test(stageb): ParserStringUtilsBox.skip_ws Void < 0 TypeError 再現テスト追加
- 目的: commit227ce61dの修正効果を検証 - テスト内容: 1. mir_stageb_string_utils_skip_ws_compile: MIRコンパイル成功確認 2. mir_stageb_string_utils_skip_ws_exec_reproduce_void_lt_zero: エラー再現(修正前用) 3. mir_stageb_string_utils_skip_ws_exec_success: 正常動作確認(修正後用・ignore) - 検証済み: - 修正前 (b00cc8d5): Type error: unsupported compare Le on Void and Integer(0) - 修正後 (227ce61d): RC=0 正常終了 - Phase 25.1: Stage-B scan系バグ修正完了
This commit is contained in:
142
src/tests/mir_stageb_string_utils_skip_ws.rs
Normal file
142
src/tests/mir_stageb_string_utils_skip_ws.rs
Normal file
@ -0,0 +1,142 @@
|
||||
/*!
|
||||
* Phase 25.1 - ParserStringUtilsBox.skip_ws Void < 0 TypeError 再現テスト
|
||||
*
|
||||
* 目的: stageb_program_min_using_only.hako で発生する
|
||||
* 「Void < Integer(0)」TypeError を Rust テストで再現する
|
||||
*
|
||||
* エラー詳細:
|
||||
* - 関数: ParserStringUtilsBox.skip_ws/2
|
||||
* - 条件: loop(j < n) の Compare で Void < 0 が発生
|
||||
* - 原因: j または n が Void になるパスが存在
|
||||
*/
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::ast::ASTNode;
|
||||
use crate::backend::VM;
|
||||
use crate::mir::{MirCompiler, MirVerifier};
|
||||
use crate::parser::NyashParser;
|
||||
|
||||
/// 最小再現ケース: ParserStringUtilsBox + Main
|
||||
fn make_minimal_src() -> String {
|
||||
// ParserStringUtilsBox 本体を include
|
||||
let utils =
|
||||
include_str!("../../lang/src/compiler/parser/scan/parser_string_utils_box.hako");
|
||||
|
||||
// 最小 Main: stageb_program_min_using_only と同等の呼び出し
|
||||
let main = r#"
|
||||
using lang.compiler.parser.scan.parser_string_utils_box as ParserStringUtilsBox
|
||||
|
||||
static box Main {
|
||||
main(args) {
|
||||
// stageb_program_min_using_only と同じ入力
|
||||
local src = "using \"foo/bar.hako\" as Foo\n"
|
||||
|
||||
// skip_ws を直接呼び出し(Void < 0 を誘発)
|
||||
local pos = ParserStringUtilsBox.skip_ws(src, 0)
|
||||
|
||||
print("skip_ws result: " + ("" + pos))
|
||||
return 0
|
||||
}
|
||||
}
|
||||
"#;
|
||||
|
||||
format!("{}\n{}", utils, main)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mir_stageb_string_utils_skip_ws_compile() {
|
||||
// Enable Stage-3 parser for 'local' keyword
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
|
||||
let src = make_minimal_src();
|
||||
let ast: ASTNode = NyashParser::parse_from_string(&src).expect("parse should succeed");
|
||||
|
||||
let mut mc = MirCompiler::with_options(true); // Stage-3 enabled
|
||||
let cr = mc
|
||||
.compile(ast)
|
||||
.expect("ParserStringUtilsBox compile should succeed");
|
||||
|
||||
// MIR 検証
|
||||
let mut verifier = MirVerifier::new();
|
||||
if let Err(errors) = verifier.verify_module(&cr.module) {
|
||||
eprintln!("[mir-verify] Verification failed:");
|
||||
for e in &errors {
|
||||
eprintln!(" - {}", e);
|
||||
}
|
||||
panic!("MIR verification failed for ParserStringUtilsBox.skip_ws");
|
||||
}
|
||||
|
||||
println!("✅ MIR compile and verify succeeded");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mir_stageb_string_utils_skip_ws_exec_reproduce_void_lt_zero() {
|
||||
// Enable Stage-3 parser
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
|
||||
let src = make_minimal_src();
|
||||
let ast: ASTNode = NyashParser::parse_from_string(&src).expect("parse ok");
|
||||
|
||||
let mut mc = MirCompiler::with_options(true); // Stage-3 enabled
|
||||
let cr = mc.compile(ast).expect("compile ok");
|
||||
|
||||
// MIR 検証
|
||||
let mut verifier = MirVerifier::new();
|
||||
verifier
|
||||
.verify_module(&cr.module)
|
||||
.expect("MIR verify should pass");
|
||||
|
||||
// VM 実行(ここで Void < 0 エラーが出るはず)
|
||||
let mut vm = VM::new();
|
||||
let exec_result = vm.execute_module(&cr.module);
|
||||
|
||||
// 現状は TypeError が出ることを確認(再現用)
|
||||
if let Err(e) = exec_result {
|
||||
let err_msg = format!("{:?}", e);
|
||||
println!("❌ Expected error reproduced: {}", err_msg);
|
||||
|
||||
// Void < Integer(0) エラーを検出
|
||||
assert!(
|
||||
err_msg.contains("Void") || err_msg.contains("TypeError"),
|
||||
"Expected Void < Integer(0) TypeError, got: {}",
|
||||
err_msg
|
||||
);
|
||||
} else {
|
||||
panic!("Expected Void < 0 TypeError, but execution succeeded!");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore] // このテストは修正後にパスするはず
|
||||
fn mir_stageb_string_utils_skip_ws_exec_success() {
|
||||
// Enable Stage-3 parser
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
|
||||
let src = make_minimal_src();
|
||||
let ast: ASTNode = NyashParser::parse_from_string(&src).expect("parse ok");
|
||||
|
||||
let mut mc = MirCompiler::with_options(true); // Stage-3 enabled
|
||||
let cr = mc.compile(ast).expect("compile ok");
|
||||
|
||||
// MIR 検証
|
||||
let mut verifier = MirVerifier::new();
|
||||
verifier
|
||||
.verify_module(&cr.module)
|
||||
.expect("MIR verify should pass");
|
||||
|
||||
// VM 実行(修正後は成功するはず)
|
||||
let mut vm = VM::new();
|
||||
let exec_result = vm.execute_module(&cr.module);
|
||||
|
||||
assert!(
|
||||
exec_result.is_ok(),
|
||||
"skip_ws should succeed after Void < 0 fix"
|
||||
);
|
||||
|
||||
println!("✅ skip_ws execution succeeded (bug fixed!)");
|
||||
}
|
||||
}
|
||||
@ -19,6 +19,7 @@ pub mod mir_stage1_using_resolver_verify;
|
||||
pub mod stage1_cli_entry_ssa_smoke;
|
||||
pub mod mir_stageb_like_args_length;
|
||||
pub mod mir_stageb_loop_break_continue;
|
||||
pub mod mir_stageb_string_utils_skip_ws; // Phase 25.1: skip_ws Void < 0 TypeError 再現
|
||||
pub mod mir_value_kind; // Phase 26-A-5: ValueId型安全化統合テスト
|
||||
pub mod nyash_abi_basic;
|
||||
pub mod parser_static_box_members;
|
||||
|
||||
Reference in New Issue
Block a user