OSDN Git Service

c6f0c48e7ba0eab8dcb11beeb8b5416ec9dc5204
[simplecms/utakata.git] / test / utf8_string_test.cpp
1 #include <iostream>
2 #include <sstream>
3 #include <string>
4 #include <functional>
5
6
7 #include "../simpletest.h"
8
9 #include "../utf8.h"
10
11 #include "../utf8_string.h"
12 #include "../TextArrayFormat.h"
13
14 bool utf8_multichar_test(smart_ptr<simpletest::CSimpleTestAsserter> asserter)
15 {
16
17     std::string tmp("あいuえお");
18     // マルチバイト文字列を正しく読みだせるかどうかのチェックを
19     // 含めたテスト
20     smart_ptr<std::istream> ss(new std::stringstream(tmp));
21
22     utakata::utf8::CUTF8InputStream stream(ss);
23
24     // 単独のreadを試す。
25     utakata::utf8_string::CUTF8Char ch(stream.read());
26     asserter->check(ch.toUTF16Code(), utakata::utf8::generateUTF8Code("あ"));
27     // peekが問題なく働いていることのテスト
28     utakata::utf8_string::CUTF8Char ch2(stream.peek());
29     asserter->check(ch2.toUTF16Code(), utakata::utf8::generateUTF8Code("い"));
30     utakata::utf8_string::CUTF8Char ch3(stream.read());
31     asserter->check(ch3.toUTF16Code(), utakata::utf8::generateUTF8Code("い"));
32
33     // asciiだとしても問題無く読みだせるはず。
34     utakata::utf8_string::CUTF8Char ch4(stream.peek());
35     asserter->check(ch4.toUTF16Code(), 'u');
36
37     // 同一コードなので比較して同じになるはず。
38     asserter->check(ch == ch2, false, "chとch2が異なる");
39     asserter->check(ch < ch2, true , "chよりch2が大きいはず");
40
41     // 文字として直接返せる。ただし比較はstd::stringでしか行えない。
42     asserter->check(ch2.toStr(), "い");
43
44     return asserter->isOk();
45 }
46
47 bool utf8_string_test(smart_ptr<simpletest::CSimpleTestAsserter> asserter)
48 {
49     // マルチバイトとascii文字の混在文字も正しく扱うことのできる
50     // CUTF8Stringのテスト
51     
52     std::string tmp("あいうえsssお");
53
54     smart_ptr<std::istream> ss(new std::stringstream(tmp));
55     utakata::utf8::CUTF8InputStream stream(ss);
56
57     utakata::utf8_string::CUTF8String str(stream.read(5));
58     asserter->check(str.begin()->toStr(), "あ");
59     asserter->check(str.size(), 5);
60
61     // 自分自身との加算でも問題ないことを確認する。
62     str += str;
63     asserter->check(str[5].toStr(), "あ");
64
65     // 本当に基本的なもの以外は、同一の名前空間内に関数が用意されている。
66     // utf8_stringから返されるのは、UTF8のバイト列を設定した文字列であると
67     // する。
68     asserter->check(utakata::utf8_string::substring(str,0,2), "あい");
69     asserter->check(utakata::utf8_string::substring(str,1,2), "いう");
70     asserter->check(utakata::utf8_string::substring(str, 2), "うえsあいうえs");
71
72     // 文字列とするのは自身の関数だけで可能。
73     asserter->check(str.toStr(), "あいうえsあいうえs");
74
75     return asserter->isOk();
76 }
77
78 bool utf8_string_util_test(smart_ptr<simpletest::CSimpleTestAsserter> asserter)
79 {
80     // CUTF8Stringと共に利用するためのユーティリティ関数の操作を
81     // 行う。
82     
83     std::string tmp("あいうえsssお");
84
85     smart_ptr<std::istream> ss(new std::stringstream(tmp));
86     utakata::utf8::CUTF8InputStream stream(ss);
87
88     utakata::utf8_string::CUTF8String str(stream.read(5));
89     utakata::utf8_string::CUTF8String str2(stream.read(3));
90     utakata::utf8_string::CUTF8String str3 = str;
91
92     // 挿入してみる。
93     str.insert(str.begin(), str2.begin(), str2.end());
94     asserter->check(str.toStr(), "ssおあいうえs");
95
96     str3.insert(str3.begin() + 1, str2.begin(), str2.begin() + 1);
97     asserter->check(str3.toStr(), "あsいうえs");
98
99     str3.insert(str3.end(), str2.begin(), str2.end());
100     asserter->check(str3.toStr(), "あsいうえsssお");
101
102     return asserter->isOk();
103 }
104
105
106 int main(int argc, char *argv[])
107 {
108     simpletest::CSimpleTestSuite suite("UTF-8 文字列テスト");
109     suite.addTester(sfcr::screate(utf8_multichar_test, suite.getAsserter()));
110     suite.addTester(sfcr::screate(utf8_string_test, suite.getAsserter()));
111     suite.addTester(sfcr::screate(utf8_string_util_test, suite.getAsserter()));
112     suite.run();
113     return 0;
114 }