1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sstream> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace base { 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WCHAR_T_IS_UTF32) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We define a custom operator<< for string16 so we can use it with logging. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that conversion. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(String16Test, OutputStream) { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Basic stream test. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::ostringstream stream; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream << "Empty '" << string16() << "' standard '" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << string16(ASCIIToUTF16("Hello, world")) << "'"; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("Empty '' standard 'Hello, world'", 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream.str().c_str()); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Interesting edge cases. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These should each get converted to the invalid character: EF BF BD. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 initial_surrogate; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_surrogate.push_back(0xd800); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 final_surrogate; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_surrogate.push_back(0xdc00); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Old italic A = U+10300, will get converted to: F0 90 8C 80 'z'. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 surrogate_pair; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surrogate_pair.push_back(0xd800); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surrogate_pair.push_back(0xdf00); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surrogate_pair.push_back('z'); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Will get converted to the invalid char + 's': EF BF BD 's'. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 unterminated_surrogate; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unterminated_surrogate.push_back(0xd800); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unterminated_surrogate.push_back('s'); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::ostringstream stream; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream << initial_surrogate << "," << final_surrogate << "," 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << surrogate_pair << "," << unterminated_surrogate; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("\xef\xbf\xbd,\xef\xbf\xbd,\xf0\x90\x8c\x80z,\xef\xbf\xbds", 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream.str().c_str()); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace base 59