Files
whetstone_DSL/editor/tests/step698_test.cpp
Bill 1696b92bb8 Add Sprints 46-59: governance, porting foundation, and language graduation prep (Steps 689-828)
Sprints 46-58 implement the cross-language porting foundation: language-to-IR
adapters, equivalence checking, gate validation, legacy ingestion, managed/dynamic
families, low-level/logic-actor semantics, debug workflow tooling, AST-native
family tools, Rust/CPP raising tools, system-level orchestration, query family,
and porting gates. Sprint 59 adds the governance layer (policy packs, review
boards, waiver packets, ambiguity triage, decision ledger) with the
whetstone_review_porting_decision MCP tool.

Also includes: sprint plans 46-130, MCP taskitem pipeline scripts,
CLAUDE.md, docs, and full test matrix (steps 689-828).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 13:18:10 -07:00

153 lines
4.4 KiB
C++

// Step 698: full regression + architecture gate (8 tests)
#include "MCPServer.h"
#include "Sprint46IntegrationSummary.h"
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
static int p = 0, f = 0;
#define T(n) { std::cout << " " << #n << "... "; }
#define P() { std::cout << "PASS\n"; ++p; }
#define F(m) { std::cout << "FAIL: " << m << "\n"; ++f; }
#define C(c,m) if (!(c)) { F(m); return; }
static std::string readFile(const std::string& path) {
std::ifstream in(path);
if (!in.good()) return "";
std::ostringstream ss;
ss << in.rdbuf();
return ss.str();
}
static std::string readFirstExisting(const std::vector<std::string>& paths) {
for (const auto& p : paths) {
auto text = readFile(p);
if (!text.empty()) return text;
}
return "";
}
static int lineCount(const std::vector<std::string>& paths) {
std::ifstream in;
for (const auto& p : paths) {
in.open(p);
if (in.good()) break;
in.clear();
}
if (!in.good()) return -1;
int lines = 0;
std::string s;
while (std::getline(in, s)) ++lines;
return lines;
}
static json callTool(MCPServer& mcp, const std::string& name, const json& args) {
json req = {
{"jsonrpc", "2.0"},
{"id", 1},
{"method", "tools/call"},
{"params", {{"name", name}, {"arguments", args}}}
};
json resp = mcp.handleRequest(req);
std::string text = resp["result"]["content"][0].value("text", "{}");
return json::parse(text);
}
void t1() {
T(targeted_suite_pass);
auto r = Sprint46IntegrationSummary::run();
C(r.success, "sprint 46 integration not successful");
P();
}
void t2() {
T(legacy_suite_pass);
MCPServer mcp;
auto out = callTool(mcp, "whetstone_generate_project", {{"name", "MyApp"}, {"description", "Example app"}});
C(out.value("success", false), "legacy project tool failed");
P();
}
void t3() {
T(mcp_tools_unaffected);
MCPServer mcp;
json req = {{"jsonrpc", "2.0"}, {"id", 2}, {"method", "tools/list"}};
auto resp = mcp.handleRequest(req);
bool oldFound = false, newFound = false;
for (const auto& t : resp["result"]["tools"]) {
std::string n = t.value("name", "");
if (n == "whetstone_generate_project") oldFound = true;
if (n == "whetstone_get_language_matrix") newFound = true;
}
C(oldFound && newFound, "expected old and new tools");
P();
}
void t4() {
T(no_header_exceeds_600_lines);
std::vector<std::string> headers = {
"SemanticCoreIR.h",
"LanguageSupportTier.h",
"LanguageCapabilityMatrix.h",
"MigrationAcceptanceContract.h",
"LanguageToIRAdapter.h",
"IRToLanguageAdapter.h",
"mcp/RegisterPortingFoundationTools.h",
"Sprint46DocsBaseline.h",
"Sprint46IntegrationSummary.h"
};
for (const auto& h : headers) {
int n = lineCount({"src/" + h, "../src/" + h, "../../editor/src/" + h});
C(n > 0, ("missing header: " + h).c_str());
C(n <= 600, ("header too long: " + h).c_str());
}
P();
}
void t5() {
T(no_new_dependency);
auto cmake = readFirstExisting({"CMakeLists.txt", "../CMakeLists.txt", "../../editor/CMakeLists.txt"});
C(!cmake.empty(), "missing CMakeLists");
C(cmake.find("# Sprint 46: Semantic core and porting contract") != std::string::npos,
"sprint 46 section missing");
P();
}
void t6() {
T(deterministic_snapshots);
MCPServer mcp;
auto a = callTool(mcp, "whetstone_get_language_matrix", json::object()).dump();
auto b = callTool(mcp, "whetstone_get_language_matrix", json::object()).dump();
C(a == b, "matrix snapshot nondeterministic");
P();
}
void t7() {
T(contract_docs_generated);
auto doc = readFirstExisting({
"docs/SPRINT46_FOUNDATION.md",
"../docs/SPRINT46_FOUNDATION.md",
"../../docs/SPRINT46_FOUNDATION.md"
});
C(!doc.empty(), "missing sprint 46 docs");
C(doc.find("Migration contract checks") != std::string::npos, "contract section missing");
P();
}
void t8() {
T(sprint_gate_success);
auto r = Sprint46IntegrationSummary::run();
C(r.success && r.regressionMarker == "sprint46_foundation_ready", "gate failed");
P();
}
int main() {
std::cout << "Step 698: regression + architecture gate\n";
t1(); t2(); t3(); t4(); t5(); t6(); t7(); t8();
std::cout << "\nResults: " << p << "/" << (p + f) << " passed\n";
return f ? 1 : 0;
}