Phase 30.1 & 73: Stage-3 features env and JoinIR flag cleanup
This commit is contained in:
@ -1,25 +1,68 @@
|
||||
use nyash_rust::parser::NyashParser;
|
||||
|
||||
fn with_env<K: AsRef<str>, V: AsRef<str>, F: FnOnce()>(key: K, val: Option<V>, f: F) {
|
||||
let k = key.as_ref().to_string();
|
||||
let prev = std::env::var(&k).ok();
|
||||
match val {
|
||||
Some(v) => std::env::set_var(&k, v.as_ref()),
|
||||
None => std::env::remove_var(&k),
|
||||
fn with_stage3_env<F: FnOnce()>(
|
||||
features: Option<&str>,
|
||||
parser_stage3: Option<&str>,
|
||||
hako_stage3: Option<&str>,
|
||||
f: F,
|
||||
) {
|
||||
let prev_features = std::env::var("NYASH_FEATURES").ok();
|
||||
let prev_parser = std::env::var("NYASH_PARSER_STAGE3").ok();
|
||||
let prev_hako = std::env::var("HAKO_PARSER_STAGE3").ok();
|
||||
|
||||
match features {
|
||||
Some(v) => std::env::set_var("NYASH_FEATURES", v),
|
||||
None => std::env::remove_var("NYASH_FEATURES"),
|
||||
}
|
||||
match parser_stage3 {
|
||||
Some(v) => std::env::set_var("NYASH_PARSER_STAGE3", v),
|
||||
None => std::env::remove_var("NYASH_PARSER_STAGE3"),
|
||||
}
|
||||
match hako_stage3 {
|
||||
Some(v) => std::env::set_var("HAKO_PARSER_STAGE3", v),
|
||||
None => std::env::remove_var("HAKO_PARSER_STAGE3"),
|
||||
}
|
||||
|
||||
f();
|
||||
match prev {
|
||||
Some(p) => std::env::set_var(&k, p),
|
||||
None => std::env::remove_var(&k),
|
||||
|
||||
match prev_features {
|
||||
Some(v) => std::env::set_var("NYASH_FEATURES", v),
|
||||
None => std::env::remove_var("NYASH_FEATURES"),
|
||||
}
|
||||
match prev_parser {
|
||||
Some(v) => std::env::set_var("NYASH_PARSER_STAGE3", v),
|
||||
None => std::env::remove_var("NYASH_PARSER_STAGE3"),
|
||||
}
|
||||
match prev_hako {
|
||||
Some(v) => std::env::set_var("HAKO_PARSER_STAGE3", v),
|
||||
None => std::env::remove_var("HAKO_PARSER_STAGE3"),
|
||||
}
|
||||
}
|
||||
|
||||
// Legacy gate 動作テスト(Phase-3 Stage3 gating の歴史的仕様).
|
||||
// 現在は Stage3 パーサを常時 ON に近い運用にしているため、実運用とはズレる。
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn stage3_default_enabled_accepts_try_and_throw() {
|
||||
with_stage3_env(None, None, None, || {
|
||||
let code_try = "try { local x = 1 } catch () { }";
|
||||
let res_try = NyashParser::parse_from_string(code_try);
|
||||
assert!(
|
||||
res_try.is_ok(),
|
||||
"try should parse when Stage-3 is default-enabled: {:?}",
|
||||
res_try.err()
|
||||
);
|
||||
|
||||
let code_throw = "throw 1";
|
||||
let res_throw = NyashParser::parse_from_string(code_throw);
|
||||
assert!(
|
||||
res_throw.is_ok(),
|
||||
"throw should parse when Stage-3 is default-enabled: {:?}",
|
||||
res_throw.err()
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn stage3_disabled_rejects_try_and_throw() {
|
||||
with_env("NYASH_PARSER_STAGE3", None::<&str>, || {
|
||||
with_stage3_env(None, Some("0"), Some("0"), || {
|
||||
let code_try = "try { local x = 1 } catch () { }";
|
||||
let res_try = NyashParser::parse_from_string(code_try);
|
||||
assert!(res_try.is_err(), "try should be rejected when gate is off");
|
||||
@ -35,7 +78,7 @@ fn stage3_disabled_rejects_try_and_throw() {
|
||||
|
||||
#[test]
|
||||
fn stage3_enabled_accepts_throw() {
|
||||
with_env("NYASH_PARSER_STAGE3", Some("1"), || {
|
||||
with_stage3_env(Some("stage3"), None, None, || {
|
||||
let code = "throw (1 + 2)";
|
||||
let res = NyashParser::parse_from_string(code);
|
||||
assert!(
|
||||
@ -48,7 +91,7 @@ fn stage3_enabled_accepts_throw() {
|
||||
|
||||
#[test]
|
||||
fn stage3_enabled_accepts_try_catch_variants() {
|
||||
with_env("NYASH_PARSER_STAGE3", Some("1"), || {
|
||||
with_stage3_env(Some("stage3"), None, None, || {
|
||||
// (Type var)
|
||||
let code1 = r#"
|
||||
try { local a = 1 }
|
||||
|
||||
Reference in New Issue
Block a user