#include "Conversion.hpp"
#include "DictGroupTestBase.hpp"
namespace opencc {
class ConversionTest : public DictGroupTestBase {
protected:
ConversionTest()
: input(utf8("太后的头发干燥")), expected(utf8("太后的頭髮乾燥")) {}
virtual void SetUp() {
dict = CreateDictGroupForConversion();
conversion = ConversionPtr(new Conversion(dict));
}
DictPtr dict;
ConversionPtr conversion;
const std::string input;
const std::string expected;
};
TEST_F(ConversionTest, ConvertString) {
const std::string converted = conversion->Convert(input);
EXPECT_EQ(expected, converted);
}
TEST_F(ConversionTest, ConvertCString) {
const std::string converted = conversion->Convert(input.c_str());
EXPECT_EQ(expected, converted);
}
TEST_F(ConversionTest, PreserveDictGroupPriority) {
LexiconPtr firstLexicon(new Lexicon);
firstLexicon->Add(DictEntryFactory::New("a", "X"));
firstLexicon->Sort();
LexiconPtr secondLexicon(new Lexicon);
secondLexicon->Add(DictEntryFactory::New("ab", "Y"));
secondLexicon->Sort();
DictPtr firstDict(new TextDict(firstLexicon));
DictPtr secondDict(new TextDict(secondLexicon));
DictPtr dictGroup(new DictGroup(std::list<DictPtr>{firstDict, secondDict}));
Conversion groupConversion(dictGroup);
EXPECT_EQ("Xbc", groupConversion.Convert("abc"));
}
TEST_F(ConversionTest, PreserveNestedDictGroupPriority) {
LexiconPtr firstLexicon(new Lexicon);
firstLexicon->Add(DictEntryFactory::New("a", "X"));
firstLexicon->Sort();
LexiconPtr secondLexicon(new Lexicon);
secondLexicon->Add(DictEntryFactory::New("ab", "Y"));
secondLexicon->Sort();
LexiconPtr thirdLexicon(new Lexicon);
thirdLexicon->Add(DictEntryFactory::New("abc", "Z"));
thirdLexicon->Sort();
DictPtr firstDict(new TextDict(firstLexicon));
DictPtr secondDict(new TextDict(secondLexicon));
DictPtr thirdDict(new TextDict(thirdLexicon));
DictPtr nestedGroup(new DictGroup(std::list<DictPtr>{firstDict, secondDict}));
DictPtr dictGroup(new DictGroup(std::list<DictPtr>{nestedGroup, thirdDict}));
Conversion groupConversion(dictGroup);
EXPECT_EQ("Xbc", groupConversion.Convert("abc"));
}
TEST_F(ConversionTest, PreserveIdeographicDescriptionSequenceComponents) {
LexiconPtr lexicon(new Lexicon);
lexicon->Add(DictEntryFactory::New(utf8("钅"), utf8("釒")));
lexicon->Add(DictEntryFactory::New(utf8("只"), utf8("隻")));
lexicon->Sort();
DictPtr componentDict(new TextDict(lexicon));
Conversion componentConversion(componentDict);
EXPECT_EQ(utf8("⿰钅只隻"), componentConversion.Convert(utf8("⿰钅只只")));
}
TEST_F(ConversionTest, PreserveComplexIdeographicDescriptionSequenceComponents) {
LexiconPtr lexicon(new Lexicon);
lexicon->Add(DictEntryFactory::New(utf8("長"), utf8("长")));
lexicon->Add(DictEntryFactory::New(utf8("馬"), utf8("马")));
lexicon->Add(DictEntryFactory::New(utf8("心"), utf8("芯")));
lexicon->Sort();
DictPtr componentDict(new TextDict(lexicon));
Conversion componentConversion(componentDict);
EXPECT_EQ(
utf8("⿺⻍⿳穴⿲月⿱⿲幺言幺⿲長馬長刂心长"),
componentConversion.Convert(
utf8("⿺⻍⿳穴⿲月⿱⿲幺言幺⿲長馬長刂心長")));
}
TEST_F(ConversionTest, DoesNotPreserveIsolatedIdeographicDescriptionCharacters) {
LexiconPtr lexicon(new Lexicon);
lexicon->Add(DictEntryFactory::New(utf8("表"), utf8("錶")));
lexicon->Add(DictEntryFactory::New(utf8("证"), utf8("證")));
lexicon->Sort();
DictPtr dict(new TextDict(lexicon));
Conversion idcDescriptionConversion(dict);
EXPECT_EQ(
utf8("錶意文字描述字元包括這些字元:⿰⿱⿲⿳⿴⿵⿶⿷⿸⿹⿺⿻"),
idcDescriptionConversion.Convert(
utf8("表意文字描述字元包括這些字元:⿰⿱⿲⿳⿴⿵⿶⿷⿸⿹⿺⿻")));
EXPECT_EQ(utf8("证證"), idcDescriptionConversion.Convert(utf8("证证")));
}
TEST_F(ConversionTest, TruncatedUtf8Sequence) {
std::string malformed;
malformed += utf8("干"); malformed += '\xE5'; malformed += '\xB9';
EXPECT_NO_THROW({
const std::string converted = conversion->Convert(malformed);
std::string expected;
expected += utf8("幹"); expected += '\xE5'; expected += '\xB9';
EXPECT_EQ(expected, converted);
});
}
}