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 }