test/test_string.cpp

changeset 589
c290f8fd979e
parent 588
6a3cd8f0a2cf
child 597
8b48126671cf
equal deleted inserted replaced
588:6a3cd8f0a2cf 589:c290f8fd979e
29 #include "cx/string.h" 29 #include "cx/string.h"
30 #include "util_allocator.h" 30 #include "util_allocator.h"
31 31
32 #include <gtest/gtest.h> 32 #include <gtest/gtest.h>
33 33
34 #define EXPECT_ZERO_TERMINATED(str) EXPECT_EQ((str).ptr[(str).length], '\0')
35
34 TEST(String, construct) { 36 TEST(String, construct) {
35 cxstring s1 = cx_str("1234"); 37 cxstring s1 = cx_str("1234");
36 cxstring s2 = cx_strn("abcd", 2); 38 cxstring s2 = cx_strn("abcd", 2);
37 cxmutstr s3 = cx_mutstr((char *) "1234"); 39 cxmutstr s3 = cx_mutstr((char *) "1234");
38 cxmutstr s4 = cx_mutstrn((char *) "abcd", 2); 40 cxmutstr s4 = cx_mutstrn((char *) "abcd", 2);
53 EXPECT_EQ(str.ptr, nullptr); 55 EXPECT_EQ(str.ptr, nullptr);
54 EXPECT_EQ(str.length, 0); 56 EXPECT_EQ(str.length, 0);
55 EXPECT_TRUE(alloc.verify()); 57 EXPECT_TRUE(alloc.verify());
56 } 58 }
57 59
60 TEST(String, strdup) {
61 cxstring str = CX_STR("test");
62 cxmutstr dup = cx_strdup(str);
63 ASSERT_EQ(dup.length, str.length);
64 EXPECT_STREQ(dup.ptr, str.ptr);
65 EXPECT_ZERO_TERMINATED(dup);
66 cx_strfree(&dup);
67
68 str.length = 2;
69 dup = cx_strdup(str);
70 ASSERT_EQ(dup.length, str.length);
71 EXPECT_STREQ(dup.ptr, "te");
72 EXPECT_ZERO_TERMINATED(dup);
73 cx_strfree(&dup);
74 }
75
58 TEST(String, strlen) { 76 TEST(String, strlen) {
59 cxstring s1 = CX_STR("1234"); 77 cxstring s1 = CX_STR("1234");
60 cxstring s2 = CX_STR(".:.:."); 78 cxstring s2 = CX_STR(".:.:.");
61 cxstring s3 = CX_STR("X"); 79 cxstring s3 = CX_STR("X");
62 80
208 EXPECT_GT(cx_strcasecmp(str, cx_str("compare shit")), 0); 226 EXPECT_GT(cx_strcasecmp(str, cx_str("compare shit")), 0);
209 EXPECT_LT(cx_strcasecmp(str, cx_str("compare this not")), 0); 227 EXPECT_LT(cx_strcasecmp(str, cx_str("compare this not")), 0);
210 EXPECT_GT(cx_strcasecmp(str, cx_str("compare")), 0); 228 EXPECT_GT(cx_strcasecmp(str, cx_str("compare")), 0);
211 } 229 }
212 230
213
214 TEST(String, strcat) { 231 TEST(String, strcat) {
215 cxstring s1 = CX_STR("12"); 232 cxstring s1 = CX_STR("12");
216 cxstring s2 = CX_STR("34"); 233 cxstring s2 = CX_STR("34");
217 cxstring s3 = CX_STR("56"); 234 cxstring s3 = CX_STR("56");
218 cxstring sn = {nullptr, 0}; 235 cxstring sn = {nullptr, 0};
219 236
220 CxTestingAllocator alloc; 237 CxTestingAllocator alloc;
221 238
222 cxmutstr t1 = cx_strcat_a(&alloc, 2, s1, s2); 239 cxmutstr t1 = cx_strcat_a(&alloc, 2, s1, s2);
223 EXPECT_EQ(cx_strcmp(cx_strcast(t1), cx_str("1234")), 0); 240 EXPECT_EQ(cx_strcmp(cx_strcast(t1), cx_str("1234")), 0);
241 EXPECT_ZERO_TERMINATED(t1);
224 cx_strfree_a(&alloc, &t1); 242 cx_strfree_a(&alloc, &t1);
225 243
226 cxmutstr t2 = cx_strcat_a(&alloc, 3, s1, s2, s3); 244 cxmutstr t2 = cx_strcat_a(&alloc, 3, s1, s2, s3);
227 EXPECT_EQ(cx_strcmp(cx_strcast(t2), cx_str("123456")), 0); 245 EXPECT_EQ(cx_strcmp(cx_strcast(t2), cx_str("123456")), 0);
246 EXPECT_ZERO_TERMINATED(t2);
228 cx_strfree_a(&alloc, &t2); 247 cx_strfree_a(&alloc, &t2);
229 248
230 cxmutstr t3 = cx_strcat_a(&alloc, 6, s1, sn, s2, sn, s3, sn); 249 cxmutstr t3 = cx_strcat_a(&alloc, 6, s1, sn, s2, sn, s3, sn);
231 EXPECT_EQ(cx_strcmp(cx_strcast(t3), cx_str("123456")), 0); 250 EXPECT_EQ(cx_strcmp(cx_strcast(t3), cx_str("123456")), 0);
251 EXPECT_ZERO_TERMINATED(t3);
232 cx_strfree_a(&alloc, &t3); 252 cx_strfree_a(&alloc, &t3);
233 253
234 cxmutstr t4 = cx_strcat_a(&alloc, 2, sn, sn); 254 cxmutstr t4 = cx_strcat_a(&alloc, 2, sn, sn);
235 EXPECT_EQ(cx_strcmp(cx_strcast(t4), cx_str("")), 0); 255 EXPECT_EQ(cx_strcmp(cx_strcast(t4), cx_str("")), 0);
256 EXPECT_ZERO_TERMINATED(t4);
236 cx_strfree_a(&alloc, &t4); 257 cx_strfree_a(&alloc, &t4);
237 258
238 EXPECT_TRUE(alloc.verify()); 259 EXPECT_TRUE(alloc.verify());
239 } 260 }
240 261
522 cxstring empty = CX_STR(""); 543 cxstring empty = CX_STR("");
523 cxstring astr = CX_STR("aaaaaaaaaa"); 544 cxstring astr = CX_STR("aaaaaaaaaa");
524 cxstring csstr = CX_STR("test AB ab TEST xyz"); 545 cxstring csstr = CX_STR("test AB ab TEST xyz");
525 546
526 cxmutstr repl = cx_strreplace(str, cx_str("abab"), cx_str("muchlonger")); 547 cxmutstr repl = cx_strreplace(str, cx_str("abab"), cx_str("muchlonger"));
527 cxstring expected = CX_STR("test muchlongerab string aba"); 548 auto expected = "test muchlongerab string aba";
528 549
529 cxmutstr repln = cx_strreplacen(str, cx_str("ab"), cx_str("c"), 2); 550 cxmutstr repln = cx_strreplacen(str, cx_str("ab"), cx_str("c"), 2);
530 cxstring expectedn = CX_STR("test ccab string aba"); 551 auto expectedn = "test ccab string aba";
531 552
532 cxmutstr longrepl = cx_strreplace(longstr, cx_str("a"), cx_str("z")); 553 cxmutstr longrepl = cx_strreplace(longstr, cx_str("a"), cx_str("z"));
533 cxstring longexpect = CX_STR( 554 auto longexpect = "xyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzcd";
534 "xyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzcd");
535 555
536 cxmutstr replnotrail = cx_strreplace(notrail, cx_str("ab"), cx_str("z")); 556 cxmutstr replnotrail = cx_strreplace(notrail, cx_str("ab"), cx_str("z"));
537 cxstring notrailexpect = CX_STR("test zz"); 557 auto notrailexpect = "test zz";
538 558
539 cxmutstr repleq = cx_strreplace(str, str, cx_str("hello")); 559 cxmutstr repleq = cx_strreplace(str, str, cx_str("hello"));
540 cxstring eqexpect = CX_STR("hello"); 560 auto eqexpect = "hello";
541 561
542 cxmutstr replempty1 = cx_strreplace(empty, cx_str("ab"), cx_str("c")); // expect: empty 562 cxmutstr replempty1 = cx_strreplace(empty, cx_str("ab"), cx_str("c")); // expect: empty
543 cxmutstr replempty2 = cx_strreplace(str, cx_str("abab"), empty); 563 cxmutstr replempty2 = cx_strreplace(str, cx_str("abab"), empty);
544 cxstring emptyexpect2 = CX_STR("test ab string aba"); 564 auto emptyexpect2 = "test ab string aba";
545 565
546 cxmutstr replpre = cx_strreplace(str, cx_str("test "), cx_str("TEST ")); 566 cxmutstr replpre = cx_strreplace(str, cx_str("test "), cx_str("TEST "));
547 cxstring preexpected = CX_STR("TEST ababab string aba"); 567 auto preexpected = "TEST ababab string aba";
548 568
549 cxmutstr replan1 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 1); 569 cxmutstr replan1 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 1);
550 cxstring an1expected = CX_STR("xaaaaaaaaa"); 570 auto an1expected = "xaaaaaaaaa";
551 571
552 cxmutstr replan4 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 4); 572 cxmutstr replan4 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 4);
553 cxstring an4expected = CX_STR("xxxxaaaaaa"); 573 auto an4expected = "xxxxaaaaaa";
554 574
555 cxmutstr replan9 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 9); 575 cxmutstr replan9 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 9);
556 cxstring an9expected = CX_STR("xxxxxxxxxa"); 576 auto an9expected = "xxxxxxxxxa";
557 577
558 cxmutstr replan10 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 10); 578 cxmutstr replan10 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 10);
559 cxstring an10expected = CX_STR("xxxxxxxxxx"); 579 auto an10expected = "xxxxxxxxxx";
560 580
561 cxmutstr replcs1 = cx_strreplace(csstr, cx_str("AB"), cx_str("*")); 581 cxmutstr replcs1 = cx_strreplace(csstr, cx_str("AB"), cx_str("*"));
562 cxstring cs1expected = CX_STR("test * ab TEST xyz"); 582 auto cs1expected = "test * ab TEST xyz";
563 583
564 cxmutstr replcs2 = cx_strreplace(csstr, cx_str("test"), cx_str("TEST")); 584 cxmutstr replcs2 = cx_strreplace(csstr, cx_str("test"), cx_str("TEST"));
565 cxstring cs2expected = CX_STR("TEST AB ab TEST xyz"); 585 auto cs2expected = "TEST AB ab TEST xyz";
566 586
567 587
568 EXPECT_NE(repl.ptr, str.ptr); 588 EXPECT_NE(repl.ptr, str.ptr);
569 EXPECT_EQ(cx_strcmp(cx_strcast(repl), expected), 0); 589 EXPECT_ZERO_TERMINATED(repl);
570 EXPECT_NE(repln.ptr, str.ptr); 590 EXPECT_STREQ(repl.ptr, expected);
571 EXPECT_EQ(cx_strcmp(cx_strcast(repln), expectedn), 0); 591 EXPECT_ZERO_TERMINATED(repln);
572 EXPECT_EQ(cx_strcmp(cx_strcast(longrepl), longexpect), 0); 592 EXPECT_STREQ(repln.ptr, expectedn);
573 EXPECT_EQ(cx_strcmp(cx_strcast(replnotrail), notrailexpect), 0); 593 EXPECT_ZERO_TERMINATED(longrepl);
574 EXPECT_EQ(cx_strcmp(cx_strcast(repleq), eqexpect), 0); 594 EXPECT_STREQ(longrepl.ptr, longexpect);
575 EXPECT_EQ(cx_strcmp(cx_strcast(replempty1), empty), 0); 595 EXPECT_ZERO_TERMINATED(replnotrail);
576 EXPECT_EQ(cx_strcmp(cx_strcast(replempty2), emptyexpect2), 0); 596 EXPECT_STREQ(replnotrail.ptr, notrailexpect);
577 EXPECT_EQ(cx_strcmp(cx_strcast(replpre), preexpected), 0); 597 EXPECT_ZERO_TERMINATED(repleq);
578 EXPECT_EQ(cx_strcmp(cx_strcast(replan1), an1expected), 0); 598 EXPECT_STREQ(repleq.ptr, eqexpect);
579 EXPECT_EQ(cx_strcmp(cx_strcast(replan4), an4expected), 0); 599 EXPECT_ZERO_TERMINATED(replempty1);
580 EXPECT_EQ(cx_strcmp(cx_strcast(replan9), an9expected), 0); 600 EXPECT_STREQ(replempty1.ptr, "");
581 EXPECT_EQ(cx_strcmp(cx_strcast(replan10), an10expected), 0); 601 EXPECT_ZERO_TERMINATED(replempty2);
582 EXPECT_EQ(cx_strcmp(cx_strcast(replcs1), cs1expected), 0); 602 EXPECT_STREQ(replempty2.ptr, emptyexpect2);
583 EXPECT_EQ(cx_strcmp(cx_strcast(replcs2), cs2expected), 0); 603 EXPECT_ZERO_TERMINATED(replpre);
604 EXPECT_STREQ(replpre.ptr, preexpected);
605 EXPECT_ZERO_TERMINATED(replan1);
606 EXPECT_STREQ(replan1.ptr, an1expected);
607 EXPECT_ZERO_TERMINATED(replan4);
608 EXPECT_STREQ(replan4.ptr, an4expected);
609 EXPECT_ZERO_TERMINATED(replan9);
610 EXPECT_STREQ(replan9.ptr, an9expected);
611 EXPECT_ZERO_TERMINATED(replan10);
612 EXPECT_STREQ(replan10.ptr, an10expected);
613 EXPECT_ZERO_TERMINATED(replcs1);
614 EXPECT_STREQ(replcs1.ptr, cs1expected);
615 EXPECT_ZERO_TERMINATED(replcs2);
616 EXPECT_STREQ(replcs2.ptr, cs2expected);
584 617
585 cx_strfree(&repl); 618 cx_strfree(&repl);
586 cx_strfree(&repln); 619 cx_strfree(&repln);
587 cx_strfree(&longrepl); 620 cx_strfree(&longrepl);
588 cx_strfree(&replnotrail); 621 cx_strfree(&replnotrail);

mercurial