@@ -1147,23 +1147,18 @@ CTEST(slice, ends_with) {
11471147CTEST (slice , strip_prefix ) {
11481148 StringSlice ss = ss_from_cstr ("Hello, World!" );
11491149
1150- // Prefix present
11511150 StringSlice stripped = ss_strip_prefix (ss , SS ("Hello, " ));
11521151 ASSERT_TRUE (ss_eq (stripped , SS ("World!" )));
11531152
1154- // Prefix absent — returns original
11551153 stripped = ss_strip_prefix (ss , SS ("Goodbye" ));
11561154 ASSERT_TRUE (ss_eq (stripped , ss ));
11571155
1158- // Empty prefix — returns original
11591156 stripped = ss_strip_prefix (ss , SS ("" ));
11601157 ASSERT_TRUE (ss_eq (stripped , ss ));
11611158
1162- // Prefix == entire string
11631159 stripped = ss_strip_prefix (ss , ss );
11641160 ASSERT_TRUE (stripped .size == 0 );
11651161
1166- // cstr variant
11671162 stripped = ss_strip_prefix_cstr (ss , "Hello, " );
11681163 ASSERT_TRUE (ss_eq (stripped , SS ("World!" )));
11691164 stripped = ss_strip_prefix_cstr (ss , "Goodbye" );
@@ -1173,23 +1168,18 @@ CTEST(slice, strip_prefix) {
11731168CTEST (slice , strip_suffix ) {
11741169 StringSlice ss = ss_from_cstr ("Hello, World!" );
11751170
1176- // Suffix present
11771171 StringSlice stripped = ss_strip_suffix (ss , SS (", World!" ));
11781172 ASSERT_TRUE (ss_eq (stripped , SS ("Hello" )));
11791173
1180- // Suffix absent — returns original
11811174 stripped = ss_strip_suffix (ss , SS ("Goodbye" ));
11821175 ASSERT_TRUE (ss_eq (stripped , ss ));
11831176
1184- // Empty suffix — returns original
11851177 stripped = ss_strip_suffix (ss , SS ("" ));
11861178 ASSERT_TRUE (ss_eq (stripped , ss ));
11871179
1188- // Suffix == entire string
11891180 stripped = ss_strip_suffix (ss , ss );
11901181 ASSERT_TRUE (stripped .size == 0 );
11911182
1192- // cstr variant
11931183 stripped = ss_strip_suffix_cstr (ss , ", World!" );
11941184 ASSERT_TRUE (ss_eq (stripped , SS ("Hello" )));
11951185 stripped = ss_strip_suffix_cstr (ss , "Goodbye" );
@@ -1208,8 +1198,6 @@ CTEST(slice, eq_ignore_case) {
12081198 ASSERT_TRUE (ss_eq_ignore_case (SS ("" ), SS ("" )));
12091199 ASSERT_TRUE (!ss_eq_ignore_case (SS ("Hello" ), SS ("World" )));
12101200 ASSERT_TRUE (!ss_eq_ignore_case (SS ("Hello" ), SS ("Hell" )));
1211-
1212- // Digits/punctuation unchanged
12131201 ASSERT_TRUE (ss_eq_ignore_case (SS ("test-123" ), SS ("TEST-123" )));
12141202}
12151203
@@ -1304,6 +1292,7 @@ CTEST(slice, foreach_split_cstr) {
13041292 "o Diva" ,
13051293 "del Pelide Achille" ,
13061294 };
1295+
13071296 size_t i = 0 ;
13081297 ss_foreach_split_cstr (SS ("Cantami, o Diva, del Pelide Achille" ), ", " , word ) {
13091298 ASSERT_TRUE (i < EXT_ARR_SIZE (expected ));
@@ -1312,7 +1301,6 @@ CTEST(slice, foreach_split_cstr) {
13121301 }
13131302 ASSERT_TRUE (i == EXT_ARR_SIZE (expected ));
13141303
1315- // Delimiter not found — yields entire string
13161304 i = 0 ;
13171305 ss_foreach_split_cstr (SS ("hello" ), ", " , word ) {
13181306 ASSERT_TRUE (ss_eq (word , SS ("hello" )));
@@ -1327,6 +1315,7 @@ CTEST(slice, foreach_rsplit_cstr) {
13271315 "o Diva" ,
13281316 "Cantami" ,
13291317 };
1318+
13301319 size_t i = 0 ;
13311320 ss_foreach_rsplit_cstr (SS ("Cantami, o Diva, del Pelide Achille" ), ", " , word ) {
13321321 ASSERT_TRUE (i < EXT_ARR_SIZE (expected ));
@@ -1335,7 +1324,6 @@ CTEST(slice, foreach_rsplit_cstr) {
13351324 }
13361325 ASSERT_TRUE (i == EXT_ARR_SIZE (expected ));
13371326
1338- // Delimiter not found — yields entire string
13391327 i = 0 ;
13401328 ss_foreach_rsplit_cstr (SS ("hello" ), ", " , word ) {
13411329 ASSERT_TRUE (ss_eq (word , SS ("hello" )));
@@ -1346,25 +1334,19 @@ CTEST(slice, foreach_rsplit_cstr) {
13461334
13471335CTEST (slice , find_char ) {
13481336 StringSlice ss = ss_from_cstr ("hello world" );
1349-
13501337 ASSERT_TRUE (ss_find_char (ss , 'h' , 0 ) == 0 );
13511338 ASSERT_TRUE (ss_find_char (ss , 'o' , 0 ) == 4 );
13521339 ASSERT_TRUE (ss_find_char (ss , 'o' , 5 ) == 7 );
13531340 ASSERT_TRUE (ss_find_char (ss , 'z' , 0 ) == -1 );
1354-
1355- // Offset past end
13561341 ASSERT_TRUE (ss_find_char (ss , 'h' , ss .size ) == -1 );
13571342}
13581343
13591344CTEST (slice , rfind_char ) {
13601345 StringSlice ss = ss_from_cstr ("hello world" );
1361-
13621346 ASSERT_TRUE (ss_rfind_char (ss , 'd' , ss .size ) == 10 );
13631347 ASSERT_TRUE (ss_rfind_char (ss , 'o' , ss .size ) == 7 );
13641348 ASSERT_TRUE (ss_rfind_char (ss , 'o' , 5 ) == 4 );
13651349 ASSERT_TRUE (ss_rfind_char (ss , 'z' , ss .size ) == -1 );
1366-
1367- // Offset at 0 — nothing to search
13681350 ASSERT_TRUE (ss_rfind_char (ss , 'h' , 0 ) == -1 );
13691351}
13701352
@@ -1433,47 +1415,31 @@ CTEST(slice, rfind_cstr) {
14331415}
14341416
14351417CTEST (slice , basename ) {
1436- // Simple absolute path
14371418 ASSERT_TRUE (ss_eq (ss_basename (SS ("/usr/local/bin/test" )), SS ("test" )));
1438- // Relative path
14391419 ASSERT_TRUE (ss_eq (ss_basename (SS ("src/main.c" )), SS ("main.c" )));
1440- // Trailing slash
14411420 ASSERT_TRUE (ss_eq (ss_basename (SS ("/usr/local/" )), SS ("local" )));
1442- // No separator — returns whole string
14431421 ASSERT_TRUE (ss_eq (ss_basename (SS ("hello.txt" )), SS ("hello.txt" )));
1444- // Root
14451422 ASSERT_TRUE (ss_basename (SS ("/" )).size == 0 );
1446- // Multiple trailing slashes
14471423 ASSERT_TRUE (ss_eq (ss_basename (SS ("/usr/local///" )), SS ("local" )));
14481424
14491425#ifdef EXT_WINDOWS
1450- // Windows-style backslash separators
14511426 ASSERT_TRUE (ss_eq (ss_basename (SS ("C:\\Users\\test\\file.txt" )), SS ("file.txt" )));
14521427 ASSERT_TRUE (ss_eq (ss_basename (SS ("C:\\Users\\test\\" )), SS ("test" )));
1453- // Mixed separators
14541428 ASSERT_TRUE (ss_eq (ss_basename (SS ("C:\\Users/test/file.txt" )), SS ("file.txt" )));
14551429#endif
14561430}
14571431
14581432CTEST (slice , dirname ) {
1459- // Simple absolute path
14601433 ASSERT_TRUE (ss_eq (ss_dirname (SS ("/usr/local/bin/test" )), SS ("/usr/local/bin" )));
1461- // Single level
14621434 ASSERT_TRUE (ss_eq (ss_dirname (SS ("/test" )), SS ("/" )));
1463- // Trailing slash
14641435 ASSERT_TRUE (ss_eq (ss_dirname (SS ("/usr/local/" )), SS ("/usr" )));
1465- // No separator — returns empty
14661436 ASSERT_TRUE (ss_dirname (SS ("hello.txt" )).size == 0 );
1467- // Root
14681437 ASSERT_TRUE (ss_eq (ss_dirname (SS ("/" )), SS ("/" )));
1469- // Relative path
14701438 ASSERT_TRUE (ss_eq (ss_dirname (SS ("src/main.c" )), SS ("src" )));
14711439
14721440#ifdef EXT_WINDOWS
1473- // Windows-style backslash separators
14741441 ASSERT_TRUE (ss_eq (ss_dirname (SS ("C:\\Users\\test\\file.txt" )), SS ("C:\\Users\\test" )));
14751442 ASSERT_TRUE (ss_eq (ss_dirname (SS ("C:\\file.txt" )), SS ("C:" )));
1476- // Mixed separators
14771443 ASSERT_TRUE (ss_eq (ss_dirname (SS ("C:\\Users/test/file.txt" )), SS ("C:\\Users/test" )));
14781444#endif
14791445}
@@ -1907,30 +1873,23 @@ CTEST(hmap, delete_ss) {
19071873
19081874CTEST (hmap , get_bytes ) {
19091875 HashMap (int , int ) map = {0 };
1910-
1911- // Empty map must return NULL without touching a NULL entries pointer.
19121876 ASSERT_TRUE (hmap_get (& map , 1 ) == NULL );
19131877
19141878 for (int i = 1 ; i <= 22 ; i ++ ) {
19151879 hmap_put (& map , i , i * 10 );
19161880 }
19171881
1918- // Hit: correct key and value, inline mutation visible on next lookup.
19191882 ASSERT_TRUE (hmap_get (& map , 5 ) != NULL );
19201883 ASSERT_TRUE (hmap_get (& map , 5 )-> key == 5 );
19211884 ASSERT_TRUE (hmap_get (& map , 5 )-> value == 50 );
19221885 hmap_get (& map , 5 )-> value = 99 ;
19231886 ASSERT_TRUE (hmap_get (& map , 5 )-> value == 99 );
19241887
1925- // Same key returns the same pointer (stable storage, no realloc triggered here).
1926- // Note: two get calls must not share an expression — both write to the tmp slot.
19271888 void * p3a = hmap_get (& map , 3 );
19281889 void * p3b = hmap_get (& map , 3 );
19291890 ASSERT_TRUE (p3a == p3b );
19301891
1931- // Miss on absent key.
19321892 ASSERT_TRUE (hmap_get (& map , 100 ) == NULL );
1933-
19341893 hmap_free (& map );
19351894}
19361895
@@ -2078,7 +2037,6 @@ CTEST(hmap, get_ss) {
20782037CTEST (hmap , get_default_ss ) {
20792038 HashMap (StringSlice , int ) map = {0 };
20802039
2081- // Word-count pattern — primary use case for get_default.
20822040 const char * words [] = {"foo" , "bar" , "foo" , "baz" , "foo" , "bar" };
20832041 for (size_t i = 0 ; i < 6 ; i ++ ) {
20842042 hmap_get_default_ss (& map , ss_from_cstr (words [i ]), 0 )-> value ++ ;
0 commit comments