X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Ftest%2FFBStringTest.cpp;h=9f51947af6c855bc88f92f749818712523b18cbf;hb=192d78d40551ec5d9aade5ca72dd6e33ad700a2b;hp=fb4a79912f044edeb303d2abbd653f07bc7cc224;hpb=fbf4e10c59b331540e8a2668f436ea210a11c22a;p=folly.git diff --git a/folly/test/FBStringTest.cpp b/folly/test/FBStringTest.cpp index fb4a7991..9f51947a 100644 --- a/folly/test/FBStringTest.cpp +++ b/folly/test/FBStringTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,17 +21,17 @@ #include #include - #include #include #include + #include #include -#include +#include #include #include -#include +#include #include using namespace std; @@ -75,7 +75,7 @@ std::list RandomList(unsigned int maxSize) { } return lst; } -} +} // namespace //////////////////////////////////////////////////////////////////////////////// // Tests begin here @@ -143,12 +143,16 @@ template void clause11_21_4_2_h(String & test) { EXPECT_EQ(test, s2); // Constructor from other iterators std::list lst; - for (auto c : test) lst.push_back(c); + for (auto c : test) { + lst.push_back(c); + } String s3(lst.begin(), lst.end()); EXPECT_EQ(test, s3); // Constructor from wchar_t iterators std::list lst1; - for (auto c : test) lst1.push_back(c); + for (auto c : test) { + lst1.push_back(c); + } String s4(lst1.begin(), lst1.end()); EXPECT_EQ(test, s4); // Constructor from wchar_t pointers @@ -208,7 +212,8 @@ template void clause11_21_4_2_lprime(String & test) { } template void clause11_21_4_2_m(String & test) { // Assignment from char - test = random('a', 'z'); + using value_type = typename String::value_type; + test = random(static_cast('a'), static_cast('z')); } template void clause11_21_4_2_n(String & test) { // Assignment from initializer_list @@ -248,8 +253,11 @@ template void clause11_21_4_4(String & test) { // exercise empty string empty("empty"); string notempty("not empty"); - if (test.empty()) test = String(empty.begin(), empty.end()); - else test = String(notempty.begin(), notempty.end()); + if (test.empty()) { + test = String(empty.begin(), empty.end()); + } else { + test = String(notempty.begin(), notempty.end()); + } } template void clause11_21_4_5(String & test) { @@ -827,8 +835,11 @@ template void clause11_21_4_7_9_a(String & test) { String s; randomString(&s, maxString); int tristate = test.compare(s); - if (tristate > 0) tristate = 1; - else if (tristate < 0) tristate = 2; + if (tristate > 0) { + tristate = 1; + } else if (tristate < 0) { + tristate = 2; + } Num2String(test, tristate); } @@ -839,8 +850,11 @@ template void clause11_21_4_7_9_b(String & test) { random(0, test.size()), random(0, test.size()), s); - if (tristate > 0) tristate = 1; - else if (tristate < 0) tristate = 2; + if (tristate > 0) { + tristate = 1; + } else if (tristate < 0) { + tristate = 2; + } Num2String(test, tristate); } @@ -853,8 +867,11 @@ template void clause11_21_4_7_9_c(String & test) { str, random(0, str.size()), random(0, str.size())); - if (tristate > 0) tristate = 1; - else if (tristate < 0) tristate = 2; + if (tristate > 0) { + tristate = 1; + } else if (tristate < 0) { + tristate = 2; + } Num2String(test, tristate); } @@ -862,9 +879,12 @@ template void clause11_21_4_7_9_d(String & test) { String s; randomString(&s, maxString); int tristate = test.compare(s.c_str()); - if (tristate > 0) tristate = 1; - else if (tristate < 0) tristate = 2; - Num2String(test, tristate); + if (tristate > 0) { + tristate = 1; + } else if (tristate < 0) { + tristate = 2; + } + Num2String(test, tristate); } template void clause11_21_4_7_9_e(String & test) { @@ -875,8 +895,11 @@ template void clause11_21_4_7_9_e(String & test) { random(0, test.size()), str.c_str(), random(0, str.size())); - if (tristate > 0) tristate = 1; - else if (tristate < 0) tristate = 2; + if (tristate > 0) { + tristate = 1; + } else if (tristate < 0) { + tristate = 2; + } Num2String(test, tristate); } @@ -995,7 +1018,10 @@ TEST(FBString, testAllClauses) { void(*f_fbstring)(folly::fbstring&), void(*f_wfbstring)(folly::basic_fbstring&)) { do { - if (1) {} else EXPECT_TRUE(1) << "Testing clause " << clause; + if (true) { + } else { + EXPECT_TRUE(1) << "Testing clause " << clause; + } randomString(&r); c = r; EXPECT_EQ(c, r); @@ -1019,7 +1045,9 @@ TEST(FBString, testAllClauses) { auto mbv = std::vector(wret + 1); auto mb = mbv.data(); int ret = wcstombs(mb, wc.c_str(), wret + 1); - if (ret == wret) mb[wret] = '\0'; + if (ret == wret) { + mb[wret] = '\0'; + } const char *mc = c.c_str(); std::string one(mb); std::string two(mc); @@ -1208,7 +1236,7 @@ TEST(FBString, testMoveOperatorPlusRhs) { // other than libstdc++. Someday if we deem it important to present // identical undefined behavior for other platforms, we can re-visit this. TEST(FBString, testConstructionFromLiteralZero) { - EXPECT_THROW(fbstring s(0), std::logic_error); + EXPECT_THROW(fbstring s(nullptr), std::logic_error); } TEST(FBString, testFixedBugs) { @@ -1270,6 +1298,18 @@ TEST(FBString, testFixedBugs) { { // D3698862 EXPECT_EQ(fbstring().find(fbstring(), 4), fbstring::npos); } + if (usingJEMalloc()) { // D4355440 + fbstring str(1337, 'f'); + str.reserve(3840); + EXPECT_NE(str.capacity(), 3840); + + struct { + std::atomic refCount_; + } dummyRefCounted; + EXPECT_EQ( + str.capacity(), + goodMallocSize(3840) - sizeof(dummyRefCounted) - sizeof(char)); + } } TEST(FBString, findWithNpos) { @@ -1406,7 +1446,7 @@ struct TestStructStringAllocator : std::allocator { } }; -} // anon namespace +} // namespace TEST(FBStringCtorTest, DefaultInitStructDefaultAlloc) { TestStructDefaultAllocator t1 { }; @@ -1426,3 +1466,212 @@ TEST(FBStringCtorTest, NullZeroConstruction) { folly::fbstring f(p, n); EXPECT_EQ(f.size(), 0); } + +// Tests for the comparison operators. I use EXPECT_TRUE rather than EXPECT_LE +// because what's under test is the operator rather than the relation between +// the objects. + +TEST(FBString, compareToStdString) { + using folly::fbstring; + using namespace std::string_literals; + auto stdA = "a"s; + auto stdB = "b"s; + fbstring fbA("a"); + fbstring fbB("b"); + EXPECT_TRUE(stdA == fbA); + EXPECT_TRUE(fbB == stdB); + EXPECT_TRUE(stdA != fbB); + EXPECT_TRUE(fbA != stdB); + EXPECT_TRUE(stdA < fbB); + EXPECT_TRUE(fbA < stdB); + EXPECT_TRUE(stdB > fbA); + EXPECT_TRUE(fbB > stdA); + EXPECT_TRUE(stdA <= fbB); + EXPECT_TRUE(fbA <= stdB); + EXPECT_TRUE(stdA <= fbA); + EXPECT_TRUE(fbA <= stdA); + EXPECT_TRUE(stdB >= fbA); + EXPECT_TRUE(fbB >= stdA); + EXPECT_TRUE(stdB >= fbB); + EXPECT_TRUE(fbB >= stdB); +} + +TEST(U16FBString, compareToStdU16String) { + using folly::basic_fbstring; + using namespace std::string_literals; + auto stdA = u"a"s; + auto stdB = u"b"s; + basic_fbstring fbA(u"a"); + basic_fbstring fbB(u"b"); + EXPECT_TRUE(stdA == fbA); + EXPECT_TRUE(fbB == stdB); + EXPECT_TRUE(stdA != fbB); + EXPECT_TRUE(fbA != stdB); + EXPECT_TRUE(stdA < fbB); + EXPECT_TRUE(fbA < stdB); + EXPECT_TRUE(stdB > fbA); + EXPECT_TRUE(fbB > stdA); + EXPECT_TRUE(stdA <= fbB); + EXPECT_TRUE(fbA <= stdB); + EXPECT_TRUE(stdA <= fbA); + EXPECT_TRUE(fbA <= stdA); + EXPECT_TRUE(stdB >= fbA); + EXPECT_TRUE(fbB >= stdA); + EXPECT_TRUE(stdB >= fbB); + EXPECT_TRUE(fbB >= stdB); +} + +TEST(U32FBString, compareToStdU32String) { + using folly::basic_fbstring; + using namespace std::string_literals; + auto stdA = U"a"s; + auto stdB = U"b"s; + basic_fbstring fbA(U"a"); + basic_fbstring fbB(U"b"); + EXPECT_TRUE(stdA == fbA); + EXPECT_TRUE(fbB == stdB); + EXPECT_TRUE(stdA != fbB); + EXPECT_TRUE(fbA != stdB); + EXPECT_TRUE(stdA < fbB); + EXPECT_TRUE(fbA < stdB); + EXPECT_TRUE(stdB > fbA); + EXPECT_TRUE(fbB > stdA); + EXPECT_TRUE(stdA <= fbB); + EXPECT_TRUE(fbA <= stdB); + EXPECT_TRUE(stdA <= fbA); + EXPECT_TRUE(fbA <= stdA); + EXPECT_TRUE(stdB >= fbA); + EXPECT_TRUE(fbB >= stdA); + EXPECT_TRUE(stdB >= fbB); + EXPECT_TRUE(fbB >= stdB); +} + +TEST(WFBString, compareToStdWString) { + using folly::basic_fbstring; + using namespace std::string_literals; + auto stdA = L"a"s; + auto stdB = L"b"s; + basic_fbstring fbA(L"a"); + basic_fbstring fbB(L"b"); + EXPECT_TRUE(stdA == fbA); + EXPECT_TRUE(fbB == stdB); + EXPECT_TRUE(stdA != fbB); + EXPECT_TRUE(fbA != stdB); + EXPECT_TRUE(stdA < fbB); + EXPECT_TRUE(fbA < stdB); + EXPECT_TRUE(stdB > fbA); + EXPECT_TRUE(fbB > stdA); + EXPECT_TRUE(stdA <= fbB); + EXPECT_TRUE(fbA <= stdB); + EXPECT_TRUE(stdA <= fbA); + EXPECT_TRUE(fbA <= stdA); + EXPECT_TRUE(stdB >= fbA); + EXPECT_TRUE(fbB >= stdA); + EXPECT_TRUE(stdB >= fbB); + EXPECT_TRUE(fbB >= stdB); +} + +// Same again, but with a more challenging input - a common prefix and different +// lengths. + +TEST(FBString, compareToStdStringLong) { + using folly::fbstring; + using namespace std::string_literals; + auto stdA = "1234567890a"s; + auto stdB = "1234567890ab"s; + fbstring fbA("1234567890a"); + fbstring fbB("1234567890ab"); + EXPECT_TRUE(stdA == fbA); + EXPECT_TRUE(fbB == stdB); + EXPECT_TRUE(stdA != fbB); + EXPECT_TRUE(fbA != stdB); + EXPECT_TRUE(stdA < fbB); + EXPECT_TRUE(fbA < stdB); + EXPECT_TRUE(stdB > fbA); + EXPECT_TRUE(fbB > stdA); + EXPECT_TRUE(stdA <= fbB); + EXPECT_TRUE(fbA <= stdB); + EXPECT_TRUE(stdA <= fbA); + EXPECT_TRUE(fbA <= stdA); + EXPECT_TRUE(stdB >= fbA); + EXPECT_TRUE(fbB >= stdA); + EXPECT_TRUE(stdB >= fbB); + EXPECT_TRUE(fbB >= stdB); +} + +TEST(U16FBString, compareToStdU16StringLong) { + using folly::basic_fbstring; + using namespace std::string_literals; + auto stdA = u"1234567890a"s; + auto stdB = u"1234567890ab"s; + basic_fbstring fbA(u"1234567890a"); + basic_fbstring fbB(u"1234567890ab"); + EXPECT_TRUE(stdA == fbA); + EXPECT_TRUE(fbB == stdB); + EXPECT_TRUE(stdA != fbB); + EXPECT_TRUE(fbA != stdB); + EXPECT_TRUE(stdA < fbB); + EXPECT_TRUE(fbA < stdB); + EXPECT_TRUE(stdB > fbA); + EXPECT_TRUE(fbB > stdA); + EXPECT_TRUE(stdA <= fbB); + EXPECT_TRUE(fbA <= stdB); + EXPECT_TRUE(stdA <= fbA); + EXPECT_TRUE(fbA <= stdA); + EXPECT_TRUE(stdB >= fbA); + EXPECT_TRUE(fbB >= stdA); + EXPECT_TRUE(stdB >= fbB); + EXPECT_TRUE(fbB >= stdB); +} + +#if FOLLY_HAVE_WCHAR_SUPPORT +TEST(U32FBString, compareToStdU32StringLong) { + using folly::basic_fbstring; + using namespace std::string_literals; + auto stdA = U"1234567890a"s; + auto stdB = U"1234567890ab"s; + basic_fbstring fbA(U"1234567890a"); + basic_fbstring fbB(U"1234567890ab"); + EXPECT_TRUE(stdA == fbA); + EXPECT_TRUE(fbB == stdB); + EXPECT_TRUE(stdA != fbB); + EXPECT_TRUE(fbA != stdB); + EXPECT_TRUE(stdA < fbB); + EXPECT_TRUE(fbA < stdB); + EXPECT_TRUE(stdB > fbA); + EXPECT_TRUE(fbB > stdA); + EXPECT_TRUE(stdA <= fbB); + EXPECT_TRUE(fbA <= stdB); + EXPECT_TRUE(stdA <= fbA); + EXPECT_TRUE(fbA <= stdA); + EXPECT_TRUE(stdB >= fbA); + EXPECT_TRUE(fbB >= stdA); + EXPECT_TRUE(stdB >= fbB); + EXPECT_TRUE(fbB >= stdB); +} + +TEST(WFBString, compareToStdWStringLong) { + using folly::basic_fbstring; + using namespace std::string_literals; + auto stdA = L"1234567890a"s; + auto stdB = L"1234567890ab"s; + basic_fbstring fbA(L"1234567890a"); + basic_fbstring fbB(L"1234567890ab"); + EXPECT_TRUE(stdA == fbA); + EXPECT_TRUE(fbB == stdB); + EXPECT_TRUE(stdA != fbB); + EXPECT_TRUE(fbA != stdB); + EXPECT_TRUE(stdA < fbB); + EXPECT_TRUE(fbA < stdB); + EXPECT_TRUE(stdB > fbA); + EXPECT_TRUE(fbB > stdA); + EXPECT_TRUE(stdA <= fbB); + EXPECT_TRUE(fbA <= stdB); + EXPECT_TRUE(stdA <= fbA); + EXPECT_TRUE(fbA <= stdA); + EXPECT_TRUE(stdB >= fbA); + EXPECT_TRUE(fbB >= stdA); + EXPECT_TRUE(stdB >= fbB); + EXPECT_TRUE(fbB >= stdB); +} +#endif