Imported Upstream version 16.3.2
[platform/upstream/libzypp.git] / tests / zypp / Locale_test.cc
1 #include <cstdlib>
2 #include <iostream>
3 #include <boost/test/auto_unit_test.hpp>
4
5 #include "zypp/Locale.h"
6
7 #define BOOST_TEST_MODULE Locale
8
9 using std::cout;
10 using std::endl;
11
12 using namespace zypp;
13 using namespace boost::unit_test;
14
15 BOOST_AUTO_TEST_CASE(static_deps)
16 {
17   setenv( "LANG", "C", 1 );
18
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) );
22
23   // solver communication: Both must lead to the same ID
24   BOOST_CHECK_EQUAL( Locale::enCode.id(),  IdString(LanguageCode::enCode.code()).id() );
25 }
26
27 //
28 // NOTE: In checks testing for empty codes (IdString::Null/IdString::Empty)
29 // explicitly use the ID, because both share the same string representation.
30 //
31 // This way you get "failed [1 != 0]" rather than "failed [ != ]"
32 //
33
34 BOOST_AUTO_TEST_CASE(no_codes)
35 {
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() );
42
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() );
47
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() );
51
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() );
57
58   //
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 );
63
64   BOOST_CHECK_EQUAL( LanguageCode::noCode.name(),       nc );
65   BOOST_CHECK_EQUAL( CountryCode::noCode.name(),        nc );
66   BOOST_CHECK_EQUAL( Locale::noCode.name(),             nc );
67
68 }
69
70 BOOST_AUTO_TEST_CASE(language_code)
71 {
72   // language code: ger deu de, N_( "German" )
73   std::string name( "German" );
74   for ( const char * s : { "ger", "deu", "de" } )
75   {
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() );
79
80     BOOST_CHECK_EQUAL( LanguageCode(s).name(), name );
81   }
82   BOOST_CHECK( LanguageCode("de") < LanguageCode("deu") );
83   BOOST_CHECK( LanguageCode("deu") < LanguageCode("ger") );
84
85   BOOST_CHECK_EQUAL( LanguageCode("XX"), IdString("XX") );
86 }
87
88 BOOST_AUTO_TEST_CASE(country_code)
89 {
90   // country code: "DE", N_("Germany)
91   std::string name( "Germany" );
92   for ( const char * s : { "DE" } )
93   {
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() );
97
98     BOOST_CHECK_EQUAL( CountryCode(s).name(), name );
99   }
100
101   BOOST_CHECK( CountryCode("AA") < CountryCode("DE") );
102
103   BOOST_CHECK_EQUAL( CountryCode("XX"), IdString("XX") );
104 }
105
106 BOOST_AUTO_TEST_CASE(locale)
107 {
108   // IdString::Null (rare)
109   {
110     for ( const Locale & l : { Locale( nullptr ), Locale( LanguageCode(nullptr), CountryCode(nullptr) ) } )
111     {
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 );
118     }
119   }
120   // Trailing garbage ([.@].*) is ignored
121   {
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() ) } )
126     {
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 );
133     }
134   }
135   {
136     for ( const Locale & l : { Locale("de_DE"), Locale( "de_DE@UTF-8" )
137                              , Locale( LanguageCode("de"), CountryCode("DE") ) } )
138     {
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 );
145     }
146   }
147   {
148     for ( const Locale & l : { Locale("de"), Locale( "de@UTF-8" )
149                              , Locale( LanguageCode("de") ) } )
150     {
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 );
156     }
157   }
158 }
159
160 BOOST_AUTO_TEST_CASE(fallback)
161 {
162   { // default fallback...
163     Locale l( "de_DE" );
164     BOOST_CHECK_EQUAL( (l = l.fallback()), "de" );
165     BOOST_CHECK_EQUAL( (l = l.fallback()), "en" );
166     BOOST_CHECK_EQUAL( (l = l.fallback()), "" );
167   }
168   { // special rules...
169     Locale l( "pt_BR" );
170     BOOST_CHECK_EQUAL( (l = l.fallback()), "en" );
171     BOOST_CHECK_EQUAL( (l = l.fallback()), "" );
172   }
173 }