1.1 --- a/test/test_string.cpp Wed Feb 01 18:07:16 2023 +0100 1.2 +++ b/test/test_string.cpp Thu Feb 02 20:25:34 2023 +0100 1.3 @@ -653,3 +653,213 @@ 1.4 EXPECT_STREQ(str.ptr, "this 1s @ te$t"); 1.5 cx_strfree(&str); 1.6 } 1.7 + 1.8 +TEST(String, strtok) { 1.9 + cxstring str = cx_str("a,comma,separated,string"); 1.10 + cxstring delim = cx_str(","); 1.11 + CxStrtokCtx ctx = cx_strtok(str, delim, 3); 1.12 + EXPECT_EQ(ctx.str.ptr, str.ptr); 1.13 + EXPECT_EQ(ctx.str.length, str.length); 1.14 + EXPECT_EQ(ctx.delim.ptr, delim.ptr); 1.15 + EXPECT_EQ(ctx.delim.length, delim.length); 1.16 + EXPECT_EQ(ctx.limit, 3); 1.17 + EXPECT_EQ(ctx.found, 0); 1.18 + EXPECT_EQ(ctx.pos, 0); 1.19 + EXPECT_EQ(ctx.next_pos, 0); 1.20 + EXPECT_EQ(ctx.delim_more, nullptr); 1.21 + EXPECT_EQ(ctx.delim_more_count, 0); 1.22 +} 1.23 + 1.24 +TEST(String, strtok_m) { 1.25 + cxmutstr str = cx_strdup(cx_str("a,comma,separated,string")); 1.26 + cxstring delim = cx_str(","); 1.27 + CxStrtokCtx ctx = cx_strtok_m(str, delim, 3); 1.28 + EXPECT_EQ(ctx.str.ptr, str.ptr); 1.29 + EXPECT_EQ(ctx.str.length, str.length); 1.30 + EXPECT_EQ(ctx.delim.ptr, delim.ptr); 1.31 + EXPECT_EQ(ctx.delim.length, delim.length); 1.32 + EXPECT_EQ(ctx.limit, 3); 1.33 + EXPECT_EQ(ctx.found, 0); 1.34 + EXPECT_EQ(ctx.pos, 0); 1.35 + EXPECT_EQ(ctx.next_pos, 0); 1.36 + EXPECT_EQ(ctx.delim_more, nullptr); 1.37 + EXPECT_EQ(ctx.delim_more_count, 0); 1.38 + cx_strfree(&str); 1.39 +} 1.40 + 1.41 +TEST(String, strtok_delim) { 1.42 + cxstring str = cx_str("an,arbitrarily|separated;string"); 1.43 + cxstring delim = cx_str(","); 1.44 + cxstring delim_more[2] = {CX_STR("|"), CX_STR(";")}; 1.45 + CxStrtokCtx ctx = cx_strtok(str, delim, 3); 1.46 + cx_strtok_delim(&ctx, delim_more, 2); 1.47 + EXPECT_EQ(ctx.str.ptr, str.ptr); 1.48 + EXPECT_EQ(ctx.str.length, str.length); 1.49 + EXPECT_EQ(ctx.delim.ptr, delim.ptr); 1.50 + EXPECT_EQ(ctx.delim.length, delim.length); 1.51 + EXPECT_EQ(ctx.limit, 3); 1.52 + EXPECT_EQ(ctx.found, 0); 1.53 + EXPECT_EQ(ctx.pos, 0); 1.54 + EXPECT_EQ(ctx.next_pos, 0); 1.55 + EXPECT_EQ(ctx.delim_more, delim_more); 1.56 + EXPECT_EQ(ctx.delim_more_count, 2); 1.57 +} 1.58 + 1.59 +TEST(String, strtok_next_easy) { 1.60 + cxstring str = cx_str("a,comma,separated,string"); 1.61 + cxstring delim = cx_str(","); 1.62 + CxStrtokCtx ctx = cx_strtok(str, delim, 3); 1.63 + bool ret; 1.64 + cxstring tok; 1.65 + 1.66 + ret = cx_strtok_next(&ctx, &tok); 1.67 + ASSERT_TRUE(ret); 1.68 + EXPECT_EQ(cx_strcmp(tok, cx_str("a")), 0); 1.69 + EXPECT_EQ(ctx.pos, 0); 1.70 + EXPECT_EQ(ctx.next_pos, 2); 1.71 + EXPECT_EQ(ctx.delim_pos, 1); 1.72 + EXPECT_EQ(ctx.found, 1); 1.73 + 1.74 + ret = cx_strtok_next(&ctx, &tok); 1.75 + ASSERT_TRUE(ret); 1.76 + EXPECT_EQ(cx_strcmp(tok, cx_str("comma")), 0); 1.77 + EXPECT_EQ(ctx.pos, 2); 1.78 + EXPECT_EQ(ctx.next_pos, 8); 1.79 + EXPECT_EQ(ctx.delim_pos, 7); 1.80 + EXPECT_EQ(ctx.found, 2); 1.81 + 1.82 + ret = cx_strtok_next(&ctx, &tok); 1.83 + ASSERT_TRUE(ret); 1.84 + EXPECT_EQ(cx_strcmp(tok, cx_str("separated")), 0); 1.85 + EXPECT_EQ(ctx.pos, 8); 1.86 + EXPECT_EQ(ctx.next_pos, 18); 1.87 + EXPECT_EQ(ctx.delim_pos, 17); 1.88 + EXPECT_EQ(ctx.found, 3); 1.89 + 1.90 + ret = cx_strtok_next(&ctx, &tok); 1.91 + ASSERT_FALSE(ret); 1.92 + EXPECT_EQ(ctx.pos, 8); 1.93 + EXPECT_EQ(ctx.next_pos, 18); 1.94 + EXPECT_EQ(ctx.delim_pos, 17); 1.95 + EXPECT_EQ(ctx.found, 3); 1.96 +} 1.97 + 1.98 +TEST(String, strtok_next_unlimited) { 1.99 + cxstring str = cx_str("some;-;otherwise;-;separated;-;string;-;"); 1.100 + cxstring delim = cx_str(";-;"); 1.101 + CxStrtokCtx ctx = cx_strtok(str, delim, SIZE_MAX); 1.102 + bool ret; 1.103 + cxstring tok; 1.104 + 1.105 + ret = cx_strtok_next(&ctx, &tok); 1.106 + ASSERT_TRUE(ret); 1.107 + EXPECT_EQ(cx_strcmp(tok, cx_str("some")), 0); 1.108 + EXPECT_EQ(ctx.pos, 0); 1.109 + EXPECT_EQ(ctx.next_pos, 7); 1.110 + EXPECT_EQ(ctx.delim_pos, 4); 1.111 + EXPECT_EQ(ctx.found, 1); 1.112 + 1.113 + ret = cx_strtok_next(&ctx, &tok); 1.114 + ASSERT_TRUE(ret); 1.115 + EXPECT_EQ(cx_strcmp(tok, cx_str("otherwise")), 0); 1.116 + EXPECT_EQ(ctx.pos, 7); 1.117 + EXPECT_EQ(ctx.next_pos, 19); 1.118 + EXPECT_EQ(ctx.delim_pos, 16); 1.119 + EXPECT_EQ(ctx.found, 2); 1.120 + 1.121 + ret = cx_strtok_next(&ctx, &tok); 1.122 + ASSERT_TRUE(ret); 1.123 + EXPECT_EQ(cx_strcmp(tok, cx_str("separated")), 0); 1.124 + EXPECT_EQ(ctx.pos, 19); 1.125 + EXPECT_EQ(ctx.next_pos, 31); 1.126 + EXPECT_EQ(ctx.delim_pos, 28); 1.127 + EXPECT_EQ(ctx.found, 3); 1.128 + 1.129 + ret = cx_strtok_next(&ctx, &tok); 1.130 + ASSERT_TRUE(ret); 1.131 + EXPECT_EQ(cx_strcmp(tok, cx_str("string")), 0); 1.132 + EXPECT_EQ(ctx.pos, 31); 1.133 + EXPECT_EQ(ctx.next_pos, 40); 1.134 + EXPECT_EQ(ctx.delim_pos, 37); 1.135 + EXPECT_EQ(ctx.found, 4); 1.136 + 1.137 + ret = cx_strtok_next(&ctx, &tok); 1.138 + ASSERT_TRUE(ret); 1.139 + EXPECT_EQ(cx_strcmp(tok, cx_str("")), 0); 1.140 + EXPECT_EQ(ctx.pos, 40); 1.141 + EXPECT_EQ(ctx.next_pos, 40); 1.142 + EXPECT_EQ(ctx.delim_pos, 40); 1.143 + EXPECT_EQ(ctx.found, 5); 1.144 + 1.145 + ret = cx_strtok_next(&ctx, &tok); 1.146 + ASSERT_FALSE(ret); 1.147 + EXPECT_EQ(ctx.pos, 40); 1.148 + EXPECT_EQ(ctx.delim_pos, 40); 1.149 + EXPECT_EQ(ctx.found, 5); 1.150 +} 1.151 + 1.152 +TEST(String, strtok_next_advanced) { 1.153 + cxmutstr str = cx_strdup(cx_str("an,arbitrarily;||separated;string")); 1.154 + cxstring delim = cx_str(","); 1.155 + cxstring delim_more[2] = {CX_STR("||"), CX_STR(";")}; 1.156 + CxStrtokCtx ctx = cx_strtok_m(str, delim, 10); 1.157 + cx_strtok_delim(&ctx, delim_more, 2); 1.158 + bool ret; 1.159 + cxmutstr tok; 1.160 + 1.161 + ret = cx_strtok_next_m(&ctx, &tok); 1.162 + ASSERT_TRUE(ret); 1.163 + EXPECT_EQ(cx_strcmp(cx_strcast(tok), cx_str("an")), 0); 1.164 + EXPECT_EQ(ctx.pos, 0); 1.165 + EXPECT_EQ(ctx.next_pos, 3); 1.166 + EXPECT_EQ(ctx.delim_pos, 2); 1.167 + EXPECT_EQ(ctx.found, 1); 1.168 + cx_strupper(tok); 1.169 + 1.170 + ret = cx_strtok_next_m(&ctx, &tok); 1.171 + ASSERT_TRUE(ret); 1.172 + EXPECT_EQ(cx_strcmp(cx_strcast(tok), cx_str("arbitrarily")), 0); 1.173 + EXPECT_EQ(ctx.pos, 3); 1.174 + EXPECT_EQ(ctx.next_pos, 15); 1.175 + EXPECT_EQ(ctx.delim_pos, 14); 1.176 + EXPECT_EQ(ctx.found, 2); 1.177 + cx_strupper(tok); 1.178 + 1.179 + ret = cx_strtok_next_m(&ctx, &tok); 1.180 + ASSERT_TRUE(ret); 1.181 + EXPECT_EQ(cx_strcmp(cx_strcast(tok), cx_str("")), 0); 1.182 + EXPECT_EQ(ctx.pos, 15); 1.183 + EXPECT_EQ(ctx.next_pos, 17); 1.184 + EXPECT_EQ(ctx.delim_pos, 15); 1.185 + EXPECT_EQ(ctx.found, 3); 1.186 + cx_strupper(tok); 1.187 + 1.188 + ret = cx_strtok_next_m(&ctx, &tok); 1.189 + ASSERT_TRUE(ret); 1.190 + EXPECT_EQ(cx_strcmp(cx_strcast(tok), cx_str("separated")), 0); 1.191 + EXPECT_EQ(ctx.pos, 17); 1.192 + EXPECT_EQ(ctx.next_pos, 27); 1.193 + EXPECT_EQ(ctx.delim_pos, 26); 1.194 + EXPECT_EQ(ctx.found, 4); 1.195 + cx_strupper(tok); 1.196 + 1.197 + ret = cx_strtok_next_m(&ctx, &tok); 1.198 + ASSERT_TRUE(ret); 1.199 + EXPECT_EQ(cx_strcmp(cx_strcast(tok), cx_str("string")), 0); 1.200 + EXPECT_EQ(ctx.pos, 27); 1.201 + EXPECT_EQ(ctx.next_pos, 33); 1.202 + EXPECT_EQ(ctx.delim_pos, 33); 1.203 + EXPECT_EQ(ctx.found, 5); 1.204 + cx_strupper(tok); 1.205 + 1.206 + ret = cx_strtok_next_m(&ctx, &tok); 1.207 + ASSERT_FALSE(ret); 1.208 + EXPECT_EQ(ctx.pos, 27); 1.209 + EXPECT_EQ(ctx.next_pos, 33); 1.210 + EXPECT_EQ(ctx.delim_pos, 33); 1.211 + EXPECT_EQ(ctx.found, 5); 1.212 + 1.213 + EXPECT_EQ(cx_strcmp(cx_strcast(str), cx_str("AN,ARBITRARILY;||SEPARATED;STRING")), 0); 1.214 + 1.215 + cx_strfree(&str); 1.216 +}