--- /dev/null
+#include "unicode_config.h"
+#include "unicode.h"
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <iomanip>
+#include <algorithm>
+#include <functional>
+#include <cstdlib>
+#include <list>
+#include <vector>
+
+class collect_wordbreakflags : public mail::wordbreak_callback_base {
+
+public:
+
+ std::vector<bool> flags;
+
+ template<typename iter_type> void operator()(iter_type b, iter_type e)
+ {
+ mail::wordbreak_callback_base::operator()(b, e);
+ }
+
+ using mail::wordbreak_callback_base::operator<<;
+
+private:
+ int operator()(bool flag)
+ {
+ flags.push_back(flag);
+ return 0;
+ }
+};
+
+static void testsuite()
+{
+ std::string buf;
+ int linenum=0;
+
+ std::ifstream fp("WordBreakTest.txt");
+
+ if (!fp.is_open())
+ exit(1);
+
+ while (1)
+ {
+ buf.clear();
+
+ if (std::getline(fp, buf).eof() && buf.empty())
+ break;
+
+ ++linenum;
+
+ buf.erase(std::find(buf.begin(), buf.end(), '#'), buf.end());
+
+ if (buf.empty())
+ continue;
+
+ std::list<std::string> words;
+
+ for (std::string::iterator b=buf.begin(), e=buf.end(); b != e;)
+ {
+ if (isspace(*b))
+ {
+ ++b;
+ continue;
+ }
+
+ std::string::iterator p=b;
+
+ while (b != e)
+ {
+ if (isspace(*b))
+ break;
+ ++b;
+ }
+
+ words.push_back(std::string(p, b));
+ }
+
+ std::vector<unicode_char> ubuf;
+ std::vector<bool> status;
+
+ while (1)
+ {
+ if (!words.empty() && words.front().size() > 1)
+ {
+ bool flag=false;
+ std::string s=words.front();
+
+ words.pop_front();
+
+ if ((unsigned char)s[0] ==
+ (unsigned char)0xc3 &&
+ (unsigned char)s[1] == (unsigned char)0xb7)
+ flag=true;
+
+ if (words.empty())
+ break;
+
+ status.push_back(flag);
+
+ std::istringstream i(words.front());
+
+ unicode_char uc;
+
+ i >> std::hex >> uc;
+
+ words.pop_front();
+
+ if (!i.fail())
+ {
+ ubuf.push_back(uc);
+ continue;
+ }
+ }
+
+ std::cerr << "Parse error, line " << linenum
+ << ": " << buf << std::endl;
+ exit(1);
+ }
+
+ if (linenum == 24)
+ {
+ linenum=24;
+ }
+ collect_wordbreakflags flags;
+
+ flags(ubuf.begin(), ubuf.end());
+ flags.finish();
+
+ if (status != flags.flags)
+ {
+ std::cerr << "Regression, line " << linenum
+ << ": " << buf << std::endl;
+ exit(1);
+ }
+ }
+}
+
+int main(int argc, char **argv)
+{
+ testsuite();
+ return 0;
+}