github.com/kubeshop/testkube@v1.17.23/pkg/tcl/expressionstcl/static_test.go (about)

     1  // Copyright 2024 Testkube.
     2  //
     3  // Licensed as a Testkube Pro file under the Testkube Community
     4  // License (the "License"); you may not use this file except in compliance with
     5  // the License. You may obtain a copy of the License at
     6  //
     7  //     https://github.com/kubeshop/testkube/blob/main/licenses/TCL.txt
     8  
     9  package expressionstcl
    10  
    11  import (
    12  	"testing"
    13  
    14  	"github.com/stretchr/testify/assert"
    15  )
    16  
    17  func must[T interface{}](v T, e error) T {
    18  	if e != nil {
    19  		panic(e)
    20  	}
    21  	return v
    22  }
    23  
    24  func errOnly(_ interface{}, e error) error {
    25  	return e
    26  }
    27  
    28  func TestStaticBool(t *testing.T) {
    29  	// Types
    30  	assert.Equal(t, "false", NewValue(false).String())
    31  	assert.Equal(t, "true", NewValue(true).String())
    32  	assert.Equal(t, true, NewValue(false).IsBool())
    33  	assert.Equal(t, true, NewValue(true).IsBool())
    34  	assert.Equal(t, false, NewValue(false).IsNone())
    35  	assert.Equal(t, false, NewValue(true).IsNone())
    36  	assert.Equal(t, false, NewValue(true).IsInt())
    37  	assert.Equal(t, false, NewValue(true).IsNumber())
    38  	assert.Equal(t, false, NewValue(true).IsString())
    39  	assert.Equal(t, false, NewValue(true).IsMap())
    40  	assert.Equal(t, false, NewValue(true).IsSlice())
    41  
    42  	// Conversion
    43  	assert.Equal(t, false, must(NewValue(false).BoolValue()))
    44  	assert.Equal(t, true, must(NewValue(true).BoolValue()))
    45  	assert.Error(t, errOnly(NewValue(true).IntValue()))
    46  	assert.Error(t, errOnly(NewValue(true).FloatValue()))
    47  	assert.Equal(t, "true", must(NewValue(true).StringValue()))
    48  	assert.Equal(t, "false", must(NewValue(false).StringValue()))
    49  	assert.Error(t, errOnly(NewValue(true).MapValue()))
    50  	assert.Error(t, errOnly(NewValue(true).SliceValue()))
    51  }
    52  
    53  func TestStaticInt(t *testing.T) {
    54  	// Types
    55  	assert.Equal(t, "0", NewValue(0).String())
    56  	assert.Equal(t, "1", NewValue(1).String())
    57  	assert.Equal(t, false, NewValue(0).IsBool())
    58  	assert.Equal(t, false, NewValue(1).IsBool())
    59  	assert.Equal(t, false, NewValue(0).IsNone())
    60  	assert.Equal(t, false, NewValue(1).IsNone())
    61  	assert.Equal(t, true, NewValue(1).IsInt())
    62  	assert.Equal(t, true, NewValue(1).IsNumber())
    63  	assert.Equal(t, false, NewValue(1).IsString())
    64  	assert.Equal(t, false, NewValue(1).IsMap())
    65  	assert.Equal(t, false, NewValue(1).IsSlice())
    66  
    67  	// Conversion
    68  	assert.Equal(t, false, must(NewValue(0).BoolValue()))
    69  	assert.Equal(t, true, must(NewValue(1).BoolValue()))
    70  	assert.Equal(t, int64(1), must(NewValue(1).IntValue()))
    71  	assert.Equal(t, 1.0, must(NewValue(1).FloatValue()))
    72  	assert.Equal(t, "1", must(NewValue(1).StringValue()))
    73  	assert.Error(t, errOnly(NewValue(1).MapValue()))
    74  	assert.Error(t, errOnly(NewValue(1).SliceValue()))
    75  }
    76  
    77  func TestStaticFloat(t *testing.T) {
    78  	// Types
    79  	assert.Equal(t, "0", NewValue(0.0).String())
    80  	assert.Equal(t, "1.5", NewValue(1.5).String())
    81  	assert.Equal(t, false, NewValue(0.0).IsBool())
    82  	assert.Equal(t, false, NewValue(1.0).IsBool())
    83  	assert.Equal(t, false, NewValue(1.5).IsBool())
    84  	assert.Equal(t, false, NewValue(0.0).IsNone())
    85  	assert.Equal(t, false, NewValue(1.0).IsNone())
    86  	assert.Equal(t, false, NewValue(1.5).IsNone())
    87  	assert.Equal(t, true, NewValue(1.0).IsInt())
    88  	assert.Equal(t, false, NewValue(1.8).IsInt())
    89  	assert.Equal(t, true, NewValue(1.5).IsNumber())
    90  	assert.Equal(t, false, NewValue(1.7).IsString())
    91  	assert.Equal(t, false, NewValue(1.7).IsMap())
    92  	assert.Equal(t, false, NewValue(1.3).IsSlice())
    93  
    94  	// Conversion
    95  	assert.Equal(t, false, must(NewValue(0.0).BoolValue()))
    96  	assert.Equal(t, true, must(NewValue(0.5).BoolValue()))
    97  	assert.Equal(t, true, must(NewValue(1.0).BoolValue()))
    98  	assert.Equal(t, true, must(NewValue(1.5).BoolValue()))
    99  	assert.Equal(t, int64(1), must(NewValue(1.8).IntValue()))
   100  	assert.Equal(t, 1.8, must(NewValue(1.8).FloatValue()))
   101  	assert.Equal(t, "1.877778", must(NewValue(1.877778).StringValue()))
   102  	assert.Equal(t, "1.88", must(NewValue(1.88).StringValue()))
   103  	assert.Error(t, errOnly(NewValue(1.8).MapValue()))
   104  	assert.Error(t, errOnly(NewValue(1.8).SliceValue()))
   105  }
   106  
   107  func TestStaticString(t *testing.T) {
   108  	// Types
   109  	assert.Equal(t, `""`, NewValue("").String())
   110  	assert.Equal(t, `"value"`, NewValue("value").String())
   111  	assert.Equal(t, `"v\"alue"`, NewValue("v\"alue").String())
   112  	assert.Equal(t, false, NewValue("").IsBool())
   113  	assert.Equal(t, false, NewValue("value").IsBool())
   114  	assert.Equal(t, false, NewValue("").IsNone())
   115  	assert.Equal(t, false, NewValue("value").IsNone())
   116  	assert.Equal(t, false, NewValue("5").IsInt())
   117  	assert.Equal(t, false, NewValue("value").IsInt())
   118  	assert.Equal(t, false, NewValue("5").IsNumber())
   119  	assert.Equal(t, false, NewValue("value").IsNumber())
   120  	assert.Equal(t, true, NewValue("").IsString())
   121  	assert.Equal(t, true, NewValue("value").IsString())
   122  	assert.Equal(t, false, NewValue("value").IsMap())
   123  	assert.Equal(t, false, NewValue("value").IsSlice())
   124  
   125  	// Conversion
   126  	assert.Equal(t, false, must(NewValue("").BoolValue()))
   127  	assert.Equal(t, false, must(NewValue("0").BoolValue()))
   128  	assert.Equal(t, false, must(NewValue("off").BoolValue()))
   129  	assert.Equal(t, false, must(NewValue("false").BoolValue()))
   130  	assert.Equal(t, true, must(NewValue("False").BoolValue()))
   131  	assert.Equal(t, true, must(NewValue("true").BoolValue()))
   132  	assert.Equal(t, true, must(NewValue("on").BoolValue()))
   133  	assert.Equal(t, true, must(NewValue("1").BoolValue()))
   134  	assert.Equal(t, true, must(NewValue("something").BoolValue()))
   135  	assert.Equal(t, int64(1), must(NewValue("1").IntValue()))
   136  	assert.Equal(t, int64(1), must(NewValue("1.5").IntValue()))
   137  	assert.Error(t, errOnly(NewValue("").IntValue()))
   138  	assert.Error(t, errOnly(NewValue("5 apples").IntValue()))
   139  	assert.Equal(t, 1.0, must(NewValue("1").FloatValue()))
   140  	assert.Equal(t, 1.5, must(NewValue("1.5").FloatValue()))
   141  	assert.Error(t, errOnly(NewValue("").FloatValue()))
   142  	assert.Error(t, errOnly(NewValue("5 apples").FloatValue()))
   143  	assert.Equal(t, "", must(NewValue("").StringValue()))
   144  	assert.Equal(t, "value", must(NewValue("value").StringValue()))
   145  	assert.Equal(t, `v"alu\e`, must(NewValue(`v"alu\e`).StringValue()))
   146  	assert.Error(t, errOnly(NewValue("").MapValue()))
   147  	assert.Error(t, errOnly(NewValue("v").MapValue()))
   148  	assert.Error(t, errOnly(NewValue("").SliceValue()))
   149  	assert.Error(t, errOnly(NewValue("v").SliceValue()))
   150  }
   151  
   152  func TestStaticMap(t *testing.T) {
   153  	// Types
   154  	assert.Equal(t, "{}", NewValue(map[string]interface{}(nil)).String())
   155  	assert.Equal(t, "{}", NewValue(map[string]string(nil)).String())
   156  	assert.Equal(t, `{"a":"b"}`, NewValue(map[string]string{"a": "b"}).String())
   157  	assert.Equal(t, `{"3":"b"}`, NewValue(map[int]string{3: "b"}).String())
   158  	assert.Equal(t, false, NewValue(map[string]interface{}(nil)).IsBool())
   159  	assert.Equal(t, false, NewValue(map[string]interface{}{}).IsBool())
   160  	assert.Equal(t, false, NewValue(map[string]interface{}{"a": "b"}).IsBool())
   161  	assert.Equal(t, false, NewValue(map[string]interface{}(nil)).IsNone())
   162  	assert.Equal(t, false, NewValue(map[string]interface{}{}).IsNone())
   163  	assert.Equal(t, false, NewValue(map[string]interface{}{"a": "b"}).IsNone())
   164  	assert.Equal(t, false, NewValue(map[int]interface{}{3: "3"}).IsInt())
   165  	assert.Equal(t, false, NewValue(map[int]interface{}{3: "3"}).IsNumber())
   166  	assert.Equal(t, false, NewValue(map[int]interface{}{3: "3"}).IsString())
   167  	assert.Equal(t, true, NewValue(map[string]interface{}(nil)).IsMap())
   168  	assert.Equal(t, true, NewValue(map[string]interface{}{}).IsMap())
   169  	assert.Equal(t, true, NewValue(map[string]interface{}{"a": "b"}).IsMap())
   170  	assert.Equal(t, false, NewValue(map[string]interface{}(nil)).IsSlice())
   171  	assert.Equal(t, false, NewValue(map[string]interface{}{}).IsSlice())
   172  	assert.Equal(t, false, NewValue(map[string]interface{}{"a": "b"}).IsSlice())
   173  
   174  	// Conversion
   175  	assert.Equal(t, false, must(NewValue(map[string]string{}).BoolValue()))
   176  	assert.Equal(t, false, must(NewValue(map[string]string(nil)).BoolValue()))
   177  	assert.Equal(t, true, must(NewValue(map[string]string{"a": "b"}).BoolValue()))
   178  	assert.Error(t, errOnly(NewValue(map[string]string(nil)).IntValue()))
   179  	assert.Error(t, errOnly(NewValue(map[string]string{}).IntValue()))
   180  	assert.Error(t, errOnly(NewValue(map[string]string{"a": "b"}).IntValue()))
   181  	assert.Error(t, errOnly(NewValue(map[string]string(nil)).FloatValue()))
   182  	assert.Error(t, errOnly(NewValue(map[string]string{}).FloatValue()))
   183  	assert.Error(t, errOnly(NewValue(map[string]string{"a": "b"}).FloatValue()))
   184  	assert.Equal(t, "{}", must(NewValue(map[string]string(nil)).StringValue()))
   185  	assert.Equal(t, "{}", must(NewValue(map[string]string{}).StringValue()))
   186  	assert.Equal(t, `{"a":"b"}`, must(NewValue(map[string]string{"a": "b"}).StringValue()))
   187  	assert.Equal(t, map[string]interface{}{}, must(NewValue(map[string]string(nil)).MapValue()))
   188  	assert.Equal(t, map[string]interface{}{}, must(NewValue(map[string]string{}).MapValue()))
   189  	assert.Equal(t, map[string]interface{}{"a": "b"}, must(NewValue(map[string]string{"a": "b"}).MapValue()))
   190  	assert.Error(t, errOnly(NewValue(map[string]string(nil)).SliceValue()))
   191  	assert.Error(t, errOnly(NewValue(map[int]string{}).SliceValue()))
   192  	assert.Error(t, errOnly(NewValue(map[int]string{3: "a"}).SliceValue()))
   193  }
   194  
   195  func TestStaticSlice(t *testing.T) {
   196  	// Types
   197  	assert.Equal(t, "[]", NewValue([]interface{}(nil)).String())
   198  	assert.Equal(t, "[]", NewValue([]string(nil)).String())
   199  	assert.Equal(t, `["a","b"]`, NewValue([]string{"a", "b"}).String())
   200  	assert.Equal(t, `[3]`, NewValue([]int{3}).String())
   201  	assert.Equal(t, false, NewValue([]interface{}(nil)).IsBool())
   202  	assert.Equal(t, false, NewValue([]interface{}{}).IsBool())
   203  	assert.Equal(t, false, NewValue([]interface{}{"a", "b"}).IsBool())
   204  	assert.Equal(t, false, NewValue([]interface{}(nil)).IsNone())
   205  	assert.Equal(t, false, NewValue([]interface{}{}).IsNone())
   206  	assert.Equal(t, false, NewValue([]interface{}{"a", "b"}).IsNone())
   207  	assert.Equal(t, false, NewValue([]interface{}{3: "3"}).IsInt())
   208  	assert.Equal(t, false, NewValue([]interface{}{3: "3"}).IsNumber())
   209  	assert.Equal(t, false, NewValue([]interface{}{3: "3"}).IsString())
   210  	assert.Equal(t, false, NewValue([]interface{}(nil)).IsMap())
   211  	assert.Equal(t, false, NewValue([]interface{}{}).IsMap())
   212  	assert.Equal(t, false, NewValue([]interface{}{"a", "b"}).IsMap())
   213  	assert.Equal(t, true, NewValue([]interface{}(nil)).IsSlice())
   214  	assert.Equal(t, true, NewValue([]interface{}{}).IsSlice())
   215  	assert.Equal(t, true, NewValue([]interface{}{"a", "b"}).IsSlice())
   216  
   217  	// Conversion
   218  	assert.Equal(t, false, must(NewValue([]string{}).BoolValue()))
   219  	assert.Equal(t, false, must(NewValue([]string(nil)).BoolValue()))
   220  	assert.Equal(t, true, must(NewValue([]string{"a", "b"}).BoolValue()))
   221  	assert.Error(t, errOnly(NewValue([]string(nil)).IntValue()))
   222  	assert.Error(t, errOnly(NewValue([]string{}).IntValue()))
   223  	assert.Error(t, errOnly(NewValue([]string{"a", "b"}).IntValue()))
   224  	assert.Error(t, errOnly(NewValue([]string(nil)).FloatValue()))
   225  	assert.Error(t, errOnly(NewValue([]string{}).FloatValue()))
   226  	assert.Error(t, errOnly(NewValue([]string{"a", "b"}).FloatValue()))
   227  	assert.Equal(t, "", must(NewValue([]string(nil)).StringValue()))
   228  	assert.Equal(t, "", must(NewValue([]string{}).StringValue()))
   229  	assert.Equal(t, `a,b`, must(NewValue([]string{"a", "b"}).StringValue()))
   230  	assert.Equal(t, map[string]interface{}{}, must(NewValue([]string(nil)).MapValue()))
   231  	assert.Equal(t, map[string]interface{}{}, must(NewValue([]string{}).MapValue()))
   232  	assert.Equal(t, map[string]interface{}{"0": "a", "1": "b"}, must(NewValue([]string{"a", "b"}).MapValue()))
   233  	assert.Equal(t, []interface{}{}, must(NewValue([]string(nil)).SliceValue()))
   234  	assert.Equal(t, []interface{}{}, must(NewValue([]string{}).SliceValue()))
   235  	assert.Equal(t, slice("a"), must(NewValue([]string{"a"}).SliceValue()))
   236  }
   237  
   238  func TestStaticNone(t *testing.T) {
   239  	// Types
   240  	assert.Equal(t, "null", None.String())
   241  	assert.Equal(t, false, None.IsBool())
   242  	assert.Equal(t, true, None.IsNone())
   243  	assert.Equal(t, false, None.IsInt())
   244  	assert.Equal(t, false, None.IsNumber())
   245  	assert.Equal(t, false, None.IsString())
   246  	assert.Equal(t, false, None.IsMap())
   247  	assert.Equal(t, false, None.IsSlice())
   248  
   249  	// Conversion
   250  	assert.Equal(t, false, must(None.BoolValue()))
   251  	assert.Equal(t, int64(0), must(None.IntValue()))
   252  	assert.Equal(t, 0.0, must(None.FloatValue()))
   253  	assert.Equal(t, "", must(None.StringValue()))
   254  	assert.Equal(t, map[string]interface{}(nil), must(None.MapValue()))
   255  	assert.Equal(t, []interface{}(nil), must(None.SliceValue()))
   256  }