locale 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. data/COPYING +55 -0
  2. data/ChangeLog +113 -0
  3. data/README +100 -0
  4. data/Rakefile +77 -0
  5. data/doc/classes/Locale/Driver.html +375 -0
  6. data/doc/classes/Locale/Driver/CGI.html +502 -0
  7. data/doc/classes/Locale/Driver/Env.html +440 -0
  8. data/doc/classes/Locale/Driver/JRuby.html +390 -0
  9. data/doc/classes/Locale/Driver/Posix.html +431 -0
  10. data/doc/classes/Locale/Driver/Win32.html +398 -0
  11. data/doc/classes/Locale/Driver/Win32Table.html +356 -0
  12. data/doc/classes/Locale/Info.html +586 -0
  13. data/doc/classes/Locale/Info/Language.html +764 -0
  14. data/doc/classes/Locale/Info/Region.html +470 -0
  15. data/doc/classes/Locale/Tag/Cldr.html +547 -0
  16. data/doc/classes/Locale/Tag/Common.html +655 -0
  17. data/doc/classes/Locale/Tag/Illegular.html +424 -0
  18. data/doc/classes/Locale/Tag/Posix.html +612 -0
  19. data/doc/classes/Locale/Tag/Rfc.html +610 -0
  20. data/doc/classes/Locale/Tag/Simple.html +684 -0
  21. data/doc/classes/Locale/TagList.html +783 -0
  22. data/doc/classes/Locale/Util.html +476 -0
  23. data/doc/classes/Locale/Util/Memoizable.html +356 -0
  24. data/doc/created.rid +1 -0
  25. data/doc/files/ChangeLog.html +497 -0
  26. data/doc/files/README.html +525 -0
  27. data/doc/files/lib/locale/driver/cgi_rb.html +342 -0
  28. data/doc/files/lib/locale/driver/env_rb.html +354 -0
  29. data/doc/files/lib/locale/driver/jruby_rb.html +359 -0
  30. data/doc/files/lib/locale/driver/posix_rb.html +349 -0
  31. data/doc/files/lib/locale/driver/win32_rb.html +359 -0
  32. data/doc/files/lib/locale/driver/win32_table_rb.html +342 -0
  33. data/doc/files/lib/locale/info/language_rb.html +353 -0
  34. data/doc/files/lib/locale/info/region_rb.html +353 -0
  35. data/doc/files/lib/locale/info_rb.html +354 -0
  36. data/doc/files/lib/locale/tag/cldr_rb.html +342 -0
  37. data/doc/files/lib/locale/tag/common_rb.html +342 -0
  38. data/doc/files/lib/locale/tag/illegular_rb.html +349 -0
  39. data/doc/files/lib/locale/tag/posix_rb.html +342 -0
  40. data/doc/files/lib/locale/tag/rfc_rb.html +342 -0
  41. data/doc/files/lib/locale/tag/simple_rb.html +349 -0
  42. data/doc/files/lib/locale/tag_rb.html +374 -0
  43. data/doc/files/lib/locale/taglist_rb.html +342 -0
  44. data/doc/files/lib/locale/util/memoizable_rb.html +360 -0
  45. data/doc/files/lib/locale/version_rb.html +342 -0
  46. data/doc/files/lib/locale_rb.html +379 -0
  47. data/doc/fr_class_index.html +20 -0
  48. data/doc/fr_file_index.html +23 -0
  49. data/doc/fr_method_index.html +80 -0
  50. data/doc/index.html +1 -0
  51. data/doc/rdoc-style.css +320 -0
  52. data/lib/locale.rb +248 -0
  53. data/lib/locale/data/languages.tab.gz +0 -0
  54. data/lib/locale/data/regions.tab.gz +0 -0
  55. data/lib/locale/driver/cgi.rb +132 -0
  56. data/lib/locale/driver/env.rb +64 -0
  57. data/lib/locale/driver/jruby.rb +53 -0
  58. data/lib/locale/driver/posix.rb +49 -0
  59. data/lib/locale/driver/win32.rb +61 -0
  60. data/lib/locale/driver/win32_table.rb +298 -0
  61. data/lib/locale/info.rb +12 -0
  62. data/lib/locale/info/language.rb +134 -0
  63. data/lib/locale/info/region.rb +74 -0
  64. data/lib/locale/tag.rb +36 -0
  65. data/lib/locale/tag/cldr.rb +93 -0
  66. data/lib/locale/tag/common.rb +122 -0
  67. data/lib/locale/tag/illegular.rb +38 -0
  68. data/lib/locale/tag/posix.rb +97 -0
  69. data/lib/locale/tag/rfc.rb +106 -0
  70. data/lib/locale/tag/simple.rb +145 -0
  71. data/lib/locale/taglist.rb +93 -0
  72. data/lib/locale/util/memoizable.rb +76 -0
  73. data/lib/locale/version.rb +12 -0
  74. data/samples/cgi/README +20 -0
  75. data/samples/cgi/cookie.cgi +62 -0
  76. data/samples/cgi/http.rb +52 -0
  77. data/samples/cgi/index.cgi +90 -0
  78. data/samples/cgi/locale.css +115 -0
  79. data/samples/sample_1.rb +25 -0
  80. data/samples/sample_info.rb +6 -0
  81. data/setup.rb +1585 -0
  82. data/test/test_detect_cgi.rb +179 -0
  83. data/test/test_detect_general.rb +159 -0
  84. data/test/test_info.rb +28 -0
  85. data/test/test_tag.rb +1183 -0
  86. data/test/test_thread.rb +37 -0
  87. metadata +162 -0
@@ -0,0 +1,179 @@
1
+ require 'cgi'
2
+ require 'locale'
3
+ require 'test/unit'
4
+
5
+ class CGI
6
+ module QueryExtension
7
+ # Override this method to avoid to put warning messages.
8
+ module_function
9
+ def readlines=(str)
10
+ @@lines = [str]
11
+ end
12
+ def readlines
13
+ @@lines
14
+ end
15
+ def read_from_cmdline
16
+ require "shellwords"
17
+ string = readlines.join(' ').gsub(/\n/n, '').gsub(/\\=/n, '%3D').gsub(/\\&/n, '%26')
18
+
19
+ words = Shellwords.shellwords(string)
20
+
21
+ if words.find{|x| /=/n.match(x) }
22
+ words.join('&')
23
+ else
24
+ words.join('+')
25
+ end
26
+ end
27
+ private :read_from_cmdline
28
+ end
29
+ end
30
+
31
+ class TestDetectCGI < Test::Unit::TestCase
32
+ def setup_cgi(str)
33
+ CGI::QueryExtension.readlines = str
34
+ Locale.init(:driver => :cgi)
35
+ cgi = CGI.new
36
+ Locale.cgi = cgi
37
+ Locale.clear_all
38
+ end
39
+
40
+ def test_query_string
41
+ #query string
42
+ setup_cgi("lang=ja_JP")
43
+ lang = Locale.current[0]
44
+ assert_equal(Locale::Tag::Simple, lang.class)
45
+ assert_equal("ja_JP", lang.to_s)
46
+
47
+ setup_cgi("lang=ja-jp")
48
+ lang = Locale.current[0]
49
+ assert_equal(Locale::Tag::Simple, lang.class)
50
+ assert_equal("ja_JP", lang.to_s)
51
+ assert_equal("ja-JP", lang.to_rfc.to_s)
52
+ setup_cgi("lang=ja-jp")
53
+ assert_equal("ja_JP", lang.to_s)
54
+ assert_equal("ja-JP", lang.to_rfc.to_s)
55
+
56
+ end
57
+
58
+ def test_cookie
59
+ #cockie
60
+ setup_cgi("Set-Cookie: lang=en-us")
61
+ assert_equal("en_US", Locale.current.to_s)
62
+ end
63
+
64
+ def test_accept_language
65
+ setup_cgi("")
66
+ ENV["HTTP_ACCEPT_LANGUAGE"] = ""
67
+ ENV["HTTP_ACCEPT_CHARSET"] = ""
68
+ lang = Locale.current[0]
69
+ assert_equal(Locale::Tag::Simple, lang.class)
70
+ assert_equal("en", lang.to_s)
71
+ assert_equal("en", lang.to_rfc.to_s)
72
+
73
+ setup_cgi("")
74
+ ENV["HTTP_ACCEPT_LANGUAGE"] = "ja,en-us;q=0.7,en;q=0.3"
75
+ lang1, lang2, lang3 = Locale.current
76
+ assert_equal("ja", lang1.to_rfc.to_s)
77
+ assert_equal("en-US", lang2.to_rfc.to_s)
78
+ assert_equal("en", lang3.to_rfc.to_s)
79
+
80
+ setup_cgi("")
81
+ ENV["HTTP_ACCEPT_LANGUAGE"] = "en-us,ja;q=0.7,en;q=0.3"
82
+ lang1, lang2, lang3 = Locale.current
83
+ assert_equal("en-US", lang1.to_rfc.to_s)
84
+ assert_equal("ja", lang2.to_rfc.to_s)
85
+ assert_equal("en", lang3.to_rfc.to_s)
86
+
87
+ setup_cgi("")
88
+ ENV["HTTP_ACCEPT_LANGUAGE"] = "en"
89
+ lang = Locale.current[0]
90
+ assert_equal("en", lang.to_rfc.to_s)
91
+ end
92
+
93
+ def test_accept_charset
94
+ #accept charset
95
+ setup_cgi("")
96
+ ENV["HTTP_ACCEPT_CHARSET"] = "Shift_JIS"
97
+ assert_equal("Shift_JIS", Locale.charset)
98
+
99
+ setup_cgi("")
100
+ ENV["HTTP_ACCEPT_CHARSET"] = "EUC-JP,*,utf-8"
101
+ assert_equal("EUC-JP", Locale.charset)
102
+
103
+ setup_cgi("")
104
+ ENV["HTTP_ACCEPT_CHARSET"] = "*"
105
+ assert_equal("UTF-8", Locale.charset)
106
+
107
+ setup_cgi("")
108
+ ENV["HTTP_ACCEPT_CHARSET"] = ""
109
+ assert_equal("UTF-8", Locale.charset)
110
+ end
111
+
112
+ def test_default
113
+ Locale.set_default(nil)
114
+ Locale.set_default("ja-JP")
115
+ setup_cgi("")
116
+ ENV["HTTP_ACCEPT_LANGUAGE"] = ""
117
+ ENV["HTTP_ACCEPT_CHARSET"] = ""
118
+ assert_equal("ja-JP", Locale.default.to_rfc.to_s)
119
+ assert_equal("ja-JP", Locale.current.to_rfc.to_s)
120
+ Locale.set_default(nil)
121
+ end
122
+
123
+ def common(*ary)
124
+ ary.map{|v| Locale::Tag::Common.parse(v)}
125
+ end
126
+
127
+ def rfc(*ary)
128
+ ary.map{|v| Locale::Tag::Rfc.parse(v)}
129
+ end
130
+
131
+ def cldr(*ary)
132
+ ary.map{|v| Locale::Tag::Cldr.parse(v)}
133
+ end
134
+
135
+ def simple(*ary)
136
+ ary.map{|v| Locale::Tag::Simple.parse(v)}
137
+ end
138
+
139
+ def test_candidates
140
+ setup_cgi("")
141
+
142
+ ENV["HTTP_ACCEPT_LANGUAGE"] = "fr-fr,zh_CN;q=0.7,zh_TW;q=0.2,ja_JP;q=0.1"
143
+
144
+ assert_equal common("fr-FR", "zh-CN", "zh-TW", "ja-JP",
145
+ "fr", "zh", "ja", "en"), Locale.candidates
146
+
147
+ assert_equal rfc("fr-FR", "zh-CN", "zh-TW", "ja-JP", "fr",
148
+ "zh", "ja", "en"), Locale.candidates(:type => :rfc)
149
+
150
+ assert_equal cldr("fr_FR", "zh_CN", "zh_TW", "ja_JP", "fr",
151
+ "zh", "ja", "en"), Locale.candidates(:type => :cldr)
152
+
153
+ assert_equal simple("fr-FR", "zh-CN", "zh-TW", "ja-JP",
154
+ "fr", "zh", "ja", "en"), Locale.candidates(:type => :simple)
155
+
156
+ assert_equal common("fr_FR", "zh", "ja"), Locale.candidates(:type => :common,
157
+ :supported_language_tags => ["fr_FR", "ja", "zh"])
158
+
159
+ assert_equal simple("fr-FR", "zh", "ja"), Locale.candidates(:type => :simple,
160
+ :supported_language_tags => ["fr-FR", "ja", "zh"])
161
+
162
+ assert_equal simple("fr-FR", "zh", "ja", "no", "pt"),
163
+ Locale.candidates(:type => :simple,
164
+ :supported_language_tags => ["fr-FR", "ja", "zh", "no", "pt"],
165
+ :default_language_tags => ["no", "pt"])
166
+
167
+ assert_equal simple("no", "pt"), Locale.candidates(:type => :simple,
168
+ :supported_language_tags => ["aa"],
169
+ :default_language_tags => ["no", "pt"])
170
+ assert_equal simple("en"), Locale.candidates(:type => :simple,
171
+ :supported_language_tags => ["aa"])
172
+
173
+ taglist = Locale.candidates(:type => :rfc)
174
+ assert_equal Locale::TagList, taglist.class
175
+ assert_equal "fr", taglist.language
176
+ assert_equal "FR", taglist.region
177
+
178
+ end
179
+ end
@@ -0,0 +1,159 @@
1
+ require 'locale'
2
+ require 'test/unit'
3
+
4
+ class TestDetectGeneral < Test::Unit::TestCase
5
+
6
+ def setup
7
+ Locale.clear_all
8
+ ENV["LC_ALL"] = nil
9
+ ENV["LC_MESSAGES"] = nil
10
+ ENV["LANG"] = nil
11
+ ENV["LANGUAGE"] = nil
12
+ end
13
+
14
+ def test_lc_all
15
+ ENV["LC_ALL"] = "ja_JP.eucJP"
16
+ ENV["LC_MESSAGES"] = "zh_CN.UTF-8" #Ignored.
17
+ ENV["LANG"] = "ko_KR.UTF-8" #Ignored.
18
+ ENV["LANGUAGE"] = nil
19
+
20
+ lang = Locale.current[0]
21
+ assert_equal Locale::Tag::Posix, lang.class
22
+ assert_equal "ja", lang.language
23
+ assert_equal "JP", lang.region
24
+ assert_equal "eucJP", lang.charset
25
+ assert_equal Locale::Tag::Posix.new("ja", "JP", "eucJP"), lang
26
+
27
+ assert_equal "eucJP", Locale.charset
28
+ end
29
+
30
+ def test_lc_messages
31
+ ENV["LC_ALL"] = nil
32
+ ENV["LC_MESSAGES"] = "ja_JP.eucJP"
33
+ ENV["LANG"] = "ko_KR.UTF-8" #Ignored.
34
+ ENV["LANGUAGE"] = nil
35
+
36
+ lang = Locale.current[0]
37
+ assert_equal Locale::Tag::Posix, lang.class
38
+ assert_equal "ja", lang.language
39
+ assert_equal "JP", lang.region
40
+ assert_equal "eucJP", lang.charset
41
+ assert_equal Locale::Tag::Posix.new("ja", "JP", "eucJP"), lang
42
+
43
+ assert_equal "eucJP", Locale.charset
44
+ end
45
+
46
+ def test_lang
47
+ ENV["LC_ALL"] = nil
48
+ ENV["LC_MESSAGES"] = nil
49
+ ENV["LANG"] = "ja_JP.eucJP"
50
+ ENV["LANGUAGE"] = nil
51
+
52
+ lang = Locale.current[0]
53
+ assert_equal Locale::Tag::Posix, lang.class
54
+ assert_equal "ja", lang.language
55
+ assert_equal "JP", lang.region
56
+ assert_equal "eucJP", lang.charset
57
+ assert_equal Locale::Tag::Posix.new("ja", "JP", "eucJP"), lang
58
+
59
+ assert_equal "eucJP", Locale.charset
60
+ end
61
+
62
+ def test_lang
63
+ ENV["LC_ALL"] = "zh_CN.UTF-8" # Ignored.
64
+ ENV["LC_MESSAGES"] = "ko_KR.UTF-8" #Ingored.
65
+ ENV["LANG"] = "en_US.UTF-8" # Ignored.
66
+ ENV["LANGUAGE"] ="ja_JP.eucJP:zh_CN.UTF-8"
67
+
68
+ lang = Locale.current[0]
69
+ assert_equal Locale::Tag::Posix, lang.class
70
+ assert_equal "ja", lang.language
71
+ assert_equal "JP", lang.region
72
+ assert_equal "eucJP", lang.charset
73
+ assert_equal Locale::Tag::Posix.new("ja", "JP", "eucJP"), lang
74
+
75
+ # Use the LANG value (locale charmap don't use LANGUAGE)
76
+ assert_equal "UTF-8", Locale.charset
77
+ end
78
+
79
+ def test_language
80
+ ENV["LC_ALL"] = "ja_JP.Shift_JIS"
81
+ ENV["LANGUAGE"] = "zh_CN.UTF-8:ja_JP"
82
+
83
+ tags = Locale.current
84
+ assert_equal Locale::Tag::Posix, tags[0].class
85
+ assert_equal Locale::Tag::Posix, tags[1].class
86
+
87
+ assert_equal "zh", tags.language
88
+ assert_equal "CN", tags.region
89
+ assert_equal "UTF-8", tags.charset
90
+
91
+ assert_equal "zh", tags[0].language
92
+ assert_equal "CN", tags[0].region
93
+ assert_equal "UTF-8", tags[0].charset
94
+
95
+ assert_equal "ja", tags[1].language
96
+ assert_equal "JP", tags[1].region
97
+ assert_equal nil, tags[1].charset
98
+
99
+ assert_equal Locale::TagList.new([Locale::Tag::Posix.new("zh", "CN", "UTF-8"),
100
+ Locale::Tag::Posix.new("ja", "JP")]), tags
101
+
102
+ assert_equal "Shift_JIS", Locale.charset
103
+ end
104
+
105
+ def test_no_charset
106
+ ENV["LC_ALL"] = "cs_CZ"
107
+
108
+ lang = Locale.current[0]
109
+ assert_equal Locale::Tag::Posix, lang.class
110
+
111
+ assert_equal "cs", lang.language
112
+ assert_equal "CZ", lang.region
113
+ assert_equal nil, lang.charset
114
+ assert_equal Locale::Tag::Posix.new("cs", "CZ"), lang
115
+
116
+ if /linux|bsd/ =~ RUBY_PLATFORM
117
+ assert_equal "ISO-8859-2", Locale.charset
118
+ end
119
+ end
120
+
121
+ def test_default
122
+ Locale.set_default("yo_NG")
123
+ assert_equal Locale::Tag.parse("yo_NG"), Locale.default
124
+ assert_equal Locale::Tag.parse("yo_NG"), Locale.current[0]
125
+ Locale.set_default(nil)
126
+
127
+ Locale.default = "fr"
128
+ assert_equal Locale::Tag.parse("fr"), Locale.default
129
+ assert_equal Locale::Tag.parse("fr"), Locale.current[0]
130
+ Locale.default = nil
131
+ end
132
+
133
+ def test_current
134
+ Locale.set_current("yo_NG")
135
+ assert_equal Locale::Tag.parse("yo_NG"), Locale.current[0]
136
+
137
+ Locale.current = "fr"
138
+ assert_equal Locale::Tag.parse("fr"), Locale.current[0]
139
+
140
+ Locale.set_default("yo_NG")
141
+ Locale.current = "fr"
142
+ assert_equal Locale::Tag.parse("yo_NG"), Locale.default
143
+ assert_equal Locale::Tag.parse("fr"), Locale.current[0]
144
+ Locale.set_default(nil)
145
+ end
146
+
147
+ def test_clear
148
+ ENV["LC_ALL"] = "ja_JP.Shift_JIS"
149
+ ENV["LANGUAGE"] = nil
150
+
151
+ assert_equal Locale::Tag.parse("ja_JP.Shift_JIS"), Locale.current[0]
152
+ Locale.clear
153
+ ENV["LANGUAGE"] = "zh_CN.UTF-8:ja_JP"
154
+ assert_equal Locale::Tag::Posix.parse("zh_CN.UTF-8"), Locale.current[0]
155
+ assert_equal Locale::Tag::Posix.parse("ja_JP"), Locale.current[1]
156
+
157
+ end
158
+
159
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'locale/info'
4
+ require 'test/unit'
5
+
6
+ class TestLocaleInfo < Test::Unit::TestCase
7
+ def test_languages
8
+ langs = Locale::Info.three_languages
9
+ assert_equal 7600, langs.length
10
+ assert_equal "English", langs["eng"].name
11
+ assert langs["eng"].living?
12
+ assert langs["eng"].individual?
13
+
14
+ langs = Locale::Info.two_languages
15
+ assert_equal 185, langs.length
16
+ assert_equal "English", langs["en"].name
17
+ assert langs["en"].living?
18
+ assert langs["en"].individual?
19
+ end
20
+
21
+ def test_regions
22
+ regions = Locale::Info.regions
23
+ assert_equal 243, regions.length
24
+ assert_equal "United States", regions["US"].name
25
+
26
+ assert_equal "ÅLand Islands", regions['AX'].name
27
+ end
28
+ end
@@ -0,0 +1,1183 @@
1
+ require 'locale/tag'
2
+ require 'test/unit'
3
+
4
+ class TagTest < Test::Unit::TestCase
5
+
6
+ def test_simple
7
+ #ja-JP, ja-392
8
+ lang = Locale::Tag.parse("ja")
9
+ assert_equal Locale::Tag::Simple, lang.class
10
+ assert_equal "ja", lang.language
11
+ assert_equal nil, lang.region
12
+ assert_equal [Locale::Tag::Simple.parse("ja"),
13
+ Locale::Tag::Simple.parse("ja")], lang.candidates
14
+
15
+ assert_equal Locale::Tag::Simple.parse("ja"), lang.to_simple
16
+ assert_equal Locale::Tag::Common.parse("ja"), lang.to_common
17
+ assert_equal Locale::Tag::Rfc.parse("ja"), lang.to_rfc
18
+ assert_equal Locale::Tag::Cldr.parse("ja"), lang.to_cldr
19
+ assert_equal Locale::Tag::Posix.parse("ja"), lang.to_posix
20
+
21
+ lang = Locale::Tag.parse("kok")
22
+ assert_equal Locale::Tag::Simple, lang.class
23
+ assert_equal "kok", lang.language
24
+ assert_equal nil, lang.region
25
+ assert_equal [Locale::Tag::Simple.parse("kok"),
26
+ Locale::Tag::Simple.parse("kok")], lang.candidates
27
+
28
+ assert_equal Locale::Tag::Simple.parse("kok"), lang.to_simple
29
+ assert_equal Locale::Tag::Common.parse("kok"), lang.to_common
30
+ assert_equal Locale::Tag::Rfc.parse("kok"), lang.to_rfc
31
+ assert_equal Locale::Tag::Cldr.parse("kok"), lang.to_cldr
32
+ assert_equal Locale::Tag::Posix.parse("kok"), lang.to_posix
33
+
34
+ lang = Locale::Tag.parse("ja-JP")
35
+ assert_equal Locale::Tag::Simple, lang.class
36
+ assert_equal "ja", lang.language
37
+ assert_equal "JP", lang.region
38
+ assert_equal [Locale::Tag::Simple.parse("ja_JP"),
39
+ Locale::Tag::Simple.parse("ja")], lang.candidates
40
+
41
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
42
+ assert_equal Locale::Tag::Common.parse("ja_JP"), lang.to_common
43
+ assert_equal Locale::Tag::Rfc.parse("ja-JP"), lang.to_rfc
44
+ assert_equal Locale::Tag::Cldr.parse("ja-JP"), lang.to_cldr
45
+ assert_equal Locale::Tag::Posix.parse("ja_JP"), lang.to_posix
46
+
47
+ lang = Locale::Tag.parse("ja_JP")
48
+ assert_equal Locale::Tag::Simple, lang.class
49
+ assert_equal "ja", lang.language
50
+ assert_equal "JP", lang.region
51
+ assert_equal [Locale::Tag::Simple.parse("ja_JP"),
52
+ Locale::Tag::Simple.parse("ja")], lang.candidates
53
+
54
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
55
+ assert_equal Locale::Tag::Common.parse("ja_JP"), lang.to_common
56
+ assert_equal Locale::Tag::Rfc.parse("ja-JP"), lang.to_rfc
57
+ assert_equal Locale::Tag::Cldr.parse("ja-JP"), lang.to_cldr
58
+ assert_equal Locale::Tag::Posix.parse("ja_JP"), lang.to_posix
59
+
60
+ # UN_M.49(Country code)
61
+ lang = Locale::Tag.parse("ja-392")
62
+ assert_equal Locale::Tag::Simple, lang.class
63
+ assert_equal "ja", lang.language
64
+ assert_equal "392", lang.region
65
+ assert_equal [Locale::Tag::Simple.parse("ja_392"),
66
+ Locale::Tag::Simple.parse("ja")], lang.candidates
67
+
68
+ assert_equal Locale::Tag::Simple.parse("ja-392"), lang.to_simple
69
+ assert_equal Locale::Tag::Common.parse("ja-392"), lang.to_common
70
+ assert_equal Locale::Tag::Rfc.parse("ja-392"), lang.to_rfc
71
+ assert_equal Locale::Tag::Cldr.parse("ja-392"), lang.to_cldr
72
+ assert_equal Locale::Tag::Posix.parse("ja_392"), lang.to_posix
73
+
74
+ lang = Locale::Tag.parse("jpn-392")
75
+ assert_equal Locale::Tag::Simple, lang.class
76
+ assert_equal "jpn", lang.language
77
+ assert_equal "392", lang.region
78
+ assert_equal [Locale::Tag::Simple.parse("jpn-392"),
79
+ Locale::Tag::Simple.parse("jpn")], lang.candidates
80
+
81
+ assert_equal Locale::Tag::Simple.parse("jpn-392"), lang.to_simple
82
+ assert_equal Locale::Tag::Common.parse("jpn-392"), lang.to_common
83
+ assert_equal Locale::Tag::Rfc.parse("jpn-392"), lang.to_rfc
84
+ assert_equal Locale::Tag::Cldr.parse("jpn-392"), lang.to_cldr
85
+ assert_equal Locale::Tag::Posix.parse("jpn_392"), lang.to_posix
86
+
87
+ lang = Locale::Tag.parse("es-419")
88
+ assert_equal Locale::Tag::Simple, lang.class
89
+ assert_equal "es", lang.language
90
+ assert_equal "419", lang.region
91
+ assert_equal [Locale::Tag::Simple.parse("es-419"),
92
+ Locale::Tag::Simple.parse("es")], lang.candidates
93
+
94
+ assert_equal Locale::Tag::Simple.parse("es-419"), lang.to_simple
95
+ assert_equal Locale::Tag::Common.parse("es-419"), lang.to_common
96
+ assert_equal Locale::Tag::Rfc.parse("es-419"), lang.to_rfc
97
+ assert_equal Locale::Tag::Cldr.parse("es_419"), lang.to_cldr
98
+ assert_equal Locale::Tag::Posix.parse("es_419"), lang.to_posix
99
+ end
100
+
101
+ def test_simple_writer
102
+ lang = Locale::Tag.parse("ja-JP")
103
+ assert_equal Locale::Tag::Simple, lang.class
104
+ assert_equal "ja_JP", lang.to_s
105
+ assert_equal [Locale::Tag::Simple.parse("ja-JP"),
106
+ Locale::Tag::Simple.parse("ja")], lang.candidates
107
+ lang.language = "en"
108
+ assert_equal "en", lang.language
109
+ assert_equal "en_JP", lang.to_s
110
+ assert_equal [Locale::Tag::Simple.parse("en-JP"),
111
+ Locale::Tag::Simple.parse("en")], lang.candidates
112
+
113
+ lang.region = "US"
114
+ assert_equal "en", lang.language
115
+ assert_equal "US", lang.region
116
+ assert_equal "en_US", lang.to_s
117
+ assert_equal [Locale::Tag::Simple.parse("en-US"),
118
+ Locale::Tag::Simple.parse("en")], lang.candidates
119
+
120
+ end
121
+
122
+ def test_common
123
+ #lang, region, script, variants
124
+
125
+ lang = Locale::Tag.parse("az_Arab")
126
+ assert_equal Locale::Tag::Common, lang.class
127
+ assert_equal "az", lang.language
128
+ assert_equal nil, lang.region
129
+ assert_equal "Arab", lang.script
130
+ assert_equal [Locale::Tag::Common.parse("az_Arab"),
131
+ Locale::Tag::Common.parse("az_Arab"),
132
+ Locale::Tag::Common.parse("az"),
133
+ Locale::Tag::Common.parse("az"),
134
+ Locale::Tag::Common.parse("az_Arab"),
135
+ Locale::Tag::Common.parse("az_Arab"),
136
+ Locale::Tag::Common.parse("az"),
137
+ Locale::Tag::Common.parse("az"),
138
+ ], lang.candidates
139
+
140
+ assert_equal Locale::Tag::Simple.parse("az"), lang.to_simple
141
+ assert_equal Locale::Tag::Common.parse("az_Arab"), lang.to_common
142
+ assert_equal Locale::Tag::Rfc.parse("az-Arab"), lang.to_rfc
143
+ assert_equal Locale::Tag::Cldr.parse("az_Arab"), lang.to_cldr
144
+ assert_equal Locale::Tag::Posix.parse("az"), lang.to_posix
145
+
146
+ lang = Locale::Tag.parse("en_Latn_US_NYNORSK")
147
+ assert_equal Locale::Tag::Common, lang.class
148
+ assert_equal "en", lang.language
149
+ assert_equal "US", lang.region
150
+ assert_equal ["NYNORSK"], lang.variants
151
+ assert_equal [Locale::Tag::Common.parse("en_Latn_US_NYNORSK"),
152
+ Locale::Tag::Common.parse("en_Latn_US"),
153
+ Locale::Tag::Common.parse("en_US_NYNORSK"),
154
+ Locale::Tag::Common.parse("en_US"),
155
+ Locale::Tag::Common.parse("en_Latn_NYNORSK"),
156
+ Locale::Tag::Common.parse("en_Latn"),
157
+ Locale::Tag::Common.parse("en_NYNORSK"),
158
+ Locale::Tag::Common.parse("en")], lang.candidates
159
+
160
+
161
+ assert_equal Locale::Tag::Simple.parse("en-US"), lang.to_simple
162
+ assert_equal Locale::Tag::Common.parse("en_Latn_US_NYNORSK"), lang.to_common
163
+ assert_equal Locale::Tag::Rfc.parse("en-Latn-US-NYNORSK"), lang.to_rfc
164
+ assert_equal Locale::Tag::Cldr.parse("en_Latn_US_NYNORSK"), lang.to_cldr
165
+ assert_equal Locale::Tag::Posix.parse("en_US@NYNORSK"), lang.to_posix
166
+
167
+ lang = Locale::Tag.parse("uz-Cyrl")
168
+ assert_equal Locale::Tag::Common, lang.class
169
+ assert_equal "uz", lang.language
170
+ assert_equal nil, lang.region
171
+ assert_equal "Cyrl", lang.script
172
+ assert_equal [Locale::Tag::Common.parse("uz-Cyrl"),
173
+ Locale::Tag::Common.parse("uz-Cyrl"),
174
+ Locale::Tag::Common.parse("uz"),
175
+ Locale::Tag::Common.parse("uz"),
176
+ Locale::Tag::Common.parse("uz-Cyrl"),
177
+ Locale::Tag::Common.parse("uz-Cyrl"),
178
+ Locale::Tag::Common.parse("uz"),
179
+ Locale::Tag::Common.parse("uz"),
180
+ ], lang.candidates
181
+
182
+ assert_equal Locale::Tag::Simple.parse("uz"), lang.to_simple
183
+ assert_equal Locale::Tag::Common.parse("uz_Cyrl"), lang.to_common
184
+ assert_equal Locale::Tag::Rfc.parse("uz-Cyrl"), lang.to_rfc
185
+ assert_equal Locale::Tag::Cldr.parse("uz_Cyrl"), lang.to_cldr
186
+ assert_equal Locale::Tag::Posix.parse("uz"), lang.to_posix
187
+
188
+ lang = Locale::Tag.parse("ja-Kana-JP")
189
+ assert_equal Locale::Tag::Common, lang.class
190
+ assert_equal "ja", lang.language
191
+ assert_equal "JP", lang.region
192
+ assert_equal "Kana", lang.script
193
+ assert_equal [Locale::Tag::Common.parse("ja-Kana-JP"),
194
+ Locale::Tag::Common.parse("ja-Kana-JP"),
195
+ Locale::Tag::Common.parse("ja-JP"),
196
+ Locale::Tag::Common.parse("ja-JP"),
197
+ Locale::Tag::Common.parse("ja-Kana"),
198
+ Locale::Tag::Common.parse("ja-Kana"),
199
+ Locale::Tag::Common.parse("ja"),
200
+ Locale::Tag::Common.parse("ja")], lang.candidates
201
+
202
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
203
+ assert_equal Locale::Tag::Common.parse("ja_Kana_JP"), lang.to_common
204
+ assert_equal Locale::Tag::Rfc.parse("ja-Kana-JP"), lang.to_rfc
205
+ assert_equal Locale::Tag::Cldr.parse("ja_Kana_JP"), lang.to_cldr
206
+ assert_equal Locale::Tag::Posix.parse("ja_JP"), lang.to_posix
207
+
208
+
209
+ lang = Locale::Tag.parse("jpn-Hira-JP")
210
+ assert_equal Locale::Tag::Common, lang.class
211
+ assert_equal "jpn", lang.language
212
+ assert_equal "JP", lang.region
213
+ assert_equal "Hira", lang.script
214
+ assert_equal [Locale::Tag::Common.parse("jpn-Hira-JP"),
215
+ Locale::Tag::Common.parse("jpn-Hira-JP"),
216
+ Locale::Tag::Common.parse("jpn-JP"),
217
+ Locale::Tag::Common.parse("jpn-JP"),
218
+ Locale::Tag::Common.parse("jpn-Hira"),
219
+ Locale::Tag::Common.parse("jpn-Hira"),
220
+ Locale::Tag::Common.parse("jpn"),
221
+ Locale::Tag::Common.parse("jpn")], lang.candidates
222
+
223
+ assert_equal Locale::Tag::Simple.parse("jpn_JP"), lang.to_simple
224
+ assert_equal Locale::Tag::Common.parse("jpn_Hira_JP"), lang.to_common
225
+ assert_equal Locale::Tag::Rfc.parse("jpn-Hira-JP"), lang.to_rfc
226
+ assert_equal Locale::Tag::Cldr.parse("jpn_Hira_JP"), lang.to_cldr
227
+ assert_equal Locale::Tag::Posix.parse("jpn_JP"), lang.to_posix
228
+
229
+ lang = Locale::Tag.parse("jpn-Hira-392")
230
+ assert_equal Locale::Tag::Common, lang.class
231
+ assert_equal "jpn", lang.language
232
+ assert_equal "392", lang.region
233
+ assert_equal "Hira", lang.script
234
+ assert_equal [Locale::Tag::Common.parse("jpn_Hira_392"),
235
+ Locale::Tag::Common.parse("jpn_Hira_392"),
236
+ Locale::Tag::Common.parse("jpn_392"),
237
+ Locale::Tag::Common.parse("jpn_392"),
238
+ Locale::Tag::Common.parse("jpn_Hira"),
239
+ Locale::Tag::Common.parse("jpn_Hira"),
240
+ Locale::Tag::Common.parse("jpn"),
241
+ Locale::Tag::Common.parse("jpn")], lang.candidates
242
+
243
+
244
+ assert_equal Locale::Tag::Simple.parse("jpn_392"), lang.to_simple
245
+ assert_equal Locale::Tag::Common.parse("jpn_Hira_392"), lang.to_common
246
+ assert_equal Locale::Tag::Rfc.parse("jpn-Hira-392"), lang.to_rfc
247
+ assert_equal Locale::Tag::Cldr.parse("jpn_Hira_392"), lang.to_cldr
248
+ assert_equal Locale::Tag::Posix.parse("jpn_392"), lang.to_posix
249
+
250
+ # Variants
251
+ lang = Locale::Tag.parse("ja-osaka")
252
+ assert_equal Locale::Tag::Common, lang.class
253
+ assert_equal "ja", lang.language
254
+ assert_equal nil, lang.region
255
+ assert_equal nil, lang.script
256
+ assert_equal ["osaka"], lang.variants
257
+
258
+ assert_equal [Locale::Tag::Common.parse("ja-osaka"),
259
+ Locale::Tag::Common.parse("ja"),
260
+ Locale::Tag::Common.parse("ja-osaka"),
261
+ Locale::Tag::Common.parse("ja"),
262
+ Locale::Tag::Common.parse("ja-osaka"),
263
+ Locale::Tag::Common.parse("ja"),
264
+ Locale::Tag::Common.parse("ja-osaka"),
265
+ Locale::Tag::Common.parse("ja")
266
+ ], lang.candidates
267
+
268
+ assert_equal Locale::Tag::Simple.parse("ja"), lang.to_simple
269
+ assert_equal Locale::Tag::Common.parse("ja-osaka"), lang.to_common
270
+ assert_equal Locale::Tag::Rfc.parse("ja-osaka"), lang.to_rfc
271
+ assert_equal Locale::Tag::Cldr.parse("ja_OSAKA"), lang.to_cldr
272
+ assert_equal Locale::Tag::Posix.parse("ja@osaka"), lang.to_posix
273
+
274
+
275
+ lang = Locale::Tag.parse("ja-JP-osaka")
276
+ assert_equal Locale::Tag::Common, lang.class
277
+ assert_equal "ja", lang.language
278
+ assert_equal "JP", lang.region
279
+ assert_equal nil, lang.script
280
+ assert_equal ["osaka"], lang.variants
281
+
282
+ assert_equal [Locale::Tag::Common.parse("ja_JP_osaka"),
283
+ Locale::Tag::Common.parse("ja_JP"),
284
+ Locale::Tag::Common.parse("ja_JP_osaka"),
285
+ Locale::Tag::Common.parse("ja_JP"),
286
+ Locale::Tag::Common.parse("ja_osaka"),
287
+ Locale::Tag::Common.parse("ja"),
288
+ Locale::Tag::Common.parse("ja_osaka"),
289
+ Locale::Tag::Common.parse("ja")
290
+ ], lang.candidates
291
+
292
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
293
+ assert_equal Locale::Tag::Common.parse("ja_JP_osaka"), lang.to_common
294
+ assert_equal Locale::Tag::Rfc.parse("ja-JP-osaka"), lang.to_rfc
295
+ assert_equal Locale::Tag::Cldr.parse("ja_JP_OSAKA"), lang.to_cldr
296
+ assert_equal Locale::Tag::Posix.parse("ja_JP@osaka"), lang.to_posix
297
+
298
+ #5 length
299
+ lang = Locale::Tag.parse("ja-Kana-JP-osaka")
300
+ assert_equal Locale::Tag::Common, lang.class
301
+ assert_equal "ja", lang.language
302
+ assert_equal "JP", lang.region
303
+ assert_equal "Kana", lang.script
304
+ assert_equal ["osaka"], lang.variants
305
+
306
+ assert_equal [Locale::Tag::Common.parse("ja-Kana-JP-osaka"),
307
+ Locale::Tag::Common.parse("ja-Kana-JP"),
308
+ Locale::Tag::Common.parse("ja-JP-osaka"),
309
+ Locale::Tag::Common.parse("ja-JP"),
310
+ Locale::Tag::Common.parse("ja-Kana-osaka"),
311
+ Locale::Tag::Common.parse("ja-Kana"),
312
+ Locale::Tag::Common.parse("ja-osaka"),
313
+ Locale::Tag::Common.parse("ja")
314
+ ], lang.candidates
315
+
316
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
317
+ assert_equal Locale::Tag::Common.parse("ja_Kana-JP_osaka"), lang.to_common
318
+ assert_equal Locale::Tag::Rfc.parse("ja-Kana-JP-osaka"), lang.to_rfc
319
+ assert_equal Locale::Tag::Cldr.parse("ja_Kana_JP_OSAKA"), lang.to_cldr
320
+ assert_equal Locale::Tag::Posix.parse("ja_JP@osaka"), lang.to_posix
321
+
322
+ #middle length
323
+ lang = Locale::Tag.parse("ja-Kana-JP-aomori")
324
+ assert_equal Locale::Tag::Common, lang.class
325
+ assert_equal "ja", lang.language
326
+ assert_equal "JP", lang.region
327
+ assert_equal "Kana", lang.script
328
+ assert_equal ["aomori"], lang.variants
329
+
330
+ assert_equal [Locale::Tag::Common.parse("ja-Kana-JP-aomori"),
331
+ Locale::Tag::Common.parse("ja-Kana-JP"),
332
+ Locale::Tag::Common.parse("ja-JP-aomori"),
333
+ Locale::Tag::Common.parse("ja-JP"),
334
+ Locale::Tag::Common.parse("ja-Kana-aomori"),
335
+ Locale::Tag::Common.parse("ja-Kana"),
336
+ Locale::Tag::Common.parse("ja-aomori"),
337
+ Locale::Tag::Common.parse("ja")
338
+ ], lang.candidates
339
+
340
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
341
+ assert_equal Locale::Tag::Common.parse("ja_Kana-JP_aomori"), lang.to_common
342
+ assert_equal Locale::Tag::Rfc.parse("ja-Kana-JP-aomori"), lang.to_rfc
343
+ assert_equal Locale::Tag::Cldr.parse("ja_Kana_JP_AOMORI"), lang.to_cldr
344
+ assert_equal Locale::Tag::Posix.parse("ja_JP@aomori"), lang.to_posix
345
+
346
+ #8 length
347
+ lang = Locale::Tag.parse("ja-Kana-JP-hokuriku")
348
+ assert_equal Locale::Tag::Common, lang.class
349
+ assert_equal "ja", lang.language
350
+ assert_equal "JP", lang.region
351
+ assert_equal "Kana", lang.script
352
+ assert_equal ["hokuriku"], lang.variants
353
+
354
+ assert_equal [Locale::Tag::Common.parse("ja-Kana-JP-hokuriku"),
355
+ Locale::Tag::Common.parse("ja-Kana-JP"),
356
+ Locale::Tag::Common.parse("ja-JP-hokuriku"),
357
+ Locale::Tag::Common.parse("ja-JP"),
358
+ Locale::Tag::Common.parse("ja-Kana-hokuriku"),
359
+ Locale::Tag::Common.parse("ja-Kana"),
360
+ Locale::Tag::Common.parse("ja-hokuriku"),
361
+ Locale::Tag::Common.parse("ja")
362
+ ], lang.candidates
363
+
364
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
365
+ assert_equal Locale::Tag::Common.parse("ja_Kana-JP_hokuriku"), lang.to_common
366
+ assert_equal Locale::Tag::Rfc.parse("ja-Kana-JP-hokuriku"), lang.to_rfc
367
+ assert_equal Locale::Tag::Cldr.parse("ja_Kana_JP_HOKURIKU"), lang.to_cldr
368
+ assert_equal Locale::Tag::Posix.parse("ja_JP@hokuriku"), lang.to_posix
369
+
370
+ #1 digit and 3 alpha
371
+ lang = Locale::Tag.parse("ja-Kana-JP-0abc")
372
+ assert_equal Locale::Tag::Common, lang.class
373
+ assert_equal "ja", lang.language
374
+ assert_equal "JP", lang.region
375
+ assert_equal "Kana", lang.script
376
+ assert_equal ["0abc"], lang.variants
377
+
378
+ assert_equal [Locale::Tag::Common.parse("ja-Kana-JP-0abc"),
379
+ Locale::Tag::Common.parse("ja-Kana-JP"),
380
+ Locale::Tag::Common.parse("ja-JP-0abc"),
381
+ Locale::Tag::Common.parse("ja-JP"),
382
+ Locale::Tag::Common.parse("ja-Kana-0abc"),
383
+ Locale::Tag::Common.parse("ja-Kana"),
384
+ Locale::Tag::Common.parse("ja-0abc"),
385
+ Locale::Tag::Common.parse("ja")
386
+ ], lang.candidates
387
+
388
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
389
+ assert_equal Locale::Tag::Common.parse("ja_Kana-JP_0abc"), lang.to_common
390
+ assert_equal Locale::Tag::Rfc.parse("ja-Kana-JP-0abc"), lang.to_rfc
391
+ assert_equal Locale::Tag::Cldr.parse("ja_Kana_JP_0ABC"), lang.to_cldr
392
+ assert_equal Locale::Tag::Posix.parse("ja_JP@0abc"), lang.to_posix
393
+
394
+ #4 digits
395
+ lang = Locale::Tag.parse("de-CH-1996")
396
+ assert_equal Locale::Tag::Common, lang.class
397
+ assert_equal "de", lang.language
398
+ assert_equal "CH", lang.region
399
+ assert_equal nil, lang.script
400
+ assert_equal ["1996"], lang.variants
401
+ assert_equal [Locale::Tag::Common.parse("de_CH_1996"),
402
+ Locale::Tag::Common.parse("de_CH"),
403
+ Locale::Tag::Common.parse("de_CH_1996"),
404
+ Locale::Tag::Common.parse("de_CH"),
405
+ Locale::Tag::Common.parse("de_1996"),
406
+ Locale::Tag::Common.parse("de"),
407
+ Locale::Tag::Common.parse("de_1996"),
408
+ Locale::Tag::Common.parse("de"),
409
+ ], lang.candidates
410
+
411
+ assert_equal Locale::Tag::Simple.parse("de-CH"), lang.to_simple
412
+ assert_equal Locale::Tag::Common.parse("de-CH-1996"), lang.to_common
413
+ assert_equal Locale::Tag::Rfc.parse("de-CH-1996"), lang.to_rfc
414
+ assert_equal Locale::Tag::Cldr.parse("de_CH_1996"), lang.to_cldr
415
+ assert_equal Locale::Tag::Posix.parse("de_CH@1996"), lang.to_posix
416
+
417
+ #Plural
418
+ lang = Locale::Tag.parse("ja-Kana-JP-hokuriku-aomori")
419
+ assert_equal Locale::Tag::Common, lang.class
420
+ assert_equal "ja", lang.language
421
+ assert_equal "JP", lang.region
422
+ assert_equal "Kana", lang.script
423
+ assert_equal ["hokuriku", "aomori"], lang.variants
424
+
425
+ assert_equal [Locale::Tag::Common.parse("ja-Kana-JP-hokuriku-aomori"),
426
+ Locale::Tag::Common.parse("ja-Kana-JP"),
427
+ Locale::Tag::Common.parse("ja-JP-hokuriku-aomori"),
428
+ Locale::Tag::Common.parse("ja-JP"),
429
+ Locale::Tag::Common.parse("ja-Kana-hokuriku-aomori"),
430
+ Locale::Tag::Common.parse("ja-Kana"),
431
+ Locale::Tag::Common.parse("ja-hokuriku-aomori"),
432
+ Locale::Tag::Common.parse("ja"),
433
+ ], lang.candidates
434
+
435
+ assert_equal Locale::Tag::Simple.parse("ja-JP"), lang.to_simple
436
+ assert_equal Locale::Tag::Common.parse("ja-Kana-JP-hokuriku-aomori"), lang.to_common
437
+ assert_equal Locale::Tag::Rfc.parse("ja-Kana-JP-hokuriku-aomori"), lang.to_rfc
438
+ assert_equal Locale::Tag::Cldr.parse("ja-Kana-JP_HOKURIKU_AOMORI"), lang.to_cldr
439
+ assert_equal Locale::Tag::Posix.parse("ja_JP@hokuriku-aomori"), lang.to_posix
440
+
441
+ #cases
442
+ lang = Locale::Tag.parse("mn-Cyrl-MN")
443
+ assert_equal Locale::Tag::Common, lang.class
444
+ assert_equal "mn", lang.language
445
+ assert_equal "MN", lang.region
446
+ assert_equal "Cyrl", lang.script
447
+
448
+ assert_equal [Locale::Tag::Common.parse("mn-Cyrl-MN"),
449
+ Locale::Tag::Common.parse("mn-Cyrl-MN"),
450
+ Locale::Tag::Common.parse("mn-MN"),
451
+ Locale::Tag::Common.parse("mn-MN"),
452
+ Locale::Tag::Common.parse("mn-Cyrl"),
453
+ Locale::Tag::Common.parse("mn-Cyrl"),
454
+ Locale::Tag::Common.parse("mn"),
455
+ Locale::Tag::Common.parse("mn"),
456
+ ], lang.candidates
457
+
458
+ assert_equal Locale::Tag::Simple.parse("mn_MN"), lang.to_simple
459
+ assert_equal Locale::Tag::Common.parse("mn_Cyrl_MN"), lang.to_common
460
+ assert_equal Locale::Tag::Rfc.parse("mn-Cyrl-MN"), lang.to_rfc
461
+ assert_equal Locale::Tag::Cldr.parse("mn-Cyrl-MN"), lang.to_cldr
462
+ assert_equal Locale::Tag::Posix.parse("mn_MN"), lang.to_posix
463
+
464
+ lang = Locale::Tag.parse("mN-cYrL-Mn")
465
+ assert_equal Locale::Tag::Common, lang.class
466
+ assert_equal "mn", lang.language
467
+ assert_equal "MN", lang.region
468
+ assert_equal "Cyrl", lang.script
469
+
470
+ assert_equal Locale::Tag::Simple.parse("mn_MN"), lang.to_simple
471
+ assert_equal Locale::Tag::Common.parse("mn_Cyrl_MN"), lang.to_common
472
+ assert_equal Locale::Tag::Rfc.parse("mn-Cyrl-MN"), lang.to_rfc
473
+ assert_equal Locale::Tag::Cldr.parse("mn-Cyrl-MN"), lang.to_cldr
474
+ assert_equal Locale::Tag::Posix.parse("mn_MN"), lang.to_posix
475
+
476
+ lang = Locale::Tag.parse("MN-cYRL-mn")
477
+ assert_equal Locale::Tag::Common, lang.class
478
+ assert_equal "mn", lang.language
479
+ assert_equal "MN", lang.region
480
+ assert_equal "Cyrl", lang.script
481
+
482
+ assert_equal Locale::Tag::Simple.parse("mn_MN"), lang.to_simple
483
+ assert_equal Locale::Tag::Common.parse("mn_Cyrl_MN"), lang.to_common
484
+ assert_equal Locale::Tag::Rfc.parse("mn-Cyrl-MN"), lang.to_rfc
485
+ assert_equal Locale::Tag::Cldr.parse("mn-Cyrl-MN"), lang.to_cldr
486
+ assert_equal Locale::Tag::Posix.parse("mn_MN"), lang.to_posix
487
+
488
+ lang = Locale::Tag.parse("zh-Latn-CN-variant1")
489
+ assert_equal Locale::Tag::Common, lang.class
490
+ assert_equal "zh", lang.language
491
+ assert_equal "CN", lang.region
492
+ assert_equal "Latn", lang.script
493
+ assert_equal ["variant1"], lang.variants
494
+
495
+ assert_equal [Locale::Tag::Common.parse("zh-Latn-CN-variant1"),
496
+ Locale::Tag::Common.parse("zh-Latn-CN"),
497
+ Locale::Tag::Common.parse("zh-CN-variant1"),
498
+ Locale::Tag::Common.parse("zh-CN"),
499
+ Locale::Tag::Common.parse("zh-Latn-variant1"),
500
+ Locale::Tag::Common.parse("zh-Latn"),
501
+ Locale::Tag::Common.parse("zh-variant1"),
502
+ Locale::Tag::Common.parse("zh"),
503
+ ], lang.candidates
504
+
505
+ assert_equal Locale::Tag::Simple.parse("zh_CN"), lang.to_simple
506
+ assert_equal Locale::Tag::Common.parse("zh_Latn_CN-variant1"), lang.to_common
507
+ assert_equal Locale::Tag::Rfc.parse("zh-Latn-CN-variant1"), lang.to_rfc
508
+ assert_equal Locale::Tag::Cldr.parse("zh-Latn-CN_VARIANT1"), lang.to_cldr
509
+ assert_equal Locale::Tag::Posix.parse("zh_CN@variant1"), lang.to_posix
510
+
511
+ # RFC3066 compatible
512
+ lang = Locale::Tag.parse("ja-jp-mac")
513
+ assert_equal Locale::Tag::Common, lang.class
514
+ assert_equal "ja", lang.language
515
+ assert_equal "JP", lang.region
516
+ assert_equal nil, lang.script
517
+ assert_equal [Locale::Tag::Common.parse("ja_JP_mac"),
518
+ Locale::Tag::Common.parse("ja_JP"),
519
+ Locale::Tag::Common.parse("ja_JP_mac"),
520
+ Locale::Tag::Common.parse("ja_JP"),
521
+ Locale::Tag::Common.parse("ja_mac"),
522
+ Locale::Tag::Common.parse("ja"),
523
+ Locale::Tag::Common.parse("ja_mac"),
524
+ Locale::Tag::Common.parse("ja"),
525
+ ], lang.candidates
526
+
527
+ end
528
+
529
+ def test_common_writer
530
+ lang = Locale::Tag.parse("zh-Latn-CN-variant1")
531
+ lang.language = "ja"
532
+ assert_equal "ja_Latn_CN_variant1", lang.to_s
533
+ lang.script = "Hira"
534
+ assert_equal "ja_Hira_CN_variant1", lang.to_s
535
+ lang.region = "JP"
536
+ assert_equal "ja_Hira_JP_variant1", lang.to_s
537
+ lang.variants = ["variant1", "variant2"]
538
+ assert_equal "ja_Hira_JP_variant1_variant2", lang.to_s
539
+
540
+ assert_equal [Locale::Tag::Common.parse("ja-Hira-JP-variant1-variant2"),
541
+ Locale::Tag::Common.parse("ja-Hira-JP"),
542
+ Locale::Tag::Common.parse("ja-JP-variant1-variant2"),
543
+ Locale::Tag::Common.parse("ja-JP"),
544
+ Locale::Tag::Common.parse("ja-Hira-variant1-variant2"),
545
+ Locale::Tag::Common.parse("ja-Hira"),
546
+ Locale::Tag::Common.parse("ja-variant1-variant2"),
547
+ Locale::Tag::Common.parse("ja"),
548
+ ], lang.candidates
549
+
550
+ end
551
+
552
+ def test_rfc
553
+ # extension
554
+ lang = Locale::Tag.parse("ja-Kana-JP-0abc-y-aa-z-bbccdd-b-nnnnnnnn")
555
+ assert_equal Locale::Tag::Rfc, lang.class
556
+ assert_equal "ja", lang.language
557
+ assert_equal "JP", lang.region
558
+ assert_equal "Kana", lang.script
559
+ assert_equal ["0abc"], lang.variants
560
+ assert_equal ["y-aa", "z-bbccdd", "b-nnnnnnnn"], lang.extensions
561
+
562
+ assert_equal [Locale::Tag::Rfc.parse("ja-Kana-JP-0abc"),
563
+ Locale::Tag::Rfc.parse("ja-Kana-JP"),
564
+ Locale::Tag::Rfc.parse("ja-JP-0abc"),
565
+ Locale::Tag::Rfc.parse("ja-JP"),
566
+ Locale::Tag::Rfc.parse("ja-Kana-0abc"),
567
+ Locale::Tag::Rfc.parse("ja-Kana"),
568
+ Locale::Tag::Rfc.parse("ja-0abc"),
569
+ Locale::Tag::Rfc.parse("ja"),
570
+ ], lang.candidates
571
+
572
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
573
+ assert_equal Locale::Tag::Common.parse("ja-Kana-JP-0abc"), lang.to_common
574
+ assert_equal Locale::Tag::Rfc.parse("ja-Kana-JP-0abc-y-aa-z-bbccdd-b-nnnnnnnn"), lang.to_rfc
575
+ assert_equal Locale::Tag::Cldr.parse("ja_Kana_JP_0abc"), lang.to_cldr
576
+ assert_equal Locale::Tag::Posix.parse("ja_JP@0abc"), lang.to_posix
577
+
578
+ lang = Locale::Tag.parse("ja-JP-0abc-y-aa-z-bbccdd-b-xxxnnnnn")
579
+ assert_equal Locale::Tag::Rfc, lang.class
580
+ assert_equal "ja", lang.language
581
+ assert_equal "JP", lang.region
582
+ assert_equal nil, lang.script
583
+ assert_equal ["0abc"], lang.variants
584
+ assert_equal ["y-aa", "z-bbccdd", "b-xxxnnnnn"], lang.extensions
585
+
586
+ assert_equal [Locale::Tag::Rfc.parse("ja-JP-0abc"),
587
+ Locale::Tag::Rfc.parse("ja-JP"),
588
+ Locale::Tag::Rfc.parse("ja-JP-0abc"),
589
+ Locale::Tag::Rfc.parse("ja-JP"),
590
+ Locale::Tag::Rfc.parse("ja-0abc"),
591
+ Locale::Tag::Rfc.parse("ja"),
592
+ Locale::Tag::Rfc.parse("ja-0abc"),
593
+ Locale::Tag::Rfc.parse("ja"),
594
+ ], lang.candidates
595
+
596
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
597
+ assert_equal Locale::Tag::Common.parse("ja-JP-0abc"), lang.to_common
598
+ assert_equal Locale::Tag::Rfc.parse("ja-JP-0abc-y-aa-z-bbccdd-b-xxxnnnnn"), lang.to_rfc
599
+ assert_equal Locale::Tag::Cldr.parse("ja_JP_0abc"), lang.to_cldr
600
+ assert_equal Locale::Tag::Posix.parse("ja_JP@0abc"), lang.to_posix
601
+
602
+ lang = Locale::Tag.parse("ja-y-aa-z-bbccdd-b-xxnnnnn")
603
+ assert_equal Locale::Tag::Rfc, lang.class
604
+ assert_equal "ja", lang.language
605
+ assert_equal nil, lang.region
606
+ assert_equal nil, lang.script
607
+ assert_equal [], lang.variants
608
+ assert_equal ["y-aa", "z-bbccdd", "b-xxnnnnn"], lang.extensions
609
+
610
+ assert_equal [Locale::Tag::Rfc.parse("ja"),
611
+ Locale::Tag::Rfc.parse("ja"),
612
+ Locale::Tag::Rfc.parse("ja"),
613
+ Locale::Tag::Rfc.parse("ja"),
614
+ Locale::Tag::Rfc.parse("ja"),
615
+ Locale::Tag::Rfc.parse("ja"),
616
+ Locale::Tag::Rfc.parse("ja"),
617
+ Locale::Tag::Rfc.parse("ja"),
618
+ ], lang.candidates
619
+
620
+ assert_equal Locale::Tag::Simple.parse("ja"), lang.to_simple
621
+ assert_equal Locale::Tag::Common.parse("ja"), lang.to_common
622
+ assert_equal Locale::Tag::Rfc.parse("ja-y-aa-z-bbccdd-b-xxnnnnn"), lang.to_rfc
623
+ assert_equal Locale::Tag::Cldr.parse("ja"), lang.to_cldr
624
+ assert_equal Locale::Tag::Posix.parse("ja"), lang.to_posix
625
+
626
+ lang = Locale::Tag.parse("zh-Latn-CN-variant1-a-extend1")
627
+ assert_equal Locale::Tag::Rfc, lang.class
628
+ assert_equal "zh", lang.language
629
+ assert_equal "CN", lang.region
630
+ assert_equal "Latn", lang.script
631
+ assert_equal ["variant1"], lang.variants
632
+ assert_equal ["a-extend1"], lang.extensions
633
+ assert_equal nil, lang.privateuse
634
+
635
+ assert_equal [Locale::Tag::Rfc.parse("zh-Latn-CN-variant1"),
636
+ Locale::Tag::Rfc.parse("zh-Latn-CN"),
637
+ Locale::Tag::Rfc.parse("zh-CN-variant1"),
638
+ Locale::Tag::Rfc.parse("zh-CN"),
639
+ Locale::Tag::Rfc.parse("zh-Latn-variant1"),
640
+ Locale::Tag::Rfc.parse("zh-Latn"),
641
+ Locale::Tag::Rfc.parse("zh-variant1"),
642
+ Locale::Tag::Rfc.parse("zh"),
643
+ ], lang.candidates
644
+
645
+ assert_equal Locale::Tag::Simple.parse("zh_CN"), lang.to_simple
646
+ assert_equal Locale::Tag::Common.parse("zh-Latn-CN_variant1"), lang.to_common
647
+ assert_equal Locale::Tag::Rfc.parse("zh-Latn-CN-variant1-a-extend1"), lang.to_rfc
648
+ assert_equal Locale::Tag::Cldr.parse("zh_Latn_CN_VARIANT1"), lang.to_cldr
649
+ assert_equal Locale::Tag::Posix.parse("zh_CN@variant1"), lang.to_posix
650
+
651
+ #Privateuse
652
+ lang = Locale::Tag.parse("zh-Latn-CN-variant1-a-extend1-x-wadegile-private1")
653
+ assert_equal Locale::Tag::Rfc, lang.class
654
+ assert_equal "zh", lang.language
655
+ assert_equal "CN", lang.region
656
+ assert_equal "Latn", lang.script
657
+ assert_equal ["variant1"], lang.variants
658
+ assert_equal ["a-extend1"], lang.extensions
659
+ assert_equal "x-wadegile-private1", lang.privateuse
660
+
661
+ assert_equal [Locale::Tag::Rfc.parse("zh-Latn-CN-variant1"),
662
+ Locale::Tag::Rfc.parse("zh-Latn-CN"),
663
+ Locale::Tag::Rfc.parse("zh-CN-variant1"),
664
+ Locale::Tag::Rfc.parse("zh-CN"),
665
+ Locale::Tag::Rfc.parse("zh-Latn-variant1"),
666
+ Locale::Tag::Rfc.parse("zh-Latn"),
667
+ Locale::Tag::Rfc.parse("zh-variant1"),
668
+ Locale::Tag::Rfc.parse("zh"),
669
+ ], lang.candidates
670
+
671
+ assert_equal Locale::Tag::Simple.parse("zh_CN"), lang.to_simple
672
+ assert_equal Locale::Tag::Common.parse("zh-Latn-CN_variant1"), lang.to_common
673
+ assert_equal Locale::Tag::Rfc.parse("zh-Latn-CN-variant1-a-extend1-x-wadegile-private1"), lang.to_rfc
674
+ assert_equal Locale::Tag::Cldr.parse("zh_Latn_CN_VARIANT1"), lang.to_cldr
675
+ assert_equal Locale::Tag::Posix.parse("zh_CN@variant1"), lang.to_posix
676
+
677
+ #Privateuse with x-ldml (CLDR conversion)
678
+ lang = Locale::Tag.parse("en-US-x-ldml-POSIX-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar")
679
+ assert_equal Locale::Tag::Rfc, lang.class
680
+ assert_equal "en", lang.language
681
+ assert_equal "US", lang.region
682
+ assert_equal ["POSIX"], lang.variants
683
+ assert_equal ["k-calendar-islamic", "k-collatio-traditio", "k-colStren-secondar"], lang.extensions
684
+ assert_equal "x-ldml-POSIX-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar", lang.privateuse
685
+
686
+ assert_equal [Locale::Tag::Rfc.parse("en-US-POSIX"),
687
+ Locale::Tag::Rfc.parse("en-US"),
688
+ Locale::Tag::Rfc.parse("en-US-POSIX"),
689
+ Locale::Tag::Rfc.parse("en-US"),
690
+ Locale::Tag::Rfc.parse("en-POSIX"),
691
+ Locale::Tag::Rfc.parse("en"),
692
+ Locale::Tag::Rfc.parse("en-POSIX"),
693
+ Locale::Tag::Rfc.parse("en"),
694
+ ], lang.candidates
695
+
696
+ assert_equal Locale::Tag::Simple.parse("en_US"), lang.to_simple
697
+ assert_equal Locale::Tag::Common.parse("en-US_POSIX"), lang.to_common
698
+ assert_equal Locale::Tag::Rfc.parse("en-US-x-ldml-POSIX-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar"), lang.to_rfc
699
+ assert_equal Locale::Tag::Cldr.parse("en_US_POSIX@calendar=islamic;collatio=traditio;colStren=secondar"), lang.to_cldr
700
+ assert_equal Locale::Tag::Posix.parse("en_US@POSIX"), lang.to_posix
701
+
702
+ lang = Locale::Tag.parse("en-US-x-ldml-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar")
703
+ assert_equal Locale::Tag::Rfc, lang.class
704
+ assert_equal "en", lang.language
705
+ assert_equal "US", lang.region
706
+ assert_equal [], lang.variants
707
+ assert_equal ["k-calendar-islamic", "k-collatio-traditio", "k-colStren-secondar"], lang.extensions
708
+ assert_equal "x-ldml-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar", lang.privateuse
709
+
710
+ assert_equal [Locale::Tag::Rfc.parse("en-US"),
711
+ Locale::Tag::Rfc.parse("en-US"),
712
+ Locale::Tag::Rfc.parse("en-US"),
713
+ Locale::Tag::Rfc.parse("en-US"),
714
+ Locale::Tag::Rfc.parse("en"),
715
+ Locale::Tag::Rfc.parse("en"),
716
+ Locale::Tag::Rfc.parse("en"),
717
+ Locale::Tag::Rfc.parse("en"),
718
+ ], lang.candidates
719
+
720
+ assert_equal Locale::Tag::Simple.parse("en_US"), lang.to_simple
721
+ assert_equal Locale::Tag::Common.parse("en-US"), lang.to_common
722
+ assert_equal Locale::Tag::Rfc.parse("en-US-x-ldml-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar"), lang.to_rfc
723
+ assert_equal Locale::Tag::Cldr.parse("en_US@calendar=islamic;collatio=traditio;colStren=secondar"), lang.to_cldr
724
+ assert_equal Locale::Tag::Posix.parse("en_US"), lang.to_posix
725
+ end
726
+
727
+ def test_rfc_writer
728
+ lang = Locale::Tag.parse("zh-Latn-CN-variant1-a-extend1-x-wadegile-private1")
729
+ lang.language = "ja"
730
+ assert_equal "ja-Latn-CN-variant1-a-extend1-x-wadegile-private1", lang.to_s
731
+ lang.script = "Hira"
732
+ assert_equal "ja-Hira-CN-variant1-a-extend1-x-wadegile-private1", lang.to_s
733
+ lang.region = "JP"
734
+ assert_equal "ja-Hira-JP-variant1-a-extend1-x-wadegile-private1", lang.to_s
735
+ lang.variants = ["variant2"]
736
+ assert_equal "ja-Hira-JP-variant2-a-extend1-x-wadegile-private1", lang.to_s
737
+ lang.extensions = ["b-extend2"]
738
+ assert_equal "ja-Hira-JP-variant2-b-extend2-x-wadegile-private1", lang.to_s
739
+ lang.privateuse = "x-foooo"
740
+ assert_equal "ja-Hira-JP-variant2-b-extend2-x-foooo", lang.to_s
741
+
742
+ assert_equal [Locale::Tag::Rfc.parse("ja-Hira-JP-variant2"),
743
+ Locale::Tag::Rfc.parse("ja-Hira-JP"),
744
+ Locale::Tag::Rfc.parse("ja-JP-variant2"),
745
+ Locale::Tag::Rfc.parse("ja-JP"),
746
+ Locale::Tag::Rfc.parse("ja-Hira-variant2"),
747
+ Locale::Tag::Rfc.parse("ja-Hira"),
748
+ Locale::Tag::Rfc.parse("ja-variant2"),
749
+ Locale::Tag::Rfc.parse("ja"),
750
+ ], lang.candidates
751
+ end
752
+
753
+ def test_cldr
754
+ lang = Locale::Tag.parse("de@collation=phonebook")
755
+ assert_equal Locale::Tag::Cldr, lang.class
756
+ assert_equal "de", lang.language
757
+ assert_equal nil, lang.region
758
+ assert_equal "phonebook", lang.extensions["collation"]
759
+
760
+ assert_equal [Locale::Tag::Cldr.parse("de"),
761
+ Locale::Tag::Cldr.parse("de"),
762
+ Locale::Tag::Cldr.parse("de"),
763
+ Locale::Tag::Cldr.parse("de"),
764
+ Locale::Tag::Cldr.parse("de"),
765
+ Locale::Tag::Cldr.parse("de"),
766
+ Locale::Tag::Cldr.parse("de"),
767
+ Locale::Tag::Cldr.parse("de"),
768
+ ], lang.candidates
769
+
770
+ assert_equal Locale::Tag::Simple.parse("de"), lang.to_simple
771
+ assert_equal Locale::Tag::Common.parse("de"), lang.to_common
772
+ assert_equal Locale::Tag::Rfc.parse("de-k-collatio-phoneboo"), lang.to_rfc
773
+ assert_equal Locale::Tag::Cldr.parse("de@collation=phonebook"), lang.to_cldr
774
+ assert_equal Locale::Tag::Posix.parse("de"), lang.to_posix
775
+
776
+ lang = Locale::Tag.parse("az_Arab@collation=phonebook")
777
+ assert_equal Locale::Tag::Cldr, lang.class
778
+ assert_equal "az", lang.language
779
+ assert_equal nil, lang.region
780
+ assert_equal "Arab", lang.script
781
+ assert_equal "phonebook", lang.extensions["collation"]
782
+
783
+ assert_equal [Locale::Tag::Cldr.parse("az_Arab"),
784
+ Locale::Tag::Cldr.parse("az_Arab"),
785
+ Locale::Tag::Cldr.parse("az"),
786
+ Locale::Tag::Cldr.parse("az"),
787
+ Locale::Tag::Cldr.parse("az_Arab"),
788
+ Locale::Tag::Cldr.parse("az_Arab"),
789
+ Locale::Tag::Cldr.parse("az"),
790
+ Locale::Tag::Cldr.parse("az"),
791
+ ], lang.candidates
792
+
793
+ assert_equal Locale::Tag::Simple.parse("az"), lang.to_simple
794
+ assert_equal Locale::Tag::Common.parse("az_Arab"), lang.to_common
795
+ assert_equal Locale::Tag::Rfc.parse("az-Arab-k-collatio-phoneboo"), lang.to_rfc
796
+ assert_equal Locale::Tag::Cldr.parse("az_Arab@collation=phonebook"), lang.to_cldr
797
+ assert_equal Locale::Tag::Posix.parse("az"), lang.to_posix
798
+
799
+ lang = Locale::Tag.parse("de_DE@collation=phonebook;currency=DDM")
800
+ assert_equal Locale::Tag::Cldr, lang.class
801
+ assert_equal "de", lang.language
802
+ assert_equal "DE", lang.region
803
+ assert_equal "phonebook", lang.extensions["collation"]
804
+ assert_equal "DDM", lang.extensions["currency"]
805
+
806
+ assert_equal [Locale::Tag::Cldr.parse("de_DE"),
807
+ Locale::Tag::Cldr.parse("de_DE"),
808
+ Locale::Tag::Cldr.parse("de_DE"),
809
+ Locale::Tag::Cldr.parse("de_DE"),
810
+ Locale::Tag::Cldr.parse("de"),
811
+ Locale::Tag::Cldr.parse("de"),
812
+ Locale::Tag::Cldr.parse("de"),
813
+ Locale::Tag::Cldr.parse("de"),
814
+ ], lang.candidates
815
+
816
+ assert_equal Locale::Tag::Simple.parse("de_DE"), lang.to_simple
817
+ assert_equal Locale::Tag::Common.parse("de_DE"), lang.to_common
818
+ if RUBY_VERSION < "1.9.0" and RUBY_PLATFORM != "java"
819
+ assert_equal Locale::Tag::Rfc.parse("de-DE-k-currency-DDM-k-collatio-phoneboo"), lang.to_rfc
820
+ else
821
+ assert_equal Locale::Tag::Rfc.parse("de-DE-k-collatio-phoneboo-k-currency-DDM"), lang.to_rfc
822
+ end
823
+ assert_equal Locale::Tag::Cldr.parse("de_DE@collation=phonebook;currency=DDM"), lang.to_cldr
824
+ assert_equal Locale::Tag::Posix.parse("de_DE"), lang.to_posix
825
+
826
+ lang = Locale::Tag.parse("en_US_POSIX@calendar=islamic;collation=traditional;colStrength=secondary")
827
+ assert_equal Locale::Tag::Cldr, lang.class
828
+ assert_equal "en", lang.language
829
+ assert_equal "US", lang.region
830
+ assert_equal ["POSIX"], lang.variants
831
+ assert_equal "islamic", lang.extensions["calendar"]
832
+ assert_equal "traditional", lang.extensions["collation"]
833
+ assert_equal "secondary", lang.extensions["colStrength"]
834
+
835
+ assert_equal [Locale::Tag::Cldr.parse("en_US_POSIX"),
836
+ Locale::Tag::Cldr.parse("en_US"),
837
+ Locale::Tag::Cldr.parse("en_US_POSIX"),
838
+ Locale::Tag::Cldr.parse("en_US"),
839
+ Locale::Tag::Cldr.parse("en_POSIX"),
840
+ Locale::Tag::Cldr.parse("en"),
841
+ Locale::Tag::Cldr.parse("en_POSIX"),
842
+ Locale::Tag::Cldr.parse("en"),
843
+ ], lang.candidates
844
+
845
+ assert_equal Locale::Tag::Simple.parse("en_US"), lang.to_simple
846
+ assert_equal Locale::Tag::Common.parse("en_US_POSIX"), lang.to_common
847
+ if RUBY_VERSION < "1.9.0" and RUBY_PLATFORM != "java"
848
+ assert_equal Locale::Tag::Rfc.parse("en-US-POSIX-k-colStren-secondar-k-collatio-traditio-k-calendar-islamic"), lang.to_rfc
849
+ else
850
+ assert_equal Locale::Tag::Rfc.parse("en-US-POSIX-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar"), lang.to_rfc
851
+ end
852
+ assert_equal Locale::Tag::Cldr.parse("en_US_POSIX@calendar=islamic;collation=traditional;colStrength=secondary"), lang.to_cldr
853
+ assert_equal Locale::Tag::Posix.parse("en_US@POSIX"), lang.to_posix
854
+
855
+ lang = Locale::Tag.parse("en_US@calendar=islamic;collation=traditional;colStrength=secondary")
856
+ assert_equal Locale::Tag::Cldr, lang.class
857
+ assert_equal "en", lang.language
858
+ assert_equal "US", lang.region
859
+ assert_equal [], lang.variants
860
+ assert_equal "islamic", lang.extensions["calendar"]
861
+ assert_equal "traditional", lang.extensions["collation"]
862
+ assert_equal "secondary", lang.extensions["colStrength"]
863
+
864
+ assert_equal [Locale::Tag::Cldr.parse("en_US"),
865
+ Locale::Tag::Cldr.parse("en_US"),
866
+ Locale::Tag::Cldr.parse("en_US"),
867
+ Locale::Tag::Cldr.parse("en_US"),
868
+ Locale::Tag::Cldr.parse("en"),
869
+ Locale::Tag::Cldr.parse("en"),
870
+ Locale::Tag::Cldr.parse("en"),
871
+ Locale::Tag::Cldr.parse("en"),
872
+ ], lang.candidates
873
+
874
+ assert_equal Locale::Tag::Simple.parse("en_US"), lang.to_simple
875
+ assert_equal Locale::Tag::Common.parse("en_US"), lang.to_common
876
+ if RUBY_VERSION < "1.9.0" and RUBY_PLATFORM != "java"
877
+ assert_equal Locale::Tag::Rfc.parse("en-US-k-colStren-secondar-k-collatio-traditio-k-calendar-islamic"), lang.to_rfc
878
+ else
879
+ assert_equal Locale::Tag::Rfc.parse("en-US-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar"), lang.to_rfc
880
+ end
881
+ assert_equal Locale::Tag::Cldr.parse("en_US@calendar=islamic;collation=traditional;colStrength=secondary"), lang.to_cldr
882
+ assert_equal Locale::Tag::Posix.parse("en_US"), lang.to_posix
883
+
884
+ end
885
+
886
+ def test_cldr_writer
887
+ lang = Locale::Tag.parse("en_US@calendar=islamic;colStrength=secondary")
888
+ lang.language = "ja"
889
+ assert_equal "ja_US@calendar=islamic;colStrength=secondary", lang.to_s
890
+ lang.script = "Hira"
891
+ assert_equal "ja_Hira_US@calendar=islamic;colStrength=secondary", lang.to_s
892
+ lang.region = "JP"
893
+ assert_equal "ja_Hira_JP@calendar=islamic;colStrength=secondary", lang.to_s
894
+ lang.variants = ["POSIX"]
895
+ assert_equal "ja_Hira_JP_POSIX@calendar=islamic;colStrength=secondary", lang.to_s
896
+ lang.extensions = {:collation => "traditional"}
897
+ assert_equal "ja_Hira_JP_POSIX@collation=traditional", lang.to_s
898
+
899
+ assert_equal [Locale::Tag::Cldr.parse("ja_Hira_JP_POSIX"),
900
+ Locale::Tag::Cldr.parse("ja_Hira_JP"),
901
+ Locale::Tag::Cldr.parse("ja_JP_POSIX"),
902
+ Locale::Tag::Cldr.parse("ja_JP"),
903
+ Locale::Tag::Cldr.parse("ja_Hira_POSIX"),
904
+ Locale::Tag::Cldr.parse("ja_Hira"),
905
+ Locale::Tag::Cldr.parse("ja_POSIX"),
906
+ Locale::Tag::Cldr.parse("ja"),
907
+ ], lang.candidates
908
+ end
909
+
910
+ def test_posix
911
+ lang = Locale::Tag.parse("C")
912
+ assert_equal Locale::Tag::Posix, lang.class
913
+ assert_equal "en", lang.language
914
+ assert_equal "US", lang.region
915
+ assert_equal "C", lang.tag
916
+
917
+ assert_equal [Locale::Tag::Posix.parse("en_US"),
918
+ Locale::Tag::Posix.parse("en_US"),
919
+ Locale::Tag::Posix.parse("en_US"),
920
+ Locale::Tag::Posix.parse("en_US"),
921
+ Locale::Tag::Posix.parse("en"),
922
+ Locale::Tag::Posix.parse("en"),
923
+ Locale::Tag::Posix.parse("en"),
924
+ Locale::Tag::Posix.parse("en"),
925
+ ], lang.candidates
926
+
927
+ assert_equal Locale::Tag::Simple.parse("en_US"), lang.to_simple
928
+ assert_equal Locale::Tag::Common.parse("en_US"), lang.to_common
929
+ assert_equal Locale::Tag::Rfc.parse("en-US"), lang.to_rfc
930
+ assert_equal Locale::Tag::Cldr.parse("en_US"), lang.to_cldr
931
+ assert_equal Locale::Tag::Posix.parse("en_US"), lang.to_posix
932
+
933
+ lang = Locale::Tag.parse("POSIX")
934
+ assert_equal Locale::Tag::Posix, lang.class
935
+ assert_equal "en", lang.language
936
+ assert_equal "US", lang.region
937
+ assert_equal "POSIX", lang.tag
938
+
939
+ assert_equal [Locale::Tag::Posix.parse("en_US"),
940
+ Locale::Tag::Posix.parse("en_US"),
941
+ Locale::Tag::Posix.parse("en_US"),
942
+ Locale::Tag::Posix.parse("en_US"),
943
+ Locale::Tag::Posix.parse("en"),
944
+ Locale::Tag::Posix.parse("en"),
945
+ Locale::Tag::Posix.parse("en"),
946
+ Locale::Tag::Posix.parse("en"),
947
+ ], lang.candidates
948
+
949
+ assert_equal Locale::Tag::Simple.parse("en_US"), lang.to_simple
950
+ assert_equal Locale::Tag::Common.parse("en_US"), lang.to_common
951
+ assert_equal Locale::Tag::Rfc.parse("en-US"), lang.to_rfc
952
+ assert_equal Locale::Tag::Cldr.parse("en_US"), lang.to_cldr
953
+ assert_equal Locale::Tag::Posix.parse("en_US"), lang.to_posix
954
+
955
+ lang = Locale::Tag.parse("japanese.euc")
956
+ assert_equal Locale::Tag::Posix, lang.class
957
+ assert_equal "japanese", lang.language
958
+ assert_equal nil, lang.region
959
+ assert_equal "euc", lang.charset
960
+
961
+ assert_equal [Locale::Tag::Posix.parse("japanese.euc"),
962
+ Locale::Tag::Posix.parse("japanese.euc"),
963
+ Locale::Tag::Posix.parse("japanese"),
964
+ Locale::Tag::Posix.parse("japanese"),
965
+ Locale::Tag::Posix.parse("japanese.euc"),
966
+ Locale::Tag::Posix.parse("japanese.euc"),
967
+ Locale::Tag::Posix.parse("japanese"),
968
+ Locale::Tag::Posix.parse("japanese"),
969
+ ], lang.candidates
970
+
971
+ lang = Locale::Tag.parse("es.iso885915")
972
+ assert_equal Locale::Tag::Posix, lang.class
973
+ assert_equal "es", lang.language
974
+ assert_equal nil, lang.region
975
+ assert_equal "iso885915", lang.charset
976
+ assert_equal nil, lang.modifier
977
+
978
+ assert_equal [Locale::Tag::Posix.parse("es.iso885915"),
979
+ Locale::Tag::Posix.parse("es.iso885915"),
980
+ Locale::Tag::Posix.parse("es"),
981
+ Locale::Tag::Posix.parse("es"),
982
+ Locale::Tag::Posix.parse("es.iso885915"),
983
+ Locale::Tag::Posix.parse("es.iso885915"),
984
+ Locale::Tag::Posix.parse("es"),
985
+ Locale::Tag::Posix.parse("es"),
986
+ ], lang.candidates
987
+
988
+ assert_equal Locale::Tag::Simple.parse("es"), lang.to_simple
989
+ assert_equal Locale::Tag::Common.parse("es"), lang.to_common
990
+ assert_equal Locale::Tag::Rfc.parse("es"), lang.to_rfc
991
+ assert_equal Locale::Tag::Cldr.parse("es"), lang.to_cldr
992
+ assert_equal Locale::Tag::Posix.parse("es.iso885915"), lang.to_posix
993
+
994
+ lang = Locale::Tag.parse("es_ES.iso885915")
995
+ assert_equal Locale::Tag::Posix, lang.class
996
+ assert_equal "es", lang.language
997
+ assert_equal "ES", lang.region
998
+ assert_equal "iso885915", lang.charset
999
+ assert_equal nil, lang.modifier
1000
+
1001
+ assert_equal [Locale::Tag::Posix.parse("es_ES.iso885915"),
1002
+ Locale::Tag::Posix.parse("es_ES.iso885915"),
1003
+ Locale::Tag::Posix.parse("es_ES"),
1004
+ Locale::Tag::Posix.parse("es_ES"),
1005
+ Locale::Tag::Posix.parse("es.iso885915"),
1006
+ Locale::Tag::Posix.parse("es.iso885915"),
1007
+ Locale::Tag::Posix.parse("es"),
1008
+ Locale::Tag::Posix.parse("es"),
1009
+ ], lang.candidates
1010
+
1011
+ assert_equal Locale::Tag::Simple.parse("es_ES"), lang.to_simple
1012
+ assert_equal Locale::Tag::Common.parse("es_ES"), lang.to_common
1013
+ assert_equal Locale::Tag::Rfc.parse("es-ES"), lang.to_rfc
1014
+ assert_equal Locale::Tag::Cldr.parse("es_ES"), lang.to_cldr
1015
+ assert_equal Locale::Tag::Posix.parse("es_ES.iso885915"), lang.to_posix
1016
+
1017
+ lang = Locale::Tag.parse("es@euro")
1018
+ assert_equal Locale::Tag::Posix, lang.class
1019
+ assert_equal "es", lang.language
1020
+ assert_equal nil, lang.region
1021
+ assert_equal nil, lang.charset
1022
+ assert_equal "euro", lang.modifier
1023
+
1024
+ assert_equal [Locale::Tag::Posix.parse("es@euro"),
1025
+ Locale::Tag::Posix.parse("es"),
1026
+ Locale::Tag::Posix.parse("es@euro"),
1027
+ Locale::Tag::Posix.parse("es"),
1028
+ Locale::Tag::Posix.parse("es@euro"),
1029
+ Locale::Tag::Posix.parse("es"),
1030
+ Locale::Tag::Posix.parse("es@euro"),
1031
+ Locale::Tag::Posix.parse("es"),
1032
+ ], lang.candidates
1033
+
1034
+ # A modifier is converted to a variant.
1035
+ # If the modifier is less than 5 characters, it is not canonical value.
1036
+ assert_equal Locale::Tag::Simple.parse("es"), lang.to_simple
1037
+ assert_equal Locale::Tag::Common.new("es", nil, nil, ["euro"]), lang.to_common
1038
+ assert_equal Locale::Tag::Rfc.new("es", nil, nil, ["euro"]), lang.to_rfc
1039
+ assert_equal Locale::Tag::Cldr.new("es", nil, nil, ["euro"]), lang.to_cldr
1040
+ assert_equal Locale::Tag::Posix.parse("es@euro"), lang.to_posix
1041
+
1042
+ lang = Locale::Tag.parse("es_ES@euro")
1043
+ assert_equal Locale::Tag::Posix, lang.class
1044
+ assert_equal "es", lang.language
1045
+ assert_equal "ES", lang.region
1046
+ assert_equal nil, lang.charset
1047
+ assert_equal "euro", lang.modifier
1048
+
1049
+ assert_equal [Locale::Tag::Posix.parse("es_ES@euro"),
1050
+ Locale::Tag::Posix.parse("es_ES"),
1051
+ Locale::Tag::Posix.parse("es_ES@euro"),
1052
+ Locale::Tag::Posix.parse("es_ES"),
1053
+ Locale::Tag::Posix.parse("es@euro"),
1054
+ Locale::Tag::Posix.parse("es"),
1055
+ Locale::Tag::Posix.parse("es@euro"),
1056
+ Locale::Tag::Posix.parse("es"),
1057
+ ], lang.candidates
1058
+
1059
+ assert_equal Locale::Tag::Simple.parse("es_ES"), lang.to_simple
1060
+ assert_equal Locale::Tag::Common.new("es", nil, "ES", ["euro"]), lang.to_common
1061
+ assert_equal Locale::Tag::Rfc.new("es", nil, "ES", ["euro"]), lang.to_rfc
1062
+ assert_equal Locale::Tag::Cldr.new("es", nil, "ES", ["EURO"]), lang.to_cldr
1063
+ assert_equal Locale::Tag::Posix.parse("es_ES@euro"), lang.to_posix
1064
+
1065
+ lang = Locale::Tag.parse("es_ES.iso885915@euro")
1066
+ assert_equal Locale::Tag::Posix, lang.class
1067
+ assert_equal "es", lang.language
1068
+ assert_equal "ES", lang.region
1069
+ assert_equal "iso885915", lang.charset
1070
+ assert_equal "euro", lang.modifier
1071
+
1072
+ assert_equal [Locale::Tag::Posix.parse("es_ES.iso885915@euro"),
1073
+ Locale::Tag::Posix.parse("es_ES.iso885915"),
1074
+ Locale::Tag::Posix.parse("es_ES@euro"),
1075
+ Locale::Tag::Posix.parse("es_ES"),
1076
+ Locale::Tag::Posix.parse("es.iso885915@euro"),
1077
+ Locale::Tag::Posix.parse("es.iso885915"),
1078
+ Locale::Tag::Posix.parse("es@euro"),
1079
+ Locale::Tag::Posix.parse("es"),
1080
+ ], lang.candidates
1081
+
1082
+ assert_equal Locale::Tag::Simple.parse("es_ES"), lang.to_simple
1083
+ assert_equal Locale::Tag::Common.new("es", nil, "ES", ["euro"]), lang.to_common
1084
+ assert_equal Locale::Tag::Rfc.new("es", nil, "ES", ["euro"]), lang.to_rfc
1085
+ assert_equal Locale::Tag::Cldr.new("es", nil, "ES", ["EURO"]), lang.to_cldr
1086
+ assert_equal Locale::Tag::Posix.parse("es_ES.iso885915@euro"), lang.to_posix
1087
+
1088
+ lang = Locale::Tag.parse("univ.utf8")
1089
+ assert_equal Locale::Tag::Posix, lang.class
1090
+ assert_equal "univ", lang.language
1091
+ assert_equal nil, lang.region
1092
+ assert_equal "utf8", lang.charset
1093
+
1094
+ assert_equal [Locale::Tag::Posix.parse("univ.utf8"),
1095
+ Locale::Tag::Posix.parse("univ.utf8"),
1096
+ Locale::Tag::Posix.parse("univ"),
1097
+ Locale::Tag::Posix.parse("univ"),
1098
+ Locale::Tag::Posix.parse("univ.utf8"),
1099
+ Locale::Tag::Posix.parse("univ.utf8"),
1100
+ Locale::Tag::Posix.parse("univ"),
1101
+ Locale::Tag::Posix.parse("univ"),
1102
+ ], lang.candidates
1103
+
1104
+ lang = Locale::Tag.parse("ja_JP.UTF-8")
1105
+ assert_equal Locale::Tag::Posix, lang.class
1106
+ assert_equal "ja", lang.language
1107
+ assert_equal "JP", lang.region
1108
+ assert_equal "UTF-8", lang.charset
1109
+
1110
+ assert_equal [Locale::Tag::Posix.parse("ja_JP.UTF-8"),
1111
+ Locale::Tag::Posix.parse("ja_JP.UTF-8"),
1112
+ Locale::Tag::Posix.parse("ja_JP"),
1113
+ Locale::Tag::Posix.parse("ja_JP"),
1114
+ Locale::Tag::Posix.parse("ja.UTF-8"),
1115
+ Locale::Tag::Posix.parse("ja.UTF-8"),
1116
+ Locale::Tag::Posix.parse("ja"),
1117
+ Locale::Tag::Posix.parse("ja"),
1118
+ ], lang.candidates
1119
+
1120
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
1121
+ assert_equal Locale::Tag::Common.parse("ja_JP"), lang.to_common
1122
+ assert_equal Locale::Tag::Rfc.parse("ja-JP"), lang.to_rfc
1123
+ assert_equal Locale::Tag::Cldr.parse("ja_JP"), lang.to_cldr
1124
+ assert_equal Locale::Tag::Posix.parse("ja_JP.UTF-8"), lang.to_posix
1125
+ end
1126
+
1127
+ def test_posix_writer
1128
+ lang = Locale::Tag.parse("es_ES.iso885915@euro")
1129
+ lang.language = "ja"
1130
+ assert_equal "ja_ES.iso885915@euro", lang.to_s
1131
+ lang.region = "JP"
1132
+ assert_equal "ja_JP.iso885915@euro", lang.to_s
1133
+ lang.charset = "EUC-JP"
1134
+ assert_equal "ja_JP.EUC-JP@euro", lang.to_s
1135
+ lang.modifier = "osaka"
1136
+ assert_equal "ja_JP.EUC-JP@osaka", lang.to_s
1137
+ assert_equal [Locale::Tag::Posix.parse("ja_JP.EUC-JP@osaka"),
1138
+ Locale::Tag::Posix.parse("ja_JP.EUC-JP"),
1139
+ Locale::Tag::Posix.parse("ja_JP@osaka"),
1140
+ Locale::Tag::Posix.parse("ja_JP"),
1141
+ Locale::Tag::Posix.parse("ja.EUC-JP@osaka"),
1142
+ Locale::Tag::Posix.parse("ja.EUC-JP"),
1143
+ Locale::Tag::Posix.parse("ja@osaka"),
1144
+ Locale::Tag::Posix.parse("ja"),
1145
+ ], lang.candidates
1146
+ end
1147
+
1148
+ def test_invaild
1149
+ lang = Locale::Tag.parse("")
1150
+ assert_equal Locale::Tag::Illegular, lang.class
1151
+ assert_equal "en", lang.language
1152
+ assert_equal nil, lang.region
1153
+
1154
+ assert_equal [Locale::Tag::Illegular.new("en"),
1155
+ ], lang.candidates
1156
+
1157
+ assert_equal Locale::Tag::Simple.parse("en"), lang.to_simple
1158
+ assert_equal Locale::Tag::Common.parse("en"), lang.to_common
1159
+ assert_equal Locale::Tag::Rfc.parse("en"), lang.to_rfc
1160
+ assert_equal Locale::Tag::Cldr.parse("en"), lang.to_cldr
1161
+ assert_equal Locale::Tag::Posix.parse("en"), lang.to_posix
1162
+
1163
+ lang = Locale::Tag.parse(nil)
1164
+ assert_equal Locale::Tag::Illegular, lang.class
1165
+ assert_equal "en", lang.language
1166
+ assert_equal nil, lang.region
1167
+
1168
+ assert_equal [Locale::Tag::Illegular.new("en"),
1169
+ ], lang.candidates
1170
+
1171
+ assert_equal Locale::Tag::Simple.parse("en"), lang.to_simple
1172
+ assert_equal Locale::Tag::Common.parse("en"), lang.to_common
1173
+ assert_equal Locale::Tag::Rfc.parse("en"), lang.to_rfc
1174
+ assert_equal Locale::Tag::Cldr.parse("en"), lang.to_cldr
1175
+ assert_equal Locale::Tag::Posix.parse("en"), lang.to_posix
1176
+ end
1177
+
1178
+ def test_raise_error
1179
+ assert_raise(RuntimeError){
1180
+ Locale::Tag::Simple.new(nil)
1181
+ }
1182
+ end
1183
+ end