package fixed_test import ( "go/ast" "go/parser" "go/token" "os" "path/filepath" "strings" "testing" ) // Determinism depends on there being no floating-point arithmetic anywhere in // the simulation path: floats drift between architectures and between native // and WASM builds, which would silently break round verification. This test // fails the build if a float type is ever introduced. // // Test files are exempt, since statistical assertions legitimately use floats. func TestNoFloatingPointInDeterministicPackages(t *testing.T) { for _, dir := range []string{".", "../sim"} { if _, err := os.Stat(dir); os.IsNotExist(err) { continue } fset := token.NewFileSet() pkgs, err := parser.ParseDir(fset, dir, nil, 0) if err != nil { t.Fatalf("parse %s: %v", dir, err) } for _, pkg := range pkgs { for name, file := range pkg.Files { if strings.HasSuffix(name, "_test.go") { continue } ast.Inspect(file, func(n ast.Node) bool { switch node := n.(type) { case *ast.Ident: if node.Name == "float32" || node.Name == "float64" { t.Errorf("%s: forbidden float type %q in deterministic package", filepath.Base(name), node.Name) } case *ast.BasicLit: if node.Kind == token.FLOAT { t.Errorf("%s: forbidden float literal %s", filepath.Base(name), node.Value) } } return true }) } } } }