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  }