@@ -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+
20522215int 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