github.com/mithrandie/csvq@v1.18.1/lib/option/utils_test.go (about) 1 package option 2 3 import ( 4 "reflect" 5 "testing" 6 7 "github.com/mithrandie/go-text" 8 ) 9 10 func TestEscapeString(t *testing.T) { 11 str := "fo\\o\a\b\f\n\r\t\v\\\\'\"bar\\" 12 expect := "fo\\\\o\\a\\b\\f\\n\\r\\t\\v\\\\\\\\\\'\"bar\\\\" 13 unescaped := EscapeString(str) 14 if unescaped != expect { 15 t.Errorf("escaped string = %q, want %q", unescaped, expect) 16 } 17 } 18 19 func TestUnescapeString(t *testing.T) { 20 str := "fo\\o\\a\\b\\f\\n\\r\\t\\v\\\\\\\\'\\\"bar''\"\"\\" 21 expect := "fo\\o\a\b\f\n\r\t\v\\\\'\"bar'\"\"\\" 22 unescaped := UnescapeString(str, '\'') 23 if unescaped != expect { 24 t.Errorf("unescaped string = %q, want %q", unescaped, expect) 25 } 26 } 27 28 func TestEscapeIdentifier(t *testing.T) { 29 str := "fo\\o\a\b\f\n\r\t\v\\\\`bar\\" 30 expect := "fo\\\\o\\a\\b\\f\\n\\r\\t\\v\\\\\\\\\\`bar\\\\" 31 unescaped := EscapeIdentifier(str) 32 if unescaped != expect { 33 t.Errorf("escaped identifier = %q, want %q", unescaped, expect) 34 } 35 } 36 37 func TestUnescapeIdentifier(t *testing.T) { 38 str := "fo\\o\\a\\b\\f\\n\\r\\t\\v\\\\\\\\`bar``\\" 39 expect := "fo\\o\a\b\f\n\r\t\v\\\\`bar`\\" 40 unescaped := UnescapeIdentifier(str, '`') 41 if unescaped != expect { 42 t.Errorf("unescaped identifier = %q, want %q", unescaped, expect) 43 } 44 } 45 46 func TestQuoteString(t *testing.T) { 47 s := "abc'def" 48 expect := "'abc\\'def'" 49 result := QuoteString(s) 50 if result != expect { 51 t.Errorf("quoted string = %q, want %q for %q", result, expect, s) 52 } 53 } 54 55 func TestQuoteIdentifier(t *testing.T) { 56 s := "abc`def" 57 expect := "`abc\\`def`" 58 result := QuoteIdentifier(s) 59 if result != expect { 60 t.Errorf("quoted identifier = %q, want %q for %q", result, expect, s) 61 } 62 } 63 64 func TestVariableSymbol(t *testing.T) { 65 s := "var" 66 expect := "@var" 67 result := VariableSymbol(s) 68 if result != expect { 69 t.Errorf("variable symbol = %q, want %q for %q", result, expect, s) 70 } 71 } 72 73 func TestFlagSymbol(t *testing.T) { 74 s := "flag" 75 expect := "@@flag" 76 result := FlagSymbol(s) 77 if result != expect { 78 t.Errorf("flag symbol = %q, want %q for %q", result, expect, s) 79 } 80 } 81 82 func TestEnvironmentVariableSymbol(t *testing.T) { 83 s := "env" 84 expect := "@%env" 85 result := EnvironmentVariableSymbol(s) 86 if result != expect { 87 t.Errorf("environment variable symbol = %q, want %q for %q", result, expect, s) 88 } 89 90 s = "1env" 91 expect = "@%`1env`" 92 result = EnvironmentVariableSymbol(s) 93 if result != expect { 94 t.Errorf("environment variable symbol = %q, want %q for %q", result, expect, s) 95 } 96 } 97 98 func TestEnclosedEnvironmentVariableSymbol(t *testing.T) { 99 s := "env" 100 expect := "@%`env`" 101 result := EnclosedEnvironmentVariableSymbol(s) 102 if result != expect { 103 t.Errorf("environment variable symbol = %q, want %q for %q", result, expect, s) 104 } 105 } 106 107 func TestRuntimeInformationSymbol(t *testing.T) { 108 s := "info" 109 expect := "@#info" 110 result := RuntimeInformationSymbol(s) 111 if result != expect { 112 t.Errorf("runtime information symbol = %q, want %q for %q", result, expect, s) 113 } 114 } 115 116 func TestMustBeEnclosed(t *testing.T) { 117 var expect bool 118 119 s := "" 120 expect = false 121 result := MustBeEnclosed(s) 122 if result != expect { 123 t.Errorf("must be enclosed = %t, want %t for %q", result, expect, s) 124 } 125 126 s = "1abc123" 127 expect = true 128 result = MustBeEnclosed(s) 129 if result != expect { 130 t.Errorf("must be enclosed = %t, want %t for %q", result, expect, s) 131 } 132 133 s = "abc123" 134 expect = false 135 result = MustBeEnclosed(s) 136 if result != expect { 137 t.Errorf("must be enclosed = %t, want %t for %q", result, expect, s) 138 } 139 140 s = "abc12#3" 141 expect = true 142 result = MustBeEnclosed(s) 143 if result != expect { 144 t.Errorf("must be enclosed = %t, want %t for %q", result, expect, s) 145 } 146 } 147 148 func TestFormatInt(t *testing.T) { 149 i := 1234567 150 sep := "," 151 expect := "1,234,567" 152 result := FormatInt(i, sep) 153 if result != expect { 154 t.Errorf("format int = %q, want %q for %d", result, expect, i) 155 } 156 } 157 158 var formatNumberTests = []struct { 159 Float float64 160 Precision int 161 DecimalPoint string 162 ThousandsSeparator string 163 DecimalSeparator string 164 Expect string 165 }{ 166 { 167 Float: 0, 168 Precision: 0, 169 DecimalPoint: ".", 170 ThousandsSeparator: ",", 171 DecimalSeparator: " ", 172 Expect: "0", 173 }, 174 { 175 Float: 123456.789123, 176 Precision: 4, 177 DecimalPoint: ".", 178 ThousandsSeparator: ",", 179 DecimalSeparator: " ", 180 Expect: "123,456.789 1", 181 }, 182 { 183 Float: 123456.7891, 184 Precision: -1, 185 DecimalPoint: ".", 186 ThousandsSeparator: ",", 187 DecimalSeparator: "", 188 Expect: "123,456.7891", 189 }, 190 } 191 192 func TestFormatNumber(t *testing.T) { 193 for _, v := range formatNumberTests { 194 result := FormatNumber(v.Float, v.Precision, v.DecimalPoint, v.ThousandsSeparator, v.DecimalSeparator) 195 if result != v.Expect { 196 t.Errorf("result = %s, want %s for %f, %d, %q, %q, %q", result, v.Expect, v.Float, v.Precision, v.DecimalPoint, v.ThousandsSeparator, v.DecimalSeparator) 197 } 198 } 199 } 200 201 func TestParseEncoding(t *testing.T) { 202 e, err := ParseEncoding("utf8") 203 if err != nil { 204 t.Errorf("unexpected error: %q", err.Error()) 205 } 206 if e != text.UTF8 { 207 t.Errorf("encoding = %s, expect to set %s for %s", e, text.UTF8, "utf8") 208 } 209 210 e, err = ParseEncoding("sjis") 211 if err != nil { 212 t.Errorf("unexpected error: %q", err.Error()) 213 } 214 if e != text.SJIS { 215 t.Errorf("encoding = %s, expect to set %s for %s", e, text.SJIS, "sjis") 216 } 217 218 expectErr := "encoding must be one of AUTO|UTF8|UTF8M|UTF16|UTF16BE|UTF16LE|UTF16BEM|UTF16LEM|SJIS" 219 _, err = ParseEncoding("error") 220 if err == nil { 221 t.Errorf("no error, want error %q for %s", expectErr, "error") 222 } else if err.Error() != expectErr { 223 t.Errorf("error = %q, want error %q for %s", err.Error(), expectErr, "error") 224 } 225 } 226 227 func TestParseDelimiter(t *testing.T) { 228 var s string 229 230 var expect rune 231 232 s = "\t" 233 expect = '\t' 234 result, err := ParseDelimiter(s) 235 if err != nil { 236 t.Errorf("unexpected error: %q", err.Error()) 237 } else if expect != result { 238 t.Errorf("result = %q, expect to set %q", result, expect) 239 } 240 241 s = "" 242 expectErr := "delimiter must be one character" 243 result, err = ParseDelimiter(s) 244 if err == nil { 245 t.Errorf("no error, want error %q for %s", expectErr, "error") 246 } else if err.Error() != expectErr { 247 t.Errorf("error = %q, want error %q for %s", err.Error(), expectErr, "error") 248 } 249 250 s = "invalid" 251 result, err = ParseDelimiter(s) 252 if err == nil { 253 t.Errorf("no error, want error %q for %s", expectErr, "error") 254 } else if err.Error() != expectErr { 255 t.Errorf("error = %q, want error %q for %s", err.Error(), expectErr, "error") 256 } 257 } 258 259 func TestParseDelimiterPositions(t *testing.T) { 260 var s string 261 262 var expectP []int 263 var expectSL bool 264 265 s = "spaces" 266 expectP = []int(nil) 267 expectSL = false 268 p, sl, err := ParseDelimiterPositions(s) 269 if err != nil { 270 t.Errorf("unexpected error: %q", err.Error()) 271 } else if !reflect.DeepEqual(expectP, p) || expectSL != sl { 272 t.Errorf("result = %v, %t, expect to set %v, %t", p, sl, expectP, expectSL) 273 } 274 275 s = "[1, 4, 6]" 276 expectP = []int{1, 4, 6} 277 expectSL = false 278 p, sl, err = ParseDelimiterPositions(s) 279 if err != nil { 280 t.Errorf("unexpected error: %q", err.Error()) 281 } else if !reflect.DeepEqual(expectP, p) || expectSL != sl { 282 t.Errorf("result = %v, %t, expect to set %v, %t", p, sl, expectP, expectSL) 283 } 284 285 s = "S[1, 4, 6]" 286 expectP = []int{1, 4, 6} 287 expectSL = true 288 p, sl, err = ParseDelimiterPositions(s) 289 if err != nil { 290 t.Errorf("unexpected error: %q", err.Error()) 291 } else if !reflect.DeepEqual(expectP, p) || expectSL != sl { 292 t.Errorf("result = %v, %t, expect to set %v, %t", p, sl, expectP, expectSL) 293 } 294 295 s = "" 296 expectP = []int(nil) 297 expectErr := "delimiter positions must be \"SPACES\" or a JSON array of integers" 298 expectSL = false 299 p, sl, err = ParseDelimiterPositions(s) 300 if err == nil { 301 t.Errorf("no error, want error %q for %s", expectErr, "error") 302 } else if err.Error() != expectErr { 303 t.Errorf("error = %q, want error %q for %s", err.Error(), expectErr, "error") 304 } 305 306 s = "invalid" 307 p, sl, err = ParseDelimiterPositions(s) 308 if err == nil { 309 t.Errorf("no error, want error %q for %s", expectErr, "error") 310 } else if err.Error() != expectErr { 311 t.Errorf("error = %q, want error %q for %s", err.Error(), expectErr, "error") 312 } 313 } 314 315 var unescapeStringBenchString = "fo\\o\\a\\b\\f\\n\\r\\t\\v\\\\\\\\'\\\"bar\\" 316 var unescapeStringBenchString2 = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" 317 318 func BenchmarkUnescapeString(b *testing.B) { 319 for i := 0; i < b.N; i++ { 320 _ = UnescapeString(unescapeStringBenchString, '\'') 321 } 322 } 323 324 func BenchmarkUnescapeString2(b *testing.B) { 325 for i := 0; i < b.N; i++ { 326 _ = UnescapeString(unescapeStringBenchString2, '\'') 327 } 328 }