Skip to content

Commit 5adae04

Browse files
committed
tests: Add scanner tests for content field
Add comprehensive tests for the clean content field in patch_hunk_line: - test_content_field_unified_diff(): Verifies clean content extraction for unified diffs, ensuring content field excludes prefixes while line field preserves the full original line - test_content_field_context_diff(): Verifies clean content extraction for context diffs, ensuring content field excludes both prefix AND the format-specific space while handling buffered lines correctly Key test coverage: * Raw line vs clean content comparison for all line types * Unified diff: content = line + 1 (skip prefix only) * Context diff: content = line + 2 (skip prefix + space) * Buffered line handling (context diff old section) * Direct line handling (context diff new section) These tests ensure the content field provides format-agnostic clean content extraction, eliminating consumer complexity. Assisted-by: Cursor
1 parent 2d193e3 commit 5adae04

1 file changed

Lines changed: 167 additions & 0 deletions

File tree

‎tests/scanner/test_basic.c‎

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2049,6 +2049,169 @@ static void test_context_field_context_diff(void)
20492049
printf("✓ Context field context diff test passed\n");
20502050
}
20512051

2052+
static void test_content_field_unified_diff(void)
2053+
{
2054+
printf("Running content field unified diff test...\n");
2055+
2056+
const char *test_patch =
2057+
"--- file1\n"
2058+
"+++ file1\n"
2059+
"@@ -1,3 +1,3 @@\n"
2060+
" context content\n"
2061+
"-removed content\n"
2062+
"+added content\n";
2063+
2064+
FILE *fp = string_to_file(test_patch);
2065+
assert(fp != NULL);
2066+
patch_scanner_t *scanner = patch_scanner_create(fp);
2067+
assert(scanner != NULL);
2068+
2069+
const patch_content_t *content;
2070+
enum patch_scanner_result result;
2071+
2072+
/* Skip headers */
2073+
result = patch_scanner_next(scanner, &content);
2074+
assert(result == PATCH_SCAN_OK && content->type == PATCH_CONTENT_HEADERS);
2075+
2076+
/* Skip hunk header */
2077+
result = patch_scanner_next(scanner, &content);
2078+
assert(result == PATCH_SCAN_OK && content->type == PATCH_CONTENT_HUNK_HEADER);
2079+
2080+
/* Test context line content */
2081+
result = patch_scanner_next(scanner, &content);
2082+
assert(result == PATCH_SCAN_OK && content->type == PATCH_CONTENT_HUNK_LINE);
2083+
assert(content->data.line->type == PATCH_LINE_CONTEXT);
2084+
/* Verify raw line includes prefix */
2085+
assert(content->data.line->length == 16); /* " context content" */
2086+
assert(strncmp(content->data.line->line, " context content", 16) == 0);
2087+
/* Verify clean content excludes prefix */
2088+
assert(content->data.line->content_length == 15); /* "context content" */
2089+
assert(strncmp(content->data.line->content, "context content", 15) == 0);
2090+
2091+
/* Test removed line content */
2092+
result = patch_scanner_next(scanner, &content);
2093+
assert(result == PATCH_SCAN_OK && content->type == PATCH_CONTENT_HUNK_LINE);
2094+
assert(content->data.line->type == PATCH_LINE_REMOVED);
2095+
/* Verify raw line includes prefix */
2096+
assert(content->data.line->length == 16); /* "-removed content" */
2097+
assert(strncmp(content->data.line->line, "-removed content", 16) == 0);
2098+
/* Verify clean content excludes prefix */
2099+
assert(content->data.line->content_length == 15); /* "removed content" */
2100+
assert(strncmp(content->data.line->content, "removed content", 15) == 0);
2101+
2102+
/* Test added line content */
2103+
result = patch_scanner_next(scanner, &content);
2104+
assert(result == PATCH_SCAN_OK && content->type == PATCH_CONTENT_HUNK_LINE);
2105+
assert(content->data.line->type == PATCH_LINE_ADDED);
2106+
/* Verify raw line includes prefix */
2107+
assert(content->data.line->length == 14); /* "+added content" */
2108+
assert(strncmp(content->data.line->line, "+added content", 14) == 0);
2109+
/* Verify clean content excludes prefix */
2110+
assert(content->data.line->content_length == 13); /* "added content" */
2111+
assert(strncmp(content->data.line->content, "added content", 13) == 0);
2112+
2113+
patch_scanner_destroy(scanner);
2114+
fclose(fp);
2115+
printf("✓ Content field unified diff test passed\n");
2116+
}
2117+
2118+
static void test_content_field_context_diff(void)
2119+
{
2120+
printf("Running content field context diff test...\n");
2121+
2122+
const char *test_patch =
2123+
"*** file1\n"
2124+
"--- file1\n"
2125+
"***************\n"
2126+
"*** 1,4 ****\n"
2127+
" context content\n"
2128+
"- removed content\n"
2129+
"! old changed content\n"
2130+
"--- 1,4 ----\n"
2131+
" context content\n"
2132+
"+ added content\n"
2133+
"! new changed content\n";
2134+
2135+
FILE *fp = string_to_file(test_patch);
2136+
assert(fp != NULL);
2137+
patch_scanner_t *scanner = patch_scanner_create(fp);
2138+
assert(scanner != NULL);
2139+
2140+
const patch_content_t *content;
2141+
enum patch_scanner_result result;
2142+
2143+
/* Skip headers */
2144+
result = patch_scanner_next(scanner, &content);
2145+
assert(result == PATCH_SCAN_OK && content->type == PATCH_CONTENT_HEADERS);
2146+
2147+
/* Skip hunk header */
2148+
result = patch_scanner_next(scanner, &content);
2149+
assert(result == PATCH_SCAN_OK && content->type == PATCH_CONTENT_HUNK_HEADER);
2150+
2151+
/* Test context line content (from buffered old section) */
2152+
result = patch_scanner_next(scanner, &content);
2153+
assert(result == PATCH_SCAN_OK && content->type == PATCH_CONTENT_HUNK_LINE);
2154+
assert(content->data.line->type == PATCH_LINE_CONTEXT);
2155+
/* Verify raw line includes prefix and space */
2156+
assert(content->data.line->length == 17); /* " context content" */
2157+
assert(strncmp(content->data.line->line, " context content", 17) == 0);
2158+
/* Verify clean content excludes prefix AND space */
2159+
assert(content->data.line->content_length == 15); /* "context content" */
2160+
assert(strncmp(content->data.line->content, "context content", 15) == 0);
2161+
2162+
/* Test removed line content (from buffered old section) */
2163+
result = patch_scanner_next(scanner, &content);
2164+
assert(result == PATCH_SCAN_OK && content->type == PATCH_CONTENT_HUNK_LINE);
2165+
assert(content->data.line->type == PATCH_LINE_REMOVED);
2166+
/* Verify raw line includes prefix and space */
2167+
assert(content->data.line->length == 17); /* "- removed content" */
2168+
assert(strncmp(content->data.line->line, "- removed content", 17) == 0);
2169+
/* Verify clean content excludes prefix AND space */
2170+
assert(content->data.line->content_length == 15); /* "removed content" */
2171+
assert(strncmp(content->data.line->content, "removed content", 15) == 0);
2172+
2173+
/* Test changed line content from old section */
2174+
result = patch_scanner_next(scanner, &content);
2175+
assert(result == PATCH_SCAN_OK && content->type == PATCH_CONTENT_HUNK_LINE);
2176+
assert(content->data.line->type == PATCH_LINE_CHANGED);
2177+
assert(content->data.line->context == PATCH_CONTEXT_OLD);
2178+
/* Verify raw line includes prefix and space */
2179+
assert(content->data.line->length == 21); /* "! old changed content" */
2180+
assert(strncmp(content->data.line->line, "! old changed content", 21) == 0);
2181+
/* Verify clean content excludes prefix AND space */
2182+
assert(content->data.line->content_length == 19); /* "old changed content" */
2183+
assert(strncmp(content->data.line->content, "old changed content", 19) == 0);
2184+
2185+
/* Test context line content (from new section) */
2186+
result = patch_scanner_next(scanner, &content);
2187+
assert(result == PATCH_SCAN_OK && content->type == PATCH_CONTENT_HUNK_LINE);
2188+
assert(content->data.line->type == PATCH_LINE_CONTEXT);
2189+
/* Verify clean content excludes prefix AND space */
2190+
assert(content->data.line->content_length == 15); /* "context content" */
2191+
assert(strncmp(content->data.line->content, "context content", 15) == 0);
2192+
2193+
/* Test added line content (from new section) */
2194+
result = patch_scanner_next(scanner, &content);
2195+
assert(result == PATCH_SCAN_OK && content->type == PATCH_CONTENT_HUNK_LINE);
2196+
assert(content->data.line->type == PATCH_LINE_ADDED);
2197+
/* Verify clean content excludes prefix AND space */
2198+
assert(content->data.line->content_length == 13); /* "added content" */
2199+
assert(strncmp(content->data.line->content, "added content", 13) == 0);
2200+
2201+
/* Test changed line content from new section */
2202+
result = patch_scanner_next(scanner, &content);
2203+
assert(result == PATCH_SCAN_OK && content->type == PATCH_CONTENT_HUNK_LINE);
2204+
assert(content->data.line->type == PATCH_LINE_CHANGED);
2205+
assert(content->data.line->context == PATCH_CONTEXT_NEW);
2206+
/* Verify clean content excludes prefix AND space */
2207+
assert(content->data.line->content_length == 19); /* "new changed content" */
2208+
assert(strncmp(content->data.line->content, "new changed content", 19) == 0);
2209+
2210+
patch_scanner_destroy(scanner);
2211+
fclose(fp);
2212+
printf("✓ Content field context diff test passed\n");
2213+
}
2214+
20522215
int main(void)
20532216
{
20542217
printf("Running patch scanner basic tests...\n\n");
@@ -2119,6 +2282,10 @@ int main(void)
21192282
test_context_field_unified_diff();
21202283
test_context_field_context_diff();
21212284

2285+
/* Test content field functionality */
2286+
test_content_field_unified_diff();
2287+
test_content_field_context_diff();
2288+
21222289
printf("\n✓ All basic tests passed!\n");
21232290
return 0;
21242291
}

0 commit comments

Comments
 (0)