@@ -2,7 +2,6 @@ package codegen_test
22
33import (
44 "bytes"
5- "flag"
65 "fmt"
76 "io/ioutil"
87 "os"
@@ -19,8 +18,6 @@ import (
1918 "github.com/glojurelang/glojure/pkg/runtime"
2019)
2120
22- var updateGolden = flag .Bool ("update" , false , "update golden files" )
23-
2421func TestCodegen (t * testing.T ) {
2522 var testFiles []string
2623 err := filepath .Walk ("testdata" , func (path string , info os.FileInfo , err error ) error {
@@ -59,45 +56,64 @@ func TestCodegen(t *testing.T) {
5956
6057 ns := lang .FindNamespace (lang .NewSymbol (nsName ))
6158
62- // Generate code for the namespace
63- var buf bytes.Buffer
64- gen := codegen .New (& buf )
65- if err := gen .Generate (ns ); err != nil {
66- t .Fatalf ("failed to generate code: %v" , err )
67- }
59+ generateAndTestNamespace (t , ns , strings .TrimSuffix (testFile , ".glj" )+ ".go" )
60+ })
61+ }
6862
69- generated := buf .Bytes ()
63+ t .Run ("glojure.core" , func (t * testing.T ) {
64+ // Test the core namespace
65+ ns := lang .FindNamespace (lang .NewSymbol ("glojure.core" ))
66+ if ns == nil {
67+ t .Fatal ("glojure.core namespace not found" )
68+ }
7069
71- // Compare with golden file
72- goldenFile := strings .TrimSuffix (testFile , ".glj" ) + ".go"
73- if * updateGolden {
74- if err := ioutil .WriteFile (goldenFile , generated , 0644 ); err != nil {
75- t .Fatal (err )
76- }
77- }
70+ goldenFile := "testdata/codegen/test/core.go"
71+ generateAndTestNamespace (t , ns , goldenFile )
72+ })
73+ }
7874
79- expected , err := ioutil .ReadFile (goldenFile )
80- if err != nil {
81- t .Fatalf ("failed to read golden file: %v" , err )
82- }
75+ func generateAndTestNamespace (t * testing.T , ns * lang.Namespace , goldenFile string ) {
76+ t .Helper ()
8377
84- if ! bytes .Equal (generated , expected ) {
85- t .Errorf ("generated code does not match golden file.\n Generated:\n %s\n Expected:\n %s" ,
86- generated , expected )
87- }
78+ // Generate code for the namespace
79+ var buf bytes.Buffer
80+ gen := codegen .New (& buf )
81+ if err := gen .Generate (ns ); err != nil {
82+ t .Fatalf ("failed to generate code: %v" , err )
83+ }
8884
89- // run go vet on the output file. print any errors from stderr
90- cmd := exec .Command ("go" , "vet" , "-all" , goldenFile )
91- var stderr bytes.Buffer
92- cmd .Stderr = & stderr
93- if err := cmd .Run (); err != nil {
94- t .Errorf ("go vet failed for %s: %v\n Stderr:\n %s" , goldenFile , err , stderr .String ())
95- }
85+ generated := buf .Bytes ()
9686
97- // Check if namespace has -main function with expected output
98- testMainFunction (t , ns )
99- })
87+ updateGolden := os .Getenv ("UPDATE_SNAPSHOT" ) == "1"
88+ if updateGolden {
89+ if err := ioutil .WriteFile (goldenFile , generated , 0644 ); err != nil {
90+ t .Fatal (err )
91+ }
92+ }
93+
94+ // Compare with golden file
95+ expected , err := ioutil .ReadFile (goldenFile )
96+ if err != nil {
97+ t .Fatalf ("failed to read golden file: %v" , err )
98+ }
99+
100+ if ! bytes .Equal (generated , expected ) {
101+ t .Errorf ("generated code does not match golden file.\n Generated:\n %s\n Expected:\n %s" ,
102+ generated , expected )
103+ }
104+
105+ // run go vet on the output file. print any errors from stderr
106+ cmd := exec .Command ("go" , "vet" , "-all" , goldenFile )
107+ var stderr bytes.Buffer
108+ cmd .Stderr = & stderr
109+ if err := cmd .Run (); err != nil {
110+ t .Errorf ("go vet failed for %s: %v\n Stderr:\n %s" , goldenFile , err , stderr .String ())
100111 }
112+
113+ // Check if namespace has -main function with expected output
114+ // TODO: consider dropping this; we really just want to ensure
115+ // the interpreter, here, behaves the same as the generated code
116+ testMainFunction (t , ns )
101117}
102118
103119// getNamespaceFromFile attempts to extract the namespace declaration from a file
@@ -149,7 +165,7 @@ func testMainFunction(t *testing.T, ns *lang.Namespace) {
149165
150166 expectedOutput := meta .ValAt (lang .NewKeyword ("expected-output" ))
151167 expectedError := meta .ValAt (lang .NewKeyword ("expected-error" ))
152-
168+
153169 if expectedOutput == nil && expectedError == nil {
154170 return
155171 }
@@ -166,7 +182,7 @@ func testMainFunction(t *testing.T, ns *lang.Namespace) {
166182 t .Errorf ("-main should have panicked with %v, but didn't" , expectedError )
167183 }
168184 }()
169-
185+
170186 // Run -main - should panic
171187 mainVar .Invoke ()
172188 return
0 commit comments