// Phase 2 精度テスト - yyjson相当精度の検証 using "apps/lib/json_native/parser/parser.hako" as JsonParser using "apps/lib/json_native/parser/parser.hako" as JsonParserUtils static box Phase2AccuracyTest { main() { print("🎯 Phase 2 完成テスト - yyjson相当精度検証") print("美しいモジュラー設計 vs 「ずれ」問題の完全解決") // 1. 基本精度テスト print("\n1️⃣ 基本JSON精度テスト") this.test_basic_accuracy() // 2. エスケープ処理精度テスト print("\n2️⃣ エスケープ処理精度テスト") this.test_escape_accuracy() // 3. ネスト構造精度テスト print("\n3️⃣ ネスト構造精度テスト") this.test_nesting_accuracy() // 4. 境界条件精度テスト print("\n4️⃣ 境界条件精度テスト") this.test_boundary_accuracy() // 5. エラー検出精度テスト print("\n5️⃣ エラー検出精度テスト") this.test_error_detection() // 6. ラウンドトリップテスト print("\n6️⃣ ラウンドトリップテスト") this.test_roundtrip_accuracy() print("\n🏆 Phase 2 精度テスト完了!") return 0 } // 基本JSON精度テスト test_basic_accuracy() { local test_cases = new ArrayBox() // 基本値テスト test_cases.push({input: "null", expected: "null"}) test_cases.push({input: "true", expected: "true"}) test_cases.push({input: "false", expected: "false"}) test_cases.push({input: "42", expected: "42"}) test_cases.push({input: "-123", expected: "-123"}) test_cases.push({input: "\"hello\"", expected: "\"hello\""}) // 空構造テスト test_cases.push({input: "[]", expected: "[]"}) test_cases.push({input: "{}", expected: "{}"}) local passed = 0 local total = test_cases.length() local i = 0 loop(i < total) { local test_case = test_cases.get(i) local input = test_case.input local expected = test_case.expected local result = JsonParserUtils.roundtrip_test(input) if result == expected { print("✅ " + input + " → " + result) passed = passed + 1 } else { print("❌ " + input + " → " + result + " (expected: " + expected + ")") } i = i + 1 } print("Basic accuracy: " + passed + "/" + total + " passed") } // エスケープ処理精度テスト test_escape_accuracy() { local escape_cases = new ArrayBox() // 基本エスケープ escape_cases.push({input: "\"say \\\"hello\\\"\"", desc: "Quote escaping"}) escape_cases.push({input: "\"path\\\\to\\\\file\"", desc: "Backslash escaping"}) escape_cases.push({input: "\"line1\\nline2\"", desc: "Newline escaping"}) escape_cases.push({input: "\"tab\\there\"", desc: "Tab escaping"}) // Unicode エスケープ(簡易版) // escape_cases.push({input: "\"\\u0041\\u0042\"", desc: "Unicode escaping"}) local i = 0 loop(i < escape_cases.length()) { local test_case = escape_cases.get(i) local input = test_case.input local desc = test_case.desc print("Testing: " + desc) print(" Input: " + input) local parsed = JsonParserUtils.parse_json(input) if parsed != null { local output = parsed.stringify() print(" Output: " + output) print(" ✅ Success") } else { print(" ❌ Parse failed") } i = i + 1 } } // ネスト構造精度テスト test_nesting_accuracy() { local nesting_cases = new ArrayBox() // 浅いネスト nesting_cases.push("{\"a\": {\"b\": \"value\"}}") nesting_cases.push("[1, [2, 3], 4]") nesting_cases.push("{\"array\": [1, 2, 3], \"object\": {\"key\": \"value\"}}") // 複雑なネスト nesting_cases.push("{\"users\": [{\"name\": \"Alice\", \"age\": 30}, {\"name\": \"Bob\", \"age\": 25}]}") nesting_cases.push("[{\"type\": \"A\", \"data\": {\"x\": 1}}, {\"type\": \"B\", \"data\": {\"y\": 2}}]") local i = 0 loop(i < nesting_cases.length()) { local input = nesting_cases.get(i) print("Testing complex nesting:") print(" Input: " + input) local parsed = JsonParserUtils.parse_json(input) if parsed != null { local output = parsed.stringify() print(" Output: " + output) print(" ✅ Nesting handled correctly") } else { print(" ❌ Nesting parse failed") } print("") i = i + 1 } } // 境界条件精度テスト test_boundary_accuracy() { local boundary_cases = new ArrayBox() // 空白処理 boundary_cases.push({input: " { \"key\" : \"value\" } ", desc: "Whitespace handling"}) boundary_cases.push({input: "{\n \"key\": \"value\"\n}", desc: "Newline handling"}) boundary_cases.push({input: "{\"key\":\"value\"}", desc: "No spaces"}) // 特殊文字 boundary_cases.push({input: "{\"key with spaces\": \"value\"}", desc: "Key with spaces"}) boundary_cases.push({input: "{\"comma,inside\": \"value,with,commas\"}", desc: "Commas in strings"}) local i = 0 loop(i < boundary_cases.length()) { local test_case = boundary_cases.get(i) local input = test_case.input local desc = test_case.desc print("Testing: " + desc) print(" Input: '" + input + "'") local parsed = JsonParserUtils.parse_json(input) if parsed != null { print(" ✅ Boundary condition handled") } else { print(" ❌ Boundary condition failed") } i = i + 1 } } // エラー検出精度テスト test_error_detection() { local error_cases = new ArrayBox() // 構文エラー error_cases.push({input: "{\"key\": }", desc: "Missing value"}) error_cases.push({input: "{\"key\" \"value\"}", desc: "Missing colon"}) error_cases.push({input: "{\"key\": \"value\",}", desc: "Trailing comma"}) error_cases.push({input: "[1, 2, 3,]", desc: "Trailing comma in array"}) // 不正な文字列 error_cases.push({input: "{\"key\": \"unclosed string}", desc: "Unclosed string"}) error_cases.push({input: "{\"key\": \"invalid\\x escape\"}", desc: "Invalid escape"}) // 不正な数値 error_cases.push({input: "{\"key\": 01}", desc: "Leading zero"}) error_cases.push({input: "{\"key\": -}", desc: "Incomplete number"}) local i = 0 loop(i < error_cases.length()) { local test_case = error_cases.get(i) local input = test_case.input local desc = test_case.desc print("Testing error detection: " + desc) print(" Input: " + input) local parsed = JsonParserUtils.parse_json(input) if parsed == null { print(" ✅ Error correctly detected") } else { print(" ❌ Error not detected (should have failed)") } i = i + 1 } } // ラウンドトリップテスト test_roundtrip_accuracy() { local complex_json = "{\"project\": \"Nyash JSON Native\", \"version\": 1, \"features\": [\"modular\", \"beautiful\", \"accurate\"], \"config\": {\"provider\": \"nyash\", \"fallback\": true}, \"status\": \"phase2_complete\"}" print("Complex JSON roundtrip test:") print("Input: " + complex_json) local result = JsonParserUtils.roundtrip_test(complex_json) if result != null { print("Output: " + result) print("✅ Complex roundtrip successful") // 2回目のラウンドトリップテスト(安定性確認) local second_result = JsonParserUtils.roundtrip_test(result) if second_result == result { print("✅ Stable roundtrip confirmed") } else { print("⚠️ Roundtrip not stable") } } else { print("❌ Complex roundtrip failed") } } }