github.com/zyedidia/knit@v1.1.2-0.20230901152954-f7d4e39a0e24/knit_test.go (about) 1 package knit_test 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "log" 8 "os" 9 "path/filepath" 10 "strings" 11 "testing" 12 13 "github.com/pelletier/go-toml/v2" 14 "github.com/zyedidia/knit" 15 ) 16 17 type Test struct { 18 Name string 19 Disable bool 20 Flags knit.Flags 21 Builds []Build 22 } 23 24 type Build struct { 25 Args []string 26 Output string 27 Notbuilt []string 28 Error string 29 } 30 31 func exists(path string) bool { 32 _, err := os.Stat(path) 33 return err == nil 34 } 35 36 func loadTest(dir string, t *testing.T) *Test { 37 data, err := os.ReadFile(filepath.Join(dir, "test.toml")) 38 if err != nil { 39 t.Fatal(err) 40 } 41 var test Test 42 err = toml.Unmarshal(data, &test) 43 if err != nil { 44 t.Fatal(err) 45 } 46 test.Flags.Shell = "sh" 47 return &test 48 } 49 50 func runTest(dir string, t *testing.T) { 51 test := loadTest(dir, t) 52 if test.Disable { 53 fmt.Printf("%s disabled\n", dir) 54 return 55 } 56 57 wd, err := os.Getwd() 58 if err != nil { 59 t.Fatal(fmt.Errorf("could not get wd: %w", err)) 60 } 61 62 os.Chdir(dir) 63 defer os.Chdir(wd) 64 for i, b := range test.Builds { 65 buf := &bytes.Buffer{} 66 _, err := knit.Run(buf, b.Args, test.Flags) 67 if err != nil { 68 if err.Error() == b.Error { 69 continue 70 } 71 t.Fatalf("%d: %v", i, err) 72 } 73 74 expected := strings.TrimSpace(b.Output) 75 got := strings.TrimSpace(buf.String()) 76 77 if expected != got { 78 t.Fatalf("%d: expected %s, got %s", i, expected, got) 79 } 80 81 for _, f := range b.Notbuilt { 82 if exists(f) { 83 t.Fatalf("%d: expected %s not to exist, but it does", i, f) 84 } 85 } 86 } 87 os.RemoveAll(".knit") 88 } 89 90 func TestAll(t *testing.T) { 91 log.SetOutput(io.Discard) 92 93 files, err := os.ReadDir("./test") 94 if err != nil { 95 t.Fatal(fmt.Errorf("open test dir: %w", err)) 96 } 97 98 tests := []string{} 99 100 for _, f := range files { 101 if f.IsDir() && f.Name() != "scratch" { 102 tests = append(tests, filepath.Join("test", f.Name())) 103 } 104 } 105 106 for _, tt := range tests { 107 t.Run(tt, func(t *testing.T) { 108 runTest(tt, t) 109 }) 110 } 111 }