Index: unittests/Utility/CMakeLists.txt =================================================================== --- unittests/Utility/CMakeLists.txt +++ unittests/Utility/CMakeLists.txt @@ -16,6 +16,7 @@ StreamTeeTest.cpp StreamTest.cpp StringExtractorTest.cpp + StringListTest.cpp StructuredDataTest.cpp TildeExpressionResolverTest.cpp TimeoutTest.cpp Index: unittests/Utility/StringListTest.cpp =================================================================== --- /dev/null +++ unittests/Utility/StringListTest.cpp @@ -0,0 +1,512 @@ +//===-- StringListTest.cpp ---------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Utility/StringList.h" +#include "lldb/Utility/StreamString.h" +#include "gtest/gtest.h" + +using namespace lldb_private; + +TEST(StringListTest, DefaultConstructor) { + StringList s; + EXPECT_EQ(0U, s.GetSize()); +} + +TEST(StringListTest, Assignment) { + StringList orig; + orig.AppendString("foo"); + orig.AppendString("bar"); + + StringList s = orig; + + ASSERT_EQ(2U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + EXPECT_STREQ("bar", s.GetStringAtIndex(1)); + + ASSERT_EQ(2U, orig.GetSize()); + EXPECT_STREQ("foo", orig.GetStringAtIndex(0)); + EXPECT_STREQ("bar", orig.GetStringAtIndex(1)); +} + +TEST(StringListTest, AppendStringStdString) { + StringList s; + s.AppendString("foo"); + ASSERT_EQ(1U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + + s.AppendString("bar"); + ASSERT_EQ(2U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + EXPECT_STREQ("bar", s.GetStringAtIndex(1)); +} + +TEST(StringListTest, AppendStringCString) { + StringList s; + s.AppendString("foo", strlen("foo")); + ASSERT_EQ(1U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + + s.AppendString("bar", strlen("bar")); + ASSERT_EQ(2U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + EXPECT_STREQ("bar", s.GetStringAtIndex(1)); +} + +TEST(StringListTest, AppendStringMove) { + StringList s; + std::string foo = "foo"; + std::string bar = "bar"; + + s.AppendString(std::move(foo)); + ASSERT_EQ(1U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + + s.AppendString(std::move(bar)); + ASSERT_EQ(2U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + EXPECT_STREQ("bar", s.GetStringAtIndex(1)); +} + +TEST(StringListTest, ShiftStdString) { + StringList s; + std::string foo = "foo"; + std::string bar = "bar"; + + s << foo; + ASSERT_EQ(1U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + + s << bar; + ASSERT_EQ(2U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + EXPECT_STREQ("bar", s.GetStringAtIndex(1)); +} + +TEST(StringListTest, ShiftCString) { + StringList s; + s << "foo"; + ASSERT_EQ(1U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + + s << "bar"; + ASSERT_EQ(2U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + EXPECT_STREQ("bar", s.GetStringAtIndex(1)); +} + +TEST(StringListTest, ShiftMove) { + StringList s; + std::string foo = "foo"; + std::string bar = "bar"; + + s << std::move(foo); + ASSERT_EQ(1U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + + s << std::move(bar); + ASSERT_EQ(2U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + EXPECT_STREQ("bar", s.GetStringAtIndex(1)); +} + +TEST(StringListTest, AppendListCStringArrayEmpty) { + StringList s; + s.AppendList(nullptr, 0); + EXPECT_EQ(0U, s.GetSize()); +} + +TEST(StringListTest, AppendListCStringArray) { + StringList s; + const char *items[3] = {"foo", "", "bar"}; + s.AppendList(items, 3); + + EXPECT_EQ(3U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + EXPECT_STREQ("", s.GetStringAtIndex(1)); + EXPECT_STREQ("bar", s.GetStringAtIndex(2)); +} + +TEST(StringListTest, AppendList) { + StringList other; + other.AppendString("foo"); + other.AppendString(""); + other.AppendString("bar"); + + StringList empty; + + StringList s; + s.AppendList(other); + + EXPECT_EQ(3U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + EXPECT_STREQ("", s.GetStringAtIndex(1)); + EXPECT_STREQ("bar", s.GetStringAtIndex(2)); + + EXPECT_EQ(3U, other.GetSize()); + EXPECT_STREQ("foo", other.GetStringAtIndex(0)); + EXPECT_STREQ("", other.GetStringAtIndex(1)); + EXPECT_STREQ("bar", other.GetStringAtIndex(2)); + + s.AppendList(empty); + s.AppendList(other); + EXPECT_EQ(6U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + EXPECT_STREQ("", s.GetStringAtIndex(1)); + EXPECT_STREQ("bar", s.GetStringAtIndex(2)); + EXPECT_STREQ("foo", s.GetStringAtIndex(3)); + EXPECT_STREQ("", s.GetStringAtIndex(4)); + EXPECT_STREQ("bar", s.GetStringAtIndex(5)); + + EXPECT_EQ(3U, other.GetSize()); + EXPECT_STREQ("foo", other.GetStringAtIndex(0)); + EXPECT_STREQ("", other.GetStringAtIndex(1)); + EXPECT_STREQ("bar", other.GetStringAtIndex(2)); +} + +TEST(StringListTest, GetSize) { + StringList s; + s.AppendString("foo"); + EXPECT_EQ(1U, s.GetSize()); + + s.AppendString("foo"); + EXPECT_EQ(2U, s.GetSize()); + + s.AppendString("foobar"); + EXPECT_EQ(3U, s.GetSize()); +} + +TEST(StringListTest, SetSize) { + StringList s; + s.SetSize(3); + EXPECT_EQ(3U, s.GetSize()); + EXPECT_STREQ("", s.GetStringAtIndex(0)); + EXPECT_STREQ("", s.GetStringAtIndex(1)); + EXPECT_STREQ("", s.GetStringAtIndex(2)); +} + +TEST(StringListTest, SplitIntoLines) { + StringList s; + s.SplitIntoLines("\nfoo\nbar\n\n"); + EXPECT_EQ(4U, s.GetSize()); + EXPECT_STREQ("", s.GetStringAtIndex(0)); + EXPECT_STREQ("foo", s.GetStringAtIndex(1)); + EXPECT_STREQ("bar", s.GetStringAtIndex(2)); + EXPECT_STREQ("", s.GetStringAtIndex(3)); +} + +TEST(StringListTest, SplitIntoLinesSingleTrailingCR) { + StringList s; + s.SplitIntoLines("\r"); + EXPECT_EQ(1U, s.GetSize()); + EXPECT_STREQ("", s.GetStringAtIndex(0)); +} + +TEST(StringListTest, SplitIntoLinesEmpty) { + StringList s; + s.SplitIntoLines(""); + EXPECT_EQ(0U, s.GetSize()); +} + +TEST(StringListTest, LongestCommonPrefixEmpty) { + StringList s; + std::string prefix = "this should be cleared"; + s.LongestCommonPrefix(prefix); + EXPECT_EQ("", prefix); +} + +TEST(StringListTest, LongestCommonPrefix) { + StringList s; + s.AppendString("foo"); + s.AppendString("foobar"); + s.AppendString("foo"); + s.AppendString("foozar"); + + std::string prefix = "this should be cleared"; + s.LongestCommonPrefix(prefix); + EXPECT_EQ("foo", prefix); +} + +TEST(StringListTest, LongestCommonPrefixSingleElement) { + StringList s; + s.AppendString("foo"); + + std::string prefix = "this should be cleared"; + s.LongestCommonPrefix(prefix); + EXPECT_EQ("foo", prefix); +} + +TEST(StringListTest, LongestCommonPrefixDuplicateElement) { + StringList s; + s.AppendString("foo"); + s.AppendString("foo"); + + std::string prefix = "this should be cleared"; + s.LongestCommonPrefix(prefix); + EXPECT_EQ("foo", prefix); +} + +TEST(StringListTest, LongestCommonPrefixNoPrefix) { + StringList s; + s.AppendString("foo"); + s.AppendString("1foobar"); + s.AppendString("2foo"); + s.AppendString("3foozar"); + + std::string prefix = "this should be cleared"; + s.LongestCommonPrefix(prefix); + EXPECT_EQ("", prefix); +} + +TEST(StringListTest, Clear) { + StringList s; + s.Clear(); + EXPECT_EQ(0U, s.GetSize()); + + s.AppendString("foo"); + s.Clear(); + EXPECT_EQ(0U, s.GetSize()); + + s.AppendString("foo"); + s.AppendString("foo"); + s.Clear(); + EXPECT_EQ(0U, s.GetSize()); +} + +TEST(StringListTest, PopBack) { + StringList s; + s.AppendString("foo"); + s.AppendString("bar"); + s.AppendString("boo"); + + s.PopBack(); + EXPECT_EQ(2U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + EXPECT_STREQ("bar", s.GetStringAtIndex(1)); + + s.PopBack(); + EXPECT_EQ(1U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + + s.PopBack(); + EXPECT_EQ(0U, s.GetSize()); +} + +TEST(StringListTest, RemoveBlankLines) { + StringList s; + + // Nothing to remove yet. + s.RemoveBlankLines(); + EXPECT_EQ(0U, s.GetSize()); + + // Add some lines. + s.AppendString(""); + s.AppendString(""); + s.AppendString("\t"); + s.AppendString(""); + s.AppendString(" "); + s.AppendString(""); + s.AppendString(""); + s.AppendString("f"); + s.AppendString(""); + s.AppendString(""); + + // And remove all the empty ones again. + s.RemoveBlankLines(); + + EXPECT_EQ(3U, s.GetSize()); + EXPECT_STREQ("\t", s.GetStringAtIndex(0)); + EXPECT_STREQ(" ", s.GetStringAtIndex(1)); + EXPECT_STREQ("f", s.GetStringAtIndex(2)); +} + +TEST(StringListTest, InsertStringAtIndexStart) { + StringList s; + + s.InsertStringAtIndex(0, "bar"); + EXPECT_EQ(1U, s.GetSize()); + EXPECT_STREQ("bar", s.GetStringAtIndex(0)); + + s.InsertStringAtIndex(0, "foo"); + EXPECT_EQ(2U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + EXPECT_STREQ("bar", s.GetStringAtIndex(1)); +} + +TEST(StringListTest, InsertStringAtIndexEnd) { + StringList s; + + s.InsertStringAtIndex(0, "foo"); + EXPECT_EQ(1U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + + s.InsertStringAtIndex(1, "bar"); + EXPECT_EQ(2U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + EXPECT_STREQ("bar", s.GetStringAtIndex(1)); +} + +TEST(StringListTest, InsertStringAtIndexOutOfBounds) { + StringList s; + + s.InsertStringAtIndex(1, "foo"); + EXPECT_EQ(1U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + + // FIXME: Inserting at an OOB index will always just append to the list. This + // seems not very intuitive. + s.InsertStringAtIndex(3, "bar"); + EXPECT_EQ(2U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); + EXPECT_STREQ("bar", s.GetStringAtIndex(1)); +} + +TEST(StringListTest, InsertStringAtIndexStdString) { + StringList s; + + std::string foo = "foo"; + s.InsertStringAtIndex(0, foo); + EXPECT_EQ(1U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); +} + +TEST(StringListTest, InsertStringAtIndexMove) { + StringList s; + + std::string foo = "foo"; + s.InsertStringAtIndex(0, std::move(foo)); + EXPECT_EQ(1U, s.GetSize()); + EXPECT_STREQ("foo", s.GetStringAtIndex(0)); +} + +TEST(StringListTest, CopyListEmpty) { + StringList s; + + EXPECT_EQ("", s.CopyList()); + EXPECT_EQ("", s.CopyList("+")); +} + +TEST(StringListTest, CopyListSingle) { + StringList s; + s.AppendString("ab"); + + EXPECT_EQ("ab", s.CopyList()); + EXPECT_EQ("-ab", s.CopyList("-")); +} + +TEST(StringListTest, CopyList) { + StringList s; + s.AppendString("ab"); + s.AppendString("cd"); + + EXPECT_EQ("ab\ncd", s.CopyList()); + EXPECT_EQ("-ab\n-cd", s.CopyList("-")); +} + +TEST(StringListTest, Join) { + StringList s; + s.AppendString("ab"); + s.AppendString("cd"); + + StreamString ss; + s.Join(" ", ss); + + EXPECT_EQ("ab cd", ss.GetString()); +} + +TEST(StringListTest, JoinEmpty) { + StringList s; + + StreamString ss; + s.Join(" ", ss); + + EXPECT_EQ("", ss.GetString()); +} + +TEST(StringListTest, JoinSingle) { + StringList s; + s.AppendString("foo"); + + StreamString ss; + s.Join(" ", ss); + + EXPECT_EQ("foo", ss.GetString()); +} + +TEST(StringListTest, JoinThree) { + StringList s; + s.AppendString("1"); + s.AppendString("2"); + s.AppendString("3"); + + StreamString ss; + s.Join(" ", ss); + + EXPECT_EQ("1 2 3", ss.GetString()); +} + +TEST(StringListTest, JoinNonSpace) { + StringList s; + s.AppendString("1"); + s.AppendString("2"); + s.AppendString("3"); + + StreamString ss; + s.Join(".", ss); + + EXPECT_EQ("1.2.3", ss.GetString()); +} + +TEST(StringListTest, JoinMultiCharSeparator) { + StringList s; + s.AppendString("1"); + s.AppendString("2"); + s.AppendString("3"); + + StreamString ss; + s.Join("--", ss); + + EXPECT_EQ("1--2--3", ss.GetString()); +} + +TEST(StringListTest, GetMaxStringLengthEqualSize) { + StringList s; + s.AppendString("123"); + s.AppendString("123"); + EXPECT_EQ(3U, s.GetMaxStringLength()); +} + +TEST(StringListTest, GetMaxStringLengthIncreasingSize) { + StringList s; + s.AppendString("123"); + s.AppendString("1234"); + EXPECT_EQ(4U, s.GetMaxStringLength()); +} + +TEST(StringListTest, GetMaxStringLengthDecreasingSize) { + StringList s; + s.AppendString("1234"); + s.AppendString("123"); + EXPECT_EQ(4U, s.GetMaxStringLength()); +} + +TEST(StringListTest, GetMaxStringLengthMixed) { + StringList s; + s.AppendString("123"); + s.AppendString("1"); + s.AppendString("123"); + s.AppendString("1234"); + s.AppendString("123"); + s.AppendString("1"); + EXPECT_EQ(4U, s.GetMaxStringLength()); +} + +TEST(StringListTest, GetMaxStringLengthEmpty) { + StringList s; + EXPECT_EQ(0U, s.GetMaxStringLength()); +}