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  }