rotuka-rutils 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ Dir.entries(File.dirname(__FILE__)).each do | it|
2
+ next unless it =~ /^t_/
3
+ require File.dirname(__FILE__) + '/' + it.gsub(/\.rb$/, '')
4
+ end
@@ -0,0 +1,42 @@
1
+ $KCODE = 'u'
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + '/../lib/rutils'
4
+
5
+ class DistanceOfTimeTest < Test::Unit::TestCase
6
+ def test_distance_of_time_in_words
7
+ assert_equal "меньше минуты", RuTils::DateTime::distance_of_time_in_words(0, 50)
8
+ assert_equal "2 минуты", RuTils::DateTime::distance_of_time_in_words(0, 140)
9
+ assert_equal "около 2 часов", RuTils::DateTime::distance_of_time_in_words(0, 60*114)
10
+ assert_equal "около 3 часов", RuTils::DateTime::distance_of_time_in_words(0, 60*120+60*60)
11
+ assert_equal "около 5 часов", RuTils::DateTime.distance_of_time_in_words(60*60*5)
12
+ end
13
+ end
14
+
15
+ class StrftimeRuTest < Test::Unit::TestCase
16
+ def test_strftime_ru
17
+ @@old_overrides = RuTils::overrides_enabled?
18
+
19
+ RuTils::overrides = true
20
+ assert_equal "сб, суббота, дек, декабрь", Time.local(2005,"dec",31).strftime("%a, %A, %b, %B")
21
+ assert_equal "%a, %A, %b, %B", Time.local(2005,"dec",31).strftime("%%a, %%A, %%b, %%B")
22
+ assert_equal "%сб, %суббота, %дек, %декабрь", Time.local(2005,"dec",31).strftime("%%%a, %%%A, %%%b, %%%B")
23
+ assert_equal "Сегодня: 31 декабря, суббота, 2005 года", Time.local(2005,"dec",31).strftime("Сегодня: %d %B, %A, %Y года")
24
+ assert_equal "Сегодня: ноябрь, 30 число, дождик в четверг, а год у нас - 2006", Time.local(2006,11,30).strftime("Сегодня: %B, %d число, дождик в %A, а год у нас - %Y")
25
+
26
+ date = Date.new(2005, 12, 31)
27
+ assert_equal "дек декабрь сб суббота", "#{Date::RU_ABBR_MONTHNAMES[date.mon]} #{Date::RU_MONTHNAMES[date.mon]} #{Date::RU_ABBR_DAYNAMES[date.wday]} #{Date::RU_DAYNAMES[date.wday]}"
28
+ # We do not support strftime on date at this point
29
+ # assert_equal "сб, суббота, дек, декабрь", date.strftime("%a, %A, %b, %B")
30
+
31
+ RuTils::overrides = false
32
+ assert_equal "Sat, Saturday, Dec, December", Time.local(2005,"dec",31).strftime("%a, %A, %b, %B")
33
+ assert_equal "%a, %A, %b, %B", Time.local(2005,"dec",31).strftime("%%a, %%A, %%b, %%B")
34
+ assert_equal "%Sat, %Saturday, %Dec, %December", Time.local(2005,"dec",31).strftime("%%%a, %%%A, %%%b, %%%B")
35
+ assert_equal "Сегодня: 31 December, Saturday, 2005 год", Time.local(2005,"dec",31).strftime("Сегодня: %d %B, %A, %Y год")
36
+
37
+ date = Date.new(2005, 11, 9)
38
+ assert_equal "Nov November Wed Wednesday", "#{Date::ABBR_MONTHNAMES[date.mon]} #{Date::MONTHNAMES[date.mon]} #{Date::ABBR_DAYNAMES[date.wday]} #{Date::DAYNAMES[date.wday]}"
39
+
40
+ RuTils::overrides = @@old_overrides
41
+ end
42
+ end
@@ -0,0 +1,371 @@
1
+ $KCODE = 'u'
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + '/../lib/rutils'
4
+
5
+
6
+ # Cюда идут наши тесты типографа. Мы содержим их отдельно поскольку набор тестов Типографицы нами не контролируется.
7
+ # Когда у рутилей появятся собственные баги под каждый баг следует завести тест
8
+ class GilensonOwnTest < Test::Unit::TestCase
9
+
10
+ def setup
11
+ @gilenson = RuTils::Gilenson::Formatter.new
12
+ end
13
+
14
+ def test_tag_lift
15
+ assert_equal "Вот&#160;такие<tag some='foo>' /> <tagmore></tagmore> дела", "Вот такие<tag some='foo>' /> <tagmore></tagmore> дела".gilensize
16
+ end
17
+
18
+ def test_byte_pass
19
+ assert_equal '<p>Теперь добираться до офиса Студии автортранспортом стало удобнее. ' +
20
+ 'Для этого мы разместили в разделе <a href="#">«Контакт»</a> окно вебкамеры, ' +
21
+ 'которая непрерывно транслирует дорожную обстановку на Садовом кольце по адресу Земляной Вал, 23. <br>' +
22
+ 'Удачной дороги! </p>',
23
+ '<p>Теперь добираться до офиса Студии автортранспортом стало удобнее. ' +
24
+ 'Для этого мы разместили в разделе <a href="#">«Контакт»</a> окно вебкамеры, ' +
25
+ 'которая непрерывно транслирует дорожную обстановку на Садовом кольце по адресу Земляной Вал, 23. <br>' +
26
+ 'Удачной дороги! </p>'.gilensize
27
+ end
28
+
29
+ def test_phones
30
+ assert_equal '<span class="nobr">3&#8211;12&#8211;30</span>', '3-12-30'.gilensize
31
+ assert_equal '<span class="nobr">12&#8211;34&#8211;56</span>', '12-34-56'.gilensize
32
+ assert_equal '<span class="nobr">88&#8211;25&#8211;04</span>', '88-25-04'.gilensize
33
+ assert_equal '+7 <span class="nobr">(99284)&#160;65&#8211;818</span>', '+7 (99284) 65-818'.gilensize
34
+ assert_equal '<span class="nobr">725&#8211;01&#8211;10</span>', '725-01-10'.gilensize
35
+ end
36
+
37
+ def test_acronyms_with_html_output
38
+ assert_equal '<acronym title="Большая советская энциклопедия">БСЭ</acronym>', 'БСЭ(Большая советская энциклопедия)'.gilensize
39
+ assert_equal '<acronym title="Advanced Micro Devices">AMD</acronym>',
40
+ 'AMD(Advanced Micro Devices)'.gilensize
41
+ assert_equal '<acronym title="Расширяемый язык разметки">XML</acronym>',
42
+ 'XML(Расширяемый язык разметки)'.gilensize
43
+ end
44
+
45
+ def test_acronyms_should_escape_entities
46
+ @gilenson.configure(:raw_output => false)
47
+ assert_equal '<acronym title="Знак &#60;">БВГ</acronym>', 'БВГ(Знак <)'.gilensize
48
+ end
49
+
50
+ def test_acronyms_with_text_output
51
+ @gilenson.configure(:raw_output => true)
52
+ thin_space = [8201].pack("U")
53
+ assert_equal_cp "так утверждает БСЭ#{thin_space}(Большая советская энциклопедия)",
54
+ @gilenson.process('так утверждает БСЭ(Большая советская энциклопедия)')
55
+ end
56
+
57
+ def test_address
58
+ assert_equal 'табл.&#160;2, рис.&#160;2.10', 'табл. 2, рис. 2.10'.gilensize
59
+ assert_equal 'офис&#160;415, оф.340, д.5, ул.&#160;Народной Воли, пл. Малышева', 'офис 415, оф.340, д.5, ул. Народной Воли, пл. Малышева'.gilensize
60
+ end
61
+
62
+ def test_html_entities_replace
63
+ assert_equal '&#34; &#38; &#39; &#62; &#60; &#160; &#167; &#169; &#171; &#174; &#176; &#177; &#183; &#187; &#8211; &#8212; &#8216; &#8217; &#8220; &#8221; &#8222; &#8226; &#8230; &#8482; &#8722;', '&quot; &amp; &apos; &gt; &lt; &nbsp; &sect; &copy; &laquo; &reg; &deg; &plusmn; &middot; &raquo; &ndash; &mdash; &lsquo; &rsquo; &ldquo; &rdquo; &bdquo; &bull; &hellip; &trade; &minus;'.gilensize
64
+ end
65
+
66
+ def test_ugly_entities_replace1 # not_correct_number
67
+ assert_equal '&#8222; &#8230; &#39; &#8220; &#8221; &#8226; &#8211; &#8212; &#8482;', '&#132; &#133; &#146; &#147; &#148; &#149; &#150; &#151; &#153;'.gilensize
68
+ end
69
+
70
+ def test_specials
71
+ assert_equal '&#169; 2002, &#169; 2003, &#169; 2004, &#169; 2005 &#8212; тоже без&#160;пробелов: &#169;2002, &#169;Кукуц. однако: варианты (а) и&#160;(с)', '(с) 2002, (С) 2003, (c) 2004, (C) 2005 -- тоже без пробелов: (с)2002, (c)Кукуц. однако: варианты (а) и (с)'.gilensize
72
+ assert_equal '+5&#176;С, +7&#176;C, &#8211;5&#176;F', '+5^С, +17^C, -275^F'.gilensize
73
+ assert_equal 'об&#160;этом подробнее &#8212; читай &#167;25', 'об этом подробнее -- читай (p)25'.gilensize
74
+ assert_equal 'один же&#160;минус &#8211; краткое тире', 'один же минус - краткое тире'.gilensize
75
+ assert_equal 'Sharpdesign&#8482;, Microsoft<sup>&#174;</sup>', 'Sharpdesign(tm), Microsoft(r)'.gilensize
76
+ end
77
+
78
+ def test_breaking
79
+ assert_equal 'скажи, мне, ведь не&#160;даром! Москва, клеймённая пожаром. Французу отдана', 'скажи ,мне, ведь не даром !Москва, клеймённая пожаром .Французу отдана'.gilensize
80
+ assert_equal 'so&#160;be it, my&#160;liege. Tiny dwellers roam thru midnight! Hell raised, the&#160;Balrog is&#160;hiding in&#160;your backyard!', 'so be it ,my liege .Tiny dwellers roam thru midnight !Hell raised, the Balrog is hiding in your backyard!'.gilensize
81
+ assert_equal 'при&#160;установке командой строки в&#160;?page=help <span class="nobr">бла-бла-бла-бла</span>', 'при установке командой строки в ?page=help бла-бла-бла-бла'.gilensize
82
+ assert_equal 'как&#160;интересно будет переноситься со&#160;строки на&#160;строку <span class="nobr">что-то</span> разделённое дефисом, ведь дефис тот&#160;тоже ведь из&#160;наших. <span class="nobr">Какие-то</span> браузеры думают, что&#160;следует переносить и&#160;его&#8230;', 'как интересно будет переноситься со строки на строку что-то разделённое дефисом, ведь дефис тот тоже ведь из наших. Какие-то браузеры думают, что следует переносить и его...'.gilensize
83
+ end
84
+
85
+ def test_quotes
86
+ assert_equal 'english &#8220;quotes&#8221; should be&#160;quite like this', 'english "quotes" should be quite like this'.gilensize
87
+ assert_equal 'русские же&#160;&#171;оформляются&#187; подобным образом', 'русские же "оформляются" подобным образом'.gilensize
88
+ assert_equal 'кавычки &#171;расставлены&#187; &#8220;in a&#160;chaotic order&#8221;', 'кавычки "расставлены" "in a chaotic order"'.gilensize
89
+ assert_equal 'диагональ моего монитора &#8212; 17&#8243;, а&#160;размер пениса &#8212; 1,5&#8243;', 'диагональ моего монитора -- 17", а размер пениса -- 1,5"'.gilensize
90
+ assert_equal 'в&#160;толщину, &#171;вложенные &#8220;quotes&#8221; вот&#160;так&#187;, &#8220;or it&#160;&#171;будет вложено&#187; elsewhere&#8221;', 'в толщину, "вложенные "quotes" вот так", "or it "будет вложено" elsewhere"'.gilensize
91
+ assert_equal '&#8220;complicated &#171;кавычки&#187;, &#171;странные &#8220;includements&#8221; кавычек&#187;', '"complicated "кавычки", "странные "includements" кавычек"'.gilensize
92
+ assert_equal '&#8220;double &#8220;quotes&#8221;', '"double "quotes"'.gilensize
93
+ assert_equal '&#171;дважды вложенные &#171;кавычки&#187;', '"дважды вложенные "кавычки"'.gilensize
94
+ assert_equal '&#171;01/02/03&#187;, дискеты в&#160;5.25&#8243;', '"01/02/03", дискеты в 5.25"'.gilensize
95
+ assert_equal 'после троеточия правая кавычка &#8212; &#171;Вот&#8230;&#187;', 'после троеточия правая кавычка -- "Вот..."'.gilensize
96
+ assert_equal 'setlocale(LC_ALL, &#8220;ru_RU.UTF8&#8221;);', 'setlocale(LC_ALL, "ru_RU.UTF8");'.gilensize
97
+ assert_equal '&#8220;read, write, delete&#8221; с&#160;флагом &#8220;only_mine&#8221;', '"read, write, delete" с флагом "only_mine"'.gilensize
98
+ assert_equal '&#171;Двоеточие:&#187;, &#171;такую умную тему должен писать чувак умеющий скрипты скриптить.&#187;', '"Двоеточие:", "такую умную тему должен писать чувак умеющий скрипты скриптить."'.gilensize
99
+ assert_equal '(&#171;Вики != HTML&#187; &#8212; &#171;Вики != HTML&#187; &#8212; (&#171;всякая чушь&#187;))', '("Вики != HTML" -- "Вики != HTML" -- ("всякая чушь"))'.gilensize
100
+ assert_equal '&#171;фигня123&#187;, &#8220;fignya123&#8221;', '"фигня123", "fignya123"'.gilensize
101
+ # assert_equal '&#171;сбалансированные &#171;кавычки<!--notypo--><!--/notypo--> (четыре в&#160;конце) &#8212; связано с&#160;синтаксисом ваки', '"сбалансированные "кавычки"""" (четыре в конце) -- связано с синтаксисом ваки'.gilensize
102
+ assert_equal '&#171;несбалансированные &#171;кавычки&#34;&#34;" (три в&#160;конце) &#8212; связано с&#160;синтаксисом ваки', '"несбалансированные "кавычки""" (три в конце) -- связано с синтаксисом ваки'.gilensize
103
+ assert_equal '&#171;разноязыкие quotes&#187;', '"разноязыкие quotes"'.gilensize
104
+ assert_equal '&#171;multilanguage кавычки&#187;', '"multilanguage кавычки"'.gilensize
105
+ end
106
+
107
+ def test_additional_quote_cases
108
+ assert_equal "&#171;И это&#160;называется языком?&#187;, &#8212; таков был&#160;его вопрос",
109
+ %q{ "И это называется языком?", -- таков был его вопрос }.gilensize
110
+
111
+ assert_equal "&#171;Он &#8212; сволочь!&#187;, сказал&#160;я",
112
+ %q{ "Он -- сволочь!", сказал я }.gilensize
113
+ end
114
+
115
+ def test_initials
116
+ assert_equal 'Это&#160;нам сказал П.И.&#8201;Петров', 'Это нам сказал П. И. Петров'.gilensize
117
+
118
+ assert_equal "А&#160;Ефимов&#8230;",
119
+ @gilenson.process("А Ефимов...")
120
+
121
+ assert_equal "Обратился за&#160;ПО. К&#160;негодяям.",
122
+ @gilenson.process("Обратился за ПО. К негодяям.")
123
+
124
+ assert_equal "ГО&#160;Самарской обл.",
125
+ @gilenson.process("ГО Самарской обл.")
126
+
127
+ assert_equal "ГОР&#160;Самарской обл.",
128
+ @gilenson.process("ГОР Самарской обл.")
129
+
130
+ assert_equal "КОШМАР Самарской обл.",
131
+ @gilenson.process("КОШМАР Самарской обл.")
132
+
133
+ assert_equal "УФПС Самарской обл.",
134
+ @gilenson.process("УФПС Самарской обл.")
135
+
136
+ end
137
+
138
+ def test_nbsp_last_letters
139
+ assert_equal "сказал&#160;я", "сказал я".gilensize
140
+ assert_equal "сказал&#160;я!", "сказал я!".gilensize
141
+ assert_equal "сказал&#160;я?", "сказал я?".gilensize
142
+ assert_equal "сказал&#160;я&#8230;", "сказал я...".gilensize
143
+ assert_equal "сказал&#160;он&#8230;", "сказал он...".gilensize
144
+ assert_equal "сказали&#160;мы?..", "сказали мы?..".gilensize
145
+ assert_equal "сказали&#160;мы?!", "сказали мы?!".gilensize
146
+ assert_equal "сказали мы?!!!", "сказали мы?!!!".gilensize
147
+ assert_equal "сказали нам", "сказали нам".gilensize
148
+ assert_equal "(сказали&#160;им)", "(сказали им)".gilensize
149
+ end
150
+
151
+ def test_marker_bypass
152
+ assert_equal "<p><span class=\"nobr\">МИЭЛЬ-Недвижимость</span></p>", "<p>МИЭЛЬ-Недвижимость</p>".gilensize
153
+ end
154
+
155
+ def test_skip_code
156
+ @gilenson.configure!(:all => true, :skip_code => true)
157
+
158
+ assert_equal "<code>Скип -- скип!</code>",
159
+ @gilenson.process("<code>Скип -- скип!</code>")
160
+
161
+ assert_equal '<code attr="test -- attr">Скип -- скип!</code>',
162
+ @gilenson.process('<code attr="test -- attr">Скип -- скип!</code>')
163
+
164
+ assert_equal "<tt>Скип -- скип!</tt> test &#8212; test <tt attr='test -- attr'>Скип -- скип!</tt>",
165
+ @gilenson.process("<tt>Скип -- скип!</tt> test -- test <tt attr='test -- attr'>Скип -- скип!</tt>")
166
+
167
+ assert_equal "<tt>Скип -- скип!</tt><tt>Скип -- скип!</tt> &#8212; <code attr='test -- attr'>Скип -- скип!</code>",
168
+ @gilenson.process("<tt>Скип -- скип!</tt><tt>Скип -- скип!</tt> -- <code attr='test -- attr'>Скип -- скип!</code>")
169
+
170
+ assert_equal "<ttt>Скип &#8212; скип!</tt>",
171
+ @gilenson.process("<ttt>Скип -- скип!</tt>")
172
+
173
+ assert_equal "<tt>Скип &#8212; скип!</ttt>",
174
+ @gilenson.process("<tt>Скип -- скип!</ttt>")
175
+
176
+ assert_equal "Ах, &#8212; <code>var x = j // -- тест</code>",
177
+ @gilenson.process("Ах, -- <code>var x = j // -- тест</code>")
178
+
179
+ assert_equal "<![CDATA[ CDATA -- ]]> &#8212; CDATA",
180
+ @gilenson.process("<![CDATA[ CDATA -- ]]> -- CDATA")
181
+
182
+ assert_equal "<![CDATA[ CDATA -- >] -- CDATA ]]> &#8212; <![CDATA[ CDATA ]> -- CDATA ]]>",
183
+ @gilenson.process("<![CDATA[ CDATA -- >] -- CDATA ]]> -- <![CDATA[ CDATA ]> -- CDATA ]]>")
184
+
185
+ assert_equal "<![CDATA[ CDATA -- >] -- CDATA ]]> &#8212; <![CDATA[ CDATA ]> -- CDATA ]]> &#8212; CDATA ]]>",
186
+ @gilenson.process("<![CDATA[ CDATA -- >] -- CDATA ]]> -- <![CDATA[ CDATA ]> -- CDATA ]]> -- CDATA ]]>")
187
+
188
+ @gilenson.configure!(:skip_code => false)
189
+
190
+ assert_equal "Ах, &#8212; <code>var x&#160;= j&#160;// &#8212; тест</code>",
191
+ @gilenson.process("Ах, -- <code>var x = j // -- тест</code>")
192
+ end
193
+
194
+ def test_skip_attr
195
+ @gilenson.configure!(:skip_attr => true)
196
+
197
+ assert_equal "<a href='#' attr='смотри -- смотри' title='test -- me' alt=\"смотри -- смотри\">just &#8212; test</a>",
198
+ @gilenson.process("<a href='#' attr='смотри -- смотри' title='test -- me' alt=\"смотри -- смотри\">just -- test</a>")
199
+
200
+ assert_equal 'мы&#160;напишем title="test &#8212; me" и&#160;alt=\'test &#8212; me\', вот',
201
+ @gilenson.process('мы напишем title="test -- me" и alt=\'test -- me\', вот')
202
+
203
+ @gilenson.configure!(:skip_attr => false)
204
+
205
+ assert_equal "<a href='#' attr='смотри -- смотри' title='test &#8212;&#160;me' alt=\"смотри &#8212; смотри\">just &#8212; test</a>",
206
+ @gilenson.process("<a href='#' attr='смотри -- смотри' title='test -- me' alt=\"смотри -- смотри\">just -- test</a>")
207
+
208
+ assert_equal 'мы&#160;напишем title="test &#8212; me" и&#160;alt=\'test &#8212; me\', вот',
209
+ @gilenson.process('мы напишем title="test -- me" и alt=\'test -- me\', вот')
210
+ end
211
+
212
+ def test_escape_html
213
+ assert_equal "Используйте &#38; вместо &#38;amp;",
214
+ @gilenson.process("Используйте &#38; вместо &#38;amp;")
215
+
216
+ @gilenson.configure!(:html => false)
217
+
218
+ assert_equal "&#38;#38; &#8212; &#38;amp; &#60;code/&#62; &#60;some_tag&#62;таги не&#160;пройдут!&#60;/some_tag&#62;. Ну&#160;и?..",
219
+ @gilenson.process("&#38; -- &amp; <code/> <some_tag>таги не пройдут!</some_tag>. Ну и?..")
220
+
221
+ assert_equal "Используйте &#38;#38; вместо &#38;amp;",
222
+ @gilenson.process("Используйте &#38; вместо &amp;")
223
+
224
+ end
225
+
226
+ def test_ampersand_in_urls
227
+
228
+ @gilenson.configure!(:html=>false)
229
+
230
+ assert_equal "&#60;a href='test?test5=5&#38;#38;test6=6'&#62;test&#38;#38;&#60;/a&#62;",
231
+ @gilenson.process("<a href='test?test5=5&#38;test6=6'>test&#38;</a>")
232
+
233
+ @gilenson.configure!(:html=>true)
234
+
235
+ assert_equal "<a href='test?test7=7&#38;test8=8'>test&#38;</a>",
236
+ @gilenson.process("<a href='test?test7=7&#38;test8=8'>test&#38;</a>")
237
+
238
+ assert_equal "<a href='test?test9=9&#038;test10=10'>test&#038;</a>",
239
+ @gilenson.process("<a href='test?test9=9&#038;test10=10'>test&#038;</a>")
240
+
241
+ assert_equal "<a href='test?test11=11&#38;test12=12'>test&</a>",
242
+ @gilenson.process("<a href='test?test11=11&test12=12'>test&</a>")
243
+
244
+ assert_equal "<a href='test?test12=12&#38;'>test</a>",
245
+ @gilenson.process("<a href='test?test12=12&amp;'>test</a>")
246
+
247
+ assert_equal "<a href='test?x=1&#38;y=2' title='&#38;-amp, &#8230;-hellip'>test</a>",
248
+ @gilenson.process("<a href='test?x=1&y=2' title='&#38;-amp, &#8230;-hellip'>test</a>")
249
+
250
+ assert_equal "<a href='test?x=3&#38;#039;y=4'>test</a>",
251
+ @gilenson.process("<a href='test?x=3&#039;y=4'>test</a>")
252
+
253
+
254
+ @gilenson.glyph[:amp] = '&amp;'
255
+
256
+ assert_equal "<a href='test?test11=11&amp;test12=12'>test&</a>",
257
+ @gilenson.process("<a href='test?test11=11&test12=12'>test&</a>")
258
+
259
+ assert_equal "<a href='test?test13=13&amp;test14=14'>test&</a>",
260
+ @gilenson.process("<a href='test?test13=13&amp;test14=14'>test&</a>")
261
+
262
+ assert_equal "<a href='test?test15=15&amp;amppp;test16=16'>test&</a>",
263
+ @gilenson.process("<a href='test?test15=15&amppp;test16=16'>test&</a>")
264
+
265
+ end
266
+
267
+ private
268
+ # Проверить равны ли строки, и если нет то обьяснить какой кодпойнт отличается.
269
+ # Совершенно необходимо для работы с различными пробелами.
270
+ def assert_equal_cp(reference, actual, msg = nil)
271
+ (assert(true, msg); return) if (reference == actual)
272
+
273
+ reference_cp, actual_cp = [reference, actual].map{|t| t.unpack("U*") }
274
+ reference_cp.each_with_index do | ref_codepoint, idx |
275
+ next unless actual_cp[idx] != ref_codepoint
276
+ beg, fin = idx - 2, idx + 2
277
+ beg = 0 if (beg < 0)
278
+ conflicting_piece = actual_cp[beg..fin].pack("U*")
279
+ msg = []
280
+ msg << "Expected #{actual.inspect} to be equal to #{reference.inspect}, but they were not, " +
281
+ "in fragment '#{beg > 0 ? '...' : ''}#{conflicting_piece}...'"
282
+ msg << "Non-matching codepoint #{actual[idx]} at offset #{idx}, " +
283
+ "expected codepoint #{ref_codepoint} instead"
284
+ flunk msg.join("\n"); return
285
+ end
286
+ raise "We should never get here"
287
+ end
288
+ end
289
+
290
+
291
+ class GilensonConfigurationTest < Test::Unit::TestCase
292
+ def setup
293
+ @gilenson = RuTils::Gilenson::Formatter.new
294
+ end
295
+
296
+ def test_settings_as_tail_arguments
297
+
298
+ assert_equal "Ну&#160;и куда вот&#160;&#8212; да&#160;туда!",
299
+ @gilenson.process("Ну и куда вот -- да туда!")
300
+
301
+ assert_equal "Ну и куда вот &#8212; да туда!",
302
+ @gilenson.process("Ну и куда вот -- да туда!", :dash => false, :dashglue => false, :wordglue => false)
303
+
304
+ assert_equal "Ну&#160;и куда вот&#160;&#8212; да&#160;туда!",
305
+ @gilenson.process("Ну и куда вот -- да туда!")
306
+
307
+ @gilenson.configure!(:dash => false, :dashglue => false, :wordglue => false)
308
+
309
+ assert_equal "Ну и куда вот &#8212; да туда!",
310
+ @gilenson.process("Ну и куда вот -- да туда!")
311
+
312
+ @gilenson.configure!(:all => true)
313
+
314
+ assert_equal "Ну&#160;и куда вот&#160;&#8212; да&#160;туда!",
315
+ @gilenson.process("Ну и куда вот -- да туда!")
316
+
317
+ @gilenson.configure!(:all => false)
318
+
319
+ assert_equal "Ну и куда вот -- да туда!",
320
+ @gilenson.process("Ну и куда вот -- да туда!")
321
+ end
322
+
323
+ def test_glyph_override
324
+ assert_equal 'скажи, мне, ведь не&#160;даром! Москва, клеймённая пожаром. Французу отдана',
325
+ @gilenson.process('скажи ,мне, ведь не даром !Москва, клеймённая пожаром .Французу отдана')
326
+
327
+ @gilenson.glyph[:nbsp] = '&nbsp;'
328
+ assert_equal 'скажи, мне, ведь не&nbsp;даром! Москва, клеймённая пожаром. Французу отдана',
329
+ @gilenson.process('скажи ,мне, ведь не даром !Москва, клеймённая пожаром .Французу отдана')
330
+ end
331
+
332
+ def test_ugly_entities_replace2 # copy&paste
333
+ @gilenson.configure!(:copypaste => true)
334
+ assert_equal '&#160; &#171; &#187; &#167; &#169; &#174; &#176; &#177; &#182; &#183; &#8211; &#8212; &#8216; &#8217; &#8220; &#8221; &#8222; &#8226; &#8230; &#8470; &#8482; &#8722; &#8201; &#8243;', @gilenson.process('  « » § © ® ° ± ¶ · – — ‘ ’ “ ” „ • … № ™ −   ″')
335
+ end
336
+
337
+ def test_raise_on_unknown_setting
338
+ assert_raise(RuTils::Gilenson::UnknownSetting) { @gilenson.configure!(:bararara => true) }
339
+ end
340
+
341
+ def test_raw_utf8_output
342
+ @gilenson.configure!(:raw_output=>true)
343
+ assert_equal '&#38442; Это просто «кавычки»',
344
+ @gilenson.process('&#38442; Это просто "кавычки"')
345
+ end
346
+
347
+ def test_configure_alternate_names
348
+ assert @gilenson.configure(:raw_output=>true)
349
+ assert @gilenson.configure!(:raw_output=>true)
350
+ end
351
+
352
+ def test_explicit_nobr
353
+ @gilenson.glyph[:nob_open] = '[NOB]'
354
+ @gilenson.glyph[:nob_close] = '[NOBC]'
355
+ assert_equal '[NOB]3&#8211;12&#8211;30[NOBC]', @gilenson.process('3-12-30')
356
+ end
357
+ end
358
+
359
+ # class TypograficaTrakoEntries < Test::Unit::TestCase
360
+ # def test_cpp
361
+ # assert_equal "C++-API", "C++-API".gilensize
362
+ # end
363
+ #
364
+ # def test_symmetricity # http://pixel-apes.com/typografica/trako/12
365
+ # assert_equal "&#171;Справка&#160;09&#187;", '"Справка 09"'.gilensize
366
+ # end
367
+ #
368
+ # def test_paths # http://pixel-apes.com/typografica/trako/13
369
+ # assert_equal '&#171;c:\www\sites\&#187;', '"c:\www\sites\"'.gilensize
370
+ # end
371
+ # end
@@ -0,0 +1,125 @@
1
+ $KCODE = 'u'
2
+ require 'test/unit'
3
+ require 'rubygems'
4
+
5
+ begin
6
+ require 'action_controller' unless defined?(ActionController)
7
+ require 'action_view' unless defined?(ActionView)
8
+ rescue LoadError
9
+ $skip_rails = true
10
+ end
11
+
12
+ begin
13
+ require 'RedCloth' unless defined?(RedCloth)
14
+ rescue LoadError
15
+ $skip_redcloth = true
16
+ end
17
+
18
+ begin
19
+ require 'BlueCloth' unless defined?(BlueCloth)
20
+ rescue LoadError
21
+ $skip_bluecloth = true
22
+ end
23
+
24
+ require File.dirname(__FILE__) + '/../lib/rutils'
25
+ load File.dirname(__FILE__) + '/../lib/integration/integration.rb'
26
+
27
+ class IntegrationFlagTest < Test::Unit::TestCase
28
+ def setup
29
+ RuTils::overrides = true
30
+ end
31
+
32
+ def test_integration_flag
33
+ RuTils::overrides = false
34
+ assert !RuTils::overrides_enabled?
35
+ RuTils::overrides = true
36
+ assert RuTils::overrides_enabled?
37
+ end
38
+ end
39
+
40
+ # Интеграция с RedCloth - Textile.
41
+ # Нужно иметь в виду что Textile осуществляет свою обработку типографики, которую мы подменяем!
42
+ class TextileIntegrationTest < Test::Unit::TestCase
43
+ def test_integration_textile
44
+ raise "You must have RedCloth to test Textile integration" and return if $skip_redcloth
45
+
46
+ RuTils::overrides = true
47
+ assert RuTils.overrides_enabled?
48
+ assert_equal "<p>И&#160;вот &#171;они пошли туда&#187;, и&#160;шли шли&#160;шли</p>",
49
+ RedCloth.new('И вот "они пошли туда", и шли шли шли').to_html
50
+
51
+ RuTils::overrides = false
52
+ assert !RuTils::overrides_enabled?
53
+ assert_equal '<p><strong>strong text</strong> and <em>emphasized text</em></p>',
54
+ RedCloth.new("*strong text* and _emphasized text_").to_html, "Spaces should be preserved \
55
+ without RuTils"
56
+
57
+ RuTils::overrides = true
58
+ assert RuTils.overrides_enabled?
59
+ assert_equal '<p><strong>strong text</strong> and <em>emphasized text</em></p>',
60
+ RedCloth.new("*strong text* and _emphasized text_").to_html, "Spaces should be preserved"
61
+
62
+ RuTils::overrides = false
63
+ assert !RuTils.overrides_enabled?
64
+ assert_equal "<p>И вот &#8220;они пошли туда&#8221;, и шли шли шли</p>",
65
+ RedCloth.new('И вот "они пошли туда", и шли шли шли').to_html
66
+
67
+ end
68
+ end
69
+
70
+ # Интеграция с BlueCloth - Markdown
71
+ # Сам Markdown никакой обработки типографики не производит (это делает RubyPants, но вряд ли его кто-то юзает на практике)
72
+ class MarkdownIntegrationTest < Test::Unit::TestCase
73
+ def test_integration_markdown
74
+ raise "You must have BlueCloth to test Markdown integration" and return if $skip_bluecloth
75
+
76
+ RuTils::overrides = true
77
+ assert RuTils.overrides_enabled?
78
+ assert_equal "<p>И вот&#160;&#171;они пошли туда&#187;, и&#160;шли шли&#160;шли</p>",
79
+ BlueCloth.new('И вот "они пошли туда", и шли шли шли').to_html
80
+
81
+ RuTils::overrides = false
82
+ assert !RuTils.overrides_enabled?
83
+ assert_equal "<p>И вот \"они пошли туда\", и шли шли шли</p>",
84
+ BlueCloth.new('И вот "они пошли туда", и шли шли шли').to_html
85
+ end
86
+ end
87
+
88
+ TEST_DATE = Date.parse("1983-10-15") # coincidentially...
89
+ TEST_TIME = Time.local(1983, 10, 15, 12, 15) # also coincidentially...
90
+
91
+ class HelperTester
92
+ def get_distance
93
+ distance_of_time_in_words(Time.now - 20.minutes, Time.now)
94
+ end
95
+
96
+ def get_select_month
97
+ select_month(TEST_DATE)
98
+ end
99
+
100
+ def get_date_select
101
+ select_date(TEST_DATE)
102
+ end
103
+
104
+ def get_date_select_without_day
105
+ select_date(TEST_DATE, :order => [:month, :year])
106
+ end
107
+ end
108
+ # Перегрузка helper'ов Rails
109
+ class RailsHelpersOverrideTest < Test::Unit::TestCase
110
+ def test_distance_of_time_in_words
111
+ raise "You must have Rails to test ActionView integration" and return if $skip_rails
112
+
113
+ HelperTester.class_eval { include ActionView::Helpers::DateHelper }
114
+
115
+ RuTils::overrides = true
116
+ stub = HelperTester.new
117
+ assert_equal "20 минут", stub.get_distance
118
+ assert_match /июль/, stub.get_select_month, "Месяц в выборе месяца должен быть указан в именительном падеже"
119
+ assert_match /декабря/, stub.get_date_select, "Имя месяца должно быть указано в родительном падеже"
120
+ assert_match /декабря/, stub.get_date_select_without_day,
121
+ "Хелпер select_date не позволяет опускать фрагменты, имя месяца должно быть указано в родительном падеже"
122
+
123
+ end
124
+ end
125
+