Files
whetstone_DSL/editor/tests/step7_test.cpp

68 lines
3.6 KiB
C++
Raw Normal View History

2026-02-06 19:31:38 -07:00
// Step 7: Schema validation. Verify legal placements accepted, illegal rejected.
#include "../src/ast/ASTNode.h"
#include "../src/ast/Module.h"
#include "../src/ast/Function.h"
#include "../src/ast/Variable.h"
#include "../src/ast/Statement.h"
#include "../src/ast/Expression.h"
#include "../src/ast/Type.h"
#include "../src/ast/Annotation.h"
#include "../src/ast/Schema.h"
#include <cassert>
#include <iostream>
int main() {
ASTSchema schema;
// Test 1: Legal placements should be accepted
assert(schema.isLegalChild("Module", "functions", "Function"));
assert(schema.isLegalChild("Module", "variables", "Variable"));
assert(schema.isLegalChild("Function", "parameters", "Parameter"));
assert(schema.isLegalChild("Function", "returnType", "PrimitiveType"));
assert(schema.isLegalChild("Function", "body", "Return"));
assert(schema.isLegalChild("Function", "body", "Assignment"));
assert(schema.isLegalChild("Assignment", "target", "VariableReference"));
assert(schema.isLegalChild("Assignment", "value", "BinaryOperation"));
assert(schema.isLegalChild("BinaryOperation", "left", "VariableReference"));
assert(schema.isLegalChild("BinaryOperation", "right", "IntegerLiteral"));
// Test 2: Illegal placements should be rejected
assert(!schema.isLegalChild("Module", "functions", "Variable")); // Variable not allowed in functions role
assert(!schema.isLegalChild("Module", "variables", "Function")); // Function not allowed in variables role
assert(!schema.isLegalChild("Function", "parameters", "Variable")); // Variable not allowed in parameters role
assert(!schema.isLegalChild("Function", "returnType", "Function")); // Function not allowed as return type
assert(!schema.isLegalChild("Assignment", "target", "IntegerLiteral")); // Literal not allowed as target
assert(!schema.isLegalChild("Assignment", "value", "Function")); // Function not allowed as value (directly)
assert(!schema.isLegalChild("IntegerLiteral", "value", "Variable")); // IntegerLiteral has no "value" role
assert(!schema.isLegalChild("NonExistentConcept", "someRole", "SomeChild")); // Non-existent parent
// Test 3: Verify cardinality (single vs multi-valued roles)
assert(schema.isSingleValued("Function", "returnType")); // Single-valued
assert(!schema.isSingleValued("Function", "parameters")); // Multi-valued
assert(schema.isSingleValued("Assignment", "target")); // Single-valued
assert(schema.isSingleValued("Assignment", "value")); // Single-valued
assert(!schema.isSingleValued("Function", "body")); // Multi-valued
// Test 4: Get allowed concepts
auto funcParamsAllowed = schema.getAllowedConcepts("Function", "parameters");
assert(funcParamsAllowed.size() == 1);
assert(funcParamsAllowed[0] == "Parameter");
auto funcBodyAllowed = schema.getAllowedConcepts("Function", "body");
assert(funcBodyAllowed.size() >= 3); // Should have multiple allowed concepts
bool hasAssignment = false, hasReturn = false, hasIf = false;
for (const auto& allowedConcept : funcBodyAllowed) {
if (allowedConcept == "Assignment") hasAssignment = true;
if (allowedConcept == "Return") hasReturn = true;
if (allowedConcept == "IfStatement") hasIf = true;
}
assert(hasAssignment && hasReturn && hasIf);
// Test 5: Edge cases
assert(schema.getAllowedConcepts("NonExistentConcept", "someRole").empty());
assert(schema.getAllowedConcepts("Function", "nonExistentRole").empty());
std::cout << "Step 7: PASS — Schema validation rejects illegal placements, accepts legal ones" << std::endl;
return 0;
}