1e5df197eSDaniel Dunbar //===- llvm/unittest/ADT/SmallStringTest.cpp ------------------------------===//
2e5df197eSDaniel Dunbar //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5df197eSDaniel Dunbar //
7e5df197eSDaniel Dunbar //===----------------------------------------------------------------------===//
8e5df197eSDaniel Dunbar //
9e5df197eSDaniel Dunbar // SmallString unit tests.
10e5df197eSDaniel Dunbar //
11e5df197eSDaniel Dunbar //===----------------------------------------------------------------------===//
12e5df197eSDaniel Dunbar 
13e5df197eSDaniel Dunbar #include "llvm/ADT/SmallString.h"
14130cec21SChandler Carruth #include "gtest/gtest.h"
1591d3cfedSDuncan P. N. Exon Smith #include <climits>
1691d3cfedSDuncan P. N. Exon Smith #include <cstring>
1791d3cfedSDuncan P. N. Exon Smith #include <stdarg.h>
18e5df197eSDaniel Dunbar 
19e5df197eSDaniel Dunbar using namespace llvm;
20e5df197eSDaniel Dunbar 
21e5df197eSDaniel Dunbar namespace {
22e5df197eSDaniel Dunbar 
23e5df197eSDaniel Dunbar // Test fixture class
24e5df197eSDaniel Dunbar class SmallStringTest : public testing::Test {
25e5df197eSDaniel Dunbar protected:
26e5df197eSDaniel Dunbar   typedef SmallString<40> StringType;
27e5df197eSDaniel Dunbar 
28e5df197eSDaniel Dunbar   StringType theString;
29e5df197eSDaniel Dunbar 
assertEmpty(StringType & v)30e5df197eSDaniel Dunbar   void assertEmpty(StringType & v) {
31e5df197eSDaniel Dunbar     // Size tests
32e5df197eSDaniel Dunbar     EXPECT_EQ(0u, v.size());
33e5df197eSDaniel Dunbar     EXPECT_TRUE(v.empty());
34e5df197eSDaniel Dunbar     // Iterator tests
35e5df197eSDaniel Dunbar     EXPECT_TRUE(v.begin() == v.end());
36e5df197eSDaniel Dunbar   }
37e5df197eSDaniel Dunbar };
38e5df197eSDaniel Dunbar 
39e5df197eSDaniel Dunbar // New string test.
TEST_F(SmallStringTest,EmptyStringTest)40e5df197eSDaniel Dunbar TEST_F(SmallStringTest, EmptyStringTest) {
41e5df197eSDaniel Dunbar   SCOPED_TRACE("EmptyStringTest");
42e5df197eSDaniel Dunbar   assertEmpty(theString);
43e5df197eSDaniel Dunbar   EXPECT_TRUE(theString.rbegin() == theString.rend());
44e5df197eSDaniel Dunbar }
45e5df197eSDaniel Dunbar 
TEST_F(SmallStringTest,AssignRepeated)4677c4ff21STalin TEST_F(SmallStringTest, AssignRepeated) {
4777c4ff21STalin   theString.assign(3, 'a');
4877c4ff21STalin   EXPECT_EQ(3u, theString.size());
4977c4ff21STalin   EXPECT_STREQ("aaa", theString.c_str());
50e5df197eSDaniel Dunbar }
51e5df197eSDaniel Dunbar 
TEST_F(SmallStringTest,AssignIterPair)52259a5a64SDavid Blaikie TEST_F(SmallStringTest, AssignIterPair) {
53259a5a64SDavid Blaikie   StringRef abc = "abc";
54259a5a64SDavid Blaikie   theString.assign(abc.begin(), abc.end());
55259a5a64SDavid Blaikie   EXPECT_EQ(3u, theString.size());
56259a5a64SDavid Blaikie   EXPECT_STREQ("abc", theString.c_str());
57259a5a64SDavid Blaikie }
58259a5a64SDavid Blaikie 
TEST_F(SmallStringTest,AssignStringRef)5977c4ff21STalin TEST_F(SmallStringTest, AssignStringRef) {
6077c4ff21STalin   StringRef abc = "abc";
6177c4ff21STalin   theString.assign(abc);
6277c4ff21STalin   EXPECT_EQ(3u, theString.size());
6377c4ff21STalin   EXPECT_STREQ("abc", theString.c_str());
6477c4ff21STalin }
6577c4ff21STalin 
TEST_F(SmallStringTest,AssignSmallVector)6677c4ff21STalin TEST_F(SmallStringTest, AssignSmallVector) {
6777c4ff21STalin   StringRef abc = "abc";
6877c4ff21STalin   SmallVector<char, 10> abcVec(abc.begin(), abc.end());
6977c4ff21STalin   theString.assign(abcVec);
7077c4ff21STalin   EXPECT_EQ(3u, theString.size());
7177c4ff21STalin   EXPECT_STREQ("abc", theString.c_str());
7277c4ff21STalin }
7377c4ff21STalin 
TEST_F(SmallStringTest,AssignStringRefs)74cf8d19f4SNathan James TEST_F(SmallStringTest, AssignStringRefs) {
75cf8d19f4SNathan James   theString.assign({"abc", "def", "ghi"});
76cf8d19f4SNathan James   EXPECT_EQ(9u, theString.size());
77cf8d19f4SNathan James   EXPECT_STREQ("abcdefghi", theString.c_str());
78cf8d19f4SNathan James }
79cf8d19f4SNathan James 
TEST_F(SmallStringTest,AppendIterPair)8077c4ff21STalin TEST_F(SmallStringTest, AppendIterPair) {
8177c4ff21STalin   StringRef abc = "abc";
8277c4ff21STalin   theString.append(abc.begin(), abc.end());
8377c4ff21STalin   theString.append(abc.begin(), abc.end());
8477c4ff21STalin   EXPECT_EQ(6u, theString.size());
8577c4ff21STalin   EXPECT_STREQ("abcabc", theString.c_str());
8677c4ff21STalin }
8777c4ff21STalin 
TEST_F(SmallStringTest,AppendStringRef)8877c4ff21STalin TEST_F(SmallStringTest, AppendStringRef) {
8977c4ff21STalin   StringRef abc = "abc";
9077c4ff21STalin   theString.append(abc);
9177c4ff21STalin   theString.append(abc);
9277c4ff21STalin   EXPECT_EQ(6u, theString.size());
9377c4ff21STalin   EXPECT_STREQ("abcabc", theString.c_str());
9477c4ff21STalin }
9577c4ff21STalin 
TEST_F(SmallStringTest,AppendSmallVector)9677c4ff21STalin TEST_F(SmallStringTest, AppendSmallVector) {
9777c4ff21STalin   StringRef abc = "abc";
9877c4ff21STalin   SmallVector<char, 10> abcVec(abc.begin(), abc.end());
9977c4ff21STalin   theString.append(abcVec);
10077c4ff21STalin   theString.append(abcVec);
10177c4ff21STalin   EXPECT_EQ(6u, theString.size());
10277c4ff21STalin   EXPECT_STREQ("abcabc", theString.c_str());
10377c4ff21STalin }
10477c4ff21STalin 
TEST_F(SmallStringTest,AppendStringRefs)105cf8d19f4SNathan James TEST_F(SmallStringTest, AppendStringRefs) {
106cf8d19f4SNathan James   theString.append({"abc", "def", "ghi"});
107cf8d19f4SNathan James   EXPECT_EQ(9u, theString.size());
108cf8d19f4SNathan James   EXPECT_STREQ("abcdefghi", theString.c_str());
109cf8d19f4SNathan James   StringRef Jkl = "jkl";
110cf8d19f4SNathan James   std::string Mno = "mno";
111cf8d19f4SNathan James   SmallString<4> Pqr("pqr");
112cf8d19f4SNathan James   const char *Stu = "stu";
113cf8d19f4SNathan James   theString.append({Jkl, Mno, Pqr, Stu});
114cf8d19f4SNathan James   EXPECT_EQ(21u, theString.size());
115cf8d19f4SNathan James   EXPECT_STREQ("abcdefghijklmnopqrstu", theString.c_str());
116cf8d19f4SNathan James }
117cf8d19f4SNathan James 
TEST_F(SmallStringTest,StringRefConversion)118d7049213SJonas Devlieghere TEST_F(SmallStringTest, StringRefConversion) {
119d7049213SJonas Devlieghere   StringRef abc = "abc";
120d7049213SJonas Devlieghere   theString.assign(abc.begin(), abc.end());
121d7049213SJonas Devlieghere   StringRef theStringRef = theString;
122d7049213SJonas Devlieghere   EXPECT_EQ("abc", theStringRef);
123d7049213SJonas Devlieghere }
124d7049213SJonas Devlieghere 
TEST_F(SmallStringTest,StdStringConversion)125d7049213SJonas Devlieghere TEST_F(SmallStringTest, StdStringConversion) {
126d7049213SJonas Devlieghere   StringRef abc = "abc";
127d7049213SJonas Devlieghere   theString.assign(abc.begin(), abc.end());
128d7049213SJonas Devlieghere   std::string theStdString = std::string(theString);
129d7049213SJonas Devlieghere   EXPECT_EQ("abc", theStdString);
130d7049213SJonas Devlieghere }
131d7049213SJonas Devlieghere 
TEST_F(SmallStringTest,Substr)13277c4ff21STalin TEST_F(SmallStringTest, Substr) {
13377c4ff21STalin   theString = "hello";
13477c4ff21STalin   EXPECT_EQ("lo", theString.substr(3));
13577c4ff21STalin   EXPECT_EQ("", theString.substr(100));
13677c4ff21STalin   EXPECT_EQ("hello", theString.substr(0, 100));
13777c4ff21STalin   EXPECT_EQ("o", theString.substr(4, 10));
13877c4ff21STalin }
13977c4ff21STalin 
TEST_F(SmallStringTest,Slice)14077c4ff21STalin TEST_F(SmallStringTest, Slice) {
14177c4ff21STalin   theString = "hello";
14277c4ff21STalin   EXPECT_EQ("l", theString.slice(2, 3));
14377c4ff21STalin   EXPECT_EQ("ell", theString.slice(1, 4));
14477c4ff21STalin   EXPECT_EQ("llo", theString.slice(2, 100));
14577c4ff21STalin   EXPECT_EQ("", theString.slice(2, 1));
14677c4ff21STalin   EXPECT_EQ("", theString.slice(10, 20));
14777c4ff21STalin }
14877c4ff21STalin 
TEST_F(SmallStringTest,Find)14977c4ff21STalin TEST_F(SmallStringTest, Find) {
15077c4ff21STalin   theString = "hello";
15177c4ff21STalin   EXPECT_EQ(2U, theString.find('l'));
15277c4ff21STalin   EXPECT_EQ(StringRef::npos, theString.find('z'));
15377c4ff21STalin   EXPECT_EQ(StringRef::npos, theString.find("helloworld"));
15477c4ff21STalin   EXPECT_EQ(0U, theString.find("hello"));
15577c4ff21STalin   EXPECT_EQ(1U, theString.find("ello"));
15677c4ff21STalin   EXPECT_EQ(StringRef::npos, theString.find("zz"));
15777c4ff21STalin   EXPECT_EQ(2U, theString.find("ll", 2));
15877c4ff21STalin   EXPECT_EQ(StringRef::npos, theString.find("ll", 3));
15977c4ff21STalin   EXPECT_EQ(0U, theString.find(""));
16077c4ff21STalin 
16177c4ff21STalin   EXPECT_EQ(3U, theString.rfind('l'));
16277c4ff21STalin   EXPECT_EQ(StringRef::npos, theString.rfind('z'));
16377c4ff21STalin   EXPECT_EQ(StringRef::npos, theString.rfind("helloworld"));
16477c4ff21STalin   EXPECT_EQ(0U, theString.rfind("hello"));
16577c4ff21STalin   EXPECT_EQ(1U, theString.rfind("ello"));
16677c4ff21STalin   EXPECT_EQ(StringRef::npos, theString.rfind("zz"));
16777c4ff21STalin 
16877c4ff21STalin   EXPECT_EQ(2U, theString.find_first_of('l'));
16977c4ff21STalin   EXPECT_EQ(1U, theString.find_first_of("el"));
17077c4ff21STalin   EXPECT_EQ(StringRef::npos, theString.find_first_of("xyz"));
17177c4ff21STalin 
17277c4ff21STalin   EXPECT_EQ(1U, theString.find_first_not_of('h'));
17377c4ff21STalin   EXPECT_EQ(4U, theString.find_first_not_of("hel"));
17477c4ff21STalin   EXPECT_EQ(StringRef::npos, theString.find_first_not_of("hello"));
17577c4ff21STalin 
17677c4ff21STalin   theString = "hellx xello hell ello world foo bar hello";
17777c4ff21STalin   EXPECT_EQ(36U, theString.find("hello"));
17877c4ff21STalin   EXPECT_EQ(28U, theString.find("foo"));
17977c4ff21STalin   EXPECT_EQ(12U, theString.find("hell", 2));
18077c4ff21STalin   EXPECT_EQ(0U, theString.find(""));
18177c4ff21STalin }
18277c4ff21STalin 
TEST_F(SmallStringTest,Count)18377c4ff21STalin TEST_F(SmallStringTest, Count) {
18477c4ff21STalin   theString = "hello";
18577c4ff21STalin   EXPECT_EQ(2U, theString.count('l'));
18677c4ff21STalin   EXPECT_EQ(1U, theString.count('o'));
18777c4ff21STalin   EXPECT_EQ(0U, theString.count('z'));
18877c4ff21STalin   EXPECT_EQ(0U, theString.count("helloworld"));
18977c4ff21STalin   EXPECT_EQ(1U, theString.count("hello"));
19077c4ff21STalin   EXPECT_EQ(1U, theString.count("ello"));
19177c4ff21STalin   EXPECT_EQ(0U, theString.count("zz"));
19277c4ff21STalin }
19377c4ff21STalin 
TEST_F(SmallStringTest,Realloc)1946a0fc73bSYaron Keren TEST_F(SmallStringTest, Realloc) {
1956a0fc73bSYaron Keren   theString = "abcd";
1966a0fc73bSYaron Keren   theString.reserve(100);
1976a0fc73bSYaron Keren   EXPECT_EQ("abcd", theString);
1986a0fc73bSYaron Keren   unsigned const N = 100000;
1996a0fc73bSYaron Keren   theString.reserve(N);
2006a0fc73bSYaron Keren   for (unsigned i = 0; i < N - 4; ++i)
2016a0fc73bSYaron Keren     theString.push_back('y');
2026a0fc73bSYaron Keren   EXPECT_EQ("abcdyyy", theString.slice(0, 7));
2036a0fc73bSYaron Keren }
2046a0fc73bSYaron Keren 
TEST_F(SmallStringTest,Comparisons)205a451156bSSam McCall TEST_F(SmallStringTest, Comparisons) {
20677c4ff21STalin   EXPECT_EQ(-1, SmallString<10>("aab").compare("aad"));
20777c4ff21STalin   EXPECT_EQ( 0, SmallString<10>("aab").compare("aab"));
20877c4ff21STalin   EXPECT_EQ( 1, SmallString<10>("aab").compare("aaa"));
20977c4ff21STalin   EXPECT_EQ(-1, SmallString<10>("aab").compare("aabb"));
21077c4ff21STalin   EXPECT_EQ( 1, SmallString<10>("aab").compare("aa"));
21177c4ff21STalin   EXPECT_EQ( 1, SmallString<10>("\xFF").compare("\1"));
21277c4ff21STalin 
213*42f74e82SMartin Storsjö   EXPECT_EQ(-1, SmallString<10>("AaB").compare_insensitive("aAd"));
214*42f74e82SMartin Storsjö   EXPECT_EQ( 0, SmallString<10>("AaB").compare_insensitive("aab"));
215*42f74e82SMartin Storsjö   EXPECT_EQ( 1, SmallString<10>("AaB").compare_insensitive("AAA"));
216*42f74e82SMartin Storsjö   EXPECT_EQ(-1, SmallString<10>("AaB").compare_insensitive("aaBb"));
217*42f74e82SMartin Storsjö   EXPECT_EQ( 1, SmallString<10>("AaB").compare_insensitive("aA"));
218*42f74e82SMartin Storsjö   EXPECT_EQ( 1, SmallString<10>("\xFF").compare_insensitive("\1"));
21977c4ff21STalin 
22077c4ff21STalin   EXPECT_EQ(-1, SmallString<10>("aab").compare_numeric("aad"));
22177c4ff21STalin   EXPECT_EQ( 0, SmallString<10>("aab").compare_numeric("aab"));
22277c4ff21STalin   EXPECT_EQ( 1, SmallString<10>("aab").compare_numeric("aaa"));
22377c4ff21STalin   EXPECT_EQ(-1, SmallString<10>("aab").compare_numeric("aabb"));
22477c4ff21STalin   EXPECT_EQ( 1, SmallString<10>("aab").compare_numeric("aa"));
22577c4ff21STalin   EXPECT_EQ(-1, SmallString<10>("1").compare_numeric("10"));
22677c4ff21STalin   EXPECT_EQ( 0, SmallString<10>("10").compare_numeric("10"));
22777c4ff21STalin   EXPECT_EQ( 0, SmallString<10>("10a").compare_numeric("10a"));
22877c4ff21STalin   EXPECT_EQ( 1, SmallString<10>("2").compare_numeric("1"));
22977c4ff21STalin   EXPECT_EQ( 0, SmallString<10>("llvm_v1i64_ty").compare_numeric("llvm_v1i64_ty"));
23077c4ff21STalin   EXPECT_EQ( 1, SmallString<10>("\xFF").compare_numeric("\1"));
23177c4ff21STalin   EXPECT_EQ( 1, SmallString<10>("V16").compare_numeric("V1_q0"));
23277c4ff21STalin   EXPECT_EQ(-1, SmallString<10>("V1_q0").compare_numeric("V16"));
23377c4ff21STalin   EXPECT_EQ(-1, SmallString<10>("V8_q0").compare_numeric("V16"));
23477c4ff21STalin   EXPECT_EQ( 1, SmallString<10>("V16").compare_numeric("V8_q0"));
23577c4ff21STalin   EXPECT_EQ(-1, SmallString<10>("V1_q0").compare_numeric("V8_q0"));
23677c4ff21STalin   EXPECT_EQ( 1, SmallString<10>("V8_q0").compare_numeric("V1_q0"));
23777c4ff21STalin }
23877c4ff21STalin 
239a451156bSSam McCall // Check gtest prints SmallString as a string instead of a container of chars.
240a451156bSSam McCall // The code is in utils/unittest/googletest/internal/custom/gtest-printers.h
TEST_F(SmallStringTest,GTestPrinter)241a451156bSSam McCall TEST_F(SmallStringTest, GTestPrinter) {
242a451156bSSam McCall   EXPECT_EQ(R"("foo")", ::testing::PrintToString(SmallString<1>("foo")));
243a451156bSSam McCall   const SmallVectorImpl<char> &ErasedSmallString = SmallString<1>("foo");
244a451156bSSam McCall   EXPECT_EQ(R"("foo")", ::testing::PrintToString(ErasedSmallString));
24591d3cfedSDuncan P. N. Exon Smith }
246a451156bSSam McCall 
247a451156bSSam McCall } // namespace
248