1/* 2 * Copyright (C) 2012 Intel Corporation. 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 "UnitTestUtils/EWK2UnitTestBase.h" 29#include "WKEinaSharedString.h" 30#include <WebKit/WKString.h> 31#include <WebKit/WKURL.h> 32 33using namespace EWK2UnitTest; 34 35extern EWK2UnitTestEnvironment* environment; 36 37// Use macro here instead of global variables in order not to have always the same pointers. 38#define testString "I'm test string!" 39#define anotherTestString "I'm another test string!" 40#define testUrl "file:///path/somewhere" 41 42class EWK2EinaSharedStringTest : public EWK2UnitTestBase { 43protected: 44 void checkString(const WKEinaSharedString& string, const char* pattern) 45 { 46 ASSERT_EQ(string.isNull(), pattern ? false : true); 47 ASSERT_EQ(string.length(), pattern ? strlen(pattern) : 0); // Compare length. 48 ASSERT_EQ(string, pattern); // Compare values. Check '==' operator with WKEinaSharedString and plain string. 49 ASSERT_STREQ(string, pattern); // Compare values. Check 'const char*' operator. 50 } 51}; 52 53TEST_F(EWK2EinaSharedStringTest, constructEmpty) 54{ 55 WKEinaSharedString emptyString; 56 checkString(emptyString, 0); 57} 58 59TEST_F(EWK2EinaSharedStringTest, constructFromPlainString) 60{ 61 WKEinaSharedString emptyString(testString); 62 checkString(emptyString, testString); 63} 64 65TEST_F(EWK2EinaSharedStringTest, constructFromWKString) 66{ 67 WKEinaSharedString string(AdoptWK, WKStringCreateWithUTF8CString(testString)); 68 checkString(string, testString); 69} 70 71TEST_F(EWK2EinaSharedStringTest, constructFromWKURL) 72{ 73 WKEinaSharedString string(AdoptWK, WKURLCreateWithUTF8CString(testUrl)); 74 checkString(string, testUrl); 75} 76 77TEST_F(EWK2EinaSharedStringTest, constructFromEinaStringShare) 78{ 79 WKEinaSharedString string(WKEinaSharedString::adopt(eina_stringshare_add(testString))); 80 checkString(string, testString); 81 82 string = WKEinaSharedString::adopt(eina_stringshare_add(anotherTestString)); 83 checkString(string, anotherTestString); 84 85 string = string; 86 checkString(string, anotherTestString); 87} 88 89TEST_F(EWK2EinaSharedStringTest, costructCopy) 90{ 91 WKEinaSharedString string(testString); 92 WKEinaSharedString copyString(string); 93 checkString(string, testString); 94 checkString(copyString, testString); 95 ASSERT_EQ(string, copyString); // Check '==' operator with two instances of WKEinaSharedString. 96} 97 98TEST_F(EWK2EinaSharedStringTest, comparisonOperators) 99{ 100 WKEinaSharedString string(testString); 101 WKEinaSharedString sameString(testString); 102 WKEinaSharedString anotherString(anotherTestString); 103 104 ASSERT_EQ(string, sameString); // Check '==' operator with two instances of WKEinaSharedString. 105 ASSERT_NE(string, anotherString); // Check '!=' operator with two instances of WKEinaSharedString. 106 107 const char* explicitlySharedString = eina_stringshare_add(testString); 108 ASSERT_EQ(static_cast<const char*>(string), explicitlySharedString); // Compare pointers. 109 ASSERT_STREQ(string, explicitlySharedString); // Compare values. 110 eina_stringshare_del(explicitlySharedString); 111 112 ASSERT_EQ(string, string); // Self-comparison. 113} 114 115TEST_F(EWK2EinaSharedStringTest, assignmentOperators) 116{ 117 WKEinaSharedString string; 118 119 string = testString; 120 checkString(string, testString); 121 122 WKEinaSharedString anotherString(anotherTestString); 123 string = anotherString; 124 checkString(string, anotherTestString); 125 ASSERT_EQ(string, anotherString); 126 127 string = string; // Check that self-assignment does not break WKEinaSharedString internal data. 128 checkString(string, anotherTestString); 129} 130 131TEST_F(EWK2EinaSharedStringTest, leakString) 132{ 133 WKEinaSharedString string; 134 135 string = testString; 136 checkString(string, testString); 137 138 Eina_Stringshare* leakedString = string.leakString(); 139 checkString(string, 0); 140 ASSERT_STREQ(leakedString, testString); 141 142 eina_stringshare_del(leakedString); 143} 144