1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2009 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sstream> 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/string16.h" 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h" 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(WCHAR_T_IS_UTF32) 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We define a custom operator<< for string16 so we can use it with logging. 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This tests that conversion. 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(String16Test, OutputStream) { 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Basic stream test. 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::ostringstream stream; 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott stream << "Empty '" << string16() << "' standard '" 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott << string16(ASCIIToUTF16("Hello, world")) << "'"; 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("Empty '' standard 'Hello, world'", 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott stream.str().c_str()); 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Interesting edge cases. 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // These should each get converted to the invalid character: EF BF BD. 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott string16 initial_surrogate; 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott initial_surrogate.push_back(0xd800); 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott string16 final_surrogate; 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott final_surrogate.push_back(0xdc00); 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Old italic A = U+10300, will get converted to: F0 90 8C 80 'z'. 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott string16 surrogate_pair; 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott surrogate_pair.push_back(0xd800); 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott surrogate_pair.push_back(0xdf00); 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott surrogate_pair.push_back('z'); 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Will get converted to the invalid char + 's': EF BF BD 's'. 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott string16 unterminated_surrogate; 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott unterminated_surrogate.push_back(0xd800); 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott unterminated_surrogate.push_back('s'); 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::ostringstream stream; 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott stream << initial_surrogate << "," << final_surrogate << "," 464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch << surrogate_pair << "," << unterminated_surrogate; 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("\xef\xbf\xbd,\xef\xbf\xbd,\xf0\x90\x8c\x80z,\xef\xbf\xbds", 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott stream.str().c_str()); 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 54