Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : */
9 :
10 : #include <sal/config.h>
11 :
12 : #include <cppunit/TestFixture.h>
13 : #include <cppunit/TestAssert.h>
14 : #include <cppunit/extensions/HelperMacros.h>
15 : #include <cppunit/plugin/TestPlugIn.h>
16 :
17 : #include <i18npool/languagetag.hxx>
18 :
19 : #include <rtl/ustring.hxx>
20 : #include <rtl/ustrbuf.hxx>
21 : #include <osl/file.hxx>
22 :
23 : #include <com/sun/star/lang/Locale.hpp>
24 :
25 : using namespace com::sun::star;
26 :
27 : // To test the replacement code add '&& 0' and also in
28 : // source/languagetag/languagetag.cxx
29 : #if defined(ENABLE_LIBLANGTAG)
30 : #define USE_LIBLANGTAG 1
31 : #else
32 : #define USE_LIBLANGTAG 0
33 : #endif
34 :
35 : namespace {
36 :
37 : class TestLanguageTag : public CppUnit::TestFixture
38 : {
39 : public:
40 1 : TestLanguageTag() {}
41 2 : virtual ~TestLanguageTag() {}
42 :
43 : void testAllTags();
44 :
45 2 : CPPUNIT_TEST_SUITE(TestLanguageTag);
46 1 : CPPUNIT_TEST(testAllTags);
47 2 : CPPUNIT_TEST_SUITE_END();
48 : };
49 :
50 1 : void TestLanguageTag::testAllTags()
51 : {
52 : {
53 1 : OUString s_de_Latn_DE( "de-Latn-DE" );
54 1 : LanguageTag de_DE( s_de_Latn_DE, true );
55 1 : OUString aBcp47 = de_DE.getBcp47();
56 1 : lang::Locale aLocale = de_DE.getLocale();
57 1 : LanguageType nLanguageType = de_DE.getLanguageType();
58 : #if USE_LIBLANGTAG
59 1 : CPPUNIT_ASSERT_MESSAGE("Default script should be stripped after canonicalize.", aBcp47 == "de-DE" );
60 1 : CPPUNIT_ASSERT( aLocale.Language == "de" );
61 1 : CPPUNIT_ASSERT( aLocale.Country == "DE" );
62 1 : CPPUNIT_ASSERT( aLocale.Variant == "" );
63 1 : CPPUNIT_ASSERT( nLanguageType == LANGUAGE_GERMAN );
64 1 : CPPUNIT_ASSERT( de_DE.getLanguage() == "de" );
65 1 : CPPUNIT_ASSERT( de_DE.getCountry() == "DE" );
66 1 : CPPUNIT_ASSERT( de_DE.getScript() == "" );
67 1 : CPPUNIT_ASSERT( de_DE.getLanguageAndScript() == "de" );
68 : #else
69 : // The simple replacement code doesn't do any fancy stuff.
70 : CPPUNIT_ASSERT_MESSAGE("Default script was stripped after canonicalize!?!", aBcp47 == s_de_Latn_DE );
71 : CPPUNIT_ASSERT( aLocale.Language == "qlt" );
72 : CPPUNIT_ASSERT( aLocale.Country == "DE" );
73 : CPPUNIT_ASSERT( aLocale.Variant == "de-Latn-DE" );
74 : CPPUNIT_ASSERT( nLanguageType == LANGUAGE_SYSTEM ); // XXX not resolved!
75 : CPPUNIT_ASSERT( de_DE.getLanguage() == "de" );
76 : CPPUNIT_ASSERT( de_DE.getCountry() == "DE" );
77 : CPPUNIT_ASSERT( de_DE.getScript() == "Latn" );
78 : CPPUNIT_ASSERT( de_DE.getLanguageAndScript() == "de-Latn" );
79 : #endif
80 : }
81 :
82 : {
83 1 : OUString s_klingon( "i-klingon" );
84 1 : LanguageTag klingon( s_klingon, true );
85 1 : lang::Locale aLocale = klingon.getLocale();
86 : #if USE_LIBLANGTAG
87 1 : CPPUNIT_ASSERT( klingon.getBcp47() == "tlh" );
88 1 : CPPUNIT_ASSERT( aLocale.Language == "tlh" );
89 1 : CPPUNIT_ASSERT( aLocale.Country == "" );
90 1 : CPPUNIT_ASSERT( aLocale.Variant == "" );
91 1 : CPPUNIT_ASSERT( klingon.getLanguageType() == LANGUAGE_SYSTEM );
92 1 : CPPUNIT_ASSERT( klingon.isValidBcp47() == true );
93 1 : CPPUNIT_ASSERT( klingon.isIsoLocale() == true );
94 1 : CPPUNIT_ASSERT( klingon.isIsoODF() == true );
95 : #else
96 : CPPUNIT_ASSERT( klingon.getBcp47() == s_klingon );
97 : CPPUNIT_ASSERT( aLocale.Language == "qlt" );
98 : CPPUNIT_ASSERT( aLocale.Country == "" );
99 : CPPUNIT_ASSERT( aLocale.Variant == s_klingon );
100 : CPPUNIT_ASSERT( klingon.getLanguageType() == LANGUAGE_SYSTEM );
101 : CPPUNIT_ASSERT( klingon.isValidBcp47() == true );
102 : CPPUNIT_ASSERT( klingon.isIsoLocale() == false );
103 : CPPUNIT_ASSERT( klingon.isIsoODF() == false );
104 : #endif
105 : }
106 :
107 : {
108 1 : OUString s_sr_RS( "sr-RS" );
109 1 : LanguageTag sr_RS( s_sr_RS, true );
110 1 : lang::Locale aLocale = sr_RS.getLocale();
111 1 : CPPUNIT_ASSERT( sr_RS.getBcp47() == s_sr_RS );
112 1 : CPPUNIT_ASSERT( aLocale.Language == "sr" );
113 1 : CPPUNIT_ASSERT( aLocale.Country == "RS" );
114 1 : CPPUNIT_ASSERT( aLocale.Variant == "" );
115 1 : CPPUNIT_ASSERT( sr_RS.getLanguageType() == LANGUAGE_USER_SERBIAN_CYRILLIC_SERBIA );
116 1 : CPPUNIT_ASSERT( sr_RS.isValidBcp47() == true );
117 1 : CPPUNIT_ASSERT( sr_RS.isIsoLocale() == true );
118 1 : CPPUNIT_ASSERT( sr_RS.isIsoODF() == true );
119 : }
120 :
121 : {
122 1 : OUString s_sr_Latn_RS( "sr-Latn-RS" );
123 1 : LanguageTag sr_RS( s_sr_Latn_RS, true );
124 1 : lang::Locale aLocale = sr_RS.getLocale();
125 1 : CPPUNIT_ASSERT( sr_RS.getBcp47() == s_sr_Latn_RS );
126 1 : CPPUNIT_ASSERT( aLocale.Language == "qlt" );
127 1 : CPPUNIT_ASSERT( aLocale.Country == "RS" );
128 1 : CPPUNIT_ASSERT( aLocale.Variant == s_sr_Latn_RS );
129 : /* TODO: conversion doesn't know this yet, once it does activate test. */
130 : #if 0
131 : CPPUNIT_ASSERT( sr_RS.getLanguageType() == LANGUAGE_USER_SERBIAN_LATIN_SERBIA );
132 : #else
133 1 : CPPUNIT_ASSERT( sr_RS.getLanguageType() == LANGUAGE_SYSTEM );
134 : #endif
135 1 : CPPUNIT_ASSERT( sr_RS.isValidBcp47() == true );
136 1 : CPPUNIT_ASSERT( sr_RS.isIsoLocale() == false );
137 1 : CPPUNIT_ASSERT( sr_RS.isIsoODF() == true );
138 1 : CPPUNIT_ASSERT( sr_RS.getLanguage() == "sr" );
139 1 : CPPUNIT_ASSERT( sr_RS.getCountry() == "RS" );
140 1 : CPPUNIT_ASSERT( sr_RS.getScript() == "Latn" );
141 1 : CPPUNIT_ASSERT( sr_RS.getLanguageAndScript() == "sr-Latn" );
142 : }
143 :
144 : {
145 1 : OUString s_de_DE( "de-DE" );
146 1 : LanguageTag de_DE( s_de_DE, true );
147 1 : lang::Locale aLocale = de_DE.getLocale();
148 1 : CPPUNIT_ASSERT( de_DE.getBcp47() == s_de_DE );
149 1 : CPPUNIT_ASSERT( aLocale.Language == "de" );
150 1 : CPPUNIT_ASSERT( aLocale.Country == "DE" );
151 1 : CPPUNIT_ASSERT( aLocale.Variant == "" );
152 1 : CPPUNIT_ASSERT( de_DE.getLanguageType() == LANGUAGE_GERMAN );
153 1 : CPPUNIT_ASSERT( de_DE.isValidBcp47() == true );
154 1 : CPPUNIT_ASSERT( de_DE.isIsoLocale() == true );
155 1 : CPPUNIT_ASSERT( de_DE.isIsoODF() == true );
156 1 : CPPUNIT_ASSERT( de_DE.getLanguage() == "de" );
157 1 : CPPUNIT_ASSERT( de_DE.getCountry() == "DE" );
158 1 : CPPUNIT_ASSERT( de_DE.getScript() == "" );
159 1 : CPPUNIT_ASSERT( de_DE.getLanguageAndScript() == "de" );
160 : }
161 :
162 : {
163 1 : OUString s_de_DE( "de-DE" );
164 1 : LanguageTag de_DE( lang::Locale( "de", "DE", "" ) );
165 1 : lang::Locale aLocale = de_DE.getLocale();
166 1 : CPPUNIT_ASSERT( de_DE.getBcp47() == s_de_DE );
167 1 : CPPUNIT_ASSERT( aLocale.Language == "de" );
168 1 : CPPUNIT_ASSERT( aLocale.Country == "DE" );
169 1 : CPPUNIT_ASSERT( aLocale.Variant == "" );
170 1 : CPPUNIT_ASSERT( de_DE.getLanguageType() == LANGUAGE_GERMAN );
171 : }
172 :
173 : {
174 1 : OUString s_de_DE( "de-DE" );
175 1 : LanguageTag de_DE( LANGUAGE_GERMAN );
176 1 : lang::Locale aLocale = de_DE.getLocale();
177 1 : CPPUNIT_ASSERT( de_DE.getBcp47() == s_de_DE );
178 1 : CPPUNIT_ASSERT( aLocale.Language == "de" );
179 1 : CPPUNIT_ASSERT( aLocale.Country == "DE" );
180 1 : CPPUNIT_ASSERT( aLocale.Variant == "" );
181 1 : CPPUNIT_ASSERT( de_DE.getLanguageType() == LANGUAGE_GERMAN );
182 : }
183 :
184 : // 'qtz' is a local use known pseudolocale for key ID resource
185 : {
186 1 : OUString s_qtz( "qtz" );
187 1 : LanguageTag qtz( s_qtz );
188 1 : lang::Locale aLocale = qtz.getLocale();
189 1 : CPPUNIT_ASSERT( qtz.getBcp47() == s_qtz );
190 1 : CPPUNIT_ASSERT( aLocale.Language == "qtz" );
191 1 : CPPUNIT_ASSERT( aLocale.Country == "" );
192 1 : CPPUNIT_ASSERT( aLocale.Variant == "" );
193 1 : CPPUNIT_ASSERT( qtz.getLanguageType() == LANGUAGE_USER_KEYID );
194 : }
195 :
196 : // 'qty' is a local use unknown locale
197 : {
198 1 : OUString s_qty( "qty" );
199 1 : LanguageTag qty( s_qty );
200 1 : lang::Locale aLocale = qty.getLocale();
201 1 : CPPUNIT_ASSERT( qty.getBcp47() == s_qty );
202 1 : CPPUNIT_ASSERT( aLocale.Language == "qty" );
203 1 : CPPUNIT_ASSERT( aLocale.Country == "" );
204 1 : CPPUNIT_ASSERT( aLocale.Variant == "" );
205 1 : CPPUNIT_ASSERT( qty.getLanguageType() == LANGUAGE_SYSTEM );
206 : }
207 :
208 : // test reset() methods
209 : {
210 1 : LanguageTag aTag( LANGUAGE_DONTKNOW );
211 1 : lang::Locale aLocale;
212 :
213 1 : aTag.reset( LANGUAGE_GERMAN );
214 1 : aLocale = aTag.getLocale();
215 1 : CPPUNIT_ASSERT( aTag.getBcp47() == "de-DE" );
216 1 : CPPUNIT_ASSERT( aLocale.Language == "de" );
217 1 : CPPUNIT_ASSERT( aLocale.Country == "DE" );
218 1 : CPPUNIT_ASSERT( aLocale.Variant == "" );
219 1 : CPPUNIT_ASSERT( aTag.getLanguageType() == LANGUAGE_GERMAN );
220 :
221 1 : aTag.reset( "en-US" );
222 1 : aLocale = aTag.getLocale();
223 1 : CPPUNIT_ASSERT( aTag.getBcp47() == "en-US" );
224 1 : CPPUNIT_ASSERT( aLocale.Language == "en" );
225 1 : CPPUNIT_ASSERT( aLocale.Country == "US" );
226 1 : CPPUNIT_ASSERT( aLocale.Variant == "" );
227 1 : CPPUNIT_ASSERT( aTag.getLanguageType() == LANGUAGE_ENGLISH_US );
228 :
229 1 : aTag.reset( lang::Locale( "de", "DE", "" ) );
230 1 : aLocale = aTag.getLocale();
231 1 : CPPUNIT_ASSERT( aTag.getBcp47() == "de-DE" );
232 1 : CPPUNIT_ASSERT( aLocale.Language == "de" );
233 1 : CPPUNIT_ASSERT( aLocale.Country == "DE" );
234 1 : CPPUNIT_ASSERT( aLocale.Variant == "" );
235 1 : CPPUNIT_ASSERT( aTag.getLanguageType() == LANGUAGE_GERMAN );
236 : }
237 :
238 : {
239 1 : OUString s_uab( "unreg-and-bad" );
240 1 : LanguageTag uab( s_uab, true );
241 1 : lang::Locale aLocale = uab.getLocale();
242 1 : CPPUNIT_ASSERT( uab.getBcp47() == s_uab );
243 1 : CPPUNIT_ASSERT( aLocale.Language == "qlt" );
244 1 : CPPUNIT_ASSERT( aLocale.Country == "" );
245 1 : CPPUNIT_ASSERT( aLocale.Variant == s_uab );
246 1 : CPPUNIT_ASSERT( uab.getLanguageType() == LANGUAGE_SYSTEM );
247 1 : CPPUNIT_ASSERT( uab.isValidBcp47() == false );
248 1 : CPPUNIT_ASSERT( uab.isIsoLocale() == false );
249 1 : CPPUNIT_ASSERT( uab.isIsoODF() == false );
250 : }
251 1 : }
252 :
253 1 : CPPUNIT_TEST_SUITE_REGISTRATION( TestLanguageTag );
254 :
255 : }
256 :
257 4 : CPPUNIT_PLUGIN_IMPLEMENT();
258 :
259 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|