diff --git a/reader/clj_conformance_test.go b/reader/clj_conformance_test.go index cca47a6..5ab5e7d 100644 --- a/reader/clj_conformance_test.go +++ b/reader/clj_conformance_test.go @@ -78,6 +78,9 @@ func FuzzCLJConformance(f *testing.F) { gljValue, gljErr := r.ReadOne() if (cljErr == nil) != (gljErr == nil) { + if isCLJConformanceErrorException(cljErr, cljExpr) { + t.Skipf("clj error: %v", cljErr) + } t.Logf("clj out: %v", cljExpr) t.Fatalf("error mismatch: cljErr=%v gljErr=%v", cljErr, gljErr) } @@ -109,6 +112,23 @@ func FuzzCLJConformance(f *testing.F) { }) } +// isCLJConformanceErrorException returns true if the error is one that +// we expect to see in the clj conformance tests. +func isCLJConformanceErrorException(cljErr error, cljOut string) bool { + if cljErr == nil { + return false + } + + // Java and Go both support regex repetitions in braces (e.g. "a{n, + // m}" for multiple "a"s), but Go's regex engine is more permissive + // and will interpret braces as literals if they don't match the + // regex repetition syntax. + if strings.Contains(cljOut, "Execution error (PatternSyntaxException) at java.util.regex.Pattern/error") && strings.Contains(cljOut, "Illegal repetition") { + return true + } + return false +} + type cljReaderCommand struct { cmd *exec.Cmd pipeIn io.WriteCloser diff --git a/reader/testdata/clj-cache/read/30e28cb5f9df7ee57fbbf9f7f81765043d2e69a56db713e107d8f32c34c207bb.glj b/reader/testdata/clj-cache/read/30e28cb5f9df7ee57fbbf9f7f81765043d2e69a56db713e107d8f32c34c207bb.glj new file mode 100644 index 0000000..800e47d --- /dev/null +++ b/reader/testdata/clj-cache/read/30e28cb5f9df7ee57fbbf9f7f81765043d2e69a56db713e107d8f32c34c207bb.glj @@ -0,0 +1,8 @@ +false +Execution error (PatternSyntaxException) at java.util.regex.Pattern/error (Pattern.java:2028). +Illegal repetition near index 37 +(\d+)\.(\d+)\.(\d+)(?:-([a-zA-Z0-9_]{{{{{+)(SNAPSHOT))? + ^ + +Full report at: +/var/folders/0m/y60b85m145lffbfdfk86129r0000gn/T/clojure-708558860762531557.edn diff --git a/reader/testdata/clj-cache/read/90c2120b8a77bd7ed9e949639bbbeb9be53852d0e4671a1fdcb55b3c99d19ae5.glj b/reader/testdata/clj-cache/read/90c2120b8a77bd7ed9e949639bbbeb9be53852d0e4671a1fdcb55b3c99d19ae5.glj new file mode 100644 index 0000000..17120c5 --- /dev/null +++ b/reader/testdata/clj-cache/read/90c2120b8a77bd7ed9e949639bbbeb9be53852d0e4671a1fdcb55b3c99d19ae5.glj @@ -0,0 +1,6 @@ +false +Execution error at user/eval1 (REPL:1). +Invalid token: :b::c + +Full report at: +/var/folders/0m/y60b85m145lffbfdfk86129r0000gn/T/clojure-5969457839634569061.edn diff --git a/reader/testdata/fuzz/FuzzCLJConformance/0d40b8d4398e177684afa1c78fd95d9b348d7125c248de27028a7a4c766340d0 b/reader/testdata/fuzz/FuzzCLJConformance/0d40b8d4398e177684afa1c78fd95d9b348d7125c248de27028a7a4c766340d0 new file mode 100644 index 0000000..66b719f --- /dev/null +++ b/reader/testdata/fuzz/FuzzCLJConformance/0d40b8d4398e177684afa1c78fd95d9b348d7125c248de27028a7a4c766340d0 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("#\"(\\d+)\\.(\\d+)\\.(\\d+)(?:-([a-zA-Z0-9_]{{{{{+)(SNAPSHOT))?\"\n")