github.com/rendon/cf@v0.0.0-20220806233241-5cb5d3939c03/test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "os" 6 "time" 7 8 log "github.com/Sirupsen/logrus" 9 "github.com/codegangsta/cli" 10 "github.com/fatih/color" 11 ) 12 13 func test(c *cli.Context) { 14 settings, err := ReadKeyValueYamlFile(".settings.yml") 15 if err != nil { 16 log.Fatalf("No '.settings.yml' file found.") 17 } 18 lang, ok := settings["lang"].(string) 19 if !ok { 20 log.Fatalf("No 'lang' field found in settings file.") 21 } 22 sourceFile, ok := settings["sourceFile"].(string) 23 if !ok { 24 log.Fatalf("No 'sourceFile' field found in settings file.") 25 } 26 tests, ok := settings["tests"].(int) 27 if !ok { 28 log.Fatalf("No 'tests' field found in settings file.") 29 } 30 validator, ok := settings["validator"].(string) 31 if !ok { 32 validator = validatorLines 33 } 34 35 if langs[lang] == nil { 36 log.Fatalf("Language %q not supported.", lang) 37 } 38 39 if err = langs[lang].Setup(sourceFile); err != nil { 40 log.Fatalf("Failed to setup source file: %s", err) 41 } 42 43 green := color.New(color.FgGreen).SprintFunc() 44 red := color.New(color.FgRed).SprintFunc() 45 failureCount := 0 46 for i := 1; i <= tests; i++ { 47 in := fmt.Sprintf(".in%d.txt", i) 48 out := fmt.Sprintf(".out%d.txt", i) 49 fmt.Printf("Test #%d: ", i) 50 if c.GlobalBool("verbose") { 51 fmt.Println() 52 } 53 54 start := time.Now() 55 passed, err := langs[lang].Run(sourceFile, in, out, validator) 56 if err != nil { 57 log.Fatalf("Test %d failed: %s", i, err) 58 } 59 end := time.Now() 60 if passed { 61 fmt.Printf("%s %.3fs\n", green("PASSED"), end.Sub(start).Seconds()) 62 } else { 63 fmt.Printf("%s %.3fs\n", red("FAILED"), end.Sub(start).Seconds()) 64 failureCount++ 65 } 66 } 67 68 fmt.Println() 69 if failureCount == 0 { 70 fmt.Printf("%s\n", green("Well done!")) 71 } else { 72 fmt.Fprintf(os.Stderr, "%s\n", red("Try again!")) 73 os.Exit(1) 74 } 75 }