195 lines
6.4 KiB
C++
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;
|
|
}
|