1 #include "unicode_config.h"
14 static void testsuite()
19 std::ifstream fp("LineBreakTest.txt");
28 if (std::getline(fp, buf).eof() && buf.empty())
33 buf.erase(std::find(buf.begin(), buf.end(), '#'), buf.end());
38 std::list<std::string> words;
40 for (std::string::iterator b=buf.begin(), e=buf.end(); b != e;)
48 std::string::iterator p=b;
57 words.push_back(std::string(p, b));
60 std::vector<unicode_char> ubuf;
61 std::vector<int> status;
65 if (!words.empty() && words.front().size() > 1)
67 int expected=UNICODE_LB_MANDATORY;
69 std::string s=words.front();
73 if ((unsigned char)s[0] ==
75 switch ( (unsigned char)s[1] ) {
76 case (unsigned char)0x97:
77 expected=UNICODE_LB_NONE;
79 case (unsigned char)0xb7:
80 expected=UNICODE_LB_ALLOWED;
87 status.push_back(expected);
89 std::istringstream i(words.front());
104 std::cerr << "Parse error, line " << linenum
105 << ": " << buf << std::endl;
109 std::vector<int> computed_status;
111 typedef std::vector<unicode_char>::const_iterator ubuf_iter;
112 typedef mail::linebreak_iter<ubuf_iter> lb_iter;
114 std::copy(lb_iter(ubuf.begin(), ubuf.end()), lb_iter(),
115 std::back_insert_iterator<std::vector<int> >
118 std::replace(computed_status.begin(),
119 computed_status.end(),
120 UNICODE_LB_MANDATORY,
123 if (computed_status != status)
125 std::cerr << "Regression, line " << linenum
126 << ": " << buf << std::endl;
132 static void testlinebreakc()
134 static unicode_char str[]={'$', '(', 0x0300, 0x0301, 0x0302, 0x0303,
135 0x0304, 0x0305, 0x0306, 0x0307, '1', '.',
138 typedef std::vector<std::pair<int, unicode_char> > linebreakvec_t;
140 linebreakvec_t linebreakvec;
142 std::copy(mail::linebreakc_iter<unicode_char *>(str,
145 mail::linebreakc_iter<unicode_char *>(),
146 std::back_insert_iterator<linebreakvec_t>
149 if (linebreakvec.size() == sizeof(str)/sizeof(str[0]))
153 for (i=0; i<sizeof(str)/sizeof(str[0]); ++i)
155 if (str[i] != linebreakvec[i].second ||
156 linebreakvec[i].first !=
157 (i < sizeof(str)/sizeof(str[0])-1
158 ? UNICODE_LB_NONE:UNICODE_LB_ALLOWED))
162 if (i == sizeof(str)/sizeof(str[0]))
165 std::cerr << "Line break test 1 failed" << std::endl;
168 int main(int argc, char **argv)
173 std::string convteststr="0000000000000000000000000000000\xe3\x82\xa2";
175 std::vector<unicode_char> uc;
178 ::convert(convteststr, "utf-8", uc);
180 std::vector<unicode_char>::iterator e(uc.end()),
181 b(std::find_if(uc.begin(), e,
182 std::not1(std::bind2nd(std::equal_to<unicode_char>
184 unicode_char('0')))));
186 if (b == e || *b++ != 0x30A2 || b != e)
188 std::cerr << "mail::iconvert::tou::convert failed"
193 if (mail::iconvert::fromu::convert(uc, "utf-8") != convteststr)
195 std::cerr << "mail::iconvert::fromu::convert failed"