Files
whetstone_DSL/editor/tests/step111_test.cpp
2026-02-09 12:23:45 -07:00

60 lines
2.9 KiB
C++

// Step 111 TDD Test: Document symbol parsing
#include "LSPClient.h"
#include <iostream>
#include <memory>
struct DummyTransport : public LSPTransport {
void send(const std::string& msg) override { (void)msg; }
bool receive(std::string& out) override { (void)out; return false; }
bool isOpen() const override { return true; }
void close() override {}
};
static void expect(bool cond, const std::string& name, int& passed, int& failed) {
if (cond) {
std::cout << "Test " << (passed + failed + 1) << " PASS: " << name << "\n";
++passed;
} else {
std::cout << "Test " << (passed + failed + 1) << " FAIL: " << name << "\n";
++failed;
}
}
int main() {
int passed = 0;
int failed = 0;
{
auto transport = std::make_shared<DummyTransport>();
LSPClient client(transport);
int id = client.requestDocumentSymbols("file:///test.py");
std::string msg = std::string("{\"jsonrpc\":\"2.0\",\"id\":") +
std::to_string(id) +
",\"result\":[{\"name\":\"foo\",\"kind\":12,\"range\":{\"start\":{\"line\":1,\"character\":0},\"end\":{\"line\":3,\"character\":0}},\"selectionRange\":{\"start\":{\"line\":1,\"character\":4},\"end\":{\"line\":1,\"character\":7}},\"children\":[{\"name\":\"x\",\"kind\":13,\"range\":{\"start\":{\"line\":2,\"character\":2},\"end\":{\"line\":2,\"character\":3}},\"selectionRange\":{\"start\":{\"line\":2,\"character\":2},\"end\":{\"line\":2,\"character\":3}}}]}]}";
client.handleMessage(msg);
auto symbols = client.getDocumentSymbols();
bool ok = symbols.size() == 1 && symbols[0].name == "foo" && symbols[0].children.size() == 1 &&
symbols[0].selectionRange.start.line == 1 && symbols[0].selectionRange.start.character == 4 &&
symbols[0].children[0].name == "x" && symbols[0].children[0].range.start.line == 2;
expect(ok, "document symbol tree", passed, failed);
}
{
auto transport = std::make_shared<DummyTransport>();
LSPClient client(transport);
int id = client.requestDocumentSymbols("file:///main.py");
std::string msg = std::string("{\"jsonrpc\":\"2.0\",\"id\":") +
std::to_string(id) +
",\"result\":[{\"name\":\"bar\",\"kind\":12,\"location\":{\"uri\":\"file:///main.py\",\"range\":{\"start\":{\"line\":4,\"character\":0},\"end\":{\"line\":4,\"character\":3}}}}]}";
client.handleMessage(msg);
auto symbols = client.getDocumentSymbols();
bool ok = symbols.size() == 1 && symbols[0].name == "bar" &&
symbols[0].range.start.line == 4 && symbols[0].range.start.character == 0 &&
symbols[0].selectionRange.start.line == 4;
expect(ok, "symbol information list", passed, failed);
}
std::cout << "\n=== Step 111 Results: " << passed << " passed, " << failed << " failed ===\n";
return failed == 0 ? 0 : 1;
}