mirror of
https://codeberg.org/scip/tablizer.git
synced 2025-12-17 04:30:56 +01:00
added unit test + docs for the various sort modes.
This commit is contained in:
@@ -78,9 +78,11 @@ var (
|
||||
// sorting
|
||||
SortByColumn int
|
||||
SortDescending bool
|
||||
SortNumeric bool
|
||||
SortTime bool
|
||||
SortAge bool
|
||||
|
||||
SortNumeric bool
|
||||
SortTime bool
|
||||
SortAge bool
|
||||
SortMode string
|
||||
)
|
||||
|
||||
// contains a whole parsed table
|
||||
|
||||
@@ -174,6 +174,19 @@ func PrepareModeFlags() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func PrepareSortFlags() {
|
||||
switch {
|
||||
case SortNumeric:
|
||||
SortMode = "numeric"
|
||||
case SortAge:
|
||||
SortMode = "duration"
|
||||
case SortTime:
|
||||
SortMode = "time"
|
||||
default:
|
||||
SortMode = "string"
|
||||
}
|
||||
}
|
||||
|
||||
func trimRow(row []string) []string {
|
||||
// FIXME: remove this when we only use Tablewriter and strip in ParseFile()!
|
||||
var fixedrow []string
|
||||
|
||||
@@ -92,7 +92,7 @@ asd igig cxxxncnc
|
||||
19191 EDD 1 X`
|
||||
|
||||
for _, tt := range tests {
|
||||
testname := fmt.Sprintf("parse-with-inverted-pattern-%t", tt.invert)
|
||||
testname := fmt.Sprintf("parse-with-pattern-%s-inverted-%t", tt.pattern, tt.invert)
|
||||
t.Run(testname, func(t *testing.T) {
|
||||
InvertMatch = tt.invert
|
||||
|
||||
|
||||
@@ -201,7 +201,8 @@ abc 345 b1`,
|
||||
origStdout, reader := stdout2pipe(t)
|
||||
|
||||
for _, tt := range tests {
|
||||
testname := fmt.Sprintf("print-sorted-table-by-%d-desc-%t", tt.sortby, tt.desc)
|
||||
testname := fmt.Sprintf("print-sorted-table-by-column-%d-desc-%t",
|
||||
tt.sortby, tt.desc)
|
||||
t.Run(testname, func(t *testing.T) {
|
||||
SortByColumn = tt.sortby
|
||||
SortDescending = tt.desc
|
||||
@@ -226,3 +227,111 @@ abc 345 b1`,
|
||||
// Restore
|
||||
os.Stdout = origStdout
|
||||
}
|
||||
|
||||
func TestSortByPrinter(t *testing.T) {
|
||||
data := Tabdata{
|
||||
maxwidthHeader: 8,
|
||||
maxwidthPerCol: []int{
|
||||
5,
|
||||
9,
|
||||
3,
|
||||
26,
|
||||
},
|
||||
columns: 4,
|
||||
headers: []string{
|
||||
"NAME",
|
||||
"DURATION",
|
||||
"COUNT",
|
||||
"WHEN",
|
||||
},
|
||||
entries: [][]string{
|
||||
{
|
||||
"beta",
|
||||
"1d10h5m1s",
|
||||
"33",
|
||||
"3/1/2014",
|
||||
},
|
||||
{
|
||||
"alpha",
|
||||
"4h35m",
|
||||
"170",
|
||||
"2013-Feb-03",
|
||||
},
|
||||
{
|
||||
"ceta",
|
||||
"33d12h",
|
||||
"9",
|
||||
"06/Jan/2008 15:04:05 -0700",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
var tests = []struct {
|
||||
sortby string
|
||||
column int
|
||||
desc bool
|
||||
expect string
|
||||
}{
|
||||
{
|
||||
column: 3,
|
||||
sortby: "numeric",
|
||||
desc: false,
|
||||
expect: `NAME(1) DURATION(2) COUNT(3) WHEN(4)
|
||||
ceta 33d12h 9 06/Jan/2008 15:04:05 -0700
|
||||
beta 1d10h5m1s 33 3/1/2014
|
||||
alpha 4h35m 170 2013-Feb-03`,
|
||||
},
|
||||
{
|
||||
column: 2,
|
||||
sortby: "duration",
|
||||
desc: false,
|
||||
expect: `NAME(1) DURATION(2) COUNT(3) WHEN(4)
|
||||
alpha 4h35m 170 2013-Feb-03
|
||||
beta 1d10h5m1s 33 3/1/2014
|
||||
ceta 33d12h 9 06/Jan/2008 15:04:05 -0700`,
|
||||
},
|
||||
{
|
||||
column: 4,
|
||||
sortby: "time",
|
||||
desc: false,
|
||||
expect: `NAME(1) DURATION(2) COUNT(3) WHEN(4)
|
||||
ceta 33d12h 9 06/Jan/2008 15:04:05 -0700
|
||||
alpha 4h35m 170 2013-Feb-03
|
||||
beta 1d10h5m1s 33 3/1/2014`,
|
||||
},
|
||||
}
|
||||
|
||||
NoColor = true
|
||||
OutputMode = "ascii"
|
||||
origStdout, reader := stdout2pipe(t)
|
||||
|
||||
for _, tt := range tests {
|
||||
testname := fmt.Sprintf("print-sorted-table-by-column-%d-desc-%t-sort-by-%s",
|
||||
tt.column, tt.desc, tt.sortby)
|
||||
|
||||
t.Run(testname, func(t *testing.T) {
|
||||
SortByColumn = tt.column
|
||||
SortDescending = tt.desc
|
||||
SortMode = tt.sortby
|
||||
|
||||
testdata := data
|
||||
printData(&testdata)
|
||||
|
||||
buf := make([]byte, 1024)
|
||||
n, err := reader.Read(buf)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
buf = buf[:n]
|
||||
output := strings.TrimSpace(string(buf))
|
||||
|
||||
if output != tt.expect {
|
||||
t.Errorf("sort column: %d, sortby: %s, got:\n%s\nwant:\n%s",
|
||||
tt.column, tt.sortby, output, tt.expect)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Restore
|
||||
os.Stdout = origStdout
|
||||
}
|
||||
|
||||
@@ -51,8 +51,8 @@ func sortTable(data *Tabdata, col int) {
|
||||
func compare(a string, b string) bool {
|
||||
var comp bool
|
||||
|
||||
switch {
|
||||
case SortNumeric:
|
||||
switch SortMode {
|
||||
case "numeric":
|
||||
left, err := strconv.Atoi(a)
|
||||
if err != nil {
|
||||
left = 0
|
||||
@@ -62,7 +62,7 @@ func compare(a string, b string) bool {
|
||||
right = 0
|
||||
}
|
||||
comp = left < right
|
||||
case SortAge:
|
||||
case "duration":
|
||||
left, err := str2duration.ParseDuration(a)
|
||||
if err != nil {
|
||||
left = 0
|
||||
@@ -72,7 +72,7 @@ func compare(a string, b string) bool {
|
||||
right = 0
|
||||
}
|
||||
comp = left.Seconds() < right.Seconds()
|
||||
case SortTime:
|
||||
case "time":
|
||||
left, _ := dateparse.ParseAny(a)
|
||||
right, _ := dateparse.ParseAny(b)
|
||||
comp = left.Unix() < right.Unix()
|
||||
|
||||
Reference in New Issue
Block a user