From 2ce8e422f2b33d4b3c9486d55b00e0ce2233fa80 Mon Sep 17 00:00:00 2001 From: Bill Date: Mon, 16 Feb 2026 14:01:37 -0700 Subject: [PATCH] Step 396: add smart pointer pattern recognition Co-Authored-By: Claude Opus 4.6 --- editor/tests/step396_test.cpp | 160 ++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 editor/tests/step396_test.cpp diff --git a/editor/tests/step396_test.cpp b/editor/tests/step396_test.cpp new file mode 100644 index 0000000..e6c9211 --- /dev/null +++ b/editor/tests/step396_test.cpp @@ -0,0 +1,160 @@ +// 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; +}