sayso-i18n 0.5.0.001

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/CHANGELOG.textile +152 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.textile +103 -0
  4. data/ci/Gemfile.no-rails +5 -0
  5. data/ci/Gemfile.no-rails.lock +14 -0
  6. data/ci/Gemfile.rails-2.3.x +9 -0
  7. data/ci/Gemfile.rails-2.3.x.lock +23 -0
  8. data/ci/Gemfile.rails-3.x +9 -0
  9. data/ci/Gemfile.rails-3.x.lock +23 -0
  10. data/lib/i18n.rb +324 -0
  11. data/lib/i18n/backend.rb +19 -0
  12. data/lib/i18n/backend/base.rb +174 -0
  13. data/lib/i18n/backend/cache.rb +102 -0
  14. data/lib/i18n/backend/cascade.rb +53 -0
  15. data/lib/i18n/backend/chain.rb +80 -0
  16. data/lib/i18n/backend/fallbacks.rb +70 -0
  17. data/lib/i18n/backend/flatten.rb +113 -0
  18. data/lib/i18n/backend/flatten_yml.rb +70 -0
  19. data/lib/i18n/backend/gettext.rb +71 -0
  20. data/lib/i18n/backend/interpolation_compiler.rb +121 -0
  21. data/lib/i18n/backend/key_value.rb +100 -0
  22. data/lib/i18n/backend/memoize.rb +46 -0
  23. data/lib/i18n/backend/metadata.rb +65 -0
  24. data/lib/i18n/backend/pluralization.rb +55 -0
  25. data/lib/i18n/backend/simple.rb +87 -0
  26. data/lib/i18n/backend/transliterator.rb +98 -0
  27. data/lib/i18n/config.rb +86 -0
  28. data/lib/i18n/core_ext/hash.rb +29 -0
  29. data/lib/i18n/core_ext/kernel/surpress_warnings.rb +9 -0
  30. data/lib/i18n/core_ext/string/interpolate.rb +105 -0
  31. data/lib/i18n/exceptions.rb +88 -0
  32. data/lib/i18n/gettext.rb +25 -0
  33. data/lib/i18n/gettext/helpers.rb +64 -0
  34. data/lib/i18n/gettext/po_parser.rb +329 -0
  35. data/lib/i18n/interpolate/ruby.rb +31 -0
  36. data/lib/i18n/locale.rb +6 -0
  37. data/lib/i18n/locale/fallbacks.rb +96 -0
  38. data/lib/i18n/locale/tag.rb +28 -0
  39. data/lib/i18n/locale/tag/parents.rb +22 -0
  40. data/lib/i18n/locale/tag/rfc4646.rb +74 -0
  41. data/lib/i18n/locale/tag/simple.rb +39 -0
  42. data/lib/i18n/tests.rb +12 -0
  43. data/lib/i18n/tests/basics.rb +54 -0
  44. data/lib/i18n/tests/defaults.rb +40 -0
  45. data/lib/i18n/tests/interpolation.rb +133 -0
  46. data/lib/i18n/tests/link.rb +56 -0
  47. data/lib/i18n/tests/localization.rb +19 -0
  48. data/lib/i18n/tests/localization/date.rb +84 -0
  49. data/lib/i18n/tests/localization/date_time.rb +77 -0
  50. data/lib/i18n/tests/localization/procs.rb +116 -0
  51. data/lib/i18n/tests/localization/time.rb +76 -0
  52. data/lib/i18n/tests/lookup.rb +74 -0
  53. data/lib/i18n/tests/pluralization.rb +35 -0
  54. data/lib/i18n/tests/procs.rb +55 -0
  55. data/lib/i18n/version.rb +3 -0
  56. data/test/all.rb +8 -0
  57. data/test/api/all_features_test.rb +58 -0
  58. data/test/api/cascade_test.rb +28 -0
  59. data/test/api/chain_test.rb +24 -0
  60. data/test/api/fallbacks_test.rb +30 -0
  61. data/test/api/flatten_yml_test.rb +32 -0
  62. data/test/api/key_value_test.rb +28 -0
  63. data/test/api/memoize_test.rb +60 -0
  64. data/test/api/pluralization_test.rb +30 -0
  65. data/test/api/simple_test.rb +28 -0
  66. data/test/backend/cache_test.rb +83 -0
  67. data/test/backend/cascade_test.rb +85 -0
  68. data/test/backend/chain_test.rb +72 -0
  69. data/test/backend/exceptions_test.rb +23 -0
  70. data/test/backend/fallbacks_test.rb +120 -0
  71. data/test/backend/flatten_yml_test.rb +49 -0
  72. data/test/backend/interpolation_compiler_test.rb +102 -0
  73. data/test/backend/key_value_test.rb +46 -0
  74. data/test/backend/memoize_test.rb +47 -0
  75. data/test/backend/metadata_test.rb +67 -0
  76. data/test/backend/pluralization_test.rb +44 -0
  77. data/test/backend/simple_test.rb +83 -0
  78. data/test/backend/transliterator_test.rb +81 -0
  79. data/test/core_ext/hash_test.rb +30 -0
  80. data/test/core_ext/string/interpolate_test.rb +99 -0
  81. data/test/gettext/api_test.rb +206 -0
  82. data/test/gettext/backend_test.rb +93 -0
  83. data/test/i18n/exceptions_test.rb +116 -0
  84. data/test/i18n/interpolate_test.rb +61 -0
  85. data/test/i18n/load_path_test.rb +26 -0
  86. data/test/i18n_test.rb +236 -0
  87. data/test/locale/fallbacks_test.rb +124 -0
  88. data/test/locale/tag/rfc4646_test.rb +142 -0
  89. data/test/locale/tag/simple_test.rb +32 -0
  90. data/test/run_all.rb +21 -0
  91. data/test/test_data/locales/de.po +72 -0
  92. data/test/test_data/locales/en.rb +3 -0
  93. data/test/test_data/locales/en.yml +3 -0
  94. data/test/test_data/locales/invalid/empty.yml +1 -0
  95. data/test/test_data/locales/plurals.rb +113 -0
  96. data/test/test_helper.rb +56 -0
  97. metadata +194 -0
@@ -0,0 +1,26 @@
1
+ require 'test_helper'
2
+
3
+ class I18nLoadPathTest < Test::Unit::TestCase
4
+ def setup
5
+ I18n.locale = :en
6
+ I18n.backend = I18n::Backend::Simple.new
7
+ store_translations(:en, :foo => {:bar => 'bar', :baz => 'baz'})
8
+ end
9
+
10
+ test "nested load paths do not break locale loading" do
11
+ I18n.load_path = [[locales_dir + '/en.yml']]
12
+ assert_equal "baz", I18n.t(:'foo.bar')
13
+ end
14
+
15
+ test "loading an empty yml file raises an InvalidLocaleData exception" do
16
+ assert_raise I18n::InvalidLocaleData do
17
+ I18n.load_path = [[locales_dir + '/invalid/empty.yml']]
18
+ I18n.t(:'foo.bar', :default => "baz")
19
+ end
20
+ end
21
+
22
+ test "adding arrays of filenames to the load path does not break locale loading" do
23
+ I18n.load_path << Dir[locales_dir + '/*.{rb,yml}']
24
+ assert_equal "baz", I18n.t(:'foo.bar')
25
+ end
26
+ end
@@ -0,0 +1,236 @@
1
+ require 'test_helper'
2
+
3
+ class I18nTest < Test::Unit::TestCase
4
+ def setup
5
+ I18n.backend.store_translations(:'en', :currency => { :format => { :separator => '.', :delimiter => ',', } })
6
+ end
7
+
8
+ test "exposes its VERSION constant" do
9
+ assert I18n::VERSION
10
+ end
11
+
12
+ test "uses the simple backend by default" do
13
+ assert I18n.backend.is_a?(I18n::Backend::Simple)
14
+ end
15
+
16
+ test "can set the backend" do
17
+ begin
18
+ assert_nothing_raised { I18n.backend = self }
19
+ assert_equal self, I18n.backend
20
+ ensure
21
+ I18n.backend = I18n::Backend::Simple.new
22
+ end
23
+ end
24
+
25
+ test "uses :en as a default_locale by default" do
26
+ assert_equal :en, I18n.default_locale
27
+ end
28
+
29
+ test "can set the default locale" do
30
+ begin
31
+ assert_nothing_raised { I18n.default_locale = 'de' }
32
+ assert_equal :de, I18n.default_locale
33
+ ensure
34
+ I18n.default_locale = :en
35
+ end
36
+ end
37
+
38
+ test "uses the default locale as a locale by default" do
39
+ assert_equal I18n.default_locale, I18n.locale
40
+ end
41
+
42
+ test "sets the current locale to Thread.current" do
43
+ assert_nothing_raised { I18n.locale = 'de' }
44
+ assert_equal :de, I18n.locale
45
+ assert_equal :de, Thread.current[:i18n_config].locale
46
+ I18n.locale = :en
47
+ end
48
+
49
+ test "can set the configuration object" do
50
+ begin
51
+ I18n.config = self
52
+ assert_equal self, I18n.config
53
+ assert_equal self, Thread.current[:i18n_config]
54
+ ensure
55
+ I18n.config = ::I18n::Config.new
56
+ end
57
+ end
58
+
59
+ test "locale is not shared between configurations" do
60
+ a = I18n::Config.new
61
+ b = I18n::Config.new
62
+ a.locale = :fr
63
+ b.locale = :es
64
+ assert_equal :fr, a.locale
65
+ assert_equal :es, b.locale
66
+ assert_equal :en, I18n.locale
67
+ end
68
+
69
+ test "other options are shared between configurations" do
70
+ begin
71
+ a = I18n::Config.new
72
+ b = I18n::Config.new
73
+ a.default_locale = :fr
74
+ b.default_locale = :es
75
+ assert_equal :es, a.default_locale
76
+ assert_equal :es, b.default_locale
77
+ assert_equal :es, I18n.default_locale
78
+ ensure
79
+ I18n.default_locale = :en
80
+ end
81
+ end
82
+
83
+ test "uses a dot as a default_separator by default" do
84
+ assert_equal '.', I18n.default_separator
85
+ end
86
+
87
+ test "can set the default_separator" do
88
+ begin
89
+ assert_nothing_raised { I18n.default_separator = "\001" }
90
+ ensure
91
+ I18n.default_separator = '.'
92
+ end
93
+ end
94
+
95
+ test "normalize_keys normalizes given locale, keys and scope to an array of single-key symbols" do
96
+ assert_equal [:en, :foo, :bar], I18n.normalize_keys(:en, :bar, :foo)
97
+ assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, :'baz.buz', :'foo.bar')
98
+ assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, 'baz.buz', 'foo.bar')
99
+ assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, %w(baz buz), %w(foo bar))
100
+ assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, [:baz, :buz], [:foo, :bar])
101
+ end
102
+
103
+ test "normalize_keys discards empty keys" do
104
+ assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, :'baz..buz', :'foo..bar')
105
+ assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, :'baz......buz', :'foo......bar')
106
+ assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, ['baz', nil, '', 'buz'], ['foo', nil, '', 'bar'])
107
+ end
108
+
109
+ test "normalize_keys uses a given separator" do
110
+ assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, :'baz|buz', :'foo|bar', '|')
111
+ end
112
+
113
+ test "can set the exception_handler" do
114
+ begin
115
+ previous_exception_handler = I18n.exception_handler
116
+ assert_nothing_raised { I18n.exception_handler = :custom_exception_handler }
117
+ ensure
118
+ I18n.exception_handler = previous_exception_handler
119
+ end
120
+ end
121
+
122
+ test "uses a custom exception handler set to I18n.exception_handler" do
123
+ begin
124
+ previous_exception_handler = I18n.exception_handler
125
+ I18n.exception_handler = :custom_exception_handler
126
+ I18n.expects(:custom_exception_handler)
127
+ I18n.translate :bogus
128
+ ensure
129
+ I18n.exception_handler = previous_exception_handler
130
+ end
131
+ end
132
+
133
+ test "uses a custom exception handler passed as an option" do
134
+ I18n.expects(:custom_exception_handler)
135
+ I18n.translate(:bogus, :exception_handler => :custom_exception_handler)
136
+ end
137
+
138
+ test "delegates translate calls to the backend" do
139
+ I18n.backend.expects(:translate).with('de', :foo, {})
140
+ I18n.translate :foo, :locale => 'de'
141
+ end
142
+
143
+ test "delegates localize calls to the backend" do
144
+ I18n.backend.expects(:localize).with('de', :whatever, :default, {})
145
+ I18n.localize :whatever, :locale => 'de'
146
+ end
147
+
148
+ test "translate given no locale uses the current locale" do
149
+ I18n.backend.expects(:translate).with(:en, :foo, {})
150
+ I18n.translate :foo
151
+ end
152
+
153
+ test "translate works with nested symbol keys" do
154
+ assert_equal ".", I18n.t(:'currency.format.separator')
155
+ end
156
+
157
+ test "translate works with nested string keys" do
158
+ assert_equal ".", I18n.t('currency.format.separator')
159
+ end
160
+
161
+ test "translate with an array as a scope works" do
162
+ assert_equal ".", I18n.t(:separator, :scope => %w(currency format))
163
+ end
164
+
165
+ test "translate with an array containing dot separated strings as a scope works" do
166
+ assert_equal ".", I18n.t(:separator, :scope => ['currency.format'])
167
+ end
168
+
169
+ test "translate with an array of keys and a dot separated string as a scope works" do
170
+ assert_equal [".", ","], I18n.t(%w(separator delimiter), :scope => 'currency.format')
171
+ end
172
+
173
+ test "translate with an array of dot separated keys and a scope works" do
174
+ assert_equal [".", ","], I18n.t(%w(format.separator format.delimiter), :scope => 'currency')
175
+ end
176
+
177
+ # def test_translate_given_no_args_raises_missing_translation_data
178
+ # assert_equal "translation missing: en, no key", I18n.t
179
+ # end
180
+
181
+ test "translate given a bogus key returns an error message" do
182
+ assert_equal "translation missing: en.bogus", I18n.t(:bogus)
183
+ end
184
+
185
+ test "translate given an empty string as a key raises an I18n::ArgumentError" do
186
+ assert_raise(I18n::ArgumentError) { I18n.t("") }
187
+ end
188
+
189
+ test "localize given nil raises an I18n::ArgumentError" do
190
+ assert_raise(I18n::ArgumentError) { I18n.l nil }
191
+ end
192
+
193
+ test "localize givan an Object raises an I18n::ArgumentError" do
194
+ assert_raise(I18n::ArgumentError) { I18n.l Object.new }
195
+ end
196
+
197
+ test "can use a lambda as an exception handler" do
198
+ begin
199
+ previous_exception_handler = I18n.exception_handler
200
+ I18n.exception_handler = Proc.new { |exception, locale, key, options| exception }
201
+ assert_equal I18n::MissingTranslationData, I18n.translate(:test_proc_handler).class
202
+ ensure
203
+ I18n.exception_handler = previous_exception_handler
204
+ end
205
+ end
206
+
207
+ test "can use an object responding to #call as an exception handler" do
208
+ begin
209
+ previous_exception_handler = I18n.exception_handler
210
+ I18n.exception_handler = Class.new do
211
+ def call(exception, locale, key, options); exception; end
212
+ end.new
213
+ assert_equal I18n::MissingTranslationData, I18n.translate(:test_proc_handler).class
214
+ ensure
215
+ I18n.exception_handler = previous_exception_handler
216
+ end
217
+ end
218
+
219
+ test "I18n.with_locale temporarily sets the given locale" do
220
+ store_translations(:en, :foo => 'Foo in :en')
221
+ store_translations(:de, :foo => 'Foo in :de')
222
+ store_translations(:pl, :foo => 'Foo in :pl')
223
+
224
+ I18n.with_locale { assert_equal [:en, 'Foo in :en'], [I18n.locale, I18n.t(:foo)] }
225
+ I18n.with_locale(:de) { assert_equal [:de, 'Foo in :de'], [I18n.locale, I18n.t(:foo)] }
226
+ I18n.with_locale(:pl) { assert_equal [:pl, 'Foo in :pl'], [I18n.locale, I18n.t(:foo)] }
227
+ I18n.with_locale(:en) { assert_equal [:en, 'Foo in :en'], [I18n.locale, I18n.t(:foo)] }
228
+
229
+ assert_equal I18n.default_locale, I18n.locale
230
+ end
231
+
232
+ test "I18n.with_locale resets the locale in case of errors" do
233
+ assert_raise(I18n::ArgumentError) { I18n.with_locale(:pl) { raise I18n::ArgumentError } }
234
+ assert_equal I18n.default_locale, I18n.locale
235
+ end
236
+ end
@@ -0,0 +1,124 @@
1
+ require 'test_helper'
2
+
3
+ include I18n::Locale
4
+
5
+ class I18nFallbacksDefaultsTest < Test::Unit::TestCase
6
+ def teardown
7
+ I18n.default_locale = :en
8
+ end
9
+
10
+ test "defaults reflect the I18n.default_locale if no default has been set manually" do
11
+ I18n.default_locale = :'en-US'
12
+ fallbacks = Fallbacks.new
13
+ assert_equal [:'en-US', :en], fallbacks.defaults
14
+ end
15
+
16
+ test "defaults reflect a manually passed default locale if any" do
17
+ fallbacks = Fallbacks.new(:'fi-FI')
18
+ assert_equal [:'fi-FI', :fi], fallbacks.defaults
19
+ I18n.default_locale = :'de-DE'
20
+ assert_equal [:'fi-FI', :fi], fallbacks.defaults
21
+ end
22
+
23
+ test "defaults allows to set multiple defaults" do
24
+ fallbacks = Fallbacks.new(:'fi-FI', :'se-FI')
25
+ assert_equal [:'fi-FI', :fi, :'se-FI', :se], fallbacks.defaults
26
+ end
27
+ end
28
+
29
+ class I18nFallbacksComputationTest < Test::Unit::TestCase
30
+ def setup
31
+ @fallbacks = Fallbacks.new(:'en-US')
32
+ end
33
+
34
+ test "with no mappings defined it returns [:es, :en-US] for :es" do
35
+ assert_equal [:es, :"en-US", :en], @fallbacks[:es]
36
+ end
37
+
38
+ test "with no mappings defined it returns [:es-ES, :es, :en-US] for :es-ES" do
39
+ assert_equal [:"es-ES", :es, :"en-US", :en], @fallbacks[:"es-ES"]
40
+ end
41
+
42
+ test "with no mappings defined it returns [:es-MX, :es, :en-US] for :es-MX" do
43
+ assert_equal [:"es-MX", :es, :"en-US", :en], @fallbacks[:"es-MX"]
44
+ end
45
+
46
+ test "with no mappings defined it returns [:es-Latn-ES, :es-Latn, :es, :en-US] for :es-Latn-ES" do
47
+ assert_equal [:"es-Latn-ES", :"es-Latn", :es, :"en-US", :en], @fallbacks[:'es-Latn-ES']
48
+ end
49
+
50
+ test "with no mappings defined it returns [:en, :en-US] for :en" do
51
+ assert_equal [:en, :"en-US"], @fallbacks[:en]
52
+ end
53
+
54
+ test "with no mappings defined it returns [:en-US, :en] for :en-US (special case: locale == default)" do
55
+ assert_equal [:"en-US", :en], @fallbacks[:"en-US"]
56
+ end
57
+
58
+ # Most people who speak Catalan also live in Spain, so it is safe to assume
59
+ # that they also speak Spanish as spoken in Spain.
60
+ test "with a Catalan mapping defined it returns [:ca, :es-ES, :es, :en-US] for :ca" do
61
+ @fallbacks.map(:ca => :"es-ES")
62
+ assert_equal [:ca, :"es-ES", :es, :"en-US", :en], @fallbacks[:ca]
63
+ end
64
+
65
+ test "with a Catalan mapping defined it returns [:ca-ES, :ca, :es-ES, :es, :en-US] for :ca-ES" do
66
+ @fallbacks.map(:ca => :"es-ES")
67
+ assert_equal [:"ca-ES", :ca, :"es-ES", :es, :"en-US", :en], @fallbacks[:"ca-ES"]
68
+ end
69
+
70
+ # People who speak Arabic as spoken in Palestine often times also speak
71
+ # Hebrew as spoken in Israel. However it is in no way safe to assume that
72
+ # everybody who speaks Arabic also speaks Hebrew.
73
+
74
+ test "with a Hebrew mapping defined it returns [:ar, :en-US] for :ar" do
75
+ @fallbacks.map(:"ar-PS" => :"he-IL")
76
+ assert_equal [:ar, :"en-US", :en], @fallbacks[:ar]
77
+ end
78
+
79
+ test "with a Hebrew mapping defined it returns [:ar-EG, :ar, :en-US] for :ar-EG" do
80
+ @fallbacks.map(:"ar-PS" => :"he-IL")
81
+ assert_equal [:"ar-EG", :ar, :"en-US", :en], @fallbacks[:"ar-EG"]
82
+ end
83
+
84
+ test "with a Hebrew mapping defined it returns [:ar-PS, :ar, :he-IL, :he, :en-US] for :ar-PS" do
85
+ @fallbacks.map(:"ar-PS" => :"he-IL")
86
+ assert_equal [:"ar-PS", :ar, :"he-IL", :he, :"en-US", :en], @fallbacks[:"ar-PS"]
87
+ end
88
+
89
+ # Sami people live in several scandinavian countries. In Finnland many people
90
+ # know Swedish and Finnish. Thus, it can be assumed that Sami living in
91
+ # Finnland also speak Swedish and Finnish.
92
+
93
+ test "with a Sami mapping defined it returns [:sms-FI, :sms, :se-FI, :se, :fi-FI, :fi, :en-US] for :sms-FI" do
94
+ @fallbacks.map(:sms => [:"se-FI", :"fi-FI"])
95
+ assert_equal [:"sms-FI", :sms, :"se-FI", :se, :"fi-FI", :fi, :"en-US", :en], @fallbacks[:"sms-FI"]
96
+ end
97
+
98
+ # Austrian people understand German as spoken in Germany
99
+
100
+ test "with a German mapping defined it returns [:de, :en-US] for de" do
101
+ @fallbacks.map(:"de-AT" => :"de-DE")
102
+ assert_equal [:de, :"en-US", :en], @fallbacks[:"de"]
103
+ end
104
+
105
+ test "with a German mapping defined it returns [:de-DE, :de, :en-US] for de-DE" do
106
+ @fallbacks.map(:"de-AT" => :"de-DE")
107
+ assert_equal [:"de-DE", :de, :"en-US", :en], @fallbacks[:"de-DE"]
108
+ end
109
+
110
+ test "with a German mapping defined it returns [:de-AT, :de, :de-DE, :en-US] for de-AT" do
111
+ @fallbacks.map(:"de-AT" => :"de-DE")
112
+ assert_equal [:"de-AT", :de, :"de-DE", :"en-US", :en], @fallbacks[:"de-AT"]
113
+ end
114
+
115
+ # Mapping :de => :en, :he => :en
116
+
117
+ test "with a mapping :de => :en, :he => :en defined it returns [:de, :en] for :de" do
118
+ assert_equal [:de, :"en-US", :en], @fallbacks[:de]
119
+ end
120
+
121
+ test "with a mapping :de => :en, :he => :en defined it [:he, :en] for :de" do
122
+ assert_equal [:he, :"en-US", :en], @fallbacks[:he]
123
+ end
124
+ end
@@ -0,0 +1,142 @@
1
+ # encoding: utf-8
2
+ require 'test_helper'
3
+
4
+ class I18nLocaleTagRfc4646ParserTest < Test::Unit::TestCase
5
+ include I18n::Locale
6
+
7
+ test "Rfc4646::Parser given a valid tag 'de' returns an array of subtags" do
8
+ assert_equal ['de', nil, nil, nil, nil, nil, nil], Tag::Rfc4646::Parser.match('de')
9
+ end
10
+
11
+ test "Rfc4646::Parser given a valid tag 'de-DE' returns an array of subtags" do
12
+ assert_equal ['de', nil, 'DE', nil, nil, nil, nil], Tag::Rfc4646::Parser.match('de-DE')
13
+ end
14
+
15
+ test "Rfc4646::Parser given a valid lowercase tag 'de-latn-de-variant-x-phonebk' returns an array of subtags" do
16
+ assert_equal ['de', 'latn', 'de', 'variant', nil, 'x-phonebk', nil], Tag::Rfc4646::Parser.match('de-latn-de-variant-x-phonebk')
17
+ end
18
+
19
+ test "Rfc4646::Parser given a valid uppercase tag 'DE-LATN-DE-VARIANT-X-PHONEBK' returns an array of subtags" do
20
+ assert_equal ['DE', 'LATN', 'DE', 'VARIANT', nil, 'X-PHONEBK', nil], Tag::Rfc4646::Parser.match('DE-LATN-DE-VARIANT-X-PHONEBK')
21
+ end
22
+
23
+ test "Rfc4646::Parser given an invalid tag 'a-DE' it returns false" do
24
+ assert_equal false, Tag::Rfc4646::Parser.match('a-DE')
25
+ end
26
+
27
+ test "Rfc4646::Parser given an invalid tag 'de-419-DE' it returns false" do
28
+ assert_equal false, Tag::Rfc4646::Parser.match('de-419-DE')
29
+ end
30
+ end
31
+
32
+ # Tag for the locale 'de-Latn-DE-Variant-a-ext-x-phonebk-i-klingon'
33
+
34
+ class I18nLocaleTagSubtagsTest < Test::Unit::TestCase
35
+ include I18n::Locale
36
+
37
+ def setup
38
+ subtags = %w(de Latn DE variant a-ext x-phonebk i-klingon)
39
+ @tag = Tag::Rfc4646.new(*subtags)
40
+ end
41
+
42
+ test "returns 'de' as the language subtag in lowercase" do
43
+ assert_equal 'de', @tag.language
44
+ end
45
+
46
+ test "returns 'Latn' as the script subtag in titlecase" do
47
+ assert_equal 'Latn', @tag.script
48
+ end
49
+
50
+ test "returns 'DE' as the region subtag in uppercase" do
51
+ assert_equal 'DE', @tag.region
52
+ end
53
+
54
+ test "returns 'variant' as the variant subtag in lowercase" do
55
+ assert_equal 'variant', @tag.variant
56
+ end
57
+
58
+ test "returns 'a-ext' as the extension subtag" do
59
+ assert_equal 'a-ext', @tag.extension
60
+ end
61
+
62
+ test "returns 'x-phonebk' as the privateuse subtag" do
63
+ assert_equal 'x-phonebk', @tag.privateuse
64
+ end
65
+
66
+ test "returns 'i-klingon' as the grandfathered subtag" do
67
+ assert_equal 'i-klingon', @tag.grandfathered
68
+ end
69
+
70
+ test "returns a formatted tag string from #to_s" do
71
+ assert_equal 'de-Latn-DE-variant-a-ext-x-phonebk-i-klingon', @tag.to_s
72
+ end
73
+
74
+ test "returns an array containing the formatted subtags from #to_a" do
75
+ assert_equal %w(de Latn DE variant a-ext x-phonebk i-klingon), @tag.to_a
76
+ end
77
+ end
78
+
79
+ # Tag inheritance
80
+
81
+ class I18nLocaleTagSubtagsTest < Test::Unit::TestCase
82
+ test "#parent returns 'de-Latn-DE-variant-a-ext-x-phonebk' as the parent of 'de-Latn-DE-variant-a-ext-x-phonebk-i-klingon'" do
83
+ tag = Tag::Rfc4646.new(*%w(de Latn DE variant a-ext x-phonebk i-klingon))
84
+ assert_equal 'de-Latn-DE-variant-a-ext-x-phonebk', tag.parent.to_s
85
+ end
86
+
87
+ test "#parent returns 'de-Latn-DE-variant-a-ext' as the parent of 'de-Latn-DE-variant-a-ext-x-phonebk'" do
88
+ tag = Tag::Rfc4646.new(*%w(de Latn DE variant a-ext x-phonebk))
89
+ assert_equal 'de-Latn-DE-variant-a-ext', tag.parent.to_s
90
+ end
91
+
92
+ test "#parent returns 'de-Latn-DE-variant' as the parent of 'de-Latn-DE-variant-a-ext'" do
93
+ tag = Tag::Rfc4646.new(*%w(de Latn DE variant a-ext))
94
+ assert_equal 'de-Latn-DE-variant', tag.parent.to_s
95
+ end
96
+
97
+ test "#parent returns 'de-Latn-DE' as the parent of 'de-Latn-DE-variant'" do
98
+ tag = Tag::Rfc4646.new(*%w(de Latn DE variant))
99
+ assert_equal 'de-Latn-DE', tag.parent.to_s
100
+ end
101
+
102
+ test "#parent returns 'de-Latn' as the parent of 'de-Latn-DE'" do
103
+ tag = Tag::Rfc4646.new(*%w(de Latn DE))
104
+ assert_equal 'de-Latn', tag.parent.to_s
105
+ end
106
+
107
+ test "#parent returns 'de' as the parent of 'de-Latn'" do
108
+ tag = Tag::Rfc4646.new(*%w(de Latn))
109
+ assert_equal 'de', tag.parent.to_s
110
+ end
111
+
112
+ # TODO RFC4647 says: "If no language tag matches the request, the "default" value is returned."
113
+ # where should we set the default language?
114
+ # test "#parent returns '' as the parent of 'de'" do
115
+ # tag = Tag::Rfc4646.new *%w(de)
116
+ # assert_equal '', tag.parent.to_s
117
+ # end
118
+
119
+ test "#parent returns an array of 5 parents for 'de-Latn-DE-variant-a-ext-x-phonebk-i-klingon'" do
120
+ parents = %w(de-Latn-DE-variant-a-ext-x-phonebk-i-klingon
121
+ de-Latn-DE-variant-a-ext-x-phonebk
122
+ de-Latn-DE-variant-a-ext
123
+ de-Latn-DE-variant
124
+ de-Latn-DE
125
+ de-Latn
126
+ de)
127
+ tag = Tag::Rfc4646.new(*%w(de Latn DE variant a-ext x-phonebk i-klingon))
128
+ assert_equal parents, tag.self_and_parents.map(&:to_s)
129
+ end
130
+
131
+ test "returns an array of 5 parents for 'de-Latn-DE-variant-a-ext-x-phonebk-i-klingon'" do
132
+ parents = %w(de-Latn-DE-variant-a-ext-x-phonebk-i-klingon
133
+ de-Latn-DE-variant-a-ext-x-phonebk
134
+ de-Latn-DE-variant-a-ext
135
+ de-Latn-DE-variant
136
+ de-Latn-DE
137
+ de-Latn
138
+ de)
139
+ tag = Tag::Rfc4646.new(*%w(de Latn DE variant a-ext x-phonebk i-klingon))
140
+ assert_equal parents, tag.self_and_parents.map(&:to_s)
141
+ end
142
+ end