Files
whetstone_DSL/editor/tests/step455_test.cpp

195 lines
6.4 KiB
C++

// Step 455: Behavioral Equivalence Checking Tests (12 tests)
#include "BehavioralEquivalence.h"
#include <iostream>
static int passed = 0, failed = 0;
#define TEST(name) { std::cout << " " << #name << "... "; }
#define PASS() { std::cout << "PASS\n"; ++passed; }
#define FAIL(msg) { std::cout << "FAIL: " << msg << "\n"; ++failed; }
#define CHECK(cond, msg) if (!(cond)) { FAIL(msg); return; } else {}
void test_sort_infers_three_standard_inputs() {
TEST(sort_infers_three_standard_inputs);
auto r = BehavioralChecker::check(
"sort_values",
"bubble sort with swap",
"items.sort()",
"python",
"rust");
CHECK(r.assertionCount() == 3, "sort should infer 3 assertions");
CHECK(r.hasAssertionFor("[3,1,2]"), "expected primary sort input");
PASS();
}
void test_search_infers_found_and_not_found_cases() {
TEST(search_infers_found_and_not_found_cases);
auto r = BehavioralChecker::check(
"find_user",
"find item by key",
"items.iter().find(...)",
"python",
"rust");
CHECK(r.hasAssertionFor("[1,2,3], key=2"), "expected found case");
CHECK(r.hasAssertionFor("[1,2,3], key=99"), "expected not-found case");
PASS();
}
void test_sum_infers_empty_and_non_empty_cases() {
TEST(sum_infers_empty_and_non_empty_cases);
auto r = BehavioralChecker::check(
"sum_values",
"sum over list with total += x",
"items.iter().fold(0, |acc, x| acc + x)",
"python",
"rust");
CHECK(r.assertionCount() == 2, "sum should infer 2 assertions");
CHECK(r.hasAssertionFor("[1,2,3]"), "expected non-empty case");
CHECK(r.hasAssertionFor("[]"), "expected empty case");
PASS();
}
void test_custom_inputs_override_inference() {
TEST(custom_inputs_override_inference);
auto r = BehavioralChecker::check(
"custom_fn",
"sort values",
"items.sort()",
"python",
"rust",
{"A", "B", "C"});
CHECK(r.assertionCount() == 3, "expected custom input count");
CHECK(r.hasAssertionFor("A"), "expected custom input A");
CHECK(!r.hasAssertionFor("[3,1,2]"), "inferred input should not be present");
PASS();
}
void test_stdlib_mapping_gets_verified_contract() {
TEST(stdlib_mapping_gets_verified_contract);
auto r = BehavioralChecker::check(
"sort_values",
"sort values",
"items.sort()",
"python",
"rust");
CHECK(r.minConfidence() >= 0.90f, "expected high confidence");
CHECK(r.annotation == "@Contract(verified)", "expected verified contract");
PASS();
}
void test_iterator_mapping_gets_verified_contract() {
TEST(iterator_mapping_gets_verified_contract);
auto r = BehavioralChecker::check(
"sum_values",
"sum values",
"items.iter().fold(0, |a, x| a + x)",
"python",
"rust");
CHECK(r.minConfidence() >= 0.90f, "iterator mapping should be high confidence");
CHECK(r.annotation == "@Contract(verified)", "expected verified contract");
PASS();
}
void test_structural_todo_gets_unverified_review() {
TEST(structural_todo_gets_unverified_review);
auto r = BehavioralChecker::check(
"mystery",
"unknown transform",
"TODO: translate this manually",
"python",
"rust");
CHECK(r.minConfidence() <= 0.50f, "TODO should be low confidence");
CHECK(r.annotation.find("@Contract(unverified)") != std::string::npos,
"expected unverified contract");
CHECK(r.annotation.find("@Review(required,human)") != std::string::npos,
"expected human review annotation");
PASS();
}
void test_cross_language_non_todo_gets_likely_contract() {
TEST(cross_language_non_todo_gets_likely_contract);
auto r = BehavioralChecker::check(
"transform",
"do transform",
"transform(data)",
"python",
"java");
CHECK(r.minConfidence() >= 0.70f && r.minConfidence() < 0.90f,
"expected mid confidence range");
CHECK(r.annotation == "@Contract(likely)", "expected likely contract");
PASS();
}
void test_same_language_defaults_high_confidence() {
TEST(same_language_defaults_high_confidence);
auto r = BehavioralChecker::check(
"identity",
"generic function",
"identity(x)",
"python",
"python");
CHECK(r.minConfidence() >= 0.95f, "same language should be high confidence");
CHECK(r.annotation == "@Contract(verified)", "expected verified contract");
PASS();
}
void test_assertions_require_same_error_behavior() {
TEST(assertions_require_same_error_behavior);
auto r = BehavioralChecker::check(
"sort_values",
"sort values",
"sorted(values)",
"python",
"python");
CHECK(!r.assertions.empty(), "expected assertions");
CHECK(r.assertions[0].sameErrors, "sameErrors should default true");
PASS();
}
void test_default_generic_inputs_used_when_no_pattern() {
TEST(default_generic_inputs_used_when_no_pattern);
auto r = BehavioralChecker::check(
"generic_fn",
"compute something",
"compute(data)",
"python",
"java");
CHECK(r.hasAssertionFor("input_0"), "expected generic input_0");
CHECK(r.hasAssertionFor("input_1"), "expected generic input_1");
PASS();
}
void test_all_passing_defaults_true() {
TEST(all_passing_defaults_true);
auto r = BehavioralChecker::check(
"sort_values",
"sort values",
"items.sort()",
"python",
"rust");
CHECK(r.allPassing, "allPassing should default true");
PASS();
}
int main() {
std::cout << "Step 455: Behavioral Equivalence Checking Tests\n";
test_sort_infers_three_standard_inputs(); // 1
test_search_infers_found_and_not_found_cases(); // 2
test_sum_infers_empty_and_non_empty_cases(); // 3
test_custom_inputs_override_inference(); // 4
test_stdlib_mapping_gets_verified_contract(); // 5
test_iterator_mapping_gets_verified_contract(); // 6
test_structural_todo_gets_unverified_review(); // 7
test_cross_language_non_todo_gets_likely_contract(); // 8
test_same_language_defaults_high_confidence(); // 9
test_assertions_require_same_error_behavior(); // 10
test_default_generic_inputs_used_when_no_pattern(); // 11
test_all_passing_defaults_true(); // 12
std::cout << "\nResults: " << passed << "/" << (passed + failed)
<< " passed\n";
return failed == 0 ? 0 : 1;
}