github.com/thlcodes/genfig@v0.3.2-alpha/util/common_test.go (about) 1 package util_test 2 3 import ( 4 "io/ioutil" 5 "os" 6 "path/filepath" 7 "sort" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 "github.com/thlcodes/genfig/util" 13 ) 14 15 var ( 16 fixturesDir, _ = filepath.Abs("../fixtures") 17 ) 18 19 func Test_ResolveGlobs(t *testing.T) { 20 tmpDir, _ := ioutil.TempDir("", "genifig") 21 defer os.RemoveAll(tmpDir) 22 23 cwd, _ := os.Getwd() 24 defer os.Chdir(cwd) 25 _ = os.Chdir(tmpDir) 26 27 ioutil.WriteFile("a.x", []byte{}, 0777) 28 ioutil.WriteFile("b.x", []byte{}, 0777) 29 ioutil.WriteFile("c.y", []byte{}, 0777) 30 os.MkdirAll("sub", 0777) 31 ioutil.WriteFile("sub/d.y", []byte{}, 0777) 32 33 type args struct { 34 globs []string 35 } 36 tests := []struct { 37 name string 38 args args 39 want []string 40 }{ 41 {"no args", args{}, []string{}}, 42 {"empty arg", args{[]string{""}}, []string{}}, 43 {"no match", args{[]string{"foo"}}, []string{}}, 44 {"all first level", args{[]string{"*"}}, []string{"c.y", "a.x", "b.x"}}, 45 {"y first level file", args{[]string{"*.y"}}, []string{"c.y"}}, 46 {"x first leve files", args{[]string{"*.x"}}, []string{"a.x", "b.x"}}, 47 {"all y files", args{[]string{"**/*.y"}}, []string{"c.y", "sub/d.y"}}, 48 {"multiple globs, unique", args{[]string{"a.*", "b.*"}}, []string{"a.x", "b.x"}}, 49 {"multiple globs, not unique", args{[]string{"a.*", "*.x"}}, []string{"a.x", "b.x"}}, 50 } 51 52 for _, tt := range tests { 53 t.Run(tt.name, func(t *testing.T) { 54 got := util.ResolveGlobs(tt.args.globs...) 55 sort.Strings(tt.want) 56 sort.Strings(got) 57 assert.Equal(t, tt.want, got) 58 }) 59 } 60 } 61 62 func Test_MapString(t *testing.T) { 63 type args struct { 64 vs []string 65 f func(string) string 66 } 67 f := func(s string) string { 68 return s + "_" 69 } 70 tests := []struct { 71 name string 72 args args 73 want []string 74 }{ 75 {"nil", args{nil, f}, []string{}}, 76 {"empty", args{[]string{}, f}, []string{}}, 77 {"normal", args{[]string{"a", "b", "_", ""}, f}, []string{"a_", "b_", "__", "_"}}, 78 } 79 for _, tt := range tests { 80 t.Run(tt.name, func(t *testing.T) { 81 require.Equal(t, tt.want, util.MapString(tt.args.vs, tt.args.f)) 82 }) 83 } 84 } 85 86 func Test_ReduceStrings(t *testing.T) { 87 type args struct { 88 vs []string 89 f func(interface{}, string) interface{} 90 r interface{} 91 } 92 f1 := func(r interface{}, i string) interface{} { 93 return r.(string) + i 94 } 95 f2 := func(r interface{}, i string) interface{} { 96 if i != "" { 97 r = append(r.([]string), i) 98 } 99 return r 100 } 101 102 tests := []struct { 103 name string 104 args args 105 want interface{} 106 }{ 107 {"nil", args{nil, f1, ""}, ""}, 108 {"empty", args{[]string{}, f1, ""}, ""}, 109 {"string", args{[]string{"a", "b", "_", ""}, f1, ""}, "ab_"}, 110 {"slice", args{[]string{"a", "b", "_", ""}, f2, []string{}}, []string{"a", "b", "_"}}, 111 } 112 for _, tt := range tests { 113 t.Run(tt.name, func(t *testing.T) { 114 require.Equal(t, tt.want, util.ReduceStrings(tt.args.vs, tt.args.f, tt.args.r)) 115 }) 116 } 117 } 118 119 func Test_CleanDir(t *testing.T) { 120 tmpDir, _ := ioutil.TempDir("", "genfig") 121 defer os.RemoveAll(tmpDir) 122 dir := "clean" 123 cwd, _ := os.Getwd() 124 os.MkdirAll(filepath.Join(tmpDir, dir), 0777) 125 os.Chdir(filepath.Join(tmpDir, dir)) 126 defer os.Chdir(cwd) 127 128 ioutil.WriteFile("a.txt", []byte{}, 0777) 129 ioutil.WriteFile("b.txt", []byte{}, 0777) 130 assert.NotEmpty(t, util.ResolveGlobs("*")) 131 132 os.Chdir("..") 133 134 type args struct { 135 name string 136 } 137 tests := []struct { 138 name string 139 args args 140 wantErr bool 141 }{ 142 {"nonexist", args{"nonexist"}, true}, 143 {"exist", args{dir}, false}, 144 } 145 for _, tt := range tests { 146 t.Run(tt.name, func(t *testing.T) { 147 err := util.CleanDir(tt.args.name) 148 if tt.wantErr { 149 require.Error(t, err) 150 return 151 } 152 assert.Empty(t, util.ResolveGlobs("./"+tt.args.name+"/*")) 153 }) 154 } 155 } 156 157 func Test_ParseString(t *testing.T) { 158 tests := []struct { 159 name string 160 s string 161 want interface{} 162 }{ 163 {"empty", "", ""}, 164 {"int", "1", int64(1)}, 165 {"float", "1.1", float64(1.1)}, 166 {"negative int", "-999", int64(-999)}, 167 {"bool true", "true", true}, 168 {"bool false", "false", false}, 169 {"int array", "[1,2,3]", []interface{}{float64(1), float64(2), float64(3)}}, 170 {"string array", "[\"a\",\"b\",\"c\"]", []interface{}{"a", "b", "c"}}, 171 } 172 for _, tt := range tests { 173 t.Run(tt.name, func(t *testing.T) { 174 got := util.ParseString(tt.s) 175 assert.Equal(t, tt.want, got) 176 }) 177 } 178 } 179 180 func Test_ParseStringArray(t *testing.T) { 181 tests := []struct { 182 name string 183 s string 184 want []interface{} 185 wantOk bool 186 }{ 187 {"empty data", "", nil, false}, 188 {"not array", "a,b", nil, false}, 189 {"invalid array", "[a,sä#.,,]", nil, false}, 190 {"empty array", "[]", []interface{}{}, true}, 191 {"ints", "[1,2,3]", []interface{}{float64(1), float64(2), float64(3)}, true}, 192 {"floats", "[1.1,2.2,3.3]", []interface{}{1.1, 2.2, 3.3}, true}, 193 {"bools", "[true, false, true]", []interface{}{true, false, true}, true}, 194 {"strings", `["a", "b", "c"]`, []interface{}{"a", "b", "c"}, true}, 195 {"mixed", "[true, 1, 2.2, \"s\"]", []interface{}{true, float64(1), 2.2, "s"}, true}, 196 } 197 for _, tt := range tests { 198 t.Run(tt.name, func(t *testing.T) { 199 got, ok := util.ParseArrayString(tt.s) 200 if tt.wantOk { 201 require.True(t, ok) 202 } else { 203 require.False(t, ok) 204 } 205 assert.Equal(t, tt.want, got) 206 }) 207 } 208 } 209 210 func Test_Reverse(t *testing.T) { 211 tests := []struct { 212 name string 213 in []string 214 want []string 215 }{ 216 {"empty", []string{}, []string{}}, 217 {"even", []string{"a", "b", "c", "d"}, []string{"d", "c", "b", "a"}}, 218 {"odd", []string{"a", "b", "c"}, []string{"c", "b", "a"}}, 219 } 220 for _, tt := range tests { 221 t.Run(tt.name, func(t *testing.T) { 222 util.ReverseStrings(tt.in) 223 assert.Equal(t, tt.want, tt.in) 224 }) 225 } 226 } 227 228 func Test_DetectSliceTypeString(t *testing.T) { 229 tests := []struct { 230 name string 231 slice []interface{} 232 want string 233 }{ 234 {"empty", []interface{}{}, "[]interface {}"}, 235 {"ints", []interface{}{1, 2, 3}, "[]int"}, 236 {"bools", []interface{}{true, false, false}, "[]bool"}, 237 {"string", []interface{}{"a", "b", ""}, "[]string"}, 238 {"mixed", []interface{}{"a", 1, false}, "[]interface {}"}, 239 {"structs", []interface{}{struct{ a int }{}}, "[]struct { a int }"}, 240 {"maps", []interface{}{map[string]interface{}{}}, "[]map[string]interface {}"}, 241 } 242 for _, tt := range tests { 243 t.Run(tt.name, func(t *testing.T) { 244 got := util.DetectSliceTypeString(tt.slice) 245 assert.Equal(t, tt.want, got) 246 }) 247 } 248 } 249 250 func Test_IsInterfaceSlice(t *testing.T) { 251 tests := []struct { 252 name string 253 in interface{} 254 want bool 255 }{ 256 {"no", "nope", false}, 257 {"also no", struct{}{}, false}, 258 {"yes", []interface{}{}, true}, 259 } 260 for _, tt := range tests { 261 t.Run(tt.name, func(t *testing.T) { 262 assert.Equal(t, tt.want, util.IsInterfaceSlice(tt.in)) 263 }) 264 } 265 } 266 267 func Test_Make64(t *testing.T) { 268 tests := []struct { 269 name string 270 want string 271 }{ 272 {"int", "int64"}, 273 {"uint", "uint64"}, 274 {"float", "float64"}, 275 {"[]float", "[]float64"}, 276 {"map[string]int", "map[string]int64"}, 277 {"string", "string"}, 278 } 279 for _, tt := range tests { 280 t.Run(tt.name, func(t *testing.T) { 281 assert.Equal(t, tt.want, util.Make64(tt.name)) 282 }) 283 } 284 }