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  }