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  }