Home | History | Annotate | Download | only in text
      1 /*
      2  * Copyright (C) 2012 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
     14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
     17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     23  * THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 
     28 #include "wtf/text/CString.h"
     29 #include <gtest/gtest.h>
     30 
     31 namespace {
     32 
     33 TEST(WTF, CStringNullStringConstructor)
     34 {
     35     CString string;
     36     ASSERT_TRUE(string.isNull());
     37     ASSERT_EQ(string.data(), static_cast<const char*>(0));
     38     ASSERT_EQ(string.length(), static_cast<size_t>(0));
     39 
     40     CString stringFromCharPointer(static_cast<const char*>(0));
     41     ASSERT_TRUE(stringFromCharPointer.isNull());
     42     ASSERT_EQ(stringFromCharPointer.data(), static_cast<const char*>(0));
     43     ASSERT_EQ(stringFromCharPointer.length(), static_cast<size_t>(0));
     44 
     45     CString stringFromCharAndLength(static_cast<const char*>(0), 0);
     46     ASSERT_TRUE(stringFromCharAndLength.isNull());
     47     ASSERT_EQ(stringFromCharAndLength.data(), static_cast<const char*>(0));
     48     ASSERT_EQ(stringFromCharAndLength.length(), static_cast<size_t>(0));
     49 }
     50 
     51 TEST(WTF, CStringEmptyEmptyConstructor)
     52 {
     53     const char* emptyString = "";
     54     CString string(emptyString);
     55     ASSERT_FALSE(string.isNull());
     56     ASSERT_EQ(string.length(), static_cast<size_t>(0));
     57     ASSERT_EQ(string.data()[0], 0);
     58 
     59     CString stringWithLength(emptyString, 0);
     60     ASSERT_FALSE(stringWithLength.isNull());
     61     ASSERT_EQ(stringWithLength.length(), static_cast<size_t>(0));
     62     ASSERT_EQ(stringWithLength.data()[0], 0);
     63 }
     64 
     65 TEST(WTF, CStringEmptyRegularConstructor)
     66 {
     67     const char* referenceString = "WebKit";
     68 
     69     CString string(referenceString);
     70     ASSERT_FALSE(string.isNull());
     71     ASSERT_EQ(string.length(), strlen(referenceString));
     72     ASSERT_STREQ(referenceString, string.data());
     73 
     74     CString stringWithLength(referenceString, 6);
     75     ASSERT_FALSE(stringWithLength.isNull());
     76     ASSERT_EQ(stringWithLength.length(), strlen(referenceString));
     77     ASSERT_STREQ(referenceString, stringWithLength.data());
     78 }
     79 
     80 TEST(WTF, CStringUninitializedConstructor)
     81 {
     82     char* buffer;
     83     CString emptyString = CString::newUninitialized(0, buffer);
     84     ASSERT_FALSE(emptyString.isNull());
     85     ASSERT_EQ(buffer, emptyString.data());
     86     ASSERT_EQ(buffer[0], 0);
     87 
     88     const size_t length = 25;
     89     CString uninitializedString = CString::newUninitialized(length, buffer);
     90     ASSERT_FALSE(uninitializedString.isNull());
     91     ASSERT_EQ(buffer, uninitializedString.data());
     92     ASSERT_EQ(uninitializedString.data()[length], 0);
     93 }
     94 
     95 TEST(WTF, CStringZeroTerminated)
     96 {
     97     const char* referenceString = "WebKit";
     98     CString stringWithLength(referenceString, 3);
     99     ASSERT_EQ(stringWithLength.data()[3], 0);
    100 }
    101 
    102 TEST(WTF, CStringCopyOnWrite)
    103 {
    104     const char* initialString = "Webkit";
    105     CString string(initialString);
    106     CString copy = string;
    107 
    108     string.mutableData()[3] = 'K';
    109     ASSERT_TRUE(string != copy);
    110     ASSERT_STREQ(string.data(), "WebKit");
    111     ASSERT_STREQ(copy.data(), initialString);
    112 }
    113 
    114 TEST(WTF, CStringComparison)
    115 {
    116     // Comparison with another CString.
    117     CString a;
    118     CString b;
    119     ASSERT_TRUE(a == b);
    120     ASSERT_FALSE(a != b);
    121     a = "a";
    122     b = CString();
    123     ASSERT_FALSE(a == b);
    124     ASSERT_TRUE(a != b);
    125     a = "a";
    126     b = "b";
    127     ASSERT_FALSE(a == b);
    128     ASSERT_TRUE(a != b);
    129     a = "a";
    130     b = "a";
    131     ASSERT_TRUE(a == b);
    132     ASSERT_FALSE(a != b);
    133     a = "a";
    134     b = "aa";
    135     ASSERT_FALSE(a == b);
    136     ASSERT_TRUE(a != b);
    137     a = "";
    138     b = "";
    139     ASSERT_TRUE(a == b);
    140     ASSERT_FALSE(a != b);
    141     a = "";
    142     b = CString();
    143     ASSERT_FALSE(a == b);
    144     ASSERT_TRUE(a != b);
    145     a = "a";
    146     b = "";
    147     ASSERT_FALSE(a == b);
    148     ASSERT_TRUE(a != b);
    149 
    150     // Comparison with a const char*.
    151     CString c;
    152     const char* d = 0;
    153     ASSERT_TRUE(c == d);
    154     ASSERT_FALSE(c != d);
    155     c = "c";
    156     d = 0;
    157     ASSERT_FALSE(c == d);
    158     ASSERT_TRUE(c != d);
    159     c = CString();
    160     d = "d";
    161     ASSERT_FALSE(c == d);
    162     ASSERT_TRUE(c != d);
    163     c = "c";
    164     d = "d";
    165     ASSERT_FALSE(c == d);
    166     ASSERT_TRUE(c != d);
    167     c = "c";
    168     d = "c";
    169     ASSERT_TRUE(c == d);
    170     ASSERT_FALSE(c != d);
    171     c = "c";
    172     d = "cc";
    173     ASSERT_FALSE(c == d);
    174     ASSERT_TRUE(c != d);
    175     c = "cc";
    176     d = "c";
    177     ASSERT_FALSE(c == d);
    178     ASSERT_TRUE(c != d);
    179     c = "";
    180     d = "";
    181     ASSERT_TRUE(c == d);
    182     ASSERT_FALSE(c != d);
    183     c = "";
    184     d = 0;
    185     ASSERT_FALSE(c == d);
    186     ASSERT_TRUE(c != d);
    187     c = CString();
    188     d = "";
    189     ASSERT_FALSE(c == d);
    190     ASSERT_TRUE(c != d);
    191     c = "a";
    192     d = "";
    193     ASSERT_FALSE(c == d);
    194     ASSERT_TRUE(c != d);
    195     c = "";
    196     d = "b";
    197     ASSERT_FALSE(c == d);
    198     ASSERT_TRUE(c != d);
    199 }
    200 
    201 } // namespace
    202