//===--- StringExtrasTest.cpp ---------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// #include "swift/Basic/StringExtras.h" #include "llvm/ADT/SmallString.h" #include "gtest/gtest.h" #include using namespace swift; TEST(CamelCaseWordsTest, Iteration) { auto words = camel_case::getWords("URLByPrependingHTTPToURL"); // Forward iteration count. EXPECT_EQ(6, std::distance(words.begin(), words.end())); // Reverse iteration count. EXPECT_EQ(6, std::distance(words.rbegin(), words.rend())); // Iteration contents. auto iter = words.begin(); EXPECT_EQ(*iter, "URL"); // Stepping forward. ++iter; EXPECT_EQ(*iter, "By"); // Immediately stepping back (fast path). --iter; EXPECT_EQ(*iter, "URL"); // Immediately stepping forward (fast path). ++iter; EXPECT_EQ(*iter, "By"); // Stepping forward. ++iter; EXPECT_EQ(*iter, "Prepending"); // Stepping back twice (slow path). --iter; --iter; EXPECT_EQ(*iter, "URL"); // Stepping forward to visit the remaining elements. ++iter; EXPECT_EQ(*iter, "By"); ++iter; EXPECT_EQ(*iter, "Prepending"); ++iter; EXPECT_EQ(*iter, "HTTP"); ++iter; EXPECT_EQ(*iter, "To"); ++iter; EXPECT_EQ(*iter, "URL"); // We're done. ++iter; EXPECT_EQ(iter, words.end()); } TEST(CamelCaseWordsTest, PluralAcronyms) { auto words = camel_case::getWords("CreateURLsFromPIXies"); // Forward iteration count. EXPECT_EQ(4, std::distance(words.begin(), words.end())); // Reverse iteration count. EXPECT_EQ(4, std::distance(words.rbegin(), words.rend())); // Iteration contents. auto iter = words.begin(); EXPECT_EQ(*iter, "Create"); // Stepping forward. ++iter; EXPECT_EQ(*iter, "URLs"); // Immediately stepping back. --iter; EXPECT_EQ(*iter, "Create"); // Immediately stepping forward. ++iter; EXPECT_EQ(*iter, "URLs"); // Stepping forward. ++iter; EXPECT_EQ(*iter, "From"); // Stepping back twice (slow path). --iter; --iter; EXPECT_EQ(*iter, "Create"); // Stepping forward to visit the remaining elements. ++iter; EXPECT_EQ(*iter, "URLs"); ++iter; EXPECT_EQ(*iter, "From"); ++iter; EXPECT_EQ(*iter, "PIXies"); // We're done. ++iter; EXPECT_EQ(iter, words.end()); } TEST(CamelCaseWordsTest, MorePluralAcronyms) { auto words = camel_case::getWords("inSameDayAsDate"); // Forward iteration count. EXPECT_EQ(5, std::distance(words.begin(), words.end())); // Reverse iteration count. EXPECT_EQ(5, std::distance(words.rbegin(), words.rend())); // Iteration contents. auto iter = words.begin(); EXPECT_EQ(*iter, "in"); // Stepping forward. ++iter; EXPECT_EQ(*iter, "Same"); // Immediately stepping back (fast path). --iter; EXPECT_EQ(*iter, "in"); // Immediately stepping forward (fast path). ++iter; EXPECT_EQ(*iter, "Same"); // Stepping forward. ++iter; EXPECT_EQ(*iter, "Day"); // Stepping back twice (slow path). --iter; --iter; EXPECT_EQ(*iter, "in"); // Stepping forward to visit the remaining elements. ++iter; EXPECT_EQ(*iter, "Same"); ++iter; EXPECT_EQ(*iter, "Day"); ++iter; EXPECT_EQ(*iter, "As"); ++iter; EXPECT_EQ(*iter, "Date"); // We're done. ++iter; EXPECT_EQ(iter, words.end()); } TEST(CamelCaseWordsTest, WordsWithUnderscores) { auto words = camel_case::getWords("CF_Flags_789"); EXPECT_EQ(5, std::distance(words.begin(), words.end())); auto iter = words.begin(); EXPECT_EQ("CF", *iter++); EXPECT_EQ("_", *iter++); EXPECT_EQ("Flags", *iter++); EXPECT_EQ("_", *iter++); EXPECT_EQ("789", *iter++); EXPECT_EQ("789", *--iter); EXPECT_EQ("_", *--iter); EXPECT_EQ("Flags", *--iter); EXPECT_EQ("_", *--iter); EXPECT_EQ("CF", *--iter); auto manyUnderscores = camel_case::getWords("___ABC"); EXPECT_EQ(4, std::distance(manyUnderscores.begin(), manyUnderscores.end())); iter = manyUnderscores.begin(); EXPECT_EQ("_", *iter++); EXPECT_EQ("_", *iter++); EXPECT_EQ("_", *iter++); EXPECT_EQ("ABC", *iter++); EXPECT_EQ("ABC", *--iter); EXPECT_EQ("_", *--iter); EXPECT_EQ("_", *--iter); EXPECT_EQ("_", *--iter); } TEST(ToLowercaseTest, Words) { llvm::SmallString<64> scratch; EXPECT_EQ(camel_case::toLowercaseWord("By", scratch), "by"); EXPECT_EQ(camel_case::toLowercaseWord("and", scratch), "and"); EXPECT_EQ(camel_case::toLowercaseWord("A", scratch), "a"); EXPECT_EQ(camel_case::toLowercaseWord("URL", scratch), "URL"); EXPECT_EQ(camel_case::toLowercaseWord("", scratch), ""); } TEST(ToLowercaseInitialismsTest, Words) { llvm::SmallString<64> scratch; EXPECT_EQ(camel_case::toLowercaseInitialisms("ToXML", scratch), "toXML"); EXPECT_EQ(camel_case::toLowercaseInitialisms("URLsInHand", scratch), "urlsInHand"); } TEST(ToSentencecaseTest, Words) { llvm::SmallString<64> scratch; EXPECT_EQ(camel_case::toSentencecase("by", scratch), "By"); EXPECT_EQ(camel_case::toSentencecase("a", scratch), "A"); EXPECT_EQ(camel_case::toSentencecase("URL", scratch), "URL"); EXPECT_EQ(camel_case::toSentencecase("", scratch), ""); }