github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/gnovm/tests/file_test.go (about) 1 package tests 2 3 import ( 4 "flag" 5 "io/fs" 6 "os" 7 "path" 8 "path/filepath" 9 "strings" 10 "testing" 11 12 gno "github.com/gnolang/gno/gnovm/pkg/gnolang" 13 ) 14 15 var withSync = flag.Bool("update-golden-tests", false, "rewrite tests updating Realm: and Output: with new values where changed") 16 17 func TestFileStr(t *testing.T) { 18 filePath := filepath.Join(".", "files", "str.gno") 19 runFileTest(t, filePath, WithNativeLibs()) 20 } 21 22 // Run tests in the `files` directory using shims from stdlib 23 // to native go standard library. 24 func TestFilesNative(t *testing.T) { 25 baseDir := filepath.Join(".", "files") 26 runFileTests(t, baseDir, []string{"*_stdlibs*"}, WithNativeLibs()) 27 } 28 29 // Test files using standard library in stdlibs/. 30 func TestFiles(t *testing.T) { 31 baseDir := filepath.Join(".", "files") 32 runFileTests(t, baseDir, []string{"*_native*"}) 33 } 34 35 func TestChallenges(t *testing.T) { 36 baseDir := filepath.Join(".", "challenges") 37 runFileTests(t, baseDir, nil) 38 } 39 40 func filterFileTests(t *testing.T, files []fs.DirEntry, ignore []string) []fs.DirEntry { 41 t.Helper() 42 43 for i := 0; i < len(files); i++ { 44 file := files[i] 45 skip := func() { files = append(files[:i], files[i+1:]...); i-- } 46 if filepath.Ext(file.Name()) != ".gno" { 47 skip() 48 continue 49 } 50 for _, is := range ignore { 51 if match, err := path.Match(is, file.Name()); match { 52 skip() 53 continue 54 } else if err != nil { 55 t.Fatalf("error parsing glob pattern %q: %v", is, err) 56 } 57 } 58 if testing.Short() && strings.Contains(file.Name(), "_long") { 59 t.Logf("skipping test %s in short mode.", file.Name()) 60 skip() 61 continue 62 } 63 } 64 return files 65 } 66 67 // ignore are glob patterns to ignore 68 func runFileTests(t *testing.T, baseDir string, ignore []string, opts ...RunFileTestOption) { 69 t.Helper() 70 71 opts = append([]RunFileTestOption{WithSyncWanted(*withSync)}, opts...) 72 73 files, err := os.ReadDir(baseDir) 74 if err != nil { 75 t.Fatal(err) 76 } 77 78 files = filterFileTests(t, files, ignore) 79 80 for _, file := range files { 81 file := file 82 t.Run(file.Name(), func(t *testing.T) { 83 if file.Name() == "composite0b.gno" { 84 t.Skip("challenge failing") 85 } 86 if file.Name() == "composite1b.gno" { 87 t.Skip("challenge failing") 88 } 89 if file.Name() == "not_a_type.gno" { 90 t.Skip("challenge failing") 91 } 92 if file.Name() == "unused0.gno" { 93 t.Skip("challenge failing") 94 } 95 96 runFileTest(t, filepath.Join(baseDir, file.Name()), opts...) 97 }) 98 } 99 } 100 101 func runFileTest(t *testing.T, path string, opts ...RunFileTestOption) { 102 t.Helper() 103 104 opts = append([]RunFileTestOption{WithSyncWanted(*withSync)}, opts...) 105 106 var logger loggerFunc 107 if gno.IsDebug() && testing.Verbose() { 108 logger = t.Log 109 } 110 rootDir := filepath.Join("..", "..") 111 err := RunFileTest(rootDir, path, append(opts, WithLoggerFunc(logger))...) 112 if err != nil { 113 t.Fatalf("got error: %v", err) 114 } 115 }