1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
//
// Copyright (c) 2009-2011 Artyom Beilis (Tonkikh)
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
#ifndef BOOST_LOCALE_WITH_ICU
#include <iostream>
int main()
{
std::cout << "ICU is not build... Skipping" << std::endl;
}
#else
#include <boost/locale/collator.hpp>
#include <boost/locale/generator.hpp>
#include <iomanip>
#include "test_locale.hpp"
template<typename Char>
void test_comp(std::locale l,std::basic_string<Char> left,std::basic_string<Char> right,int ilevel,int expected)
{
typedef std::basic_string<Char> string_type;
boost::locale::collator_base::level_type level = static_cast<boost::locale::collator_base::level_type>(ilevel);
TEST(boost::locale::comparator<Char>(l,level)(left,right) == (expected < 0));
if(ilevel==4) {
std::collate<Char> const &coll=std::use_facet<std::collate<Char> >(l);
string_type lt=coll.transform(left.c_str(),left.c_str()+left.size());
string_type rt=coll.transform(right.c_str(),right.c_str()+right.size());
if(expected < 0)
TEST(lt<rt);
else if(expected == 0) {
TEST(lt==rt);
}
else
TEST(lt > rt);
long lh=coll.hash(left.c_str(),left.c_str()+left.size());
long rh=coll.hash(right.c_str(),right.c_str()+right.size());
if(expected == 0)
TEST(lh==rh);
else
TEST(lh!=rh);
}
boost::locale::collator<Char> const &coll=std::use_facet<boost::locale::collator<Char> >(l);
string_type lt=coll.transform(level,left.c_str(),left.c_str()+left.size());
TEST(lt==coll.transform(level,left));
string_type rt=coll.transform(level,right.c_str(),right.c_str()+right.size());
TEST(rt==coll.transform(level,right));
if(expected < 0)
TEST(lt<rt);
else if(expected == 0)
TEST(lt==rt);
else
TEST(lt > rt);
long lh=coll.hash(level,left.c_str(),left.c_str()+left.size());
TEST(lh==coll.hash(level,left));
long rh=coll.hash(level,right.c_str(),right.c_str()+right.size());
TEST(rh==coll.hash(level,right));
if(expected == 0)
TEST(lh==rh);
else
TEST(lh!=rh);
}
#define TEST_COMP(c,_l,_r) test_comp<c>(l,_l,_r,level,expected)
void compare(std::string left,std::string right,int level,int expected)
{
boost::locale::generator gen;
std::locale l=gen("en_US.UTF-8");
if(level == 4)
TEST(l(left,right) == (expected < 0));
TEST_COMP(char,left,right);
TEST_COMP(wchar_t,to<wchar_t>(left),to<wchar_t>(right));
#ifdef BOOST_LOCALE_ENABLE_CHAR16_T
TEST_COMP(char16_t,to<char16_t>(left),to<char16_t>(right));
#endif
#ifdef BOOST_LOCALE_ENABLE_CHAR32_T
TEST_COMP(char32_t,to<char32_t>(left),to<char32_t>(right));
#endif
l=gen("en_US.ISO8859-1");
if(level == 4)
TEST(l(to<char>(left),to<char>(right)) == (expected < 0));
TEST_COMP(char,to<char>(left),to<char>(right));
}
void test_collate()
{
int
primary = 0,
secondary = 1,
tertiary = 2,
quaternary = 3,
identical = 4;
int le = -1,gt = 1,eq = 0;
compare("a","A",primary,eq);
compare("a","A",secondary,eq);
compare("A","a",tertiary,gt);
compare("a","A",tertiary,le);
compare("a","A",quaternary,le);
compare("A","a",quaternary,gt);
compare("a","A",identical,le);
compare("A","a",identical,gt);
compare("a","ä",primary,eq); // a , ä
compare("a","ä",secondary,le); // a , ä
compare("ä","a",secondary,gt); // a , ä
compare("a","ä",quaternary,le); // a , ä
compare("ä","a",quaternary,gt); // a , ä
compare("a","ä",identical,le); // a , ä
compare("ä","a",identical,gt); // a , ä
}
int main()
{
try {
test_collate();
}
catch(std::exception const &e) {
std::cerr << "Failed " << e.what() << std::endl;
return EXIT_FAILURE;
}
FINALIZE();
}
#endif // NOICU
// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
// boostinspect:noascii
|