// yyjson置き換えテスト - 既存APIとの互換性確認 using "apps/lib/json_native/parser/parser.nyash" as JsonParserUtils // 🔄 既存JsonDocBox API互換テスト static box JsonDocBoxCompatTest { main() { print("🔄 yyjson置き換えテスト - API互換性確認") print("目標: 既存のJsonDocBox使用コードが同じ結果を返すこと") // 1. 基本API互換テスト print("\n1️⃣ 基本API互換テスト") this.test_basic_api_compat() // 2. 実際の使用例テスト print("\n2️⃣ 実際の使用例テスト") this.test_real_usage_examples() // 3. エラー処理互換テスト print("\n3️⃣ エラー処理互換テスト") this.test_error_handling_compat() // 4. 性能比較テスト print("\n4️⃣ 性能比較テスト") this.test_performance_comparison() print("\n✅ yyjson置き換えテスト完了") print("🎯 次のステップ: プラグインシステムでの実際の置き換え") return 0 } // 基本API互換テスト test_basic_api_compat() { print("JsonDocBox API互換性テスト:") // 既存の使用パターンをシミュレート local test_json = "{\"kind\":\"Program\",\"statements\":[]}" print("Original JSON: " + test_json) // Nyash Native版で解析 local native_result = this.simulate_jsondocbox_api(test_json) if native_result != null { print("Native result: " + native_result) print("✅ API compatibility maintained") } else { print("❌ API compatibility broken") } // より複雑なケース local complex_json = "{\"user\": {\"name\": \"Alice\", \"id\": 123}, \"active\": true}" print("\nComplex JSON: " + complex_json) local complex_result = this.simulate_jsondocbox_api(complex_json) if complex_result != null { print("Complex result: " + complex_result) print("✅ Complex JSON handled correctly") } else { print("❌ Complex JSON handling failed") } } // JsonDocBox APIをシミュレート simulate_jsondocbox_api(json_text) { // 既存コードパターン: // local doc = new JsonDocBox() // doc.parse(json) // local root = doc.root() // print(root.get("kind").str()) local parsed = JsonParserUtils.parse_json(json_text) if parsed == null { return null } // root.get("kind").str() をシミュレート if parsed.get_kind() == "object" { local kind_node = parsed.object_get("kind") if kind_node != null and kind_node.get_kind() == "string" { return kind_node.as_string() } } return "non_object_or_no_kind" } // 実際の使用例テスト test_real_usage_examples() { // apps/tests/jsonbox_parse_ok.nyash の内容をシミュレート print("Real usage example simulation:") local examples = new ArrayBox() examples.push("{\"kind\":\"Program\",\"statements\":[]}") examples.push("{\"type\":\"function\",\"name\":\"main\",\"body\":[]}") examples.push("{\"operation\":\"add\",\"left\":1,\"right\":2}") local i = 0 loop(i < examples.length()) { local json = examples.get(i) print("Testing: " + json) // エラーチェック(doc.error()に相当) local parsed = JsonParserUtils.parse_json(json) if parsed == null { print(" Error detected (as expected for invalid JSON)") } else { print(" Parse success: " + parsed.stringify()) } i = i + 1 } } // エラー処理互換テスト test_error_handling_compat() { print("Error handling compatibility:") // 既存のエラーケースをテスト local error_cases = new ArrayBox() error_cases.push("{\"kind\": }") // apps/tests/jsonbox_parse_err.nyash error_cases.push("{invalid json}") error_cases.push("[1, 2, 3") // 不完全な配列 error_cases.push("{\"key\": \"value\",}") // 末尾カンマ local i = 0 loop(i < error_cases.length()) { local invalid_json = error_cases.get(i) print("Testing error case: " + invalid_json) local result = JsonParserUtils.parse_json(invalid_json) if result == null { print(" ✅ Error correctly detected and handled") } else { print(" ❌ Error not detected (should have failed)") } i = i + 1 } } // 性能比較テスト test_performance_comparison() { print("Performance comparison test:") // 小さなJSON local small_json = "{\"key\": \"value\"}" local small_iterations = 100 print("Small JSON (" + small_iterations + " iterations):") print(" JSON: " + small_json) local start_time = 0 // TODO: 時間測定機能が必要 local i = 0 loop(i < small_iterations) { JsonParserUtils.parse_json(small_json) i = i + 1 } print(" ✅ Small JSON performance test completed") // 大きなJSON local large_json = this.generate_large_json() print("\nLarge JSON test:") print(" Size: " + large_json.length() + " characters") local large_result = JsonParserUtils.parse_json(large_json) if large_result != null { print(" ✅ Large JSON parsed successfully") print(" Result size: " + large_result.stringify().length() + " characters") } else { print(" ❌ Large JSON parsing failed") } } // 大きなJSONを生成 generate_large_json() { local json = "{\"users\": [" local i = 0 loop(i < 10) { if i > 0 { json = json + ", " } local active_val = "true" if i % 2 != 0 { active_val = "false" } local user_json = "{\"id\": " + i + ", \"name\": \"User" + i + "\", \"active\": " + active_val + ", \"tags\": [\"tag1\", \"tag2\", \"tag3\"], \"metadata\": {\"created\": \"2025-01-01\", \"updated\": \"2025-01-02\"}}" json = json + user_json i = i + 1 } json = json + "], \"total\": 10, \"status\": \"active\"}" return json } } // 🎯 置き換え完了検証 static box ReplacementVerification { verify_replacement_ready() { print("🎯 yyjson置き換え準備状況の検証") // 1. 機能完全性チェック local functionality_score = this.check_functionality() print("Functionality: " + functionality_score + "/100") // 2. 精度チェック local accuracy_score = this.check_accuracy() print("Accuracy: " + accuracy_score + "/100") // 3. API互換性チェック local compatibility_score = this.check_compatibility() print("Compatibility: " + compatibility_score + "/100") // 4. 総合判定 local total_score = (functionality_score + accuracy_score + compatibility_score) / 3 print("Total score: " + total_score + "/100") if total_score >= 80 { print("🎉 置き換え準備完了!") print("✅ yyjson → Nyash JSON Native 置き換え可能") return true } else { print("⚠️ 置き換えにはさらなる改善が必要") print("❌ 追加開発が必要な領域あり") return false } } check_functionality() { // 基本機能のチェック(簡易版) local tests = new ArrayBox() tests.push("null") tests.push("true") tests.push("42") tests.push("\"string\"") tests.push("[]") tests.push("{}") local passed = 0 local i = 0 loop(i < tests.length()) { local result = JsonParserUtils.parse_json(tests.get(i)) if result != null { passed = passed + 1 } i = i + 1 } return (passed * 100) / tests.length() } check_accuracy() { // 精度のチェック(ラウンドトリップ) local tests = new ArrayBox() tests.push("\"escaped\\\"quote\"") tests.push("{\"nested\": {\"deep\": \"value\"}}") tests.push("[1, 2, {\"mixed\": true}]") local passed = 0 local i = 0 loop(i < tests.length()) { local result = JsonParserUtils.roundtrip_test(tests.get(i)) if result != null { passed = passed + 1 } i = i + 1 } return (passed * 100) / tests.length() } check_compatibility() { // API互換性のチェック(既存使用パターン) local json = "{\"kind\":\"Program\",\"statements\":[]}" local docbox_compat = JsonDocBoxCompatTest() local result = docbox_compat.simulate_jsondocbox_api(json) if result == "Program" { return 100 // 完全互換 } else { if result != null { return 70 // 部分互換 } else { return 0 // 非互換 } } } }