You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: render_tsv_test.go
    path of file: ./repos/go-pretty/table
    
    the code of the file until where you have to start completion: package table

import (
	"fmt"
	"testing"
)

func TestTable_RenderTSV(t *testing.T) {
	tests := []struct {
		name   string
		tw     func() Writer
		output string
	}{
		{
			tw: func() Writer {
				tw := NewWriter()
				tw.AppendHeader(testHeader)
				tw.AppendRows(testRows)
				tw.AppendRow(testRowMultiLine)
				tw.AppendRow(testRowTabs)
				tw.AppendRow(testRowDoubleQuotes)
				tw.AppendFooter(testFooter)
				tw.SetCaption(testCaption)
				tw.SetTitle(testTitle1)
				return tw
			},
			output: `
Game of Thrones
#	First Name	Last Name	Salary	
1	Arya	Stark	3000	
20	Jon	Snow	2000	You know nothing, Jon Snow!
300	Tyrion	Lannister	5000	
0	Winter	Is	0	"Coming.
The North Remembers!
This is known."
0	Valar	Morghulis	0	"Faceless    Men"
0	Valar	Morghulis	0	"Faceless""Men"
		Total	10000	
A Song of Ic
    
func TestTable_RenderTSV(t *testing.T) {
	tests := []struct {
		name   string
		tw     func() Writer
		output string
	}{
		{
			tw: func() Writer {
				tw := NewWriter()
				tw.AppendHeader(testHeader)
				tw.AppendRows(testRows)
				tw.AppendRow(testRowMultiLine)
				tw.AppendRow(testRowTabs)
				tw.AppendRow(testRowDoubleQuotes)
				tw.AppendFooter(testFooter)
				tw.SetCaption(testCaption)
				tw.SetTitle(testTitle1)
				return tw
			},
			output: `
Game of Thrones
#	First Name	Last Name	Salary	
1	Arya	Stark	3000	
20	Jon	Snow	2000	You know nothing, Jon Snow!
300	Tyrion	Lannister	5000	
0	Winter	Is	0	"Coming.
The North Remembers!
This is known."
0	Valar	Morghulis	0	"Faceless    Men"
0	Valar	Morghulis	0	"Faceless""Men"
		Total	10000	
A Song of Ice and Fire`,
		},
		{
			name: "Auto index",
			tw: func() Writer {
				tw := NewWriter()
				for rowIdx := 0; rowIdx < 10; rowIdx++ {
					row := make(Row, 10)
					for colIdx := 0; colIdx < 10; colIdx++ {
						row[colIdx] = fmt.Sprintf("%s%d", AutoIndexColumnID(colIdx), rowIdx+1)
					}
					tw.AppendRow(row)
				}
				for rowIdx := 0; rowIdx < 1; rowIdx++ {
					row := make(Row, 10)
					for colIdx := 0; colIdx < 10; colIdx++ {
						row[colIdx] = AutoIndexColumnID(colIdx) + "F"
					}
					tw.AppendFooter(row)
				}
				tw.SetAutoIndex(true)
				tw.SetStyle(StyleLight)
				return tw
			},
			output: `
	A	B	C	D	E	F	G	H	I	J
1	A1	B1	C1	D1	E1	F1	G1	H1	I1	J1
2	A2	B2	C2	D2	E2	F2	G2	H2	I2	J2
3	A3	B3	C3	D3	E3	F3	G3	H3	I3	J3
4	A4	B4	C4	D4	E4	F4	G4	H4	I4	J4
5	A5	B5	C5	D5	E5	F5	G5	H5	I5	J5
6	A6	B6	C6	D6	E6	F6	G6	H6	I6	J6
7	A7	B7	C7	D7	E7	F7	G7	H7	I7	J7
8	A8	B8	C8	D8	E8	F8	G8	H8	I8	J8
9	A9	B9	C9	D9	E9	F9	G9	H9	I9	J9
10	A10	B10	C10	D10	E10	F10	G10	H10	I10	J10
	AF	BF	CF	DF	EF	FF	GF	HF	IF	JF`,
		},
		{
			name: "Empty",
			tw: func() Writer {
				tw := NewWriter()
				return tw
			},
			output: ``,
		},
		{
			name: "Every column hidden",
			tw: func() Writer {
				tw := NewWriter()
				tw.AppendHeader(testHeader)
				tw.AppendRows(testRows)
				tw.AppendFooter(testFooter)
				tw.SortBy([]SortBy{
					{Name: "Salary", Mode: DscNumeric},
				})
				tw.SetColumnConfigs(generateColumnConfigsWithHiddenColumns([]int{0, 1, 2, 3, 4}))
				return tw
			},
			output: ``,
		},
		{
			name: "First column hidden",
			tw: func() Writer {
				tw := NewWriter()
				tw.AppendHeader(testHeader)
				tw.AppendRows(testRows)
				tw.AppendFooter(testFooter)
				tw.SortBy([]SortBy{
					{Name: "Salary", Mode: DscNumeric},
				})
				tw.SetColumnConfigs(generateColumnConfigsWithHiddenColumns([]int{0}))
				return tw
			},
			output: `
First Name	Last Name	Salary	
>>Tyrion	Lannister<<	5013	
>>Arya	Stark<<	3013	
>>Jon	Snow<<	2013	~You know nothing, Jon Snow!~
	Total	10000	`,
		},
		{
			name: "Column hidden in the middle",
			tw: func() Writer {
				tw := NewWriter()
				tw.AppendHeader(testHeader)
				tw.AppendRows(testRows)
				tw.AppendFooter(testFooter)
				tw.SortBy([]SortBy{
					{Name: "Salary", Mode: DscNumeric},
				})
				tw.SetColumnConfigs(generateColumnConfigsWithHiddenColumns([]int{1}))
				return tw
			},
			output: `
#	Last Name	Salary	
307	Lannister<<	5013	
8	Stark<<	3013	
27	Snow<<	2013	~You know nothing, Jon Snow!~
	Total	10000	`,
		},
		{
			name: "Last column hidden",
			tw: func() Writer {
				tw := NewWriter()
				tw.AppendHeader(testHeader)
				tw.AppendRows(testRows)
				tw.AppendFooter(testFooter)
				tw.SortBy([]SortBy{
					{Name: "Salary", Mode: DscNumeric},
				})
				tw.SetColumnConfigs(generateColumnConfigsWithHiddenColumns([]int{4}))
				return tw
			},
			output: `
#	First Name	Last Name	Salary
307	>>Tyrion	Lannister<<	5013
8	>>Arya	Stark<<	3013
27	>>Jon	Snow<<	2013
		Total	10000`,
		},
		{
			name: "Sorted",
			tw: func() Writer {
				tw := NewWriter()
				tw.AppendHeader(testHeader)
				tw.AppendRows(testRows)
				tw.AppendRow(Row{11, "Sansa", "Stark", 6000})
				tw.AppendFooter(testFooter)
				tw.SortBy([]SortBy{{Name: "Last Name", Mode: Asc}, {Name: "First Name", Mode: Asc}})
				return tw
			},
			output: `
#	First Name	Last Name	Salary	
300	Tyrion	Lannister	5000	
20	Jon	Snow	2000	You know nothing, Jon Snow!
1	Arya	Stark	3000	
11	Sansa	Stark	6000	
		Total	10000	`,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			output := tt.tw().RenderTSV()
			compareOutput(t, output, tt.output)
		})
	}
}