‰PNG  IHDR @ @ ªiqÞ pHYs   šœ —tEXtComment #include #include #include using namespace Passenger; using namespace std; namespace tut { struct DataStructures_LStringTest: public TestBase { LString str, str2; psg_pool_t *pool; DataStructures_LStringTest() { psg_lstr_init(&str); psg_lstr_init(&str2); pool = psg_create_pool(PSG_DEFAULT_POOL_SIZE); } ~DataStructures_LStringTest() { psg_lstr_deinit(&str); psg_lstr_deinit(&str2); psg_destroy_pool(pool); } void reset() { psg_lstr_deinit(&str); psg_lstr_deinit(&str2); psg_lstr_init(&str); psg_lstr_init(&str2); } }; DEFINE_TEST_GROUP(DataStructures_LStringTest); TEST_METHOD(1) { set_test_name("It is empty upon initialization"); ensure_equals(str.size, 0u); ensure_equals(str.start, &emptyLStringPart); ensure_equals(str.start->next, NULL); ensure_equals(str.start->data, ""); ensure_equals(str.start->size, 0u); ensure_equals(str.end, &emptyLStringPart); ensure_equals(str.end->next, NULL); ensure_equals(str.end->data, ""); ensure_equals(str.end->size, 0u); ensure_equals(StaticString(str.start->data, str.size), ""); } TEST_METHOD(2) { set_test_name("Appending updates the links and the size"); psg_lstr_append(&str, pool, "ab"); ensure_equals(str.size, 2u); ensure(str.start != &emptyLStringPart); ensure_equals(str.start, str.end); psg_lstr_append(&str, pool, "cde"); ensure_equals(str.size, 5u); ensure(str.start != &emptyLStringPart); ensure(str.start != str.end); } TEST_METHOD(3) { set_test_name("Appending an empty string does nothing"); psg_lstr_append(&str, pool, ""); ensure_equals(str.size, 0u); ensure_equals(str.start, &emptyLStringPart); ensure_equals(str.end, &emptyLStringPart); psg_lstr_append(&str, pool, "ab"); psg_lstr_append(&str, pool, ""); ensure_equals(str.size, 2u); ensure(str.start != &emptyLStringPart); ensure_equals(str.start, str.end); } /***** Comparison with StaticString *****/ TEST_METHOD(10) { set_test_name("Comparing an empty LString with an empty StaticString"); ensure(psg_lstr_cmp(&str, "")); } TEST_METHOD(11) { set_test_name("Comparing an empty LString with a non-empty StaticString"); ensure(!psg_lstr_cmp(&str, "foo")); ensure(!psg_lstr_cmp(&str, "bar")); } TEST_METHOD(12) { set_test_name("Comparing an single-part LString with an empty StaticString"); psg_lstr_append(&str, pool, "hi"); ensure(!psg_lstr_cmp(&str, "")); } TEST_METHOD(13) { set_test_name("Comparing an single-part LString with a non-empty StaticString"); psg_lstr_append(&str, pool, "hi"); ensure(psg_lstr_cmp(&str, "hi")); ensure(!psg_lstr_cmp(&str, "ho")); } TEST_METHOD(14) { set_test_name("Comparing an multi-part LString with an empty StaticString"); psg_lstr_append(&str, pool, "hi"); psg_lstr_append(&str, pool, "ho"); ensure(!psg_lstr_cmp(&str, "")); } TEST_METHOD(15) { set_test_name("Comparing an multi-part LString with a non-empty StaticString"); psg_lstr_append(&str, pool, "hi"); psg_lstr_append(&str, pool, "ho"); ensure(psg_lstr_cmp(&str, "hiho")); ensure(!psg_lstr_cmp(&str, "hiho!")); ensure(!psg_lstr_cmp(&str, "hihi")); ensure(!psg_lstr_cmp(&str, "hm")); ensure(!psg_lstr_cmp(&str, "")); } /***** Comparison with StaticString, with size argument *****/ TEST_METHOD(20) { set_test_name("Comparing an empty LString with an empty StaticString, with size argument"); ensure(psg_lstr_cmp(&str, "", 0)); ensure(psg_lstr_cmp(&str, "", 1)); ensure(psg_lstr_cmp(&str, "", 2)); } TEST_METHOD(21) { set_test_name("Comparing an empty LString with a non-empty StaticString, with size argument"); ensure(psg_lstr_cmp(&str, "hello", 0)); ensure(!psg_lstr_cmp(&str, "hello", 1)); } TEST_METHOD(22) { set_test_name("Comparing an single-part LString with an empty StaticString, with size argument"); psg_lstr_append(&str, pool, "hi"); ensure(psg_lstr_cmp(&str, "", 0)); ensure(!psg_lstr_cmp(&str, "", 1)); } TEST_METHOD(23) { set_test_name("Comparing an single-part LString with a non-empty StaticString, with size argument"); psg_lstr_append(&str, pool, "hi"); ensure(psg_lstr_cmp(&str, "hi!", 0)); ensure(psg_lstr_cmp(&str, "hi!", 1)); ensure(psg_lstr_cmp(&str, "hi!", 2)); ensure(!psg_lstr_cmp(&str, "hi!", 3)); ensure(!psg_lstr_cmp(&str, "ho", 2)); } TEST_METHOD(24) { set_test_name("Comparing an multi-part LString with an empty StaticString, with size argument"); psg_lstr_append(&str, pool, "hi"); psg_lstr_append(&str, pool, "hoi"); ensure(psg_lstr_cmp(&str, "", 0)); ensure(!psg_lstr_cmp(&str, "", 1)); } TEST_METHOD(25) { set_test_name("Comparing an multi-part LString with a non-empty StaticString, with size argument"); psg_lstr_append(&str, pool, "hi"); psg_lstr_append(&str, pool, "hoi"); ensure(psg_lstr_cmp(&str, "", 0)); ensure(psg_lstr_cmp(&str, "h", 1)); ensure(psg_lstr_cmp(&str, "hi", 2)); ensure(psg_lstr_cmp(&str, "hihoi", 0)); ensure(psg_lstr_cmp(&str, "hihoi", 1)); ensure(psg_lstr_cmp(&str, "hihoi", 2)); ensure(psg_lstr_cmp(&str, "hihoi", 3)); ensure(psg_lstr_cmp(&str, "hihoi", 5)); ensure(psg_lstr_cmp(&str, "hihoi!", 5)); ensure(!psg_lstr_cmp(&str, "hihoi!", 6)); ensure(!psg_lstr_cmp(&str, "hihoo", 5)); ensure(psg_lstr_cmp(&str, "hihoo", 4)); } /***** Comparison with LString *****/ TEST_METHOD(30) { set_test_name("Comparing an empty LString with an empty LString"); ensure(psg_lstr_cmp(&str, &str2)); } TEST_METHOD(31) { set_test_name("Comparing an empty LString with a one-part LString"); psg_lstr_append(&str2, pool, "hi"); ensure(!psg_lstr_cmp(&str, &str2)); } TEST_METHOD(32) { set_test_name("Comparing an empty LString with a multi-part LString"); psg_lstr_append(&str2, pool, "hi"); psg_lstr_append(&str2, pool, "hoi"); ensure(!psg_lstr_cmp(&str, &str2)); } TEST_METHOD(33) { set_test_name("Comparing an one-part LString with a one-part LString"); psg_lstr_append(&str, pool, "hi"); psg_lstr_append(&str2, pool, "hi"); ensure(psg_lstr_cmp(&str, &str2)); reset(); psg_lstr_append(&str, pool, "hi"); psg_lstr_append(&str2, pool, "ho"); ensure(!psg_lstr_cmp(&str, &str2)); reset(); psg_lstr_append(&str, pool, "hi"); psg_lstr_append(&str2, pool, "hii"); ensure(!psg_lstr_cmp(&str, &str2)); } TEST_METHOD(34) { set_test_name("Comparing an one-part LString with a multi-part LString"); psg_lstr_append(&str, pool, "hi"); psg_lstr_append(&str2, pool, "h"); psg_lstr_append(&str2, pool, "i"); ensure(psg_lstr_cmp(&str, &str2)); reset(); psg_lstr_append(&str, pool, "hi"); psg_lstr_append(&str2, pool, "h"); psg_lstr_append(&str2, pool, "o"); ensure(!psg_lstr_cmp(&str, &str2)); reset(); psg_lstr_append(&str, pool, "hi"); psg_lstr_append(&str2, pool, "hi"); psg_lstr_append(&str2, pool, "o"); ensure(!psg_lstr_cmp(&str, &str2)); reset(); psg_lstr_append(&str, pool, "hi"); psg_lstr_append(&str2, pool, "hi"); psg_lstr_append(&str2, pool, "i"); ensure(!psg_lstr_cmp(&str, &str2)); } TEST_METHOD(35) { set_test_name("Comparing an multi-part LString with a multi-part LString"); psg_lstr_append(&str, pool, "hi"); psg_lstr_append(&str, pool, "ho!"); psg_lstr_append(&str2, pool, "hi"); psg_lstr_append(&str2, pool, "ho!"); ensure(psg_lstr_cmp(&str, &str2)); reset(); psg_lstr_append(&str, pool, "hi"); psg_lstr_append(&str, pool, "ho!"); psg_lstr_append(&str2, pool, "h"); psg_lstr_append(&str2, pool, "iho!"); ensure(psg_lstr_cmp(&str, &str2)); reset(); psg_lstr_append(&str, pool, "hi"); psg_lstr_append(&str, pool, "ho!"); psg_lstr_append(&str2, pool, "h"); psg_lstr_append(&str2, pool, "iho"); ensure(!psg_lstr_cmp(&str, &str2)); reset(); psg_lstr_append(&str, pool, "hi"); psg_lstr_append(&str, pool, "ho!"); psg_lstr_append(&str2, pool, "h"); psg_lstr_append(&str2, pool, "i"); psg_lstr_append(&str2, pool, "h"); psg_lstr_append(&str2, pool, "o!"); ensure(psg_lstr_cmp(&str, &str2)); } /***** psg_lstr_make_contiguous *****/ TEST_METHOD(40) { set_test_name("psg_lstr_make_contiguous(non-empty string)"); const LString *cstr; psg_lstr_append(&str, pool, "hey"); psg_lstr_append(&str, pool, "my"); psg_lstr_append(&str, pool, "world"); cstr = psg_lstr_make_contiguous(&str, pool); ensure_equals(cstr->size, strlen("heymyworld")); ensure_equals(cstr->start->next, NULL); ensure_equals(StaticString(cstr->start->data, cstr->size), "heymyworld"); } TEST_METHOD(41) { set_test_name("psg_lstr_make_contiguous(empty string)"); const LString *cstr; cstr = psg_lstr_make_contiguous(&str, pool); ensure_equals(cstr->size, 0u); ensure_equals(cstr->start, &emptyLStringPart); ensure_equals(cstr->end, &emptyLStringPart); } /***** psg_lstr_move_and_append *****/ TEST_METHOD(45) { set_test_name("psg_lstr_move_and_append does nothing if from == to"); psg_lstr_append(&str, pool, "hello"); psg_lstr_append(&str, pool, "world"); psg_lstr_move_and_append(&str, pool, &str); ensure_equals(str.size, 10u); ensure_equals(StaticString(str.start->data, str.start->size), "hello"); ensure_equals(str.start->next, str.end); ensure_equals(StaticString(str.end->data, str.end->size), "world"); } TEST_METHOD(46) { set_test_name("psg_lstr_move_and_append does nothing if 'from' is empty"); psg_lstr_append(&str2, pool, "hello"); psg_lstr_append(&str2, pool, "world"); psg_lstr_move_and_append(&str, pool, &str2); ensure_equals(str.size, 0u); ensure_equals(str.start, &emptyLStringPart); ensure_equals(str.end, &emptyLStringPart); ensure_equals(str2.size, 10u); ensure_equals(StaticString(str2.start->data, str2.start->size), "hello"); ensure_equals(str2.start->next, str2.end); ensure_equals(StaticString(str2.end->data, str2.end->size), "world"); } TEST_METHOD(47) { set_test_name("psg_lstr_move_and_append when 'to' is empty"); psg_lstr_append(&str, pool, "hello"); psg_lstr_append(&str, pool, "world"); psg_lstr_move_and_append(&str, pool, &str2); ensure_equals(str.size, 0u); ensure_equals(str.start, &emptyLStringPart); ensure_equals(str.end, &emptyLStringPart); ensure_equals(str2.size, 10u); ensure_equals(StaticString(str2.start->data, str2.start->size), "hello"); ensure_equals(str2.start->next, str2.end); ensure_equals(StaticString(str2.end->data, str2.end->size), "world"); } TEST_METHOD(48) { set_test_name("psg_lstr_move_and_append when 'to' is non-empty"); psg_lstr_append(&str, pool, "hello"); psg_lstr_append(&str, pool, "world"); psg_lstr_append(&str2, pool, "abcde"); psg_lstr_move_and_append(&str, pool, &str2); ensure_equals(str.size, 0u); ensure_equals(str.start, &emptyLStringPart); ensure_equals(str.end, &emptyLStringPart); ensure_equals(str2.size, 15u); ensure_equals(StaticString(str2.start->data, str2.start->size), "abcde"); ensure(str2.start->next != str2.end); ensure(str2.start->next != NULL); ensure_equals(StaticString(str2.start->next->data, str2.start->next->size), "hello"); ensure_equals(str2.start->next->next, str2.end); ensure_equals(StaticString(str2.end->data, str2.end->size), "world"); } }