//===--- OwnedStringTest.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/OwnedString.h" #include "gtest/gtest.h" using namespace swift; TEST(OwnedStringTest, char_pointer_empty) { const char *data = ""; const size_t length = strlen(data); OwnedString ownedString(data); EXPECT_EQ(length, ownedString.size()); EXPECT_TRUE(ownedString.empty()); OwnedString copy = ownedString.copy(); EXPECT_EQ(length, copy.size()); EXPECT_TRUE(copy.empty()); StringRef str = copy.str(); EXPECT_EQ("", str); EXPECT_EQ(length, str.size()); } TEST(OwnedStringTest, char_pointer_non_empty) { const char *data = "string"; const size_t length = strlen(data); OwnedString ownedString(data); EXPECT_EQ(length, ownedString.size()); EXPECT_FALSE(ownedString.empty()); OwnedString copy = ownedString.copy(); EXPECT_EQ(length, copy.size()); EXPECT_FALSE(copy.empty()); StringRef str = copy.str(); EXPECT_EQ("string", str); EXPECT_EQ(length, strlen(str.data())); } TEST(OwnedStringTest, char_pointer_length_equal) { const char *data = "string"; size_t length = strlen(data); OwnedString ownedString(data, length); EXPECT_EQ(length, ownedString.size()); EXPECT_FALSE(ownedString.empty()); OwnedString copy = ownedString.copy(); EXPECT_EQ(length, copy.size()); EXPECT_FALSE(copy.empty()); // Make sure we correctly copied the data and that it is null // terminated. StringRef str = copy.str(); EXPECT_EQ("string", str); EXPECT_EQ(length, strlen(str.data())); } TEST(OwnedStringTest, char_pointer_length_nonzero) { const char *data = "string"; const size_t length = 1; OwnedString ownedString(data, length); EXPECT_EQ(length, ownedString.size()); EXPECT_FALSE(ownedString.empty()); OwnedString copy = ownedString.copy(); EXPECT_EQ(length, copy.size()); EXPECT_FALSE(copy.empty()); // Make sure we correctly copied the data and that it is null // terminated. StringRef str = copy.str(); EXPECT_EQ("s", str); EXPECT_EQ(1, strlen(str.data())); } TEST(OwnedStringTest, char_pointer_length_zero) { const char *data = "string"; const size_t length = 0; OwnedString ownedString(data, length); EXPECT_EQ(length, ownedString.size()); EXPECT_TRUE(ownedString.empty()); OwnedString copy = ownedString.copy(); EXPECT_EQ(length, copy.size()); EXPECT_TRUE(copy.empty()); } TEST(OwnedStringTest, copy_original_new_different) { // Initialize a mutable string. const char *original = "string"; const size_t length = strlen(original); char *data = static_cast(malloc(length + 1)); memcpy(data, original, length); data[length] = '\0'; // Create an OwnedString. OwnedString ownedString(data, length); EXPECT_EQ(length, ownedString.size()); EXPECT_FALSE(ownedString.empty()); // Copy the string OwnedString copy = ownedString.copy(); EXPECT_EQ(length, copy.size()); EXPECT_FALSE(copy.empty()); // Make sure we correctly copied the data and that it is null // terminated. StringRef str = copy.str(); EXPECT_EQ("string", str); EXPECT_EQ(length, strlen(str.data())); // Make sure updating the original pointer doesn't affect the copy. data[0] = 'a'; EXPECT_EQ("string", str); } TEST(OwnedStringTest, copy_constructor_original_not_copy) { // Initialize a mutable string. const char *original = "string"; const size_t length = strlen(original); char *data = static_cast(malloc(length + 1)); memcpy(data, original, length); data[length] = '\0'; // Create an OwnedString. OwnedString ownedString(data, length); EXPECT_EQ(length, ownedString.size()); EXPECT_FALSE(ownedString.empty()); // Copy the string OwnedString copy = OwnedString(ownedString); EXPECT_EQ(length, copy.size()); EXPECT_FALSE(copy.empty()); // Make sure we correctly copied the data and that it is null // terminated. StringRef str = copy.str(); EXPECT_EQ("string", str); EXPECT_EQ(length, strlen(str.data())); // Make sure updating the original pointer doesn't affect the copy. data[0] = 'a'; EXPECT_EQ("atring", str); } TEST(OwnedStringTest, copy_constructor_original_copy) { // Initialize a mutable string. const char *original = "string"; const size_t length = strlen(original); char *data = static_cast(malloc(length + 1)); memcpy(data, original, length); data[length] = '\0'; // Create an OwnedString. OwnedString ownedString(data, length); EXPECT_EQ(length, ownedString.size()); EXPECT_FALSE(ownedString.empty()); // Copy the string OwnedString copy = OwnedString(ownedString.copy()); EXPECT_EQ(length, copy.size()); EXPECT_FALSE(copy.empty()); // Make sure we correctly copied the data and that it is null // terminated. StringRef str = copy.str(); EXPECT_EQ("string", str); EXPECT_EQ(length, strlen(str.data())); // Make sure updating the original pointer doesn't affect the copy. data[0] = 'a'; EXPECT_EQ("string", str); }