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) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WCHAR_T_IS_UTF32) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We define a custom operator<< for string16 so we can use it with logging. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that conversion. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(String16Test, OutputStream) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Basic stream test. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::ostringstream stream; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream << "Empty '" << string16() << "' standard '" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << string16(ASCIIToUTF16("Hello, world")) << "'"; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("Empty '' standard 'Hello, world'", 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream.str().c_str()); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Interesting edge cases. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These should each get converted to the invalid character: EF BF BD. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 initial_surrogate; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_surrogate.push_back(0xd800); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 final_surrogate; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_surrogate.push_back(0xdc00); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Old italic A = U+10300, will get converted to: F0 90 8C 80 'z'. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 surrogate_pair; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surrogate_pair.push_back(0xd800); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surrogate_pair.push_back(0xdf00); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surrogate_pair.push_back('z'); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Will get converted to the invalid char + 's': EF BF BD 's'. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 unterminated_surrogate; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unterminated_surrogate.push_back(0xd800); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unterminated_surrogate.push_back('s'); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::ostringstream stream; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream << initial_surrogate << "," << final_surrogate << "," 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << surrogate_pair << "," << unterminated_surrogate; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("\xef\xbf\xbd,\xef\xbf\xbd,\xf0\x90\x8c\x80z,\xef\xbf\xbds", 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream.str().c_str()); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 55