package table
import (
"fmt"
"testing"
"github.com/jedib0t/go-pretty/v6/text"
"github.com/stretchr/testify/assert"
)
func TestTable_RenderHTML(t *testing.T) {
tw := NewWriter()
tw.AppendHeader(testHeader)
tw.AppendRows(testRows)
tw.AppendRow(testRowMultiLine)
tw.AppendFooter(testFooter)
tw.SetColumnConfigs([]ColumnConfig{
{Name: "Salary", VAlign: text.VAlignBottom},
{Number: 5, VAlign: text.VAlignBottom},
})
tw.SetTitle(testTitle1)
tw.SetCaption(testCaption)
tw.Style().Title = TitleOptions{
Align: text.AlignLeft,
Colors: text.Colors{text.BgBlack, text.Bold, text.FgHiBlue},
Format: text.FormatTitle,
}
compareOutput(t, tw.RenderHTML(), `
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. |
|
|
Total |
10000 |
|
A Song of Ice and Fire
`)
}
func TestTable_RenderHTML_AutoIndex(t *testing.T) {
tw := NewWriter()
for rowIdx := 0; rowIdx < 3; rowIdx++ {
row := make(Row, 3)
for colIdx := 0; colIdx < 3; colIdx++ {
row[colIdx] = fmt.Sprintf("%s%d", AutoIndexColumnID(colIdx), rowIdx+1)
}
tw.AppendRow(row)
}
for rowIdx := 0; rowIdx < 1; rowIdx++ {
row := make(Row, 3)
for colIdx := 0; colIdx < 3; colIdx++ {
row[colIdx] = AutoIndexColumnID(colIdx) + "F"
}
tw.AppendFooter(row)
}
tw.SetOutputMirror(nil)
tw.SetAutoIndex(true)
tw.SetStyle(StyleLight)
compareOutput(t, tw.RenderHTML(), `
|
A |
B |
C |
1 |
A1 |
B1 |
C1 |
2 |
A2 |
B2 |
C2 |
3 |
A3 |
B3 |
C3 |
|
AF |
BF |
CF |
`)
}
func TestTable_RenderHTML_Colored(t *testing.T) {
tw := NewWriter()
tw.AppendHeader(testHeader)
tw.AppendRows(testRows)
tw.AppendRow(testRowMultiLine)
tw.AppendFooter(testFooter)
tw.SetCaption(testCaption)
tw.SetTitle(testTitle1)
tw.Style().HTML.CSSClass = "go-pretty-table-colored"
colorsBlackOnWhite := text.Colors{text.BgWhite, text.FgBlack}
tw.SetColumnConfigs([]ColumnConfig{
{
Name: "#",
Colors: text.Colors{text.Bold},
ColorsHeader: colorsBlackOnWhite,
}, {
Name: "First Name",
Colors: text.Colors{text.FgCyan},
ColorsHeader: colorsBlackOnWhite,
}, {
Name: "Last Name",
Colors: text.Colors{text.FgMagenta},
ColorsHeader: colorsBlackOnWhite,
ColorsFooter: colorsBlackOnWhite,
}, {
Name: "Salary",
Colors: text.Colors{text.FgYellow},
ColorsHeader: colorsBlackOnWhite,
ColorsFooter: colorsBlackOnWhite,
VAlign: text.VAlignBottom,
}, {
Number: 5,
Colors: text.Colors{text.FgBlack},
ColorsHeader: colorsBlackOnWhite,
VAlign: text.VAlignBottom,
},
})
compareOutput(t, tw.RenderHTML(), `
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. |
|
|
Total |
10000 |
|
A Song of Ice and Fire
`)
}
func TestTable_RenderHTML_CustomStyle(t *testing.T) {
tw := NewWriter()
tw.AppendHeader(testHeader)
tw.AppendRow(Row{1, "Arya", "Stark", 3000, "Not today."})
tw.AppendRow(Row{1, "Jon", "Snow", 2000, "You know\nnothing,\nJon Snow!"})
tw.AppendRow(Row{300, "Tyrion", "Lannister", 5000})
tw.AppendFooter(testFooter)
tw.SetAutoIndex(true)
tw.Style().HTML = HTMLOptions{
CSSClass: "game-of-thrones",
EmptyColumn: " ",
EscapeText: false,
Newline: "",
}
tw.SetOutputMirror(nil)
compareOutput(t, tw.RenderHTML(), `
|
# |
First Name |
Last Name |
Salary |
|
1 |
1 |
Arya |
Stark |
3000 |
Not today. |
2 |
1 |
Jon |
Snow |
2000 |
You knownothing,Jon Snow! |
3 |
300 |
Tyrion |
Lannister |
5000 |
|
|
|
|
Total |
10000 |
|
`)
}
func TestTable_RenderHTML_Empty(t *testing.T) {
tw := NewWriter()
assert.Empty(t, tw.RenderHTML())
}
func TestTable_RenderHTML_HiddenColumns(t *testing.T) {
tw := NewWriter()
tw.AppendHeader(testHeader)
tw.AppendRows(testRows)
tw.AppendFooter(testFooter)
// ensure sorting is done before hiding the columns
tw.SortBy([]SortBy{
{Name: "Salary", Mode: DscNumeric},
})
t.Run("every column hidden", func(t *testing.T) {
tw.SetColumnConfigs(generateColumnConfigsWithHiddenColumns([]int{0, 1, 2, 3, 4}))
compareOutput(t, tw.RenderHTML(), "")
})
t.Run("first column hidden", func(t *testing.T) {
tw.SetColumnConfigs(generateColumnConfigsWithHiddenColumns([]int{0}))
compareOutput(t, tw.RenderHTML(), `
First Name |
Last Name |
Salary |
|
>>Tyrion |
Lannister<< |
5013 |
|
>>Arya |
Stark<< |
3013 |
|
>>Jon |
Snow<< |
2013 |
~You know nothing, Jon Snow!~ |
|
Total |
10000 |
|
`)
})
t.Run("column hidden in the middle", func(t *testing.T) {
tw.SetColumnConfigs(generateColumnConfigsWithHiddenColumns([]int{1}))
compareOutput(t, tw.RenderHTML(), `
# |
Last Name |
Salary |
|
307 |
Lannister<< |
5013 |
|
8 |
Stark<< |
3013 |
|
27 |
Snow<< |
2013 |
~You know nothing, Jon Snow!~ |
|
Total |
10000 |
|
`)
})
t.Run("last column hidden", func(t *testing.T) {
tw.SetColumnConfigs(generateColumnConfigsWithHiddenColumns([]int{4}))
compareOutput(t, tw.RenderHTML(), `
# |
First Name |
Last Name |
Salary |
307 |
>>Tyrion |
Lannister<< |
5013 |
8 |
>>Arya |
Stark<< |
3013 |
27 |
>>Jon |
Snow<< |
2013 |
|
|
Total |
10000 |
`)
})
}
func TestTable_RenderHTML_Sorted(t *testing.T) {
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}})
compareOutput(t, tw.RenderHTML(), `
# |
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 |
|
`)
}