blob: 0e1a3c41c255f869633e0b56332002a043ac7b92 [file] [log] [blame]
//
// 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_HAS_CHAR16_T
TEST_COMP(char16_t,to<char16_t>(left),to<char16_t>(right));
#endif
#ifdef BOOST_HAS_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