blob: edf26ef5b72fd0813c2490be5c75bf7b77ae7ccc [file] [log] [blame]
//===--- 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<char *>(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<char *>(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<char *>(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);
}