| /* |
| * Copyright (C) 2012 Apple Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| * THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #include "config.h" |
| |
| #include <wtf/text/CString.h> |
| |
| TEST(WTF, CStringNullStringConstructor) |
| { |
| CString string; |
| ASSERT_TRUE(string.isNull()); |
| ASSERT_EQ(string.data(), static_cast<const char*>(0)); |
| ASSERT_EQ(string.length(), static_cast<size_t>(0)); |
| |
| CString stringFromCharPointer(static_cast<const char*>(0)); |
| ASSERT_TRUE(stringFromCharPointer.isNull()); |
| ASSERT_EQ(stringFromCharPointer.data(), static_cast<const char*>(0)); |
| ASSERT_EQ(stringFromCharPointer.length(), static_cast<size_t>(0)); |
| |
| CString stringFromCharAndLength(static_cast<const char*>(0), 0); |
| ASSERT_TRUE(stringFromCharAndLength.isNull()); |
| ASSERT_EQ(stringFromCharAndLength.data(), static_cast<const char*>(0)); |
| ASSERT_EQ(stringFromCharAndLength.length(), static_cast<size_t>(0)); |
| } |
| |
| TEST(WTF, CStringEmptyEmptyConstructor) |
| { |
| const char* emptyString = ""; |
| CString string(emptyString); |
| ASSERT_FALSE(string.isNull()); |
| ASSERT_EQ(string.length(), static_cast<size_t>(0)); |
| ASSERT_EQ(string.data()[0], 0); |
| |
| CString stringWithLength(emptyString, 0); |
| ASSERT_FALSE(stringWithLength.isNull()); |
| ASSERT_EQ(stringWithLength.length(), static_cast<size_t>(0)); |
| ASSERT_EQ(stringWithLength.data()[0], 0); |
| } |
| |
| TEST(WTF, CStringEmptyRegularConstructor) |
| { |
| const char* referenceString = "WebKit"; |
| |
| CString string(referenceString); |
| ASSERT_FALSE(string.isNull()); |
| ASSERT_EQ(string.length(), strlen(referenceString)); |
| ASSERT_STREQ(referenceString, string.data()); |
| |
| CString stringWithLength(referenceString, 6); |
| ASSERT_FALSE(stringWithLength.isNull()); |
| ASSERT_EQ(stringWithLength.length(), strlen(referenceString)); |
| ASSERT_STREQ(referenceString, stringWithLength.data()); |
| } |
| |
| TEST(WTF, CStringUninitializedConstructor) |
| { |
| char* buffer; |
| CString emptyString = CString::newUninitialized(0, buffer); |
| ASSERT_FALSE(emptyString.isNull()); |
| ASSERT_EQ(buffer, emptyString.data()); |
| ASSERT_EQ(buffer[0], 0); |
| |
| const size_t length = 25; |
| CString uninitializedString = CString::newUninitialized(length, buffer); |
| ASSERT_FALSE(uninitializedString.isNull()); |
| ASSERT_EQ(buffer, uninitializedString.data()); |
| ASSERT_EQ(uninitializedString.data()[length], 0); |
| } |
| |
| TEST(WTF, CStringZeroTerminated) |
| { |
| const char* referenceString = "WebKit"; |
| CString stringWithLength(referenceString, 3); |
| ASSERT_EQ(stringWithLength.data()[3], 0); |
| } |
| |
| TEST(WTF, CStringCopyOnWrite) |
| { |
| const char* initialString = "Webkit"; |
| CString string(initialString); |
| CString copy = string; |
| |
| string.mutableData()[3] = 'K'; |
| ASSERT_TRUE(string != copy); |
| ASSERT_STREQ(string.data(), "WebKit"); |
| ASSERT_STREQ(copy.data(), initialString); |
| } |
| |
| TEST(WTF, CStringComparison) |
| { |
| // Comparison with another CString. |
| CString a; |
| CString b; |
| ASSERT_TRUE(a == b); |
| ASSERT_FALSE(a != b); |
| a = "a"; |
| b = CString(); |
| ASSERT_FALSE(a == b); |
| ASSERT_TRUE(a != b); |
| a = "a"; |
| b = "b"; |
| ASSERT_FALSE(a == b); |
| ASSERT_TRUE(a != b); |
| a = "a"; |
| b = "a"; |
| ASSERT_TRUE(a == b); |
| ASSERT_FALSE(a != b); |
| a = "a"; |
| b = "aa"; |
| ASSERT_FALSE(a == b); |
| ASSERT_TRUE(a != b); |
| a = ""; |
| b = ""; |
| ASSERT_TRUE(a == b); |
| ASSERT_FALSE(a != b); |
| a = ""; |
| b = CString(); |
| ASSERT_FALSE(a == b); |
| ASSERT_TRUE(a != b); |
| a = "a"; |
| b = ""; |
| ASSERT_FALSE(a == b); |
| ASSERT_TRUE(a != b); |
| |
| // Comparison with a const char*. |
| CString c; |
| const char* d = 0; |
| ASSERT_TRUE(c == d); |
| ASSERT_FALSE(c != d); |
| c = "c"; |
| d = 0; |
| ASSERT_FALSE(c == d); |
| ASSERT_TRUE(c != d); |
| c = CString(); |
| d = "d"; |
| ASSERT_FALSE(c == d); |
| ASSERT_TRUE(c != d); |
| c = "c"; |
| d = "d"; |
| ASSERT_FALSE(c == d); |
| ASSERT_TRUE(c != d); |
| c = "c"; |
| d = "c"; |
| ASSERT_TRUE(c == d); |
| ASSERT_FALSE(c != d); |
| c = "c"; |
| d = "cc"; |
| ASSERT_FALSE(c == d); |
| ASSERT_TRUE(c != d); |
| c = "cc"; |
| d = "c"; |
| ASSERT_FALSE(c == d); |
| ASSERT_TRUE(c != d); |
| c = ""; |
| d = ""; |
| ASSERT_TRUE(c == d); |
| ASSERT_FALSE(c != d); |
| c = ""; |
| d = 0; |
| ASSERT_FALSE(c == d); |
| ASSERT_TRUE(c != d); |
| c = CString(); |
| d = ""; |
| ASSERT_FALSE(c == d); |
| ASSERT_TRUE(c != d); |
| c = "a"; |
| d = ""; |
| ASSERT_FALSE(c == d); |
| ASSERT_TRUE(c != d); |
| c = ""; |
| d = "b"; |
| ASSERT_FALSE(c == d); |
| ASSERT_TRUE(c != d); |
| } |