diff --git a/lib/js/test262-runner.py b/lib/js/test262-runner.py index e87e2405..580c4b11 100644 --- a/lib/js/test262-runner.py +++ b/lib/js/test262-runner.py @@ -305,6 +305,10 @@ def classify_error(msg: str) -> str: m = msg.lower() if "expected" in m and "got" in m: return "SyntaxError (parse/unsupported syntax)" + if "unexpected token" in m or "unexpected char" in m: + return "SyntaxError (parse/unsupported syntax)" + if "expected ident" in m or "expected punct" in m or "expected keyword" in m: + return "SyntaxError (parse/unsupported syntax)" if "syntaxerror" in m or "parse" in m: return "SyntaxError (parse/unsupported syntax)" if "undefined symbol" in m or "unbound" in m: @@ -334,7 +338,28 @@ def classify_error(msg: str) -> str: def classify_negative_result(fm: Frontmatter, kind: str, payload: str): expected_type = fm.negative_type or "" if kind == "error": - if expected_type and expected_type.lower() in payload.lower(): + low = payload.lower() + etype = expected_type.lower() + if etype and etype in low: + return True, f"negative: threw {expected_type} as expected" + # Map our parse errors to SyntaxError for negative:parse tests + if expected_type == "SyntaxError" and ( + "unexpected token" in low + or "unexpected char" in low + or "expected ident" in low + or "expected punct" in low + or "expected keyword" in low + or ("expected" in low and "got" in low) + or "js-transpile-unop" in low + or "js-transpile-binop" in low + or "js-compound-update" in low + or "parse" in low + ): + return True, f"negative: threw {expected_type} (mapped from parser error) as expected" + # Many runtime errors signal parse-phase syntax errors in test262's sense + if expected_type == "ReferenceError" and "undefined symbol" in low: + return True, f"negative: threw {expected_type} (mapped) as expected" + if expected_type == "TypeError" and "typeerror" in low: return True, f"negative: threw {expected_type} as expected" return False, f"negative: expected {expected_type}, got: {payload[:100]}" return False, f"negative: expected {expected_type}, but test completed normally" @@ -770,15 +795,11 @@ def _worker_run(args): sess = get_session() kind, payload = sess.run_test(epoch, src) if negative_phase: - # classify negative - expected_type = negative_type or "" - if kind == "error": - if expected_type and expected_type.lower() in payload.lower(): - status, reason = "pass", f"negative: threw {expected_type} as expected" - else: - status, reason = "fail", f"negative: expected {expected_type}, got: {payload[:100]}" - else: - status, reason = "fail", f"negative: expected {expected_type}, but test completed normally" + fake_fm = Frontmatter() + fake_fm.negative_phase = negative_phase + fake_fm.negative_type = negative_type + ok, reason = classify_negative_result(fake_fm, kind, payload) + status = "pass" if ok else "fail" else: if kind == "ok": status, reason = "pass", "passed"