github.com/mithrandie/csvq@v1.18.1/lib/syntax/element_test.go (about) 1 package syntax 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/mithrandie/csvq/lib/file" 8 "github.com/mithrandie/csvq/lib/option" 9 10 "github.com/mithrandie/go-text/color" 11 ) 12 13 var syntaxTestEnv, _ = option.NewEnvironment(context.Background(), file.DefaultWaitTimeout, file.DefaultRetryDelay) 14 var syntaxTestPalette, _ = option.NewPalette(syntaxTestEnv) 15 16 func TestName_Format(t *testing.T) { 17 var e Name = "str" 18 19 expect := "str" 20 result := e.Format(nil) 21 if result != expect { 22 t.Errorf("result = %q, want %q", result, expect) 23 } 24 25 expect = syntaxTestPalette.Render(NameEffect, "str") 26 result = e.Format(syntaxTestPalette) 27 if result != expect { 28 t.Errorf("result = %q, want %q", result, expect) 29 } 30 } 31 32 var grammarFormatTests = []struct { 33 Grammar Grammar 34 UsePalette bool 35 Expect string 36 }{ 37 { 38 Grammar: []Element{Keyword("KEY"), Link("link")}, 39 UsePalette: false, 40 Expect: "KEY <link>", 41 }, 42 { 43 Grammar: []Element{Keyword("KEY"), Link("link")}, 44 UsePalette: true, 45 Expect: syntaxTestPalette.Render(KeywordEffect, "KEY") + " " + syntaxTestPalette.Render(LinkEffect, "<link>"), 46 }, 47 { 48 Grammar: []Element{Option{String("str1"), String("str2")}}, 49 UsePalette: false, 50 Expect: "[str1 str2]", 51 }, 52 { 53 Grammar: []Element{Option{String("str1"), String("str2")}}, 54 UsePalette: true, 55 Expect: "[" + syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str1")) + " " + syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str2")) + "]", 56 }, 57 { 58 Grammar: []Element{FollowingContinuousOption{String("str1"), String("str2")}}, 59 UsePalette: false, 60 Expect: " [, str1 str2 ...]", 61 }, 62 { 63 Grammar: []Element{ContinuousOption{String("str1"), String("str2")}}, 64 UsePalette: false, 65 Expect: "str1 str2 [, str1 str2 ...]", 66 }, 67 { 68 Grammar: []Element{ContinuousOption{String("str1"), String("str2")}}, 69 UsePalette: true, 70 Expect: syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str1")) + " " + syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str2")) + " [, " + syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str1")) + " " + syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str2")) + " ...]", 71 }, 72 { 73 Grammar: []Element{AnyOne{String("str1"), String("str2")}}, 74 UsePalette: false, 75 Expect: "{str1|str2}", 76 }, 77 { 78 Grammar: []Element{AnyOne{String("str1"), String("str2")}}, 79 UsePalette: true, 80 Expect: "{" + syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str1")) + "|" + syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str2")) + "}", 81 }, 82 { 83 Grammar: []Element{Parentheses{String("str1"), String("str2")}}, 84 UsePalette: false, 85 Expect: "(str1 str2)", 86 }, 87 { 88 Grammar: []Element{Parentheses{String("str1"), String("str2")}}, 89 UsePalette: true, 90 Expect: "(" + syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str1")) + " " + syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str2")) + ")", 91 }, 92 { 93 Grammar: []Element{PlainGroup{String("str1"), String("str2")}}, 94 UsePalette: false, 95 Expect: "str1 str2", 96 }, 97 { 98 Grammar: []Element{PlainGroup{String("str1"), String("str2")}}, 99 UsePalette: true, 100 Expect: syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str1")) + " " + syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str2")), 101 }, 102 { 103 Grammar: []Element{ConnectedGroup{String("str1"), String("str2")}}, 104 UsePalette: false, 105 Expect: "str1str2", 106 }, 107 { 108 Grammar: []Element{ConnectedGroup{String("str1"), String("str2")}}, 109 UsePalette: true, 110 Expect: syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str1")) + syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str2")), 111 }, 112 { 113 Grammar: []Element{Function{Name: "fn", Args: []Element{Option{Keyword("DISTINCT")}, String("str"), Option{String("arg1"), String("arg2")}}, AfterArgs: []Element{Keyword("OVER"), Parentheses{Link("partition_clause")}}, Return: Return("string")}}, 114 UsePalette: false, 115 Expect: "fn([DISTINCT] str::string [, arg1::string [, arg2::string]]) OVER (<partition_clause>) return::string", 116 }, 117 { 118 Grammar: []Element{Function{Name: "fn", Args: []Element{Option{Keyword("DISTINCT")}, String("str"), Option{String("arg1"), String("arg2")}}, AfterArgs: []Element{Keyword("OVER"), Parentheses{Link("partition_clause")}}, Return: Return("string")}}, 119 UsePalette: true, 120 Expect: syntaxTestPalette.Render(KeywordEffect, "fn") + 121 "([" + syntaxTestPalette.Render(KeywordEffect, "DISTINCT") + "] " + 122 syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str")) + syntaxTestPalette.Render(TypeEffect, "::string") + " [, " + 123 syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "arg1")) + syntaxTestPalette.Render(TypeEffect, "::string") + " [, " + 124 syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "arg2")) + syntaxTestPalette.Render(TypeEffect, "::string") + "]]) " + 125 syntaxTestPalette.Render(KeywordEffect, "OVER") + " (" + 126 syntaxTestPalette.Render(LinkEffect, "<partition_clause>") + ") " + 127 syntaxTestPalette.Render(TypeEffect, "return::string"), 128 }, 129 { 130 Grammar: []Element{Function{Name: "fn", Args: []Element{String("str"), Integer("int"), Float("float"), Boolean("bool"), Ternary("ternary"), Datetime("dt"), Link("link")}}}, 131 UsePalette: false, 132 Expect: "fn(str::string, int::integer, float::float, bool::boolean, ternary::ternary, dt::datetime, <link>)", 133 }, 134 { 135 Grammar: []Element{Function{Name: "fn", CustomArgs: Grammar{String("str"), Keyword("FROM"), Integer("num")}}}, 136 UsePalette: false, 137 Expect: "fn(str::string FROM num::integer)", 138 }, 139 { 140 Grammar: []Element{ArgWithDefValue{Arg: String("str"), Default: String("1")}}, 141 UsePalette: false, 142 Expect: "str::string DEFAULT 1", 143 }, 144 { 145 Grammar: []Element{ArgWithDefValue{Arg: String("str"), Default: String("1")}}, 146 UsePalette: true, 147 Expect: syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str")) + syntaxTestPalette.Render(TypeEffect, "::string") + " " + syntaxTestPalette.Render(KeywordEffect, "DEFAULT") + " " + syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "1")), 148 }, 149 { 150 Grammar: []Element{String("str")}, 151 UsePalette: false, 152 Expect: "str", 153 }, 154 { 155 Grammar: []Element{String("str")}, 156 UsePalette: true, 157 Expect: syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str")), 158 }, 159 { 160 Grammar: []Element{Integer("int")}, 161 UsePalette: false, 162 Expect: "int", 163 }, 164 { 165 Grammar: []Element{Integer("int")}, 166 UsePalette: true, 167 Expect: syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.NumberEffect, "int")), 168 }, 169 { 170 Grammar: []Element{Float("float")}, 171 UsePalette: false, 172 Expect: "float", 173 }, 174 { 175 Grammar: []Element{Float("float")}, 176 UsePalette: true, 177 Expect: syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.NumberEffect, "float")), 178 }, 179 { 180 Grammar: []Element{Identifier("ident")}, 181 UsePalette: false, 182 Expect: "ident", 183 }, 184 { 185 Grammar: []Element{Identifier("ident")}, 186 UsePalette: true, 187 Expect: syntaxTestPalette.Render(option.IdentifierEffect, "ident"), 188 }, 189 { 190 Grammar: []Element{Datetime("dt")}, 191 UsePalette: false, 192 Expect: "dt", 193 }, 194 { 195 Grammar: []Element{Datetime("dt")}, 196 UsePalette: true, 197 Expect: syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.DatetimeEffect, "dt")), 198 }, 199 { 200 Grammar: []Element{Boolean("bool")}, 201 UsePalette: false, 202 Expect: "bool", 203 }, 204 { 205 Grammar: []Element{Boolean("bool")}, 206 UsePalette: true, 207 Expect: syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.BooleanEffect, "bool")), 208 }, 209 { 210 Grammar: []Element{Ternary("ternary")}, 211 UsePalette: false, 212 Expect: "ternary", 213 }, 214 { 215 Grammar: []Element{Ternary("ternary")}, 216 UsePalette: true, 217 Expect: syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.TernaryEffect, "ternary")), 218 }, 219 { 220 Grammar: []Element{Null("null")}, 221 UsePalette: false, 222 Expect: "null", 223 }, 224 { 225 Grammar: []Element{Null("null")}, 226 UsePalette: true, 227 Expect: syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.NullEffect, "null")), 228 }, 229 { 230 Grammar: []Element{Variable("@var")}, 231 UsePalette: false, 232 Expect: "@var", 233 }, 234 { 235 Grammar: []Element{Variable("@var")}, 236 UsePalette: true, 237 Expect: syntaxTestPalette.Render(VariableEffect, "@var"), 238 }, 239 { 240 Grammar: []Element{Flag("@@flag")}, 241 UsePalette: false, 242 Expect: "@@flag", 243 }, 244 { 245 Grammar: []Element{Flag("@@flag")}, 246 UsePalette: true, 247 Expect: syntaxTestPalette.Render(FlagEffect, "@@flag"), 248 }, 249 { 250 Grammar: []Element{Token(".")}, 251 UsePalette: false, 252 Expect: ".", 253 }, 254 { 255 Grammar: []Element{Token(".")}, 256 UsePalette: true, 257 Expect: ".", 258 }, 259 { 260 Grammar: []Element{Italic("str")}, 261 UsePalette: false, 262 Expect: "str", 263 }, 264 { 265 Grammar: []Element{Italic("str")}, 266 UsePalette: true, 267 Expect: syntaxTestPalette.Render(ItalicEffect, "str"), 268 }, 269 { 270 Grammar: []Element{Return("string")}, 271 UsePalette: false, 272 Expect: " return::string", 273 }, 274 { 275 Grammar: []Element{Return("string")}, 276 UsePalette: true, 277 Expect: " " + syntaxTestPalette.Render(TypeEffect, "return::string"), 278 }, 279 { 280 Grammar: []Element{Description{ 281 Template: "abc %s %s %s %s %s %s", 282 Values: []Element{String("str"), Ternary("TRUE"), Ternary("ternary"), Null("NULL"), Null("null"), Link("link")}, 283 }}, 284 UsePalette: false, 285 Expect: "abc _str_ TRUE _ternary_ NULL _null_ <link>", 286 }, 287 { 288 Grammar: []Element{Description{ 289 Template: "abc %s %s %s %s %s %s", 290 Values: []Element{String("str"), Ternary("TRUE"), Ternary("ternary"), Null("NULL"), Null("null"), Link("link")}, 291 }}, 292 UsePalette: true, 293 Expect: "abc " + 294 syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.StringEffect, "str")) + " " + 295 syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.TernaryEffect, "TRUE")) + " " + 296 syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.TernaryEffect, "ternary")) + " " + 297 syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.NullEffect, "NULL")) + " " + 298 syntaxTestPalette.Render(ItalicEffect, syntaxTestPalette.Render(option.NullEffect, "null")) + " " + 299 syntaxTestPalette.Render(LinkEffect, "<link>"), 300 }, 301 } 302 303 func TestGrammar_Format(t *testing.T) { 304 var palette *color.Palette 305 306 for _, v := range grammarFormatTests { 307 if v.UsePalette { 308 palette = syntaxTestPalette 309 } else { 310 palette = nil 311 } 312 result := v.Grammar.Format(palette) 313 if result != v.Expect { 314 t.Errorf("result = %q, want %q for %v", result, v.Expect, v.Grammar) 315 } 316 } 317 }