github.com/neugram/ng@v0.0.0-20180309130942-d472ff93d872/gengo/gengo_test.go (about) 1 // Copyright 2017 The Neugram Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package gengo_test 6 7 import ( 8 "bytes" 9 "io/ioutil" 10 "os" 11 "os/exec" 12 "path/filepath" 13 "strings" 14 "testing" 15 16 "neugram.io/ng/gengo" 17 ) 18 19 func TestGeneratedPrograms(t *testing.T) { 20 files, err := filepath.Glob("../eval/testdata/*.ng") 21 if err != nil { 22 t.Fatal(err) 23 } 24 if len(files) == 0 { 25 t.Fatal("cannot find testdata") 26 } 27 28 for _, file := range files { 29 file := file 30 test := file[len("../eval/testdata/") : len(file)-3] 31 exclude := []string{ // TODO remove this list 32 "import3", 33 "error6", 34 "error7", 35 "import3_error", 36 "import4", 37 "import5", 38 "import8", 39 "method2", 40 "op1", 41 } 42 donotrun := false 43 for _, ex := range exclude { 44 if test == ex { 45 donotrun = true 46 } 47 } 48 if donotrun { 49 continue 50 } 51 t.Run(test, func(t *testing.T) { 52 t.Parallel() 53 res, err := gengo.GenGo(file, "main") 54 if err != nil { 55 if strings.HasSuffix(test, "_error") { 56 return 57 } 58 t.Fatal(err) 59 } 60 61 f, err := ioutil.TempFile("", "gengo-"+test) 62 if err != nil { 63 t.Fatal(err) 64 } 65 tmpgo := f.Name() + ".go" 66 f.Close() 67 os.Remove(f.Name()) 68 f, err = os.Create(tmpgo) 69 if err != nil { 70 t.Fatal(err) 71 } 72 defer os.Remove(f.Name()) 73 74 if _, err := f.Write(res); err != nil { 75 t.Fatal(err) 76 } 77 if err := f.Close(); err != nil { 78 t.Fatal(err) 79 } 80 binname := strings.TrimSuffix(f.Name(), ".go") 81 82 cmd := exec.Command("go", "build", "-o", binname, f.Name()) 83 out, err := cmd.CombinedOutput() 84 if err != nil { 85 if strings.HasSuffix(test, "_error") { 86 return 87 } 88 t.Fatalf("failed to build: %v\n%s", err, out) 89 } 90 defer os.Remove(binname) 91 92 cmd = exec.Command(binname) 93 out, err = cmd.CombinedOutput() 94 if err != nil { 95 if strings.HasSuffix(test, "_error") { 96 return 97 } 98 if strings.HasSuffix(test, "_panic") { 99 // TODO: check errors make sense 100 return 101 } 102 t.Fatalf("failed to run: %v\n%s", err, out) 103 } 104 if !bytes.HasSuffix(out, []byte("OK\n")) { 105 t.Logf("output:\n%s", out) 106 t.Error("test missing OK") 107 } 108 }) 109 } 110 }