github.com/NeowayLabs/nash@v0.2.2-0.20200127205349-a227041ffd50/internal/sh/builtin/glob_test.go (about) 1 package builtin_test 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "strings" 8 "testing" 9 ) 10 11 func setup(t *testing.T) (string, func()) { 12 dir, err := ioutil.TempDir("", "globtest") 13 if err != nil { 14 t.Fatalf("error on setup: %s", err) 15 } 16 17 return dir, func() { 18 os.RemoveAll(dir) 19 } 20 } 21 22 func createFile(t *testing.T, path string) { 23 f, err := os.Create(path) 24 if err != nil { 25 t.Fatal(err) 26 } 27 f.WriteString("hi") 28 f.Close() 29 } 30 31 func TestGlobNoResult(t *testing.T) { 32 dir, teardown := setup(t) 33 defer teardown() 34 35 pattern := dir + "/*.la" 36 37 out := execSuccess(t, fmt.Sprintf(` 38 var res, err <= glob("%s") 39 print($res) 40 print($err) 41 print(len($res)) 42 `, pattern)) 43 44 if out != "0" { 45 t.Fatalf("expected no results, got: %q", out) 46 } 47 } 48 49 func TestGlobOneResult(t *testing.T) { 50 dir, teardown := setup(t) 51 defer teardown() 52 53 filename := dir + "/whatever.go" 54 createFile(t, filename) 55 pattern := dir + "/*.go" 56 57 out := execSuccess(t, fmt.Sprintf(` 58 var res, err <= glob("%s") 59 print($res) 60 print($err) 61 `, pattern)) 62 63 if out != filename { 64 t.Fatalf("expected %q, got: %q", filename, out) 65 } 66 } 67 68 func TestGlobMultipleResults(t *testing.T) { 69 dir, teardown := setup(t) 70 defer teardown() 71 72 filename1 := dir + "/whatever.h" 73 filename2 := dir + "/whatever2.h" 74 75 createFile(t, filename1) 76 createFile(t, filename2) 77 78 pattern := dir + "/*.h" 79 80 out := execSuccess(t, fmt.Sprintf(` 81 var res, err <= glob("%s") 82 print($res) 83 print($err) 84 `, pattern)) 85 86 res := strings.Split(out, " ") 87 if len(res) != 2 { 88 t.Fatalf("expected 2 results, got: %d", len(res)) 89 } 90 91 found1 := false 92 found2 := false 93 94 for _, r := range res { 95 if r == filename1 { 96 found1 = true 97 } 98 if r == filename2 { 99 found2 = true 100 } 101 } 102 103 if !found1 || !found2 { 104 t.Fatalf("unable to found all files, got: %q", out) 105 } 106 } 107 108 func TestGlobInvalidPatternError(t *testing.T) { 109 out := execSuccess(t, ` 110 var res, err <= glob("*[.go") 111 print($res) 112 if $err != "" { 113 print("got error") 114 } 115 `) 116 117 if out != "got error" { 118 t.Fatalf("expected error message on glob, got nothing, output[%s]", out) 119 } 120 } 121 122 func TestFatalFailure(t *testing.T) { 123 type tcase struct { 124 name string 125 code string 126 } 127 cases := []tcase{ 128 tcase{ 129 name: "noParam", 130 code: ` 131 var res <= glob() 132 print($res) 133 `, 134 }, 135 tcase{ 136 name: "multipleParams", 137 code: ` 138 var res <= glob("/a/*", "/b/*") 139 print($res) 140 `, 141 }, 142 tcase{ 143 name: "wrongType", 144 code: ` 145 var param = ("hi") 146 var res <= glob($param) 147 print($res) 148 `, 149 }, 150 } 151 152 for _, c := range cases { 153 t.Run(c.name, func(t *testing.T) { 154 execFailure(t, c.code) 155 }) 156 } 157 }