diff --git a/src/sds.c b/src/sds.c index f81cb4c26..3939cc5b3 100644 --- a/src/sds.c +++ b/src/sds.c @@ -1230,269 +1230,3 @@ error: sdsfree(res); return NULL; } - -#ifdef SERVER_TEST -#include -#include -#include "testhelp.h" - -#define UNUSED(x) (void)(x) - -static sds sdsTestTemplateCallback(sds varname, void *arg) { - UNUSED(arg); - static const char *_var1 = "variable1"; - static const char *_var2 = "variable2"; - - if (!strcmp(varname, _var1)) return sdsnew("value1"); - else if (!strcmp(varname, _var2)) return sdsnew("value2"); - else return NULL; -} - -int sdsTest(int argc, char **argv, int flags) { - UNUSED(argc); - UNUSED(argv); - UNUSED(flags); - - { - sds x = sdsnew("foo"), y; - - test_cond("Create a string and obtain the length", - sdslen(x) == 3 && memcmp(x,"foo\0",4) == 0); - - sdsfree(x); - x = sdsnewlen("foo",2); - test_cond("Create a string with specified length", - sdslen(x) == 2 && memcmp(x,"fo\0",3) == 0); - - x = sdscat(x,"bar"); - test_cond("Strings concatenation", - sdslen(x) == 5 && memcmp(x,"fobar\0",6) == 0); - - x = sdscpy(x,"a"); - test_cond("sdscpy() against an originally longer string", - sdslen(x) == 1 && memcmp(x,"a\0",2) == 0); - - x = sdscpy(x,"xyzxxxxxxxxxxyyyyyyyyyykkkkkkkkkk"); - test_cond("sdscpy() against an originally shorter string", - sdslen(x) == 33 && - memcmp(x,"xyzxxxxxxxxxxyyyyyyyyyykkkkkkkkkk\0",33) == 0); - - sdsfree(x); - x = sdscatprintf(sdsempty(),"%d",123); - test_cond("sdscatprintf() seems working in the base case", - sdslen(x) == 3 && memcmp(x,"123\0",4) == 0); - - sdsfree(x); - x = sdscatprintf(sdsempty(),"a%cb",0); - test_cond("sdscatprintf() seems working with \\0 inside of result", - sdslen(x) == 3 && memcmp(x,"a\0""b\0",4) == 0); - - { - sdsfree(x); - char etalon[1024*1024]; - for (size_t i = 0; i < sizeof(etalon); i++) { - etalon[i] = '0'; - } - x = sdscatprintf(sdsempty(),"%0*d",(int)sizeof(etalon),0); - test_cond("sdscatprintf() can print 1MB", - sdslen(x) == sizeof(etalon) && memcmp(x,etalon,sizeof(etalon)) == 0); - } - - sdsfree(x); - x = sdsnew("--"); - x = sdscatfmt(x, "Hello %s World %I,%I--", "Hi!", LLONG_MIN,LLONG_MAX); - test_cond("sdscatfmt() seems working in the base case", - sdslen(x) == 60 && - memcmp(x,"--Hello Hi! World -9223372036854775808," - "9223372036854775807--",60) == 0); - printf("[%s]\n",x); - - sdsfree(x); - x = sdsnew("--"); - x = sdscatfmt(x, "%u,%U--", UINT_MAX, ULLONG_MAX); - test_cond("sdscatfmt() seems working with unsigned numbers", - sdslen(x) == 35 && - memcmp(x,"--4294967295,18446744073709551615--",35) == 0); - - sdsfree(x); - x = sdsnew(" x "); - sdstrim(x," x"); - test_cond("sdstrim() works when all chars match", - sdslen(x) == 0); - - sdsfree(x); - x = sdsnew(" x "); - sdstrim(x," "); - test_cond("sdstrim() works when a single char remains", - sdslen(x) == 1 && x[0] == 'x'); - - sdsfree(x); - x = sdsnew("xxciaoyyy"); - sdstrim(x,"xy"); - test_cond("sdstrim() correctly trims characters", - sdslen(x) == 4 && memcmp(x,"ciao\0",5) == 0); - - y = sdsdup(x); - sdsrange(y,1,1); - test_cond("sdsrange(...,1,1)", - sdslen(y) == 1 && memcmp(y,"i\0",2) == 0); - - sdsfree(y); - y = sdsdup(x); - sdsrange(y,1,-1); - test_cond("sdsrange(...,1,-1)", - sdslen(y) == 3 && memcmp(y,"iao\0",4) == 0); - - sdsfree(y); - y = sdsdup(x); - sdsrange(y,-2,-1); - test_cond("sdsrange(...,-2,-1)", - sdslen(y) == 2 && memcmp(y,"ao\0",3) == 0); - - sdsfree(y); - y = sdsdup(x); - sdsrange(y,2,1); - test_cond("sdsrange(...,2,1)", - sdslen(y) == 0 && memcmp(y,"\0",1) == 0); - - sdsfree(y); - y = sdsdup(x); - sdsrange(y,1,100); - test_cond("sdsrange(...,1,100)", - sdslen(y) == 3 && memcmp(y,"iao\0",4) == 0); - - sdsfree(y); - y = sdsdup(x); - sdsrange(y,100,100); - test_cond("sdsrange(...,100,100)", - sdslen(y) == 0 && memcmp(y,"\0",1) == 0); - - sdsfree(y); - y = sdsdup(x); - sdsrange(y,4,6); - test_cond("sdsrange(...,4,6)", - sdslen(y) == 0 && memcmp(y,"\0",1) == 0); - - sdsfree(y); - y = sdsdup(x); - sdsrange(y,3,6); - test_cond("sdsrange(...,3,6)", - sdslen(y) == 1 && memcmp(y,"o\0",2) == 0); - - sdsfree(y); - sdsfree(x); - x = sdsnew("foo"); - y = sdsnew("foa"); - test_cond("sdscmp(foo,foa)", sdscmp(x,y) > 0); - - sdsfree(y); - sdsfree(x); - x = sdsnew("bar"); - y = sdsnew("bar"); - test_cond("sdscmp(bar,bar)", sdscmp(x,y) == 0); - - sdsfree(y); - sdsfree(x); - x = sdsnew("aar"); - y = sdsnew("bar"); - test_cond("sdscmp(bar,bar)", sdscmp(x,y) < 0); - - sdsfree(y); - sdsfree(x); - x = sdsnewlen("\a\n\0foo\r",7); - y = sdscatrepr(sdsempty(),x,sdslen(x)); - test_cond("sdscatrepr(...data...)", - memcmp(y,"\"\\a\\n\\x00foo\\r\"",15) == 0); - - { - unsigned int oldfree; - char *p; - int i; - size_t step = 10, j; - - sdsfree(x); - sdsfree(y); - x = sdsnew("0"); - test_cond("sdsnew() free/len buffers", sdslen(x) == 1 && sdsavail(x) == 0); - - /* Run the test a few times in order to hit the first two - * SDS header types. */ - for (i = 0; i < 10; i++) { - size_t oldlen = sdslen(x); - x = sdsMakeRoomFor(x,step); - int type = x[-1]&SDS_TYPE_MASK; - - test_cond("sdsMakeRoomFor() len", sdslen(x) == oldlen); - if (type != SDS_TYPE_5) { - test_cond("sdsMakeRoomFor() free", sdsavail(x) >= step); - oldfree = sdsavail(x); - UNUSED(oldfree); - } - p = x+oldlen; - for (j = 0; j < step; j++) { - p[j] = 'A'+j; - } - sdsIncrLen(x,step); - } - test_cond("sdsMakeRoomFor() content", - memcmp("0ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ",x,101) == 0); - test_cond("sdsMakeRoomFor() final length",sdslen(x)==101); - - sdsfree(x); - } - - /* Simple template */ - x = sdstemplate("v1={variable1} v2={variable2}", sdsTestTemplateCallback, NULL); - test_cond("sdstemplate() normal flow", - memcmp(x,"v1=value1 v2=value2",19) == 0); - sdsfree(x); - - /* Template with callback error */ - x = sdstemplate("v1={variable1} v3={doesnotexist}", sdsTestTemplateCallback, NULL); - test_cond("sdstemplate() with callback error", x == NULL); - - /* Template with empty var name */ - x = sdstemplate("v1={", sdsTestTemplateCallback, NULL); - test_cond("sdstemplate() with empty var name", x == NULL); - - /* Template with truncated var name */ - x = sdstemplate("v1={start", sdsTestTemplateCallback, NULL); - test_cond("sdstemplate() with truncated var name", x == NULL); - - /* Template with quoting */ - x = sdstemplate("v1={{{variable1}} {{} v2={variable2}", sdsTestTemplateCallback, NULL); - test_cond("sdstemplate() with quoting", - memcmp(x,"v1={value1} {} v2=value2",24) == 0); - sdsfree(x); - - /* Test sdsresize - extend */ - x = sdsnew("1234567890123456789012345678901234567890"); - x = sdsResize(x, 200, 1); - test_cond("sdsrezie() expand len", sdslen(x) == 40); - test_cond("sdsrezie() expand strlen", strlen(x) == 40); - test_cond("sdsrezie() expand alloc", sdsalloc(x) == 200); - /* Test sdsresize - trim free space */ - x = sdsResize(x, 80, 1); - test_cond("sdsrezie() shrink len", sdslen(x) == 40); - test_cond("sdsrezie() shrink strlen", strlen(x) == 40); - test_cond("sdsrezie() shrink alloc", sdsalloc(x) == 80); - /* Test sdsresize - crop used space */ - x = sdsResize(x, 30, 1); - test_cond("sdsrezie() crop len", sdslen(x) == 30); - test_cond("sdsrezie() crop strlen", strlen(x) == 30); - test_cond("sdsrezie() crop alloc", sdsalloc(x) == 30); - /* Test sdsresize - extend to different class */ - x = sdsResize(x, 400, 1); - test_cond("sdsrezie() expand len", sdslen(x) == 30); - test_cond("sdsrezie() expand strlen", strlen(x) == 30); - test_cond("sdsrezie() expand alloc", sdsalloc(x) == 400); - /* Test sdsresize - shrink to different class */ - x = sdsResize(x, 4, 1); - test_cond("sdsrezie() crop len", sdslen(x) == 4); - test_cond("sdsrezie() crop strlen", strlen(x) == 4); - test_cond("sdsrezie() crop alloc", sdsalloc(x) == 4); - sdsfree(x); - } - return 0; -} -#endif diff --git a/src/sds.h b/src/sds.h index e65d7a139..ed69bd24e 100644 --- a/src/sds.h +++ b/src/sds.h @@ -280,8 +280,4 @@ void *sds_malloc(size_t size); void *sds_realloc(void *ptr, size_t size); void sds_free(void *ptr); -#ifdef SERVER_TEST -int sdsTest(int argc, char *argv[], int flags); -#endif - #endif diff --git a/src/server.c b/src/server.c index f23468b35..388dd8fb5 100644 --- a/src/server.c +++ b/src/server.c @@ -6935,7 +6935,6 @@ struct serverTest { {"sha1test", sha1Test}, {"endianconv", endianconvTest}, {"zmalloc", zmalloc_test}, - {"sds", sdsTest}, {"dict", dictTest}, {"listpack", listpackTest}, }; diff --git a/src/unit/test_files.h b/src/unit/test_files.h index 14fe39644..01f61bac1 100644 --- a/src/unit/test_files.h +++ b/src/unit/test_files.h @@ -21,6 +21,7 @@ int test_kvstoreIteratorRemoveAllKeysNoDeleteEmptyDict(int argc, char **argv, in int test_kvstoreIteratorRemoveAllKeysDeleteEmptyDict(int argc, char **argv, int flags); int test_kvstoreDictIteratorRemoveAllKeysNoDeleteEmptyDict(int argc, char **argv, int flags); int test_kvstoreDictIteratorRemoveAllKeysDeleteEmptyDict(int argc, char **argv, int flags); +int test_sds(int argc, char **argv, int flags); int test_string2ll(int argc, char **argv, int flags); int test_string2l(int argc, char **argv, int flags); int test_ll2string(int argc, char **argv, int flags); @@ -32,6 +33,7 @@ unitTest __test_crc64_c[] = {{"test_crc64", test_crc64}, {NULL, NULL}}; unitTest __test_crc64combine_c[] = {{"test_crc64combine", test_crc64combine}, {NULL, NULL}}; unitTest __test_intset_c[] = {{"test_intsetValueEncodings", test_intsetValueEncodings}, {"test_intsetBasicAdding", test_intsetBasicAdding}, {"test_intsetLargeNumberRandomAdd", test_intsetLargeNumberRandomAdd}, {"test_intsetUpgradeFromint16Toint32", test_intsetUpgradeFromint16Toint32}, {"test_intsetUpgradeFromint16Toint64", test_intsetUpgradeFromint16Toint64}, {"test_intsetUpgradeFromint32Toint64", test_intsetUpgradeFromint32Toint64}, {"test_intsetStressLookups", test_intsetStressLookups}, {"test_intsetStressAddDelete", test_intsetStressAddDelete}, {NULL, NULL}}; unitTest __test_kvstore_c[] = {{"test_kvstoreAdd16Keys", test_kvstoreAdd16Keys}, {"test_kvstoreIteratorRemoveAllKeysNoDeleteEmptyDict", test_kvstoreIteratorRemoveAllKeysNoDeleteEmptyDict}, {"test_kvstoreIteratorRemoveAllKeysDeleteEmptyDict", test_kvstoreIteratorRemoveAllKeysDeleteEmptyDict}, {"test_kvstoreDictIteratorRemoveAllKeysNoDeleteEmptyDict", test_kvstoreDictIteratorRemoveAllKeysNoDeleteEmptyDict}, {"test_kvstoreDictIteratorRemoveAllKeysDeleteEmptyDict", test_kvstoreDictIteratorRemoveAllKeysDeleteEmptyDict}, {NULL, NULL}}; +unitTest __test_sds_c[] = {{"test_sds", test_sds}, {NULL, NULL}}; unitTest __test_util_c[] = {{"test_string2ll", test_string2ll}, {"test_string2l", test_string2l}, {"test_ll2string", test_ll2string}, {"test_ld2string", test_ld2string}, {"test_fixedpoint_d2string", test_fixedpoint_d2string}, {"test_reclaimFilePageCache", test_reclaimFilePageCache}, {NULL, NULL}}; struct unitTestSuite { @@ -42,5 +44,6 @@ struct unitTestSuite { {"test_crc64combine.c", __test_crc64combine_c}, {"test_intset.c", __test_intset_c}, {"test_kvstore.c", __test_kvstore_c}, + {"test_sds.c", __test_sds_c}, {"test_util.c", __test_util_c}, }; diff --git a/src/unit/test_sds.c b/src/unit/test_sds.c new file mode 100644 index 000000000..15cda483f --- /dev/null +++ b/src/unit/test_sds.c @@ -0,0 +1,258 @@ +#include +#include +#include +#include "test_help.h" + +#include "../sds.h" + +static sds sdsTestTemplateCallback(sds varname, void *arg) { + UNUSED(arg); + static const char *_var1 = "variable1"; + static const char *_var2 = "variable2"; + + if (!strcmp(varname, _var1)) return sdsnew("value1"); + else if (!strcmp(varname, _var2)) return sdsnew("value2"); + else return NULL; +} + +int test_sds(int argc, char **argv, int flags) { + UNUSED(argc); + UNUSED(argv); + UNUSED(flags); + + sds x = sdsnew("foo"), y; + + TEST_ASSERT_MESSAGE("Create a string and obtain the length", + sdslen(x) == 3 && memcmp(x, "foo\0", 4) == 0); + + sdsfree(x); + x = sdsnewlen("foo", 2); + TEST_ASSERT_MESSAGE("Create a string with specified length", + sdslen(x) == 2 && memcmp(x, "fo\0", 3) == 0); + + x = sdscat(x, "bar"); + TEST_ASSERT_MESSAGE("Strings concatenation", + sdslen(x) == 5 && memcmp(x, "fobar\0", 6) == 0); + + x = sdscpy(x, "a"); + TEST_ASSERT_MESSAGE("sdscpy() against an originally longer string", + sdslen(x) == 1 && memcmp(x, "a\0", 2) == 0); + + x = sdscpy(x, "xyzxxxxxxxxxxyyyyyyyyyykkkkkkkkkk"); + TEST_ASSERT_MESSAGE("sdscpy() against an originally shorter string", + sdslen(x) == 33 && + memcmp(x, "xyzxxxxxxxxxxyyyyyyyyyykkkkkkkkkk\0", 33) == 0); + + sdsfree(x); + x = sdscatprintf(sdsempty(), "%d", 123); + TEST_ASSERT_MESSAGE("sdscatprintf() seems working in the base case", + sdslen(x) == 3 && memcmp(x, "123\0", 4) == 0); + + sdsfree(x); + x = sdscatprintf(sdsempty(), "a%cb", 0); + TEST_ASSERT_MESSAGE("sdscatprintf() seems working with \\0 inside of result", + sdslen(x) == 3 && memcmp(x, "a\0""b\0", 4) == 0); + + sdsfree(x); + char etalon[1024 * 1024]; + for (size_t i = 0; i < sizeof(etalon); i++) { + etalon[i] = '0'; + } + x = sdscatprintf(sdsempty(), "%0*d", (int)sizeof(etalon), 0); + TEST_ASSERT_MESSAGE("sdscatprintf() can print 1MB", + sdslen(x) == sizeof(etalon) && memcmp(x, etalon, sizeof(etalon)) == 0); + + sdsfree(x); + x = sdsnew("--"); + x = sdscatfmt(x, "Hello %s World %I,%I--", "Hi!", LLONG_MIN,LLONG_MAX); + TEST_ASSERT_MESSAGE("sdscatfmt() seems working in the base case", + sdslen(x) == 60 && + memcmp(x,"--Hello Hi! World -9223372036854775808," + "9223372036854775807--",60) == 0); + + sdsfree(x); + x = sdsnew("--"); + x = sdscatfmt(x, "%u,%U--", UINT_MAX, ULLONG_MAX); + TEST_ASSERT_MESSAGE("sdscatfmt() seems working with unsigned numbers", + sdslen(x) == 35 && + memcmp(x, "--4294967295,18446744073709551615--", 35) == 0); + + sdsfree(x); + x = sdsnew(" x "); + sdstrim(x, " x"); + TEST_ASSERT_MESSAGE("sdstrim() works when all chars match", + sdslen(x) == 0); + + sdsfree(x); + x = sdsnew(" x "); + sdstrim(x," "); + TEST_ASSERT_MESSAGE("sdstrim() works when a single char remains", + sdslen(x) == 1 && x[0] == 'x'); + + sdsfree(x); + x = sdsnew("xxciaoyyy"); + sdstrim(x, "xy"); + TEST_ASSERT_MESSAGE("sdstrim() correctly trims characters", + sdslen(x) == 4 && memcmp(x, "ciao\0", 5) == 0); + + y = sdsdup(x); + sdsrange(y, 1, 1); + TEST_ASSERT_MESSAGE("sdsrange(...,1,1)", + sdslen(y) == 1 && memcmp(y, "i\0", 2) == 0); + + sdsfree(y); + y = sdsdup(x); + sdsrange(y, 1, -1); + TEST_ASSERT_MESSAGE("sdsrange(...,1,-1)", + sdslen(y) == 3 && memcmp(y, "iao\0", 4) == 0); + + sdsfree(y); + y = sdsdup(x); + sdsrange(y, -2, -1); + TEST_ASSERT_MESSAGE("sdsrange(...,-2,-1)", + sdslen(y) == 2 && memcmp(y, "ao\0", 3) == 0); + + sdsfree(y); + y = sdsdup(x); + sdsrange(y, 2, 1); + TEST_ASSERT_MESSAGE("sdsrange(...,2,1)", + sdslen(y) == 0 && memcmp(y, "\0", 1) == 0); + + sdsfree(y); + y = sdsdup(x); + sdsrange(y, 1, 100); + TEST_ASSERT_MESSAGE("sdsrange(...,1,100)", + sdslen(y) == 3 && memcmp(y, "iao\0", 4) == 0); + + sdsfree(y); + y = sdsdup(x); + sdsrange(y, 100, 100); + TEST_ASSERT_MESSAGE("sdsrange(...,100,100)", + sdslen(y) == 0 && memcmp(y, "\0", 1) == 0); + + sdsfree(y); + y = sdsdup(x); + sdsrange(y,4,6); + TEST_ASSERT_MESSAGE("sdsrange(...,4,6)", + sdslen(y) == 0 && memcmp(y, "\0", 1) == 0); + + sdsfree(y); + y = sdsdup(x); + sdsrange(y, 3, 6); + TEST_ASSERT_MESSAGE("sdsrange(...,3,6)", + sdslen(y) == 1 && memcmp(y, "o\0", 2) == 0); + + sdsfree(y); + sdsfree(x); + x = sdsnew("foo"); + y = sdsnew("foa"); + TEST_ASSERT_MESSAGE("sdscmp(foo,foa)", sdscmp(x,y) > 0); + + sdsfree(y); + sdsfree(x); + x = sdsnew("bar"); + y = sdsnew("bar"); + TEST_ASSERT_MESSAGE("sdscmp(bar,bar)", sdscmp(x,y) == 0); + + sdsfree(y); + sdsfree(x); + x = sdsnew("aar"); + y = sdsnew("bar"); + TEST_ASSERT_MESSAGE("sdscmp(bar,bar)", sdscmp(x,y) < 0); + + sdsfree(y); + sdsfree(x); + x = sdsnewlen("\a\n\0foo\r", 7); + y = sdscatrepr(sdsempty(), x, sdslen(x)); + TEST_ASSERT_MESSAGE("sdscatrepr(...data...)", + memcmp(y, "\"\\a\\n\\x00foo\\r\"", 15) == 0); + + unsigned int oldfree; + char *p; + int i; + size_t step = 10, j; + + sdsfree(x); + sdsfree(y); + x = sdsnew("0"); + TEST_ASSERT_MESSAGE("sdsnew() free/len buffers", + sdslen(x) == 1 && sdsavail(x) == 0); + + /* Run the test a few times in order to hit the first two + * SDS header types. */ + for (i = 0; i < 10; i++) { + size_t oldlen = sdslen(x); + x = sdsMakeRoomFor(x, step); + int type = x[-1] & SDS_TYPE_MASK; + + TEST_ASSERT_MESSAGE("sdsMakeRoomFor() len", sdslen(x) == oldlen); + if (type != SDS_TYPE_5) { + TEST_ASSERT_MESSAGE("sdsMakeRoomFor() free", sdsavail(x) >= step); + oldfree = sdsavail(x); + UNUSED(oldfree); + } + p = x+oldlen; + for (j = 0; j < step; j++) { + p[j] = 'A' + j; + } + sdsIncrLen(x, step); + } + TEST_ASSERT_MESSAGE("sdsMakeRoomFor() content", + memcmp("0ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ", x, 101) == 0); + TEST_ASSERT_MESSAGE("sdsMakeRoomFor() final length", sdslen(x) == 101); + + sdsfree(x); + + /* Simple template */ + x = sdstemplate("v1={variable1} v2={variable2}", sdsTestTemplateCallback, NULL); + TEST_ASSERT_MESSAGE("sdstemplate() normal flow", + memcmp(x, "v1=value1 v2=value2", 19) == 0); + sdsfree(x); + + /* Template with callback error */ + x = sdstemplate("v1={variable1} v3={doesnotexist}", sdsTestTemplateCallback, NULL); + TEST_ASSERT_MESSAGE("sdstemplate() with callback error", x == NULL); + + /* Template with empty var name */ + x = sdstemplate("v1={", sdsTestTemplateCallback, NULL); + TEST_ASSERT_MESSAGE("sdstemplate() with empty var name", x == NULL); + + /* Template with truncated var name */ + x = sdstemplate("v1={start", sdsTestTemplateCallback, NULL); + TEST_ASSERT_MESSAGE("sdstemplate() with truncated var name", x == NULL); + + /* Template with quoting */ + x = sdstemplate("v1={{{variable1}} {{} v2={variable2}", sdsTestTemplateCallback, NULL); + TEST_ASSERT_MESSAGE("sdstemplate() with quoting", + memcmp(x, "v1={value1} {} v2=value2", 24) == 0); + sdsfree(x); + + /* Test sdsresize - extend */ + x = sdsnew("1234567890123456789012345678901234567890"); + x = sdsResize(x, 200, 1); + TEST_ASSERT_MESSAGE("sdsrezie() expand len", sdslen(x) == 40); + TEST_ASSERT_MESSAGE("sdsrezie() expand strlen", strlen(x) == 40); + TEST_ASSERT_MESSAGE("sdsrezie() expand alloc", sdsalloc(x) == 200); + /* Test sdsresize - trim free space */ + x = sdsResize(x, 80, 1); + TEST_ASSERT_MESSAGE("sdsrezie() shrink len", sdslen(x) == 40); + TEST_ASSERT_MESSAGE("sdsrezie() shrink strlen", strlen(x) == 40); + TEST_ASSERT_MESSAGE("sdsrezie() shrink alloc", sdsalloc(x) == 80); + /* Test sdsresize - crop used space */ + x = sdsResize(x, 30, 1); + TEST_ASSERT_MESSAGE("sdsrezie() crop len", sdslen(x) == 30); + TEST_ASSERT_MESSAGE("sdsrezie() crop strlen", strlen(x) == 30); + TEST_ASSERT_MESSAGE("sdsrezie() crop alloc", sdsalloc(x) == 30); + /* Test sdsresize - extend to different class */ + x = sdsResize(x, 400, 1); + TEST_ASSERT_MESSAGE("sdsrezie() expand len", sdslen(x) == 30); + TEST_ASSERT_MESSAGE("sdsrezie() expand strlen", strlen(x) == 30); + TEST_ASSERT_MESSAGE("sdsrezie() expand alloc", sdsalloc(x) == 400); + /* Test sdsresize - shrink to different class */ + x = sdsResize(x, 4, 1); + TEST_ASSERT_MESSAGE("sdsrezie() crop len", sdslen(x) == 4); + TEST_ASSERT_MESSAGE("sdsrezie() crop strlen", strlen(x) == 4); + TEST_ASSERT_MESSAGE("sdsrezie() crop alloc", sdsalloc(x) == 4); + sdsfree(x); + return 0; +}