diff --git a/docs/private b/docs/private index 0866b96a..a5752595 160000 --- a/docs/private +++ b/docs/private @@ -1 +1 @@ -Subproject commit 0866b96a8516e4a32374091049fbe6e0c552e8db +Subproject commit a57525957d8bbc7d69f17c2285833706c0cda7e0 diff --git a/src/mir/join_ir/normalized/dev_fixtures.rs b/src/mir/join_ir/normalized/dev_fixtures.rs index 52fd1978..ae368fb3 100644 --- a/src/mir/join_ir/normalized/dev_fixtures.rs +++ b/src/mir/join_ir/normalized/dev_fixtures.rs @@ -24,6 +24,10 @@ pub enum NormalizedDevFixture { /// Refactor-B: ContinueReturn multi minimal (multiple return-if with same value) /// Note: This also tests Null literal support from Refactor-A ContinueReturnMultiMin, + /// Parse Array minimal (Phase Next: _parse_array homomorphic fixture) + ParseArrayMin, + /// Parse Object minimal (Phase Next: _parse_object homomorphic fixture) + ParseObjectMin, } impl NormalizedDevFixture { @@ -40,6 +44,8 @@ impl NormalizedDevFixture { Self::PatternContinueReturnMin => "pattern_continue_return_minimal", Self::ParseStringCompositeMin => "parse_string_composite_minimal", Self::ContinueReturnMultiMin => "continue_return_multi_minimal", + Self::ParseArrayMin => "parse_array_minimal", + Self::ParseObjectMin => "parse_object_minimal", } } @@ -64,6 +70,12 @@ impl NormalizedDevFixture { Self::ContinueReturnMultiMin => { "../../../../docs/private/roadmap2/phases/normalized_dev/fixtures/continue_return_multi_min.program.json" } + Self::ParseArrayMin => { + "../../../../docs/private/roadmap2/phases/normalized_dev/fixtures/parse_array_min.program.json" + } + Self::ParseObjectMin => { + "../../../../docs/private/roadmap2/phases/normalized_dev/fixtures/parse_object_min.program.json" + } } } @@ -76,7 +88,9 @@ impl NormalizedDevFixture { | Self::Pattern4JsonParserParseObjectContinueSkipWs | Self::PatternContinueReturnMin | Self::ParseStringCompositeMin - | Self::ContinueReturnMultiMin => FunctionRoute::LoopFrontend, + | Self::ContinueReturnMultiMin + | Self::ParseArrayMin + | Self::ParseObjectMin => FunctionRoute::LoopFrontend, } } @@ -104,6 +118,12 @@ impl NormalizedDevFixture { Self::ContinueReturnMultiMin => include_str!( "../../../../docs/private/roadmap2/phases/normalized_dev/fixtures/continue_return_multi_min.program.json" ), + Self::ParseArrayMin => include_str!( + "../../../../docs/private/roadmap2/phases/normalized_dev/fixtures/parse_array_min.program.json" + ), + Self::ParseObjectMin => include_str!( + "../../../../docs/private/roadmap2/phases/normalized_dev/fixtures/parse_object_min.program.json" + ), } } @@ -134,6 +154,8 @@ pub const ALL_DEV_FIXTURES: &[NormalizedDevFixture] = &[ NormalizedDevFixture::PatternContinueReturnMin, NormalizedDevFixture::ParseStringCompositeMin, NormalizedDevFixture::ContinueReturnMultiMin, + NormalizedDevFixture::ParseArrayMin, + NormalizedDevFixture::ParseObjectMin, ]; #[cfg(test)] diff --git a/src/mir/join_ir/normalized/fixtures.rs b/src/mir/join_ir/normalized/fixtures.rs index f2919196..f086374f 100644 --- a/src/mir/join_ir/normalized/fixtures.rs +++ b/src/mir/join_ir/normalized/fixtures.rs @@ -791,6 +791,22 @@ pub fn build_parse_string_composite_min_structured_for_normalized_dev() -> JoinM NormalizedDevFixture::ParseStringCompositeMin.load_and_lower() } +/// Parse Array minimal を Structured で組み立てるヘルパー +/// +/// Fixture: docs/private/roadmap2/phases/normalized_dev/fixtures/parse_array_min.program.json +pub fn build_parse_array_min_structured_for_normalized_dev() -> JoinModule { + use super::dev_fixtures::NormalizedDevFixture; + NormalizedDevFixture::ParseArrayMin.load_and_lower() +} + +/// Parse Object minimal を Structured で組み立てるヘルパー +/// +/// Fixture: docs/private/roadmap2/phases/normalized_dev/fixtures/parse_object_min.program.json +pub fn build_parse_object_min_structured_for_normalized_dev() -> JoinModule { + use super::dev_fixtures::NormalizedDevFixture; + NormalizedDevFixture::ParseObjectMin.load_and_lower() +} + /// まとめて import したいとき用のプレリュード。 pub mod prelude { pub use super::{ @@ -809,6 +825,8 @@ pub mod prelude { build_pattern4_continue_min_structured_for_normalized_dev, build_pattern_continue_return_min_structured_for_normalized_dev, build_parse_string_composite_min_structured_for_normalized_dev, + build_parse_array_min_structured_for_normalized_dev, + build_parse_object_min_structured_for_normalized_dev, build_selfhost_if_sum_p3_ext_structured_for_normalized_dev, build_selfhost_if_sum_p3_structured_for_normalized_dev, build_selfhost_token_scan_p2_accum_structured_for_normalized_dev, diff --git a/tests/normalized_joinir_min.rs b/tests/normalized_joinir_min.rs index 239b959c..179b59a3 100644 --- a/tests/normalized_joinir_min.rs +++ b/tests/normalized_joinir_min.rs @@ -20,6 +20,8 @@ use nyash_rust::mir::join_ir::normalized::fixtures::{ build_pattern4_continue_min_structured_for_normalized_dev, build_pattern_continue_return_min_structured_for_normalized_dev, build_parse_string_composite_min_structured_for_normalized_dev, + build_parse_array_min_structured_for_normalized_dev, + build_parse_object_min_structured_for_normalized_dev, build_selfhost_args_parse_p2_structured_for_normalized_dev, build_selfhost_if_sum_p3_ext_structured_for_normalized_dev, build_selfhost_if_sum_p3_structured_for_normalized_dev, diff --git a/tests/normalized_joinir_min/shapes.rs b/tests/normalized_joinir_min/shapes.rs index 37d33570..9958e1a0 100644 --- a/tests/normalized_joinir_min/shapes.rs +++ b/tests/normalized_joinir_min/shapes.rs @@ -366,7 +366,7 @@ fn test_phase88_jsonparser_unescape_string_step2_min_rejects_non_const_then_i_up assert!(res.is_err(), "expected fail-fast panic"); let msg = panic_message(res.err().unwrap()); assert!( - msg.contains("then i update of form (i + const)"), + msg.contains("then' branch step increment") || msg.contains("then i update of form (i + const)"), "unexpected panic message: {}", msg ); @@ -616,3 +616,73 @@ fn test_continue_return_multi_min_returns_null_at_first_match() { // - Refactor-B: Multiple return-if with same value (i==3, i==7 both return null) assert_eq!(result, JoinValue::Unit, "Expected Unit (null) from first return-if at i=3"); } + +/// Phase Next: Parse Array minimal - vm_bridge direct vs structured +#[test] +fn test_parse_array_min_vm_bridge_direct_matches_structured() { + use nyash_rust::mir::join_ir::normalized::dev_fixtures::NormalizedDevFixture; + + let _ctx = normalized_dev_test_ctx(); + let structured = NormalizedDevFixture::ParseArrayMin.load_and_lower(); + let entry = structured.entry.expect("entry required"); + + let input = [JoinValue::Int(10)]; + let base = run_joinir_vm_bridge(&structured, entry, &input, false); + let dev = run_joinir_vm_bridge(&structured, entry, &input, true); + + assert_eq!(base, dev, "vm bridge mismatch for parse_array min"); +} + +/// Phase Next: Parse Array minimal - expected output test +#[test] +fn test_parse_array_min_expected_output() { + use nyash_rust::mir::join_ir::normalized::dev_fixtures::NormalizedDevFixture; + + let _ctx = normalized_dev_test_ctx(); + let structured = NormalizedDevFixture::ParseArrayMin.load_and_lower(); + let entry = structured.entry.expect("entry required"); + + let input = [JoinValue::Int(10)]; + let result = run_joinir_vm_bridge(&structured, entry, &input, true); + + assert_eq!( + result, + JoinValue::Int(6), + "Expected acc=6 for n=10 (i=0,1,2,4,5,6 increments, i=3 continue, i=7 return)" + ); +} + +/// Phase Next: Parse Object minimal - vm_bridge direct vs structured +#[test] +fn test_parse_object_min_vm_bridge_direct_matches_structured() { + use nyash_rust::mir::join_ir::normalized::dev_fixtures::NormalizedDevFixture; + + let _ctx = normalized_dev_test_ctx(); + let structured = NormalizedDevFixture::ParseObjectMin.load_and_lower(); + let entry = structured.entry.expect("entry required"); + + let input = [JoinValue::Int(10)]; + let base = run_joinir_vm_bridge(&structured, entry, &input, false); + let dev = run_joinir_vm_bridge(&structured, entry, &input, true); + + assert_eq!(base, dev, "vm bridge mismatch for parse_object min"); +} + +/// Phase Next: Parse Object minimal - expected output test +#[test] +fn test_parse_object_min_expected_output() { + use nyash_rust::mir::join_ir::normalized::dev_fixtures::NormalizedDevFixture; + + let _ctx = normalized_dev_test_ctx(); + let structured = NormalizedDevFixture::ParseObjectMin.load_and_lower(); + let entry = structured.entry.expect("entry required"); + + let input = [JoinValue::Int(10)]; + let result = run_joinir_vm_bridge(&structured, entry, &input, true); + + assert_eq!( + result, + JoinValue::Int(7), + "Expected acc=7 for n=10 (i=0,1,2,3,5,6,7 increments, i=4 continue, i=8 return)" + ); +}