Files
whetstone_DSL/editor/tests/step433_test.cpp

142 lines
5.5 KiB
C++

// Step 433: Inline Annotation Badges Tests (12 tests)
#include "CodeAnnotationBadges.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 {}
static std::vector<AnnotationBadgeInput> sampleInputs() {
return {
{10, "IntentAnnotation", "Parse auth tokens", "n1"},
{10, "RiskAnnotation", "High external exposure", "n1"},
{20, "ComplexityAnnotation", "Cyclomatic=12", "n2"},
{30, "ReviewAnnotation", "Human review required", "n3"}
};
}
void test_build_badges_count_matches_input() {
TEST(build_badges_count_matches_input);
auto badges = CodeAnnotationBadges::buildBadges(sampleInputs());
CHECK(badges.size() == sampleInputs().size(), "badge count mismatch");
PASS();
}
void test_badges_sorted_by_line_then_type() {
TEST(badges_sorted_by_line_then_type);
auto badges = CodeAnnotationBadges::buildBadges({
{30, "RiskAnnotation", "r", "n3"},
{10, "IntentAnnotation", "i", "n1"},
{10, "ComplexityAnnotation", "c", "n1"}
});
CHECK(badges[0].line == 10 && badges[1].line == 10 && badges[2].line == 30,
"line sort mismatch");
PASS();
}
void test_icon_mapping_for_known_types() {
TEST(icon_mapping_for_known_types);
CHECK(CodeAnnotationBadges::iconForType("IntentAnnotation") == "I", "intent icon");
CHECK(CodeAnnotationBadges::iconForType("ComplexityAnnotation") == "C", "complexity icon");
CHECK(CodeAnnotationBadges::iconForType("RiskAnnotation") == "R", "risk icon");
PASS();
}
void test_color_mapping_for_known_types() {
TEST(color_mapping_for_known_types);
CHECK(CodeAnnotationBadges::colorForType("IntentAnnotation") == "#1ABC9C", "intent color");
CHECK(CodeAnnotationBadges::colorForType("RiskAnnotation") == "#E74C3C", "risk color");
PASS();
}
void test_unknown_type_fallback_icon_and_color() {
TEST(unknown_type_fallback_icon_and_color);
CHECK(CodeAnnotationBadges::iconForType("UnknownAnnotation") == "A", "fallback icon");
CHECK(CodeAnnotationBadges::colorForType("UnknownAnnotation") == "#95A5A6", "fallback color");
PASS();
}
void test_stack_by_line_groups_multiple_badges_same_line() {
TEST(stack_by_line_groups_multiple_badges_same_line);
auto badges = CodeAnnotationBadges::buildBadges(sampleInputs());
auto stacks = CodeAnnotationBadges::stackByLine(badges);
int line10Count = 0;
for (const auto& s : stacks) if (s.line == 10) line10Count = (int)s.badges.size();
CHECK(line10Count == 2, "line 10 should have two stacked badges");
PASS();
}
void test_stack_by_line_sorted_by_line() {
TEST(stack_by_line_sorted_by_line);
auto badges = CodeAnnotationBadges::buildBadges(sampleInputs());
auto stacks = CodeAnnotationBadges::stackByLine(badges);
CHECK(stacks.size() >= 3, "expected three lines");
CHECK(stacks[0].line < stacks[1].line, "stacks should be sorted by line");
PASS();
}
void test_expand_detail_contains_type_node_and_detail() {
TEST(expand_detail_contains_type_node_and_detail);
auto badges = CodeAnnotationBadges::buildBadges(sampleInputs());
auto text = CodeAnnotationBadges::expandDetail(badges[0]);
CHECK(text.find(badges[0].type) != std::string::npos, "missing type");
CHECK(text.find(badges[0].nodeId) != std::string::npos, "missing node");
CHECK(text.find(badges[0].detail) != std::string::npos, "missing detail");
PASS();
}
void test_badge_preserves_line_and_node_id() {
TEST(badge_preserves_line_and_node_id);
auto badges = CodeAnnotationBadges::buildBadges(sampleInputs());
CHECK(badges[0].line > 0, "line missing");
CHECK(!badges[0].nodeId.empty(), "node id missing");
PASS();
}
void test_empty_input_returns_empty_badges() {
TEST(empty_input_returns_empty_badges);
auto badges = CodeAnnotationBadges::buildBadges({});
CHECK(badges.empty(), "expected empty badges");
PASS();
}
void test_empty_badges_return_empty_stacks() {
TEST(empty_badges_return_empty_stacks);
auto stacks = CodeAnnotationBadges::stackByLine({});
CHECK(stacks.empty(), "expected empty stacks");
PASS();
}
void test_review_annotation_has_review_icon() {
TEST(review_annotation_has_review_icon);
auto badges = CodeAnnotationBadges::buildBadges({{5, "ReviewAnnotation", "review me", "n1"}});
CHECK(!badges.empty(), "badge missing");
CHECK(badges[0].icon == "V", "review icon mismatch");
PASS();
}
int main() {
std::cout << "Step 433: Inline Annotation Badges Tests\n";
test_build_badges_count_matches_input(); // 1
test_badges_sorted_by_line_then_type(); // 2
test_icon_mapping_for_known_types(); // 3
test_color_mapping_for_known_types(); // 4
test_unknown_type_fallback_icon_and_color(); // 5
test_stack_by_line_groups_multiple_badges_same_line();// 6
test_stack_by_line_sorted_by_line(); // 7
test_expand_detail_contains_type_node_and_detail(); // 8
test_badge_preserves_line_and_node_id(); // 9
test_empty_input_returns_empty_badges(); // 10
test_empty_badges_return_empty_stacks(); // 11
test_review_annotation_has_review_icon(); // 12
std::cout << "\nResults: " << passed << "/" << (passed + failed)
<< " passed\n";
return failed == 0 ? 0 : 1;
}