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