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  }