// Step 396: Smart Pointer Patterns (12 tests) #include #include #include #include "ast/Parser.h" #include "ast/CppAdvancedNodes.h" int main() { int passed = 0; // Test 1: Detect unique_ptr pattern { std::string text = "std::unique_ptr widget;"; assert(detectSmartPointerKind(text) == "unique_ptr"); std::cout << "PASS: test 1 — detect unique_ptr\n"; passed++; } // Test 2: Detect shared_ptr pattern { std::string text = "std::shared_ptr config;"; assert(detectSmartPointerKind(text) == "shared_ptr"); std::cout << "PASS: test 2 — detect shared_ptr\n"; passed++; } // Test 3: Detect weak_ptr pattern { std::string text = "std::weak_ptr obs;"; assert(detectSmartPointerKind(text) == "weak_ptr"); std::cout << "PASS: test 3 — detect weak_ptr\n"; passed++; } // Test 4: Extract inner type from smart pointer { assert(extractSmartPointerInner("std::unique_ptr") == "Widget"); assert(extractSmartPointerInner("shared_ptr") == "const Foo"); assert(extractSmartPointerInner("std::shared_ptr>") == "std::vector"); std::cout << "PASS: test 4 — extract inner type\n"; passed++; } // Test 5: Smart pointer ownership mapping { assert(smartPointerOwnership("unique_ptr") == "Unique"); assert(smartPointerOwnership("shared_ptr") == "Shared_ARC"); assert(smartPointerOwnership("weak_ptr") == "Weak"); assert(smartPointerOwnership("") == ""); std::cout << "PASS: test 5 — ownership mapping\n"; passed++; } // Test 6: Parse function with unique_ptr parameter { std::string src = R"( void process(std::unique_ptr w) { return; } )"; auto mod = TreeSitterParser::parseCpp(src); auto& fns = mod->getChildren("functions"); assert(!fns.empty()); auto* fn = static_cast(fns[0]); assert(fn->name == "process"); std::cout << "PASS: test 6 — parse function with unique_ptr param\n"; passed++; } // Test 7: Parse function with shared_ptr return { std::string src = R"( std::shared_ptr createConfig() { return nullptr; } )"; auto mod = TreeSitterParser::parseCpp(src); auto& fns = mod->getChildren("functions"); assert(!fns.empty()); auto* fn = static_cast(fns[0]); assert(fn->name == "createConfig"); // Check return type contains shared_ptr auto* retType = fn->getChild("returnType"); if (retType && retType->conceptType == "PrimitiveType") { auto* pt = static_cast(retType); assert(detectSmartPointerKind(pt->kind) == "shared_ptr"); } std::cout << "PASS: test 7 — parse function with shared_ptr return\n"; passed++; } // Test 8: Detect smart pointer in class field declaration text { auto q = detectQualifiers("std::unique_ptr widget_;"); assert(q.smartPointerKind == "unique_ptr"); auto q2 = detectQualifiers("std::shared_ptr logger_;"); assert(q2.smartPointerKind == "shared_ptr"); std::cout << "PASS: test 8 — smart pointer in field text\n"; passed++; } // Test 9: No false positive on non-smart-pointer { assert(detectSmartPointerKind("int x;") == ""); assert(detectSmartPointerKind("std::vector v;") == ""); assert(detectSmartPointerKind("auto ptr = new Widget();") == ""); std::cout << "PASS: test 9 — no false positive\n"; passed++; } // Test 10: Parse make_unique call { std::string src = R"( void init() { auto w = std::make_unique(); } )"; auto mod = TreeSitterParser::parseCpp(src); assert(mod != nullptr); auto& fns = mod->getChildren("functions"); assert(!fns.empty()); std::cout << "PASS: test 10 — parse make_unique call\n"; passed++; } // Test 11: Smart pointer cross-language mapping concept { // unique_ptr → Rust Box, shared_ptr → Rust Arc std::string kind1 = "unique_ptr"; std::string ownership1 = smartPointerOwnership(kind1); assert(ownership1 == "Unique"); // Would map to Box in Rust generator std::string kind2 = "shared_ptr"; std::string ownership2 = smartPointerOwnership(kind2); assert(ownership2 == "Shared_ARC"); // Would map to Arc in Rust generator std::cout << "PASS: test 11 — cross-language mapping concept\n"; passed++; } // Test 12: Parse new/delete expressions (FunctionCall nodes) { std::string src = R"( void cleanup() { auto* p = new Widget(); delete p; } )"; auto mod = TreeSitterParser::parseCpp(src); assert(mod != nullptr); auto& fns = mod->getChildren("functions"); assert(!fns.empty()); std::cout << "PASS: test 12 — parse new/delete expressions\n"; passed++; } std::cout << "\nStep 396 result: " << passed << "/12 tests passed\n"; return (passed == 12) ? 0 : 1; }