98 lines
3.1 KiB
C++
98 lines
3.1 KiB
C++
|
|
// Step 1941: PolyglotSuiteOrchestrator
|
||
|
|
//
|
||
|
|
// t1: run returns SuiteResult with correct parity and guard
|
||
|
|
// t2: overallPass true when parity matches and guard passes
|
||
|
|
// t3: overallPass false when parity diverges
|
||
|
|
// t4: overallPass false when guard regression detected
|
||
|
|
// t5: runAll covers all registered nodeIds
|
||
|
|
|
||
|
|
#include "PolyglotSuiteOrchestrator.h"
|
||
|
|
#include <iostream>
|
||
|
|
|
||
|
|
namespace ws = whetstone;
|
||
|
|
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;}
|
||
|
|
|
||
|
|
void t1(){
|
||
|
|
T(run_returns_suiteresult);
|
||
|
|
ws::PolyglotSuiteOrchestrator o;
|
||
|
|
o.addVariant("sort","Python","p");
|
||
|
|
o.addVariant("sort","Rust", "r");
|
||
|
|
o.recordExpected("sort","Python","1 2 3\n");
|
||
|
|
o.recordExpected("sort","Rust", "1 2 3\n");
|
||
|
|
o.approveBaseline("sort","Python","1 2 3\n");
|
||
|
|
o.approveBaseline("sort","Rust", "1 2 3\n");
|
||
|
|
auto sr = o.run("sort","3 1 2");
|
||
|
|
C(sr.astNodeId == "sort", "nodeId");
|
||
|
|
C(sr.parity.allMatch, "parity matches");
|
||
|
|
C(sr.guard.passed, "guard passed");
|
||
|
|
C(sr.overallPass, "overall pass");
|
||
|
|
P();
|
||
|
|
}
|
||
|
|
|
||
|
|
void t2(){
|
||
|
|
T(overallPass_true_when_all_good);
|
||
|
|
ws::PolyglotSuiteOrchestrator o;
|
||
|
|
o.addVariant("f","Go","g");
|
||
|
|
o.recordExpected("f","Go","ok\n");
|
||
|
|
o.approveBaseline("f","Go","ok\n");
|
||
|
|
auto sr = o.run("f","");
|
||
|
|
C(sr.overallPass, "overall pass");
|
||
|
|
P();
|
||
|
|
}
|
||
|
|
|
||
|
|
void t3(){
|
||
|
|
T(overallPass_false_when_parity_diverges);
|
||
|
|
ws::PolyglotSuiteOrchestrator o;
|
||
|
|
o.addVariant("sort","Python","p");
|
||
|
|
o.addVariant("sort","Rust", "r");
|
||
|
|
o.recordExpected("sort","Python","1 2 3\n");
|
||
|
|
o.recordExpected("sort","Rust", "3 2 1\n"); // diverges
|
||
|
|
o.approveBaseline("sort","Python","1 2 3\n");
|
||
|
|
o.approveBaseline("sort","Rust", "3 2 1\n");
|
||
|
|
auto sr = o.run("sort","");
|
||
|
|
C(!sr.parity.allMatch, "parity fails");
|
||
|
|
C(!sr.overallPass, "overall fails");
|
||
|
|
P();
|
||
|
|
}
|
||
|
|
|
||
|
|
void t4(){
|
||
|
|
T(overallPass_false_when_guard_regression);
|
||
|
|
ws::PolyglotSuiteOrchestrator o;
|
||
|
|
o.addVariant("sort","Python","p");
|
||
|
|
o.recordExpected("sort","Python","new_output\n");
|
||
|
|
o.approveBaseline("sort","Python","old_output\n"); // mismatch → regression
|
||
|
|
auto sr = o.run("sort","");
|
||
|
|
C(!sr.guard.passed, "guard fails");
|
||
|
|
C(!sr.overallPass, "overall fails");
|
||
|
|
P();
|
||
|
|
}
|
||
|
|
|
||
|
|
void t5(){
|
||
|
|
T(runAll_covers_all_nodeIds);
|
||
|
|
ws::PolyglotSuiteOrchestrator o;
|
||
|
|
o.addVariant("sort", "Rust","r");
|
||
|
|
o.addVariant("merge","Go", "g");
|
||
|
|
o.recordExpected("sort", "Rust","s\n");
|
||
|
|
o.recordExpected("merge","Go", "m\n");
|
||
|
|
auto results = o.runAll("");
|
||
|
|
C(results.size() == 2, "two suite results");
|
||
|
|
bool sortFound = false, mergeFound = false;
|
||
|
|
for (auto& sr : results) {
|
||
|
|
if (sr.astNodeId == "sort") sortFound = true;
|
||
|
|
if (sr.astNodeId == "merge") mergeFound = true;
|
||
|
|
}
|
||
|
|
C(sortFound && mergeFound, "both nodeIds covered");
|
||
|
|
P();
|
||
|
|
}
|
||
|
|
|
||
|
|
int main(){
|
||
|
|
std::cout << "Step 1941: PolyglotSuiteOrchestrator\n";
|
||
|
|
t1(); t2(); t3(); t4(); t5();
|
||
|
|
std::cout << "\n" << p << "/" << (p+f) << " passed\n";
|
||
|
|
return f > 0 ? 1 : 0;
|
||
|
|
}
|