package main import ( "fmt" "io/ioutil" "os" "os/exec" "path" "regexp" "strings" "github.com/kylelemons/godebug/diff" ) func fileExists(f string) bool { _, err := os.Stat(f); return err == nil; } var inputre = regexp.MustCompile(`\.input$`) type CPTest struct { Name string Input *[]byte Output *[]byte } func runOneTest(dir string, test *CPTest) { fmt.Println("Running Test", test.Name, "..."); fmt.Println("=========="); fmt.Println("INPUT:") fmt.Println(string(*test.Input)); fmt.Println("=========="); cmd := exec.Command("go", "run", path.Join(dir, "main.go")); inpipe, _ := cmd.StdinPipe(); defer inpipe.Close(); fmt.Fprintln(inpipe, string(*test.Input)); out,err := cmd.Output(); if err != nil { fmt.Println(err); return } fmt.Println("OUTPUT:") fmt.Println(string(out)); if test.Output != nil { fmt.Println("=========="); fmt.Println("ANSWER:") fmt.Println(string(*test.Output)); fmt.Println("=========="); fmt.Println("DIFF:") fmt.Println(diff.Diff(string(out), string(*test.Output))) } fmt.Println("=========="); } func runTests(dir string, selected []string) { testfolder := path.Join(dir, "cpgo_tests") info, err := os.Stat(testfolder); if err != nil { fmt.Println("Error encountered", err); os.Exit(1); } if !info.IsDir() { fmt.Println(testfolder, "is not a directory.") os.Exit(1); } entries, err := ioutil.ReadDir(testfolder); if err != nil { fmt.Println("Error while accessing", testfolder, err); os.Exit(1); } tests := make([]CPTest, 0); testmap := map[string]*CPTest{}; for _,file := range entries { if strings.HasSuffix(file.Name(), ".input") { fpath := path.Join(testfolder, file.Name()); input,_ := ioutil.ReadFile(fpath); outputfile := string(inputre.ReplaceAll([]byte(fpath), []byte(".output"))); tst := CPTest{ Name: strings.TrimSuffix(file.Name(), ".input"), Input: &input, }; if fileExists(outputfile) { out,_ := ioutil.ReadFile(outputfile); tst.Output = &out; } tests = append(tests, tst); testmap[tst.Name] = &tst; } } if len(selected) == 0 { for _, t := range tests { runOneTest(dir, &t); } } else { for _,name := range selected { t, exists := testmap[name]; if exists { runOneTest(dir, t); } else { fmt.Println(name, "is not a valid test."); return } } } }