3 #include <boost/test/auto_unit_test.hpp>
5 #include "zypp/Locale.h"
7 #define BOOST_TEST_MODULE Locale
13 using namespace boost::unit_test;
15 BOOST_AUTO_TEST_CASE(static_deps)
17 setenv( "LANG", "C", 1 );
19 // static vars initialization sequence: Locale depends on LanguageCode
20 BOOST_CHECK_EQUAL( LanguageCode::enCode.code(), "en" );
21 BOOST_CHECK_EQUAL( IdString(Locale::enCode), IdString(LanguageCode::enCode) );
23 // solver communication: Both must lead to the same ID
24 BOOST_CHECK_EQUAL( Locale::enCode.id(), IdString(LanguageCode::enCode.code()).id() );
28 // NOTE: In checks testing for empty codes (IdString::Null/IdString::Empty)
29 // explicitly use the ID, because both share the same string representation.
31 // This way you get "failed [1 != 0]" rather than "failed [ != ]"
34 BOOST_AUTO_TEST_CASE(no_codes)
36 // IdString::Null is probably a rare case
37 BOOST_CHECK_EQUAL( LanguageCode(nullptr).id(), IdString::Null.id() );
38 BOOST_CHECK_EQUAL( CountryCode(nullptr).id(), IdString::Null.id() );
39 BOOST_CHECK_EQUAL( Locale(nullptr).id(), IdString::Null.id() );
40 BOOST_CHECK_EQUAL( Locale(nullptr).language().id(), IdString::Null.id() );
41 BOOST_CHECK_EQUAL( Locale(nullptr).country().id(), IdString::Null.id() );
43 // IdString::Null is the ususal noCode
44 BOOST_CHECK_EQUAL( LanguageCode::noCode.id(), LanguageCode().id() );
45 BOOST_CHECK_EQUAL( LanguageCode::noCode.id(), LanguageCode("").id() );
46 BOOST_CHECK_EQUAL( LanguageCode::noCode.id(), IdString::Empty.id() );
48 BOOST_CHECK_EQUAL( CountryCode::noCode.id(), CountryCode().id() );
49 BOOST_CHECK_EQUAL( CountryCode::noCode.id(), CountryCode("").id() );
50 BOOST_CHECK_EQUAL( CountryCode::noCode.id(), IdString::Empty.id() );
52 BOOST_CHECK_EQUAL( Locale::noCode.id(), Locale().id() );
53 BOOST_CHECK_EQUAL( Locale::noCode.id(), Locale("").id() );
54 BOOST_CHECK_EQUAL( Locale::noCode.id(), IdString::Empty.id() );
55 BOOST_CHECK_EQUAL( Locale::noCode.language().id(), LanguageCode::noCode.id() );
56 BOOST_CHECK_EQUAL( Locale::noCode.country().id(), CountryCode::noCode.id() );
59 const char * nc = "No Code";
60 BOOST_CHECK_EQUAL( LanguageCode(nullptr).name(), nc );
61 BOOST_CHECK_EQUAL( CountryCode(nullptr).name(), nc );
62 BOOST_CHECK_EQUAL( Locale(nullptr).name(), nc );
64 BOOST_CHECK_EQUAL( LanguageCode::noCode.name(), nc );
65 BOOST_CHECK_EQUAL( CountryCode::noCode.name(), nc );
66 BOOST_CHECK_EQUAL( Locale::noCode.name(), nc );
70 BOOST_AUTO_TEST_CASE(language_code)
72 // language code: ger deu de, N_( "German" )
73 std::string name( "German" );
74 for ( const char * s : { "ger", "deu", "de" } )
76 BOOST_CHECK_EQUAL( LanguageCode(s).code(), s );
77 BOOST_CHECK_EQUAL( LanguageCode(s), IdString(s) );
78 BOOST_CHECK_EQUAL( LanguageCode(s).id(), IdString(s).id() );
80 BOOST_CHECK_EQUAL( LanguageCode(s).name(), name );
82 BOOST_CHECK( LanguageCode("de") < LanguageCode("deu") );
83 BOOST_CHECK( LanguageCode("deu") < LanguageCode("ger") );
85 BOOST_CHECK_EQUAL( LanguageCode("XX"), IdString("XX") );
88 BOOST_AUTO_TEST_CASE(country_code)
90 // country code: "DE", N_("Germany)
91 std::string name( "Germany" );
92 for ( const char * s : { "DE" } )
94 BOOST_CHECK_EQUAL( CountryCode(s).code(), s );
95 BOOST_CHECK_EQUAL( CountryCode(s), IdString(s) );
96 BOOST_CHECK_EQUAL( CountryCode(s).id(), IdString(s).id() );
98 BOOST_CHECK_EQUAL( CountryCode(s).name(), name );
101 BOOST_CHECK( CountryCode("AA") < CountryCode("DE") );
103 BOOST_CHECK_EQUAL( CountryCode("XX"), IdString("XX") );
106 BOOST_AUTO_TEST_CASE(locale)
108 // IdString::Null (rare)
110 for ( const Locale & l : { Locale( nullptr ), Locale( LanguageCode(nullptr), CountryCode(nullptr) ) } )
112 BOOST_CHECK_EQUAL( l.id(), IdString::Null.id() );
113 BOOST_CHECK_EQUAL( l.language().id(), IdString::Null.id() );
114 BOOST_CHECK_EQUAL( l.country().id(), IdString::Null.id() );
115 BOOST_CHECK_EQUAL( bool(l), false );
116 BOOST_CHECK_EQUAL( bool(l.language()), false );
117 BOOST_CHECK_EQUAL( bool(l.country()), false );
120 // Trailing garbage ([.@].*) is ignored
122 for ( const Locale & l : { Locale(), Locale( "" ), Locale( "@UTF-8" ), Locale( ".UTF-8" )
123 , Locale( LanguageCode(), CountryCode(nullptr) )
124 , Locale( LanguageCode(nullptr), CountryCode() )
125 , Locale( LanguageCode(), CountryCode() ) } )
127 BOOST_CHECK_EQUAL( l.id(), IdString::Empty.id() );
128 BOOST_CHECK_EQUAL( l.language().id(), IdString::Empty.id() );
129 BOOST_CHECK_EQUAL( l.country().id(), IdString::Empty.id() );
130 BOOST_CHECK_EQUAL( bool(l), false );
131 BOOST_CHECK_EQUAL( bool(l.language()), false );
132 BOOST_CHECK_EQUAL( bool(l.country()), false );
136 for ( const Locale & l : { Locale("de_DE"), Locale( "de_DE@UTF-8" )
137 , Locale( LanguageCode("de"), CountryCode("DE") ) } )
139 BOOST_CHECK_EQUAL( l, IdString("de_DE") );
140 BOOST_CHECK_EQUAL( l.language(), IdString("de") );
141 BOOST_CHECK_EQUAL( l.country(), IdString("DE") );
142 BOOST_CHECK_EQUAL( bool(l), true );
143 BOOST_CHECK_EQUAL( bool(l.language()), true );
144 BOOST_CHECK_EQUAL( bool(l.country()), true );
148 for ( const Locale & l : { Locale("de"), Locale( "de@UTF-8" )
149 , Locale( LanguageCode("de") ) } )
151 BOOST_CHECK_EQUAL( l.id(), l.language().id() );
152 BOOST_CHECK_EQUAL( l.country().id(), IdString::Empty.id() );
153 BOOST_CHECK_EQUAL( bool(l), true );
154 BOOST_CHECK_EQUAL( bool(l.language()), true );
155 BOOST_CHECK_EQUAL( bool(l.country()), false );
160 BOOST_AUTO_TEST_CASE(fallback)
162 { // default fallback...
164 BOOST_CHECK_EQUAL( (l = l.fallback()), "de" );
165 BOOST_CHECK_EQUAL( (l = l.fallback()), "en" );
166 BOOST_CHECK_EQUAL( (l = l.fallback()), "" );
168 { // special rules...
170 BOOST_CHECK_EQUAL( (l = l.fallback()), "en" );
171 BOOST_CHECK_EQUAL( (l = l.fallback()), "" );