github.com/mithrandie/csvq@v1.18.1/lib/query/string_formatter_test.go (about) 1 package query 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/mithrandie/csvq/lib/value" 8 "github.com/mithrandie/ternary" 9 ) 10 11 var stringFormatterFormatTests = []struct { 12 Format string 13 Values []value.Primary 14 Expect string 15 Error string 16 }{ 17 { 18 Format: "--%d--%+6d--% d--%06d--%-10d--%4d--%04d--%d--", 19 Values: []value.Primary{ 20 value.NewInteger(123), 21 value.NewInteger(123), 22 value.NewInteger(123), 23 value.NewInteger(123), 24 value.NewInteger(123), 25 value.NewNull(), 26 value.NewNull(), 27 value.NewNull(), 28 }, 29 Expect: "--123-- +123-- 123--000123--123 -- -- ----", 30 }, 31 { 32 Format: "--%b--%o--%x--%X--% x--", 33 Values: []value.Primary{ 34 value.NewInteger(123), 35 value.NewInteger(123), 36 value.NewInteger(123), 37 value.NewInteger(123), 38 value.NewInteger(123), 39 }, 40 Expect: "--1111011--173--7b--7B-- 7b--", 41 }, 42 { 43 Format: "--%e--%E--%f--%.2f--%.f--%06f--%02f--%0f--%-6f--%6f--%2f--% f--%4f--%04f--%f--", 44 Values: []value.Primary{ 45 value.NewFloat(123.456), 46 value.NewFloat(123.456), 47 value.NewFloat(123.456), 48 value.NewFloat(123.456), 49 value.NewFloat(123.456), 50 value.NewFloat(-1.2), 51 value.NewFloat(1.2), 52 value.NewFloat(-1.2), 53 value.NewFloat(1.2), 54 value.NewFloat(1.2), 55 value.NewFloat(1.2), 56 value.NewFloat(1.2), 57 value.NewNull(), 58 value.NewNull(), 59 value.NewNull(), 60 }, 61 Expect: "--1.23456e+02--1.23456E+02--123.456--123.46--123---001.2--1.2---1.2--1.2 -- 1.2--1.2-- 1.2-- -- ----", 62 }, 63 { 64 Format: "--%s--%q--%i--%T--%.2i--%.2T--%%", 65 Values: []value.Primary{ 66 value.NewString("str"), 67 value.NewString("str"), 68 value.NewString("str"), 69 value.NewString("str"), 70 value.NewString("str"), 71 value.NewString("str"), 72 }, 73 Expect: "--str--'str'--`str`--String--`st`--St--%", 74 }, 75 { 76 Format: "--%s--%s--%s--", 77 Values: []value.Primary{ 78 value.NewString("str"), 79 value.NewTernary(ternary.TRUE), 80 value.NewDatetime(time.Date(2012, 2, 3, 9, 18, 15, 0, GetTestLocation())), 81 }, 82 Expect: "--str--TRUE--2012-02-03T09:18:15Z--", 83 }, 84 { 85 Format: "--%s--", 86 Values: []value.Primary{}, 87 Error: "number of replace values does not match", 88 }, 89 { 90 Format: "--%s--", 91 Values: []value.Primary{ 92 value.NewString("str"), 93 value.NewString("str"), 94 }, 95 Error: "number of replace values does not match", 96 }, 97 { 98 Format: "--%w--", 99 Values: []value.Primary{ 100 value.NewString("str"), 101 }, 102 Error: "\"w\" is an unknown placeholder", 103 }, 104 { 105 Format: "--%0", 106 Values: []value.Primary{ 107 value.NewString("str"), 108 }, 109 Error: "unexpected termination of format string", 110 }, 111 } 112 113 func TestStringFormatter_Format(t *testing.T) { 114 f := NewStringFormatter() 115 116 for _, v := range stringFormatterFormatTests { 117 result, err := f.Format(v.Format, v.Values) 118 if err != nil { 119 if len(v.Error) < 1 { 120 t.Errorf("unexpected error %q for %q, %v", err.Error(), v.Format, v.Values) 121 } else if err.Error() != v.Error { 122 t.Errorf("error %q, want error %q for %q, %v", err, v.Error, v.Format, v.Values) 123 } 124 continue 125 } 126 if 0 < len(v.Error) { 127 t.Errorf("no error, want error %q for %q, %v", v.Error, v.Format, v.Values) 128 continue 129 } 130 if result != v.Expect { 131 t.Errorf("result = %q, want %q for %q, %v", result, v.Expect, v.Format, v.Values) 132 } 133 } 134 }