2
0
mirror of https://github.com/boostorg/locale.git synced 2026-01-19 04:22:08 +00:00

Refactor collation test and add missing case

Test of identical level with equal values was missing.
This commit is contained in:
Alexander Grund
2023-06-25 19:38:00 +02:00
committed by Alexander Grund
parent aac343b6e0
commit 15dcfb797d
4 changed files with 72 additions and 47 deletions

View File

@@ -12,12 +12,15 @@
#include <iostream>
template<typename Char>
void test_comp(std::locale l, std::basic_string<Char> left, std::basic_string<Char> right, int ilevel, int expected)
void test_comp(const std::locale& l,
const std::basic_string<Char>& left,
const std::basic_string<Char>& right,
const boost::locale::collate_level level,
const int expected)
{
typedef std::basic_string<Char> string_type;
boost::locale::collate_level level = static_cast<boost::locale::collate_level>(ilevel);
TEST_EQ(boost::locale::comparator<Char>(l, level)(left, right), expected < 0);
if(ilevel == 4) {
if(level == boost::locale::collate_level::identical) {
const std::collate<Char>& 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());
@@ -57,11 +60,15 @@ void test_comp(std::locale l, std::basic_string<Char> left, std::basic_string<Ch
#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)
void compare(const std::string left,
const std::string right,
const boost::locale::collate_level level,
const int expected)
{
using boost::locale::collate_level;
boost::locale::generator gen;
std::locale l = gen("en_US.UTF-8");
if(level == 4)
if(level == collate_level::identical)
TEST_EQ(l(left, right), (expected < 0));
TEST_COMP(char, left, right);
TEST_COMP(wchar_t, to<wchar_t>(left), to<wchar_t>(right));
@@ -72,31 +79,33 @@ void compare(std::string left, std::string right, int level, int expected)
TEST_COMP(char32_t, to<char32_t>(left), to<char32_t>(right));
#endif
l = gen("en_US.ISO8859-1");
if(level == 4)
if(level == collate_level::identical)
TEST_EQ(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;
constexpr int le = -1, gt = 1, eq = 0;
using boost::locale::collate_level;
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 , ä
compare("a", "A", collate_level::primary, eq);
compare("a", "A", collate_level::secondary, eq);
compare("A", "a", collate_level::tertiary, gt);
compare("a", "A", collate_level::tertiary, le);
compare("a", "A", collate_level::quaternary, le);
compare("A", "a", collate_level::quaternary, gt);
compare("a", "A", collate_level::identical, le);
compare("A", "a", collate_level::identical, gt);
compare("a", "ä", collate_level::primary, eq);
compare("a", "ä", collate_level::secondary, le);
compare("ä", "a", collate_level::secondary, gt);
compare("a", "ä", collate_level::quaternary, le);
compare("ä", "a", collate_level::quaternary, gt);
compare("a", "ä", collate_level::identical, le);
compare("ä", "a", collate_level::identical, gt);
compare("a", "a", collate_level::identical, eq);
compare("ä", "ä", collate_level::identical, eq);
}
BOOST_LOCALE_DISABLE_UNREACHABLE_CODE_WARNING

View File

@@ -56,12 +56,13 @@ void test_char()
std::cout << "- Testing at least C" << std::endl;
std::locale l = gen("C.UTF-8");
test_one<CharType>(l, "a", "b", -1);
test_one<CharType>(l, "b", "a", 1);
test_one<CharType>(l, "a", "a", 0);
#if !defined(__APPLE__) && !defined(__FreeBSD__)
for(const std::string locale_name : {"en_US.UTF-8", "en_US.ISO8859-1"}) {
if(!has_posix_locale(locale_name))
std::cout << "- " << locale_name << " not supported, skipping" << std::endl;
std::cout << "- " << locale_name << " not supported, skipping" << std::endl; // LCOV_EXCL_LINE
else {
std::cout << "- Testing " << locale_name << std::endl;
l = gen(locale_name);

View File

@@ -57,6 +57,7 @@ void test_char()
std::locale l = gen("en_US.UTF-8");
test_one<CharType>(l, "a", "b", -1);
test_one<CharType>(l, "b", "a", 1);
test_one<CharType>(l, "a", "a", 0);
#if defined(_LIBCPP_VERSION) && (defined(__APPLE__) || defined(__FreeBSD__))
@@ -76,7 +77,7 @@ void test_char()
test_one<CharType>(l, "ängel", "år", info.language() == "sv" ? 1 : -1);
}
} else
std::cout << "- " << name << " not supported, skipping" << std::endl;
std::cout << "- " << name << " not supported, skipping" << std::endl; // LCOV_EXCL_LINE
}
#endif
}

View File

@@ -12,12 +12,15 @@
#include <iomanip>
template<typename Char>
void test_comp(std::locale l, std::basic_string<Char> left, std::basic_string<Char> right, int ilevel, int expected)
void test_comp(const std::locale& l,
const std::basic_string<Char>& left,
const std::basic_string<Char>& right,
const boost::locale::collate_level level,
const int expected)
{
typedef std::basic_string<Char> string_type;
boost::locale::collate_level level = static_cast<boost::locale::collate_level>(ilevel);
TEST_EQ(boost::locale::comparator<Char>(l, level)(left, right), (expected < 0));
if(ilevel == 4) {
if(level == boost::locale::collate_level::identical) {
const std::collate<Char>& 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());
@@ -57,36 +60,47 @@ void test_comp(std::locale l, std::basic_string<Char> left, std::basic_string<Ch
#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)
void compare(const std::string left,
const std::string right,
const boost::locale::collate_level level,
const int expected)
{
boost::locale::generator gen;
std::locale l = gen("en_US.UTF-8");
if(level == 4)
if(level == boost::locale::collate_level::identical)
TEST_EQ(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
}
void test_collate()
{
int primary = 0, secondary = 1, tertiary = 2, quaternary = 3, identical = 4;
int le = -1, gt = 1, eq = 0;
constexpr int le = -1, gt = 1, eq = 0;
using boost::locale::collate_level;
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 , ä
compare("a", "A", collate_level::primary, eq);
compare("a", "A", collate_level::secondary, eq);
compare("A", "a", collate_level::tertiary, gt);
compare("a", "A", collate_level::tertiary, le);
compare("a", "A", collate_level::quaternary, le);
compare("A", "a", collate_level::quaternary, gt);
compare("a", "A", collate_level::identical, le);
compare("A", "a", collate_level::identical, gt);
compare("a", "ä", collate_level::primary, eq);
compare("a", "ä", collate_level::secondary, le);
compare("ä", "a", collate_level::secondary, gt);
compare("a", "ä", collate_level::quaternary, le);
compare("ä", "a", collate_level::quaternary, gt);
compare("a", "ä", collate_level::identical, le);
compare("ä", "a", collate_level::identical, gt);
compare("a", "a", collate_level::identical, eq);
compare("ä", "ä", collate_level::identical, eq);
}
BOOST_LOCALE_DISABLE_UNREACHABLE_CODE_WARNING