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  }