rotuka-rutils 0.2.4

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.
@@ -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
+