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