| the Compartmented Robust Posix C++ Unit Test system |
|
|---|
Compare the sort order of strings in a locale.
Used in: An ASSERT_TRUE(expr),
VERIFY_TRUE(expr),
ASSERT_FALSE(expr) or
VERIFY_FALSE(expr).
The basic use syntax is:
ASSERT_TRUE(crpcut::collate(reference_string, locale)
op tested_string)
locale defaults to the current locale and
can be left out.
reference_string can be either a C-string or
std::string
tested_string can be either a C-string or
std::string
op is one of:
operator
reference_string is sorted
before tested_string in the
locale.
reference_string is sorted
before, or equitable with, tested_string in
the locale.
reference_string is sorted
behind tested_string in
the locale.
reference_string is sorted
behind, or equitable with, tested_string in
the locale.
reference_string is
equitable with tested_string in
the sort order of the locale.
reference_string is
not equitable with tested_string in
the sort order of the locale.
Example: The test program
#include <crpcut.hpp>
char str1_utf8[] = { '\xc3', '\xb6', 'z', 0 };
char str2_utf8[] = { 'z', '\xc3', '\xb6', 0};
TEST(in_german_locale)
{
ASSERT_TRUE(crpcut::collate(str1_utf8, std::locale("de_DE.utf8")) < str2_utf8);
ASSERT_TRUE(crpcut::collate(str1_utf8, std::locale("de_DE.utf8")) > str2_utf8);
}
TEST(in_swedish_locale)
{
ASSERT_TRUE(crpcut::collate(str1_utf8, std::locale("sv_SE.utf8")) < str2_utf8);
ASSERT_TRUE(crpcut::collate(str1_utf8, std::locale("sv_SE.utf8")) > str2_utf8);
}
int main(int argc, char *argv[])
{
return crpcut::run(argc, argv);
}
fails the opposite tests in the different locales:
FAILED!: in_german_locale
phase="running" --------------------------------------------------------------
samples/collate.cpp:37
ASSERT_TRUE(crpcut::collate(str1_utf8, std::locale("de_DE.utf8")) > str2_utf8)
is evaluated as:
Failed in locale "de_DE.utf8"
with left hand value = "öz"
and right hand value = "zö"
-------------------------------------------------------------------------------
===============================================================================
FAILED!: in_swedish_locale
phase="running" --------------------------------------------------------------
samples/collate.cpp:42
ASSERT_TRUE(crpcut::collate(str1_utf8, std::locale("sv_SE.utf8")) < str2_utf8)
is evaluated as:
Failed in locale "sv_SE.utf8"
with left hand value = "öz"
and right hand value = "zö"
-------------------------------------------------------------------------------
===============================================================================
2 test cases selected
Sum Critical Non-critical
FAILED : 2 2 0
crpcut::collate can also be used as
a function template,
crpcut::collate<translation>(),
with:
translation
Translate reference_string and
tested_string to lower case, in the
locale, before collation order comparison.
Translate reference_string and
tested_string to upper case, in the
locale, before collation order comparison.
Do not translate
reference_string nor
tested_string before collation order
comparison. This is the behaviour of the non-templated
version of crpcut::collate()
Example: The test program
#include <crpcut.hpp>
TEST(case_insensitive_pass)
{
ASSERT_TRUE(crpcut::collate<crpcut::lowercase>("Name") == "name");
}
TEST(case_sensitive_fail)
{
ASSERT_TRUE(crpcut::collate<crpcut::verbatim>("Name") == "name");
}
int main(int argc, char *argv[])
{
return crpcut::run(argc, argv);
}
fails one test:
FAILED!: case_sensitive_fail
phase="running" --------------------------------------------------------------
samples/collate_case.cpp:37
ASSERT_TRUE(crpcut::collate<crpcut::verbatim>("Name") == "name")
is evaluated as:
Failed in locale "C"
with left hand value = "Name"
and right hand value = "name"
-------------------------------------------------------------------------------
===============================================================================
2 test cases selected
Sum Critical Non-critical
PASSED : 1 1 0
FAILED : 1 1 0