int main() { assert(unique1("")); assert(unique1("a")); assert(!unique1("aa")); assert(unique1("asdfjkl;")); assert(!unique1("asdfjkl;a")); assert(unique2("")); assert(unique2("a")); assert(!unique2("aa")); assert(unique2("asdfjkl;")); assert(!unique2("asdfjkl;a")); char s[][10] = {"", "abc", "abcd"}; char r[][10] = {"", "cba", "dcba"}; for (int i = 0; i < 3; i++) { reverse(s[i]); assert(strcmp(s[i], r[i]) == 0); } assert(is_permutation("abcd", "dcba")); assert(!is_permutation("abcd", "ddcba")); }
TEST(fxcrt, WeakPtrCyclic) { PseudoDeletable thing1; PseudoDeletable thing2; { UniquePtr unique1(&thing1); UniquePtr unique2(&thing2); WeakPtr ptr1(std::move(unique1)); WeakPtr ptr2(std::move(unique2)); ptr1->SetNext(ptr2); ptr2->SetNext(ptr1); } // Leaks without explicit clear. EXPECT_EQ(0, thing1.delete_count()); EXPECT_EQ(0, thing2.delete_count()); }
TEST(fxcrt, WeakPtrCyclicClear) { PseudoDeletable thing1; PseudoDeletable thing2; { UniquePtr unique1(&thing1); UniquePtr unique2(&thing2); WeakPtr ptr1(std::move(unique1)); WeakPtr ptr2(std::move(unique2)); ptr1->SetNext(ptr2); ptr2->SetNext(ptr1); ptr1.Clear(); EXPECT_EQ(1, thing1.delete_count()); EXPECT_EQ(0, thing2.delete_count()); } EXPECT_EQ(1, thing1.delete_count()); EXPECT_EQ(1, thing2.delete_count()); }
TEST(fxcrt, WeakPtrResetNonNull) { PseudoDeletable thing1; PseudoDeletable thing2; { UniquePtr unique1(&thing1); WeakPtr ptr1(std::move(unique1)); WeakPtr ptr2 = ptr1; UniquePtr unique2(&thing2); ptr2.Reset(std::move(unique2)); EXPECT_TRUE(ptr1); EXPECT_EQ(&thing1, ptr1.Get()); EXPECT_TRUE(ptr2); EXPECT_EQ(&thing2, ptr2.Get()); EXPECT_FALSE(ptr1 == ptr2); EXPECT_TRUE(ptr1 != ptr2); EXPECT_EQ(0, thing1.delete_count()); EXPECT_EQ(0, thing2.delete_count()); } EXPECT_EQ(1, thing1.delete_count()); EXPECT_EQ(1, thing2.delete_count()); }