1d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)// found in the LICENSE file.
4d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
5d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "config.h"
6d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
7d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "wtf/text/TextCodecReplacement.h"
8d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
9d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "wtf/OwnPtr.h"
10d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "wtf/text/CString.h"
11d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "wtf/text/TextCodec.h"
12d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "wtf/text/TextEncoding.h"
13d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "wtf/text/TextEncodingRegistry.h"
14d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "wtf/text/WTFString.h"
15d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include <gtest/gtest.h>
16d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
17d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)namespace WTF {
18d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
19d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)namespace {
20d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
21d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)// Just one example, others are listed in the codec implementation.
22d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)const char* replacementAlias = "iso-2022-kr";
23d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
24d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)TEST(TextCodecReplacement, Aliases)
25d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
26d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // "replacement" is not a valid alias for itself
27d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_FALSE(TextEncoding("replacement").isValid());
28d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_FALSE(TextEncoding("rEpLaCeMeNt").isValid());
29d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
30d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_TRUE(TextEncoding(replacementAlias).isValid());
31d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_STREQ("replacement", TextEncoding(replacementAlias).name());
32d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
33d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
34d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)TEST(TextCodecReplacement, DecodesToFFFD)
35d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
36d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    TextEncoding encoding(replacementAlias);
37d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    OwnPtr<TextCodec> codec(newTextCodec(encoding));
38d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
39d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    bool sawError = false;
40d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    const char testCase[] = "hello world";
41d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    size_t testCaseSize = sizeof(testCase) - 1;
42d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
43d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    const String result = codec->decode(testCase, testCaseSize, DataEOF, false, sawError);
44d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_TRUE(sawError);
45d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    ASSERT_EQ(1u, result.length());
46d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(0xFFFDU, result[0]);
47d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
48d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
49d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)TEST(TextCodecReplacement, EncodesToUTF8)
50d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
51d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    TextEncoding encoding(replacementAlias);
52d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    OwnPtr<TextCodec> codec(newTextCodec(encoding));
53d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
54d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // "Kanji" in Chinese characters.
55d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    const UChar testCase[] = { 0x6F22, 0x5B57 };
56d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    size_t testCaseSize = WTF_ARRAY_LENGTH(testCase);
57d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    CString result = codec->encode(testCase, testCaseSize, QuestionMarksForUnencodables);
58d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
59d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_STREQ("\xE6\xBC\xA2\xE5\xAD\x97", result.data());
60d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
61d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
62d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} // namespace
63d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
64d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} // namespace WTF
65