gettext 1.91.0 → 1.92.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (238) hide show
  1. data/ChangeLog +111 -1
  2. data/NEWS +35 -0
  3. data/README +26 -24
  4. data/bin/rgettext +2 -2
  5. data/bin/rmsgfmt +2 -2
  6. data/bin/rmsgmerge +2 -2
  7. data/doc/classes/ActionView/Helpers/FormBuilder.html +11 -11
  8. data/doc/classes/ActionView/TemplateFinder.html +152 -0
  9. data/doc/classes/ActiveRecord/Base.html +87 -87
  10. data/doc/classes/ActiveRecord/ConnectionAdapters/Column.html +6 -6
  11. data/doc/classes/GetText.html +617 -491
  12. data/doc/classes/GetText/ActiveRecordParser.html +13 -13
  13. data/doc/classes/GetText/ErbContainer.html +12 -12
  14. data/doc/classes/GetText/ErbParser.html +6 -6
  15. data/doc/classes/GetText/NoboundTextDomainError.html +1 -1
  16. data/doc/classes/GetText/PoParser.html +11 -11
  17. data/doc/classes/GetText/Rails.html +20 -20
  18. data/doc/classes/GetText/RubyParser.html +5 -0
  19. data/doc/classes/GetText/TextDomain.html +53 -53
  20. data/doc/classes/GetText/TextDomainManager.html +54 -54
  21. data/doc/classes/Iconv.html +20 -20
  22. data/doc/classes/Locale.html +151 -151
  23. data/doc/classes/Locale/Object.html +92 -92
  24. data/doc/classes/Locale/SystemBase.html +32 -32
  25. data/doc/classes/Locale/SystemCGI.html +31 -31
  26. data/doc/classes/Locale/SystemWin32.html +6 -6
  27. data/doc/classes/MOFile.html +311 -293
  28. data/doc/classes/MOFile/HeaderRev1.html +150 -0
  29. data/doc/classes/Module.html +6 -6
  30. data/doc/created.rid +1 -1
  31. data/doc/files/ChangeLog.html +143 -2
  32. data/doc/files/README.html +31 -25
  33. data/doc/files/lib/gettext/active_record_rb.html +1 -1
  34. data/doc/files/lib/gettext/mo_rb.html +1 -1
  35. data/doc/files/lib/gettext/parser/active_record_rb.html +1 -1
  36. data/doc/files/lib/gettext/parser/ruby_rb.html +1 -1
  37. data/doc/files/lib/gettext/poparser_rb.html +1 -1
  38. data/doc/files/lib/gettext/rails_rb.html +1 -1
  39. data/doc/files/lib/gettext/rgettext_rb.html +1 -1
  40. data/doc/files/lib/gettext/rmsgfmt_rb.html +2 -1
  41. data/doc/files/lib/gettext/utils_rb.html +1 -1
  42. data/doc/files/lib/gettext/version_rb.html +1 -1
  43. data/doc/files/lib/gettext_rb.html +1 -1
  44. data/doc/fr_class_index.html +2 -0
  45. data/doc/fr_method_index.html +133 -129
  46. data/lib/gettext.rb +49 -7
  47. data/lib/gettext/active_record.rb +49 -4
  48. data/lib/gettext/mo.rb +39 -12
  49. data/lib/gettext/parser/active_record.rb +6 -4
  50. data/lib/gettext/parser/ruby.rb +11 -4
  51. data/lib/gettext/poparser.rb +81 -52
  52. data/lib/gettext/rails.rb +28 -11
  53. data/lib/gettext/rgettext.rb +6 -1
  54. data/lib/gettext/rmsgfmt.rb +3 -11
  55. data/lib/gettext/utils.rb +7 -3
  56. data/lib/gettext/version.rb +1 -1
  57. data/po/bs/rails.po +55 -20
  58. data/po/bs/rgettext.po +3 -3
  59. data/po/ca/rails.po +58 -31
  60. data/po/ca/rgettext.po +16 -18
  61. data/po/cs/rails.po +55 -20
  62. data/po/cs/rgettext.po +3 -3
  63. data/po/de/rails.po +55 -27
  64. data/po/de/rgettext.po +21 -22
  65. data/po/el/rails.po +60 -36
  66. data/po/el/rgettext.po +15 -17
  67. data/po/eo/rails.po +51 -23
  68. data/po/eo/rgettext.po +21 -20
  69. data/po/es/rails.po +57 -31
  70. data/po/es/rgettext.po +17 -18
  71. data/po/et/rails.po +55 -20
  72. data/po/fr/rails.po +56 -21
  73. data/po/fr/rgettext.po +3 -3
  74. data/po/hr/rails.po +55 -20
  75. data/po/hr/rgettext.po +3 -3
  76. data/po/hu/rails.po +54 -26
  77. data/po/hu/rgettext.po +18 -17
  78. data/po/it/rails.po +55 -20
  79. data/po/it/rgettext.po +3 -3
  80. data/po/ja/rails.po +54 -26
  81. data/po/ja/rgettext.po +17 -18
  82. data/po/ko/rails.po +56 -21
  83. data/po/ko/rgettext.po +3 -3
  84. data/po/lv/rails.po +155 -0
  85. data/po/lv/rgettext.po +137 -0
  86. data/po/nb/rails.po +61 -34
  87. data/po/nb/rgettext.po +22 -19
  88. data/po/nl/rails.po +56 -21
  89. data/po/nl/rgettext.po +3 -3
  90. data/po/pt_BR/rails.po +53 -26
  91. data/po/pt_BR/rgettext.po +19 -19
  92. data/po/rails.pot +44 -16
  93. data/po/rgettext.pot +3 -3
  94. data/po/ru/rails.po +62 -36
  95. data/po/ru/rgettext.po +19 -19
  96. data/po/sr/rails.po +87 -58
  97. data/po/sr/rgettext.po +38 -33
  98. data/po/sv/rgettext.po +3 -3
  99. data/po/ua/rails.po +62 -32
  100. data/po/ua/rgettext.po +19 -17
  101. data/po/vi/rails.po +56 -28
  102. data/po/vi/rgettext.po +35 -34
  103. data/po/zh/rails.po +52 -24
  104. data/po/zh/rgettext.po +22 -24
  105. data/po/zh_TW/rails.po +51 -23
  106. data/po/zh_TW/rgettext.po +16 -18
  107. data/samples/cgi/cookie.cgi +0 -0
  108. data/samples/cgi/helloerb1.cgi +0 -0
  109. data/samples/cgi/helloerb2.cgi +0 -0
  110. data/samples/cgi/http.rb +0 -0
  111. data/samples/cgi/index.cgi +0 -0
  112. data/samples/cgi/po/lv/helloerb1.po +65 -0
  113. data/samples/cgi/po/lv/helloerb2.po +52 -0
  114. data/samples/cgi/po/lv/hellolib.po +24 -0
  115. data/samples/cgi/po/lv/main.po +77 -0
  116. data/samples/cgi/po/nb/helloerb1.po +16 -14
  117. data/samples/cgi/po/nb/helloerb2.po +14 -12
  118. data/samples/cgi/po/nb/hellolib.po +9 -7
  119. data/samples/cgi/po/nb/main.po +20 -18
  120. data/samples/cgi/po/sr/helloerb1.po +8 -8
  121. data/samples/cgi/po/sr/helloerb2.po +6 -6
  122. data/samples/cgi/po/sr/hellolib.po +2 -2
  123. data/samples/cgi/po/sr/main.po +15 -15
  124. data/samples/cgi/po/ua/helloerb1.po +2 -2
  125. data/samples/cgi/po/ua/main.po +3 -3
  126. data/samples/hello_plural.rb +0 -0
  127. data/samples/makemo.rb +0 -0
  128. data/samples/po/lv/hello.po +24 -0
  129. data/samples/po/lv/hello2.po +32 -0
  130. data/samples/po/lv/hello_noop.po +28 -0
  131. data/samples/po/lv/hello_plural.po +26 -0
  132. data/samples/po/lv/helloglade2.po +38 -0
  133. data/samples/po/lv/hellogtk.po +24 -0
  134. data/samples/po/lv/hellotk.po +24 -0
  135. data/samples/po/nb/hello.po +9 -8
  136. data/samples/po/nb/hello2.po +9 -9
  137. data/samples/po/nb/hello_noop.po +10 -9
  138. data/samples/po/nb/hello_plural.po +10 -8
  139. data/samples/po/nb/helloglade2.po +10 -8
  140. data/samples/po/nb/hellogtk.po +9 -8
  141. data/samples/po/nb/hellotk.po +9 -7
  142. data/samples/po/sr/hello.po +2 -2
  143. data/samples/po/sr/hello2.po +4 -4
  144. data/samples/po/sr/hello_noop.po +3 -3
  145. data/samples/po/sr/hello_plural.po +3 -3
  146. data/samples/po/sr/helloglade2.po +4 -4
  147. data/samples/po/sr/hellogtk.po +2 -2
  148. data/samples/po/sr/hellotk.po +2 -2
  149. data/samples/po/ua/hello2.po +2 -2
  150. data/samples/po/ua/hello_plural.po +2 -2
  151. data/samples/rails/config/boot.rb +3 -2
  152. data/samples/rails/config/environment.rb +2 -3
  153. data/samples/rails/db/schema.rb +0 -0
  154. data/samples/rails/po/lv/blog.po +110 -0
  155. data/samples/rails/po/nb/blog.po +19 -15
  156. data/samples/rails/po/sr/blog.po +23 -23
  157. data/samples/rails/po/ua/blog.po +3 -3
  158. data/samples/rails/public/dispatch.cgi +0 -0
  159. data/samples/rails/public/dispatch.fcgi +0 -0
  160. data/samples/rails/public/dispatch.rb +0 -0
  161. data/samples/rails/public/javascripts/controls.js +1 -1
  162. data/samples/rails/public/javascripts/dragdrop.js +1 -1
  163. data/samples/rails/public/javascripts/effects.js +1 -1
  164. data/samples/rails/script/about +0 -0
  165. data/samples/rails/script/breakpointer +0 -0
  166. data/samples/rails/script/console +0 -0
  167. data/samples/rails/script/destroy +0 -0
  168. data/samples/rails/script/generate +0 -0
  169. data/samples/rails/script/performance/benchmarker +0 -0
  170. data/samples/rails/script/performance/profiler +0 -0
  171. data/samples/rails/script/plugin +0 -0
  172. data/samples/rails/script/process/reaper +0 -0
  173. data/samples/rails/script/process/spawner +0 -0
  174. data/samples/rails/script/process/spinner +0 -0
  175. data/samples/rails/script/runner +0 -0
  176. data/samples/rails/script/server +0 -0
  177. data/samples/rails/vendor/plugins/gettext/po/lv/gettext_plugin.po +28 -0
  178. data/samples/rails/vendor/plugins/gettext/po/nb/gettext_plugin.po +11 -8
  179. data/samples/rails/vendor/plugins/gettext/po/sr/gettext_plugin.po +5 -5
  180. data/src/poparser.ry +27 -6
  181. data/test/benchmark.rb +1 -1
  182. data/test/db/mysql.drop.sql +1 -0
  183. data/test/db/mysql.sql +13 -0
  184. data/test/fixtures/inept_wizard.rb +3 -0
  185. data/test/fixtures/people.yml +6 -0
  186. data/test/fixtures/topic.rb +30 -0
  187. data/test/fixtures/wizard.rb +5 -0
  188. data/test/po/active_record.pot +151 -66
  189. data/test/po/ja/active_record.po +177 -92
  190. data/test/po/ja/test_pgettext.po +41 -0
  191. data/test/rails/app/controllers/users_controller.rb +1 -0
  192. data/test/rails/app/views/articles/_form_fr.html.erb +1 -0
  193. data/test/rails/config/boot.rb +96 -32
  194. data/test/rails/config/environment.rb +3 -2
  195. data/test/rails/db/schema.rb +4 -4
  196. data/test/rails/public/dispatch.cgi +0 -0
  197. data/test/rails/public/dispatch.fcgi +0 -0
  198. data/test/rails/public/dispatch.rb +0 -0
  199. data/test/rails/public/javascripts/controls.js +484 -354
  200. data/test/rails/public/javascripts/dragdrop.js +88 -58
  201. data/test/rails/public/javascripts/effects.js +396 -364
  202. data/test/rails/public/javascripts/prototype.js +2817 -1107
  203. data/test/rails/script/about +0 -0
  204. data/test/rails/script/breakpointer +0 -0
  205. data/test/rails/script/console +0 -0
  206. data/test/rails/script/destroy +0 -0
  207. data/test/rails/script/generate +0 -0
  208. data/test/rails/script/performance/benchmarker +0 -0
  209. data/test/rails/script/performance/profiler +0 -0
  210. data/test/rails/script/plugin +0 -0
  211. data/test/rails/script/process/inspector +0 -0
  212. data/test/rails/script/process/reaper +0 -0
  213. data/test/rails/script/process/spawner +0 -0
  214. data/test/rails/script/runner +0 -0
  215. data/test/rails/script/server +0 -0
  216. data/test/rails/test/functional/articles_controller_test.rb +5 -0
  217. data/test/rails/test/result/en/create_error.html +3 -3
  218. data/test/rails/test/result/en/custom_error_message.html +3 -3
  219. data/test/rails/test/result/en/custom_error_message_with_plural.html +60 -60
  220. data/test/rails/test/result/en/multi_error_messages_for.html +6 -6
  221. data/test/rails/test/result/en/new.html +3 -3
  222. data/test/rails/test/result/fr/custom_error_message.html +3 -3
  223. data/test/rails/test/result/fr/custom_error_message_with_plural.html +60 -60
  224. data/test/rails/test/result/fr/new.html +23 -0
  225. data/test/rails/test/result/ja/create_error.html +3 -3
  226. data/test/rails/test/result/ja/custom_error_message.html +3 -3
  227. data/test/rails/test/result/ja/custom_error_message_with_plural.html +60 -60
  228. data/test/rails/test/result/ja/multi_error_messages_for.html +6 -6
  229. data/test/rails/test/result/ja/new.html +3 -3
  230. data/test/test.sh +2 -2
  231. data/test/test_active_record.rb +824 -20
  232. data/test/test_gettext.rb +34 -4
  233. data/test/test_java.sh +0 -0
  234. data/test/test_locale.rb +2 -2
  235. data/test/test_parser.rb +13 -2
  236. data/test/test_rails_caching.rb +11 -4
  237. data/test/testlib/pgettext.rb +33 -0
  238. metadata +32 -4
@@ -0,0 +1,23 @@
1
+ <html>
2
+ <head>
3
+ <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
4
+ <title>Ruby-GetText-Package Test Application</title>
5
+ <link href="/stylesheets/scaffold.css" media="screen" rel="Stylesheet" type="text/css" />
6
+ </head>
7
+ <body>
8
+
9
+ <p style="color: green"></p>
10
+
11
+ <h1>New article</h1>
12
+
13
+ <form action="/articles/create" method="post">
14
+ <h1>FRENCH</h1>
15
+
16
+ <input name="commit" type="submit" value="Create" />
17
+ </form>
18
+
19
+ <a href="/articles/list">Back</a>
20
+
21
+
22
+ </body>
23
+ </html>
@@ -27,7 +27,7 @@
27
27
  <option value="2004">2004</option>
28
28
  <option value="2005">2005</option>
29
29
  <option value="2006">2006</option>
30
- <option value="2007" selected="selected">2007</option>
30
+ <option selected="selected" value="2007">2007</option>
31
31
  <option value="2008">2008</option>
32
32
  <option value="2009">2009</option>
33
33
  <option value="2010">2010</option>
@@ -38,7 +38,7 @@
38
38
  <option value="1">January</option>
39
39
  <option value="2">February</option>
40
40
  <option value="3">March</option>
41
- <option value="4" selected="selected">April</option>
41
+ <option selected="selected" value="4">April</option>
42
42
  <option value="5">May</option>
43
43
  <option value="6">June</option>
44
44
  <option value="7">July</option>
@@ -49,7 +49,7 @@
49
49
  <option value="12">December</option>
50
50
  </select>
51
51
  <select id="article_lastupdate_3i" name="article[lastupdate(3i)]">
52
- <option value="1" selected="selected">1</option>
52
+ <option selected="selected" value="1">1</option>
53
53
  <option value="2">2</option>
54
54
  <option value="3">3</option>
55
55
  <option value="4">4</option>
@@ -20,7 +20,7 @@
20
20
  <option value="2004">2004</option>
21
21
  <option value="2005">2005</option>
22
22
  <option value="2006">2006</option>
23
- <option value="2007" selected="selected">2007</option>
23
+ <option selected="selected" value="2007">2007</option>
24
24
  <option value="2008">2008</option>
25
25
  <option value="2009">2009</option>
26
26
  <option value="2010">2010</option>
@@ -28,7 +28,7 @@
28
28
  <option value="2012">2012</option>
29
29
  </select>
30
30
  <select id="user_lastupdate_2i" name="user[lastupdate(2i)]">
31
- <option value="1" selected="selected">January</option>
31
+ <option selected="selected" value="1">January</option>
32
32
  <option value="2">February</option>
33
33
  <option value="3">March</option>
34
34
  <option value="4">April</option>
@@ -42,7 +42,7 @@
42
42
  <option value="12">December</option>
43
43
  </select>
44
44
  <select id="user_lastupdate_3i" name="user[lastupdate(3i)]">
45
- <option value="1" selected="selected">1</option>
45
+ <option selected="selected" value="1">1</option>
46
46
  <option value="2">2</option>
47
47
  <option value="3">3</option>
48
48
  <option value="4">4</option>
@@ -14,66 +14,66 @@
14
14
  <div class="fieldWithErrors"><input id="user_name" name="user[name]" size="30" type="text" value="foo" /></div></p>
15
15
 
16
16
  <p><label for="user_lastupdate">最終更新日</label><br/>
17
- <div class="fieldWithErrors"><select id="user_lastupdate_1i" name="user[lastupdate(1i)]">
18
- <option value="2003">2003</option>
19
- <option value="2004">2004</option>
20
- <option value="2005">2005</option>
21
- <option value="2006">2006</option>
22
- <option value="2007">2007</option>
23
- <option value="2008" selected="selected">2008</option>
24
- <option value="2009">2009</option>
25
- <option value="2010">2010</option>
26
- <option value="2011">2011</option>
27
- <option value="2012">2012</option>
28
- <option value="2013">2013</option>
29
- </select>
30
- <select id="user_lastupdate_2i" name="user[lastupdate(2i)]">
31
- <option value="1">January</option>
32
- <option value="2">February</option>
33
- <option value="3">March</option>
34
- <option value="4">April</option>
35
- <option value="5" selected="selected">May</option>
36
- <option value="6">June</option>
37
- <option value="7">July</option>
38
- <option value="8">August</option>
39
- <option value="9">September</option>
40
- <option value="10">October</option>
41
- <option value="11">November</option>
42
- <option value="12">December</option>
43
- </select>
44
- <select id="user_lastupdate_3i" name="user[lastupdate(3i)]">
45
- <option value="1">1</option>
46
- <option value="2">2</option>
47
- <option value="3">3</option>
48
- <option value="4">4</option>
49
- <option value="5">5</option>
50
- <option value="6" selected="selected">6</option>
51
- <option value="7">7</option>
52
- <option value="8">8</option>
53
- <option value="9">9</option>
54
- <option value="10">10</option>
55
- <option value="11">11</option>
56
- <option value="12">12</option>
57
- <option value="13">13</option>
58
- <option value="14">14</option>
59
- <option value="15">15</option>
60
- <option value="16">16</option>
61
- <option value="17">17</option>
62
- <option value="18">18</option>
63
- <option value="19">19</option>
64
- <option value="20">20</option>
65
- <option value="21">21</option>
66
- <option value="22">22</option>
67
- <option value="23">23</option>
68
- <option value="24">24</option>
69
- <option value="25">25</option>
70
- <option value="26">26</option>
71
- <option value="27">27</option>
72
- <option value="28">28</option>
73
- <option value="29">29</option>
74
- <option value="30">30</option>
75
- <option value="31">31</option>
76
- </select>
17
+ <div class="fieldWithErrors"><div class="fieldWithErrors"><select id="user_lastupdate_1i" name="user[lastupdate(1i)]">
18
+ <div class="fieldWithErrors"><option value="2002">2002</option></div>
19
+ <div class="fieldWithErrors"><option value="2003">2003</option></div>
20
+ <div class="fieldWithErrors"><option value="2004">2004</option></div>
21
+ <div class="fieldWithErrors"><option value="2005">2005</option></div>
22
+ <div class="fieldWithErrors"><option value="2006">2006</option></div>
23
+ <div class="fieldWithErrors"><option selected="selected" value="2007">2007</option></div>
24
+ <div class="fieldWithErrors"><option value="2008">2008</option></div>
25
+ <div class="fieldWithErrors"><option value="2009">2009</option></div>
26
+ <div class="fieldWithErrors"><option value="2010">2010</option></div>
27
+ <div class="fieldWithErrors"><option value="2011">2011</option></div>
28
+ <div class="fieldWithErrors"><option value="2012">2012</option></div>
29
+ </select></div>
30
+ <div class="fieldWithErrors"><select id="user_lastupdate_2i" name="user[lastupdate(2i)]">
31
+ <div class="fieldWithErrors"><option selected="selected" value="1">January</option></div>
32
+ <div class="fieldWithErrors"><option value="2">February</option></div>
33
+ <div class="fieldWithErrors"><option value="3">March</option></div>
34
+ <div class="fieldWithErrors"><option value="4">April</option></div>
35
+ <div class="fieldWithErrors"><option value="5">May</option></div>
36
+ <div class="fieldWithErrors"><option value="6">June</option></div>
37
+ <div class="fieldWithErrors"><option value="7">July</option></div>
38
+ <div class="fieldWithErrors"><option value="8">August</option></div>
39
+ <div class="fieldWithErrors"><option value="9">September</option></div>
40
+ <div class="fieldWithErrors"><option value="10">October</option></div>
41
+ <div class="fieldWithErrors"><option value="11">November</option></div>
42
+ <div class="fieldWithErrors"><option value="12">December</option></div>
43
+ </select></div>
44
+ <div class="fieldWithErrors"><select id="user_lastupdate_3i" name="user[lastupdate(3i)]">
45
+ <div class="fieldWithErrors"><option selected="selected" value="1">1</option></div>
46
+ <div class="fieldWithErrors"><option value="2">2</option></div>
47
+ <div class="fieldWithErrors"><option value="3">3</option></div>
48
+ <div class="fieldWithErrors"><option value="4">4</option></div>
49
+ <div class="fieldWithErrors"><option value="5">5</option></div>
50
+ <div class="fieldWithErrors"><option value="6">6</option></div>
51
+ <div class="fieldWithErrors"><option value="7">7</option></div>
52
+ <div class="fieldWithErrors"><option value="8">8</option></div>
53
+ <div class="fieldWithErrors"><option value="9">9</option></div>
54
+ <div class="fieldWithErrors"><option value="10">10</option></div>
55
+ <div class="fieldWithErrors"><option value="11">11</option></div>
56
+ <div class="fieldWithErrors"><option value="12">12</option></div>
57
+ <div class="fieldWithErrors"><option value="13">13</option></div>
58
+ <div class="fieldWithErrors"><option value="14">14</option></div>
59
+ <div class="fieldWithErrors"><option value="15">15</option></div>
60
+ <div class="fieldWithErrors"><option value="16">16</option></div>
61
+ <div class="fieldWithErrors"><option value="17">17</option></div>
62
+ <div class="fieldWithErrors"><option value="18">18</option></div>
63
+ <div class="fieldWithErrors"><option value="19">19</option></div>
64
+ <div class="fieldWithErrors"><option value="20">20</option></div>
65
+ <div class="fieldWithErrors"><option value="21">21</option></div>
66
+ <div class="fieldWithErrors"><option value="22">22</option></div>
67
+ <div class="fieldWithErrors"><option value="23">23</option></div>
68
+ <div class="fieldWithErrors"><option value="24">24</option></div>
69
+ <div class="fieldWithErrors"><option value="25">25</option></div>
70
+ <div class="fieldWithErrors"><option value="26">26</option></div>
71
+ <div class="fieldWithErrors"><option value="27">27</option></div>
72
+ <div class="fieldWithErrors"><option value="28">28</option></div>
73
+ <div class="fieldWithErrors"><option value="29">29</option></div>
74
+ <div class="fieldWithErrors"><option value="30">30</option></div>
75
+ <div class="fieldWithErrors"><option value="31">31</option></div>
76
+ </select></div>
77
77
  </div></p>
78
78
  <!--[eoform:article]-->
79
79
 
@@ -24,7 +24,7 @@
24
24
  <option value="2004">2004</option>
25
25
  <option value="2005">2005</option>
26
26
  <option value="2006">2006</option>
27
- <option value="2007" selected="selected">2007</option>
27
+ <option selected="selected" value="2007">2007</option>
28
28
  <option value="2008">2008</option>
29
29
  <option value="2009">2009</option>
30
30
  <option value="2010">2010</option>
@@ -35,7 +35,7 @@
35
35
  <option value="1">January</option>
36
36
  <option value="2">February</option>
37
37
  <option value="3">March</option>
38
- <option value="4" selected="selected">April</option>
38
+ <option selected="selected" value="4">April</option>
39
39
  <option value="5">May</option>
40
40
  <option value="6">June</option>
41
41
  <option value="7">July</option>
@@ -46,7 +46,7 @@
46
46
  <option value="12">December</option>
47
47
  </select>
48
48
  <select id="article_lastupdate_3i" name="article[lastupdate(3i)]">
49
- <option value="1" selected="selected">1</option>
49
+ <option selected="selected" value="1">1</option>
50
50
  <option value="2">2</option>
51
51
  <option value="3">3</option>
52
52
  <option value="4">4</option>
@@ -90,7 +90,7 @@
90
90
  <option value="2004">2004</option>
91
91
  <option value="2005">2005</option>
92
92
  <option value="2006">2006</option>
93
- <option value="2007" selected="selected">2007</option>
93
+ <option selected="selected" value="2007">2007</option>
94
94
  <option value="2008">2008</option>
95
95
  <option value="2009">2009</option>
96
96
  <option value="2010">2010</option>
@@ -101,7 +101,7 @@
101
101
  <option value="1">January</option>
102
102
  <option value="2">February</option>
103
103
  <option value="3">March</option>
104
- <option value="4" selected="selected">April</option>
104
+ <option selected="selected" value="4">April</option>
105
105
  <option value="5">May</option>
106
106
  <option value="6">June</option>
107
107
  <option value="7">July</option>
@@ -112,7 +112,7 @@
112
112
  <option value="12">December</option>
113
113
  </select>
114
114
  <select id="user_lastupdate_3i" name="user[lastupdate(3i)]">
115
- <option value="1" selected="selected">1</option>
115
+ <option selected="selected" value="1">1</option>
116
116
  <option value="2">2</option>
117
117
  <option value="3">3</option>
118
118
  <option value="4">4</option>
@@ -27,7 +27,7 @@
27
27
  <option value="2004">2004</option>
28
28
  <option value="2005">2005</option>
29
29
  <option value="2006">2006</option>
30
- <option value="2007" selected="selected">2007</option>
30
+ <option selected="selected" value="2007">2007</option>
31
31
  <option value="2008">2008</option>
32
32
  <option value="2009">2009</option>
33
33
  <option value="2010">2010</option>
@@ -38,7 +38,7 @@
38
38
  <option value="1">January</option>
39
39
  <option value="2">February</option>
40
40
  <option value="3">March</option>
41
- <option value="4" selected="selected">April</option>
41
+ <option selected="selected" value="4">April</option>
42
42
  <option value="5">May</option>
43
43
  <option value="6">June</option>
44
44
  <option value="7">July</option>
@@ -49,7 +49,7 @@
49
49
  <option value="12">December</option>
50
50
  </select>
51
51
  <select id="article_lastupdate_3i" name="article[lastupdate(3i)]">
52
- <option value="1" selected="selected">1</option>
52
+ <option selected="selected" value="1">1</option>
53
53
  <option value="2">2</option>
54
54
  <option value="3">3</option>
55
55
  <option value="4">4</option>
data/test/test.sh CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/bin/sh
2
2
 
3
- export LC_ALL="ja_JP.eucJP";
4
- export LANG="ja_JP.eucJP";
3
+ export LC_ALL="ja_JP.UTF-8";
4
+ export LANG="ja_JP.UTF-8";
5
5
  rake rebuilddb
6
6
  for target in test_*.rb
7
7
  do
@@ -11,11 +11,13 @@ require 'active_record/fixtures'
11
11
  require 'fixtures/topic'
12
12
  require 'fixtures/reply'
13
13
  require 'fixtures/developer'
14
+ require 'fixtures/wizard'
15
+ require 'fixtures/inept_wizard'
14
16
  require 'logger'
15
17
 
16
- version = /activerecord-([^\/]+)/.match($:.join)[1]
18
+ AR_TEST_VERSION = /activerecord-([^\/]+)/.match($:.join)[1]
17
19
 
18
- if version > "2.0.0"
20
+ if AR_TEST_VERSION > "2.0.0"
19
21
  #ticket 6657 on dev.rubyonrails.org require this but it becames removed(?)
20
22
  AR_6657 = true
21
23
  else
@@ -67,6 +69,12 @@ class Topic
67
69
  end
68
70
  end
69
71
 
72
+ class ProtectedPerson < ActiveRecord::Base
73
+ set_table_name 'people'
74
+ attr_accessor :addon
75
+ attr_protected :first_name
76
+ end
77
+
70
78
  class MyModel
71
79
  attr_accessor :title
72
80
  def save; end
@@ -83,16 +91,30 @@ class MyModel
83
91
  validates_presence_of :title
84
92
  end
85
93
 
94
+ class Conjurer < IneptWizard
95
+ end
96
+
97
+ class Thaumaturgist < IneptWizard
98
+ end
99
+
86
100
  class ValidationsTest < Test::Unit::TestCase
87
101
  fixtures :topics, :developers
88
102
 
89
103
  def setup
90
104
  bindtextdomain_to(Topic, "active_record")
91
- Topic.write_inheritable_attribute(:validate, nil)
92
- Topic.write_inheritable_attribute(:validate_on_create, nil)
93
- Topic.write_inheritable_attribute(:validate_on_update, nil)
105
+
106
+ if AR_TEST_VERSION < "2.1.0"
107
+ Topic.write_inheritable_attribute(:validate, nil)
108
+ Topic.write_inheritable_attribute(:validate_on_create, nil)
109
+ Topic.write_inheritable_attribute(:validate_on_update, nil)
110
+ else
111
+ Topic.instance_variable_set("@validate_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
112
+ Topic.instance_variable_set("@validate_on_create_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
113
+ Topic.instance_variable_set("@validate_on_update_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
114
+ end
94
115
  end
95
116
 
117
+
96
118
  def test_single_attr_validation_and_error_msg
97
119
  GetText.set_locale_all "ja_JP.UTF-8"
98
120
  r = Reply.new
@@ -210,6 +232,77 @@ class ValidationsTest < Test::Unit::TestCase
210
232
  end
211
233
  end
212
234
 
235
+ def test_exception_on_create_bang_many
236
+ assert_raises(ActiveRecord::RecordInvalid) do
237
+ Reply.create!([ { "title" => "OK" }, { "title" => "Wrong Create" }])
238
+ end
239
+
240
+ GetText.set_locale_all "ja_JP.UTF-8"
241
+ begin
242
+ Reply.create!([ { "title" => "OK" }, { "title" => "Wrong Create" }])
243
+ rescue ActiveRecord::RecordInvalid => invalid
244
+ assert_equal "入力値が正しくありません。: Reply内容 空です。", invalid.message
245
+ end
246
+ GetText.set_locale_all "en"
247
+ begin
248
+ Reply.create!([ { "title" => "OK" }, { "title" => "Wrong Create" }])
249
+ rescue ActiveRecord::RecordInvalid => invalid
250
+ assert_equal "Validation failed: Content Empty", invalid.message
251
+ end
252
+ end
253
+
254
+
255
+ def test_exception_on_create_bang_with_block
256
+ assert_raises(ActiveRecord::RecordInvalid) do
257
+ Reply.create!({ "title" => "OK" }) do |r|
258
+ r.content = nil
259
+ end
260
+ end
261
+
262
+ GetText.set_locale_all "ja_JP.UTF-8"
263
+ begin
264
+ Reply.create!({ "title" => "OK" }) do |r|
265
+ r.content = nil
266
+ end
267
+ rescue ActiveRecord::RecordInvalid => invalid
268
+ assert_equal "入力値が正しくありません。: Reply内容 空です。", invalid.message
269
+ end
270
+
271
+ GetText.set_locale_all "en"
272
+ begin
273
+ Reply.create!({ "title" => "OK" }) do |r|
274
+ r.content = nil
275
+ end
276
+ rescue ActiveRecord::RecordInvalid => invalid
277
+ assert_equal "Validation failed: Content Empty", invalid.message
278
+ end
279
+ end
280
+
281
+ def test_exception_on_create_bang_many_with_block
282
+ assert_raises(ActiveRecord::RecordInvalid) do
283
+ Reply.create!([{ "title" => "OK" }, { "title" => "Wrong Create" }]) do |r|
284
+ r.content = nil
285
+ end
286
+ end
287
+ GetText.set_locale_all "ja_JP.UTF-8"
288
+ begin
289
+ Reply.create!([{ "title" => "OK" }, { "title" => "Wrong Create" }]) do |r|
290
+ r.content = nil
291
+ end
292
+ rescue ActiveRecord::RecordInvalid => invalid
293
+ assert_equal "入力値が正しくありません。: Reply内容 空です。", invalid.message
294
+ end
295
+
296
+ GetText.set_locale_all "en"
297
+ begin
298
+ Reply.create!([{ "title" => "OK" }, { "title" => "Wrong Create" }]) do |r|
299
+ r.content = nil
300
+ end
301
+ rescue ActiveRecord::RecordInvalid => invalid
302
+ assert_equal "Validation failed: Content Empty", invalid.message
303
+ end
304
+ end
305
+
213
306
  def test_scoped_create_without_attributes
214
307
  Reply.with_scope(:create => {}) do
215
308
  assert_raises(ActiveRecord::RecordInvalid) { Reply.create! }
@@ -234,7 +327,6 @@ class ValidationsTest < Test::Unit::TestCase
234
327
  end
235
328
  end
236
329
 
237
-
238
330
  def test_single_error_per_attr_iteration
239
331
  GetText.set_locale_all "ja_JP.UTF-8"
240
332
  r = Reply.new
@@ -350,6 +442,16 @@ class ValidationsTest < Test::Unit::TestCase
350
442
  perform = false
351
443
  end
352
444
 
445
+ =begin
446
+ #Don't need this
447
+ def test_no_title_confirmation
448
+ end
449
+ def test_title_confirmation
450
+ end
451
+ def test_terms_of_service_agreement_no_acceptance
452
+ end
453
+ =end
454
+
353
455
  def test_errors_on_boundary_breaking
354
456
  GetText.set_locale_all "ja_JP.UTF-8"
355
457
  developer = Developer.new("name" => "xs")
@@ -467,6 +569,14 @@ class ValidationsTest < Test::Unit::TestCase
467
569
  assert t.save
468
570
  end
469
571
 
572
+ =begin
573
+ #Don't need this
574
+ def test_validates_acceptance_of_as_database_column
575
+ end
576
+ def test_validates_acceptance_of_with_non_existant_table
577
+ end
578
+ =end
579
+
470
580
  def test_validate_presences
471
581
  Topic.validates_presence_of(:title, :content)
472
582
 
@@ -539,7 +649,80 @@ class ValidationsTest < Test::Unit::TestCase
539
649
  assert_equal "Title has already been taken", t2.errors.on(:title)
540
650
  end
541
651
 
542
- def test_validate_format_fn
652
+ =begin
653
+ #Don't need this
654
+ def test_validate_uniqueness_with_scope
655
+ end
656
+ def test_validate_uniqueness_scoped_to_defining_class
657
+ end
658
+ def test_validate_uniqueness_with_scope_array
659
+ end
660
+ def test_validate_case_insensitive_uniqueness
661
+ end
662
+ def test_validate_case_sensitive_uniqueness
663
+ end
664
+ =end
665
+
666
+ def test_validate_straight_inheritance_uniqueness
667
+ GetText.set_locale_all "ja_JP.UTF-8"
668
+ w1 = IneptWizard.create(:name => "I18nRincewind", :city => "I18nAnkh-Morpork")
669
+ assert w1.valid?, "Saving w1"
670
+
671
+ # Should use validation from base class (which is abstract)
672
+ w2 = IneptWizard.new(:name => "I18nRincewind", :city => "I18nQuirm")
673
+ assert !w2.valid?, "w2 shouldn't be valid"
674
+ assert w2.errors.on(:name), "Should have errors for name"
675
+ assert_equal "不器用な魔術師名はすでに存在します。", w2.errors.on(:name), "Should have uniqueness message for name"
676
+
677
+ w3 = Conjurer.new(:name => "I18nRincewind", :city => "I18nQuirm")
678
+ assert !w3.valid?, "w3 shouldn't be valid"
679
+ assert w3.errors.on(:name), "Should have errors for name"
680
+ assert_equal "手品師名はすでに存在します。", w3.errors.on(:name), "Should have uniqueness message for name"
681
+
682
+ w4 = Conjurer.create(:name => "I18nThe Amazing Bonko", :city => "I18nQuirm")
683
+ assert w4.valid?, "Saving w4"
684
+
685
+ w5 = Thaumaturgist.new(:name => "I18nThe Amazing Bonko", :city => "I18nLancre")
686
+ assert !w5.valid?, "w5 shouldn't be valid"
687
+ assert w5.errors.on(:name), "Should have errors for name"
688
+ assert_equal "奇術師名はすでに存在します。", w5.errors.on(:name), "Should have uniqueness message for name"
689
+
690
+ w6 = Thaumaturgist.new(:name => "I18nMustrum Ridcully", :city => "I18nQuirm")
691
+ assert !w6.valid?, "w6 shouldn't be valid"
692
+ assert w6.errors.on(:city), "Should have errors for city"
693
+ assert_equal "奇術師町はすでに存在します。", w6.errors.on(:city), "Should have uniqueness message for city"
694
+
695
+ GetText.set_locale_all "en"
696
+ w1 = IneptWizard.create(:name => "Rincewind", :city => "Ankh-Morpork")
697
+ assert w1.valid?, "Saving w1"
698
+
699
+ # Should use validation from base class (which is abstract)
700
+ w2 = IneptWizard.new(:name => "Rincewind", :city => "Quirm")
701
+ assert !w2.valid?, "w2 shouldn't be valid"
702
+ assert w2.errors.on(:name), "Should have errors for name"
703
+ assert_equal "Name has already been taken", w2.errors.on(:name), "Should have uniqueness message for name"
704
+
705
+ w3 = Conjurer.new(:name => "Rincewind", :city => "Quirm")
706
+ assert !w3.valid?, "w3 shouldn't be valid"
707
+ assert w3.errors.on(:name), "Should have errors for name"
708
+ assert_equal "Name has already been taken", w3.errors.on(:name), "Should have uniqueness message for name"
709
+
710
+ w4 = Conjurer.create(:name => "The Amazing Bonko", :city => "Quirm")
711
+ assert w4.valid?, "Saving w4"
712
+
713
+ w5 = Thaumaturgist.new(:name => "The Amazing Bonko", :city => "Lancre")
714
+ assert !w5.valid?, "w5 shouldn't be valid"
715
+ assert w5.errors.on(:name), "Should have errors for name"
716
+ assert_equal "Name has already been taken", w5.errors.on(:name), "Should have uniqueness message for name"
717
+
718
+ w6 = Thaumaturgist.new(:name => "Mustrum Ridcully", :city => "Quirm")
719
+ assert !w6.valid?, "w6 shouldn't be valid"
720
+ assert w6.errors.on(:city), "Should have errors for city"
721
+ assert_equal "City has already been taken", w6.errors.on(:city), "Should have uniqueness message for city"
722
+ end
723
+
724
+
725
+ def test_validate_format_fn
543
726
  Topic.validates_format_of(:title, :content, :with => /^Validation\smacros \w+!$/, :message => N_("%{fn} is bad data"))
544
727
 
545
728
  GetText.set_locale_all "ja_JP.UTF-8"
@@ -588,6 +771,63 @@ class ValidationsTest < Test::Unit::TestCase
588
771
  assert_raise(ArgumentError) { Topic.validates_format_of(:title, :content) }
589
772
  end
590
773
 
774
+ =begin
775
+ # Don't need this
776
+ def test_validate_format_with_allow_blank
777
+ end
778
+ =end
779
+ def test_validate_format_numeric_fn
780
+ Topic.validates_format_of(:title, :content, :with => /^[1-9][0-9]*$/, :message => N_("%{fn} is bad data"))
781
+
782
+ GetText.set_locale_all "ja_JP.UTF-8"
783
+ t = Topic.create("title" => "72x", "content" => "6789")
784
+ assert !t.valid?, "Shouldn't be valid"
785
+ assert !t.save, "Shouldn't save because it's invalid"
786
+ assert_equal "タイトルは悪いデータです。", t.errors.on(:title)
787
+ assert_nil t.errors.on(:content)
788
+
789
+ t.title = "-11"
790
+ assert !t.valid?, "Shouldn't be valid"
791
+
792
+ t.title = "03"
793
+ assert !t.valid?, "Shouldn't be valid"
794
+
795
+ t.title = "z44"
796
+ assert !t.valid?, "Shouldn't be valid"
797
+
798
+ t.title = "5v7"
799
+ assert !t.valid?, "Shouldn't be valid"
800
+
801
+ t.title = "1"
802
+
803
+ assert t.save
804
+ assert_nil t.errors.on(:title)
805
+
806
+ GetText.set_locale_all "en"
807
+ t = Topic.create("title" => "72x", "content" => "6789")
808
+ assert !t.valid?, "Shouldn't be valid"
809
+ assert !t.save, "Shouldn't save because it's invalid"
810
+ assert_equal "Title is bad data", t.errors.on(:title)
811
+ assert_nil t.errors.on(:content)
812
+
813
+ t.title = "-11"
814
+ assert !t.valid?, "Shouldn't be valid"
815
+
816
+ t.title = "03"
817
+ assert !t.valid?, "Shouldn't be valid"
818
+
819
+ t.title = "z44"
820
+ assert !t.valid?, "Shouldn't be valid"
821
+
822
+ t.title = "5v7"
823
+ assert !t.valid?, "Shouldn't be valid"
824
+
825
+ t.title = "1"
826
+
827
+ assert t.save
828
+ assert_nil t.errors.on(:title)
829
+ end
830
+
591
831
  def test_validate_format_numeric
592
832
  Topic.validates_format_of(:title, :content, :with => /^[1-9][0-9]*$/, :message => N_("is bad data"))
593
833
 
@@ -639,7 +879,35 @@ class ValidationsTest < Test::Unit::TestCase
639
879
  assert t.save
640
880
  assert_nil t.errors.on(:title)
641
881
  end
642
-
882
+
883
+ def test_validate_format_with_formatted_message_fn
884
+ Topic.validates_format_of(:title, :with => /^Valid Title$/, :message => N_("%{fn} can not be %{val}"))
885
+
886
+ GetText.set_locale_all "ja_JP.UTF-8"
887
+ t = Topic.create(:title => 'Invalid title')
888
+ assert_equal "Invalid titleはタイトルではありません。", t.errors.full_messages[0]
889
+ assert_equal "Invalid titleはタイトルではありません。", t.errors.on(:title)
890
+
891
+ GetText.set_locale_all "en"
892
+ t = Topic.create(:title => 'Invalid title')
893
+ assert_equal "Title can not be Invalid title", t.errors.full_messages[0]
894
+ assert_equal "Title can not be Invalid title", t.errors.on(:title)
895
+ end
896
+
897
+ def test_validate_format_with_formatted_message
898
+ Topic.validates_format_of(:title, :with => /^Valid Title$/, :message => N_("can not be %{val}"))
899
+
900
+ GetText.set_locale_all "ja_JP.UTF-8"
901
+ t = Topic.create(:title => 'Invalid title')
902
+ assert_equal "タイトル はInvalid titleではありません。", t.errors.full_messages[0]
903
+ assert_equal "はInvalid titleではありません。", t.errors.on(:title)
904
+
905
+ GetText.set_locale_all "en"
906
+ t = Topic.create(:title => 'Invalid title')
907
+ assert_equal "Title can not be Invalid title", t.errors.full_messages[0]
908
+ assert_equal "can not be Invalid title", t.errors.on(:title)
909
+ end
910
+
643
911
  def test_validates_inclusion_of
644
912
  Topic.validates_inclusion_of( :title, :in => %w( a b c d e f g ) )
645
913
 
@@ -662,6 +930,113 @@ class ValidationsTest < Test::Unit::TestCase
662
930
  assert_equal "Title is not included in the list", t.errors.on(:title)
663
931
  end
664
932
 
933
+ =begin
934
+ # Don't need this
935
+ def test_validates_inclusion_of_with_allow_nil
936
+ end
937
+ def test_numericality_with_getter_method
938
+ end
939
+ def test_validates_length_of_with_allow_nil
940
+ end
941
+ def test_validates_length_of_with_allow_blank
942
+ end
943
+ =end
944
+
945
+ def test_validates_inclusion_of_with_formatted_message_fn
946
+ Topic.validates_inclusion_of( :title, :in => %w( a b c d e f g ), :message => N_("%{fn} option %{val} is not in the list") )
947
+ GetText.set_locale_all "ja_JP.UTF-8"
948
+
949
+ assert Topic.create("title" => "a", "content" => "abc").valid?
950
+
951
+ t = Topic.create("title" => "uhoh", "content" => "abc")
952
+ assert !t.valid?
953
+ assert t.errors.on(:title)
954
+ assert_equal "オプションuhohはタイトル一覧にありません。", t.errors.full_messages[0]
955
+ assert_equal "オプションuhohはタイトル一覧にありません。", t.errors["title"]
956
+
957
+ GetText.set_locale_all "en"
958
+ assert Topic.create("title" => "a", "content" => "abc").valid?
959
+
960
+ t = Topic.create("title" => "uhoh", "content" => "abc")
961
+ assert !t.valid?
962
+ assert t.errors.on(:title)
963
+ assert_equal "Title option uhoh is not in the list", t.errors.full_messages[0]
964
+ assert_equal "Title option uhoh is not in the list", t.errors["title"]
965
+ end
966
+
967
+ def test_validates_inclusion_of_with_formatted_message
968
+ Topic.validates_inclusion_of( :title, :in => %w( a b c d e f g ), :message => N_("option %{val} is not in the list") )
969
+ GetText.set_locale_all "ja_JP.UTF-8"
970
+
971
+ assert Topic.create("title" => "a", "content" => "abc").valid?
972
+
973
+ t = Topic.create("title" => "uhoh", "content" => "abc")
974
+ assert !t.valid?
975
+ assert t.errors.on(:title)
976
+ assert_equal "タイトル オプションuhohは一覧にありません。", t.errors.full_messages[0]
977
+ assert_equal "オプションuhohは一覧にありません。", t.errors["title"]
978
+
979
+ GetText.set_locale_all "en"
980
+ assert Topic.create("title" => "a", "content" => "abc").valid?
981
+
982
+ t = Topic.create("title" => "uhoh", "content" => "abc")
983
+ assert !t.valid?
984
+ assert t.errors.on(:title)
985
+ assert_equal "Title option uhoh is not in the list", t.errors.full_messages[0]
986
+ assert_equal "option uhoh is not in the list", t.errors["title"]
987
+ end
988
+
989
+ =begin
990
+ Don't need this
991
+ def test_numericality_with_allow_nil_and_getter_method
992
+ end
993
+ def test_validates_exclusion_of
994
+ end
995
+ =end
996
+ def test_validates_exclusion_of_with_formatted_message_fn
997
+ GetText.set_locale_all "ja_JP.UTF-8"
998
+ Topic.validates_exclusion_of( :title, :in => %w( abe monkey ), :message => N_("%{fn} option %{val} is restricted") )
999
+
1000
+ assert Topic.create("title" => "something", "content" => "abc")
1001
+
1002
+ t = Topic.create("title" => "monkey")
1003
+ assert !t.valid?
1004
+ assert t.errors.on(:title)
1005
+ assert_equal "オプションタイトルmonkeyは制限されています。", t.errors.full_messages[0]
1006
+ assert_equal "オプションタイトルmonkeyは制限されています。", t.errors["title"]
1007
+
1008
+ GetText.set_locale_all "en"
1009
+ assert Topic.create("title" => "something", "content" => "abc")
1010
+
1011
+ t = Topic.create("title" => "monkey")
1012
+ assert !t.valid?
1013
+ assert t.errors.on(:title)
1014
+ assert_equal "Title option monkey is restricted", t.errors.full_messages[0]
1015
+ assert_equal "Title option monkey is restricted", t.errors["title"]
1016
+ end
1017
+
1018
+ def test_validates_exclusion_of_with_formatted_message
1019
+ GetText.set_locale_all "ja_JP.UTF-8"
1020
+ Topic.validates_exclusion_of( :title, :in => %w( abe monkey ), :message => N_("option %{val} is restricted") )
1021
+
1022
+ assert Topic.create("title" => "something", "content" => "abc")
1023
+
1024
+ t = Topic.create("title" => "monkey")
1025
+ assert !t.valid?
1026
+ assert t.errors.on(:title)
1027
+ assert_equal "タイトル オプションmonkeyは制限されています。", t.errors.full_messages[0]
1028
+ assert_equal "オプションmonkeyは制限されています。", t.errors["title"]
1029
+
1030
+ GetText.set_locale_all "en"
1031
+ assert Topic.create("title" => "something", "content" => "abc")
1032
+
1033
+ t = Topic.create("title" => "monkey")
1034
+ assert !t.valid?
1035
+ assert t.errors.on(:title)
1036
+ assert_equal "Title option monkey is restricted", t.errors.full_messages[0]
1037
+ assert_equal "option monkey is restricted", t.errors["title"]
1038
+ end
1039
+
665
1040
  def test_validates_length_of_using_minimum
666
1041
  Topic.validates_length_of :title, :minimum => 5
667
1042
 
@@ -709,6 +1084,12 @@ class ValidationsTest < Test::Unit::TestCase
709
1084
  assert_equal "Title is too long (maximum is 5 characters)", t.errors.on("title")
710
1085
  end
711
1086
 
1087
+ =begin
1088
+ # Don't need this
1089
+ def test_optionally_validates_length_of_using_minimum
1090
+ end
1091
+ =end
1092
+
712
1093
  def test_validates_length_of_using_within
713
1094
  Topic.validates_length_of(:title, :content, :within => 3..5)
714
1095
 
@@ -745,6 +1126,12 @@ class ValidationsTest < Test::Unit::TestCase
745
1126
  assert_equal "Content is too short (minimum is 3 characters)", t.errors.on(:content)
746
1127
  end
747
1128
 
1129
+ =begin
1130
+ # Don't need this
1131
+ def test_optionally_validates_length_of_using_within
1132
+ end
1133
+ =end
1134
+
748
1135
  def test_optionally_validates_length_of_using_within_on_create_fn
749
1136
  Topic.validates_length_of :title, :content, :within => 5..10, :on => :create, :too_short => N_("my string(%{fn}) is too short: %d"), :too_long => N_("my string(%{fn}) is too long: %d")
750
1137
 
@@ -858,6 +1245,14 @@ class ValidationsTest < Test::Unit::TestCase
858
1245
 
859
1246
  end
860
1247
 
1248
+ =begin
1249
+ # Don't need this
1250
+ def test_optionally_validates_length_of_using_is
1251
+ end
1252
+ def test_validates_length_of_using_bignum
1253
+ end
1254
+ =end
1255
+
861
1256
  def test_validates_length_with_globaly_modified_error_message_fn
862
1257
  ActiveRecord::Errors.default_error_messages[:too_short] = N_('%{fn} %d dayo')
863
1258
  Topic.validates_length_of :title, :minimum => 10
@@ -892,6 +1287,15 @@ class ValidationsTest < Test::Unit::TestCase
892
1287
  assert_equal '10 dayo', t.errors.on('title')
893
1288
  end
894
1289
 
1290
+ =begin
1291
+ def test_validates_size_of_association
1292
+ end
1293
+ def test_validates_size_of_association_using_within
1294
+ end
1295
+ def test_validates_length_of_nasty_params
1296
+ end
1297
+ =end
1298
+
895
1299
  def test_validates_length_of_custom_errors_for_minimum_with_message_fn
896
1300
  Topic.validates_length_of( :title, :minimum => 5, :message => N_("%{fn} hoo %d") )
897
1301
  GetText.set_locale_all "ja_JP.UTF-8"
@@ -1101,6 +1505,29 @@ class ValidationsTest < Test::Unit::TestCase
1101
1505
  assert_equal "hoo 5", t.errors.on("title")
1102
1506
  end
1103
1507
 
1508
+ =begin
1509
+ def test_validates_length_of_using_minimum_utf8
1510
+ end
1511
+ def test_validates_length_of_using_maximum_utf8
1512
+ end
1513
+ def test_validates_length_of_using_within_utf8
1514
+ end
1515
+ def test_optionally_validates_length_of_using_within_utf8
1516
+ end
1517
+ def test_optionally_validates_length_of_using_within_on_create_utf8
1518
+ end
1519
+ def test_optionally_validates_length_of_using_within_on_update_utf8
1520
+ end
1521
+ def test_validates_length_of_using_is_utf8
1522
+ end
1523
+ def test_validates_size_of_association_utf8
1524
+ end
1525
+ def test_validates_associated_many
1526
+ end
1527
+ def test_validates_associated_one
1528
+ end
1529
+ =end
1530
+
1104
1531
  def test_validate_block_fn
1105
1532
  Topic.validate { |topic| topic.errors.add("title", N_("%{fn} will never be valid")) }
1106
1533
  GetText.set_locale_all "ja_JP.UTF-8"
@@ -1135,6 +1562,13 @@ class ValidationsTest < Test::Unit::TestCase
1135
1562
  assert_equal "will never be valid", t.errors.on("title")
1136
1563
  end
1137
1564
 
1565
+ =begin
1566
+ def test_invalid_validator
1567
+ end
1568
+ def test_throw_away_typing
1569
+ end
1570
+ =end
1571
+
1138
1572
  def test_validates_acceptance_of_with_custom_error_using_quotes_fn
1139
1573
  Developer.validates_acceptance_of :salary, :message=> N_("%{fn} contains 'single' and \"double\" quotes")
1140
1574
 
@@ -1569,6 +2003,155 @@ class ValidationsTest < Test::Unit::TestCase
1569
2003
  assert_equal "This string contains 'single' and \"double\" quotes", r.errors.on(:topic)
1570
2004
  end
1571
2005
 
2006
+ =begin
2007
+ def test_if_validation_using_method_true
2008
+ end
2009
+ def test_unless_validation_using_method_true
2010
+ end
2011
+ def test_if_validation_using_method_false
2012
+ end
2013
+ =end
2014
+ def test_unless_validation_using_method_false_fn
2015
+ # When the method returns false
2016
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>N_("%{fn} hoo %d"), :unless => :condition_is_true_but_its_not )
2017
+
2018
+ GetText.set_locale_all "ja"
2019
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2020
+ assert !t.valid?
2021
+ assert t.errors.on(:title)
2022
+ assert_equal "タイトルふー5", t.errors.full_messages[0]
2023
+ assert_equal "タイトルふー5", t.errors["title"]
2024
+
2025
+ GetText.set_locale_all "en"
2026
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2027
+ assert !t.valid?
2028
+ assert t.errors.on(:title)
2029
+ assert_equal "Title hoo 5", t.errors.full_messages[0]
2030
+ assert_equal "Title hoo 5", t.errors["title"]
2031
+ end
2032
+
2033
+ def test_unless_validation_using_method_false
2034
+ # When the method returns false
2035
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>N_("hoo %d"), :unless => :condition_is_true_but_its_not )
2036
+
2037
+ GetText.set_locale_all "ja"
2038
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2039
+ assert !t.valid?
2040
+ assert t.errors.on(:title)
2041
+ assert_equal "タイトル ふー5", t.errors.full_messages[0]
2042
+ assert_equal "ふー5", t.errors["title"]
2043
+
2044
+ GetText.set_locale_all "en"
2045
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2046
+ assert !t.valid?
2047
+ assert t.errors.on(:title)
2048
+ assert_equal "Title hoo 5", t.errors.full_messages[0]
2049
+ assert_equal "hoo 5", t.errors["title"]
2050
+ end
2051
+
2052
+ def test_if_validation_using_string_true_fn
2053
+ # When the evaluated string returns true
2054
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>N_("%{fn} hoo %d"), :if => "a = 1; a == 1" )
2055
+
2056
+ GetText.set_locale_all "ja"
2057
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2058
+ assert !t.valid?
2059
+ assert t.errors.on(:title)
2060
+ assert_equal "タイトルふー5", t.errors.full_messages[0]
2061
+ assert_equal "タイトルふー5", t.errors["title"]
2062
+
2063
+ GetText.set_locale_all "en"
2064
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2065
+ assert !t.valid?
2066
+ assert t.errors.on(:title)
2067
+ assert_equal "Title hoo 5", t.errors.full_messages[0]
2068
+ assert_equal "Title hoo 5", t.errors["title"]
2069
+ end
2070
+
2071
+ def test_if_validation_using_string_true
2072
+ # When the evaluated string returns true
2073
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>N_("hoo %d"), :if => "a = 1; a == 1" )
2074
+
2075
+ GetText.set_locale_all "ja"
2076
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2077
+ assert !t.valid?
2078
+ assert t.errors.on(:title)
2079
+ assert_equal "タイトル ふー5", t.errors.full_messages[0]
2080
+ assert_equal "ふー5", t.errors["title"]
2081
+
2082
+ GetText.set_locale_all "en"
2083
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2084
+ assert !t.valid?
2085
+ assert t.errors.on(:title)
2086
+ assert_equal "Title hoo 5", t.errors.full_messages[0]
2087
+ assert_equal "hoo 5", t.errors["title"]
2088
+ end
2089
+
2090
+ =begin
2091
+ def test_unless_validation_using_string_true
2092
+ end
2093
+ def test_if_validation_using_string_false
2094
+ end
2095
+ =end
2096
+ def test_unless_validation_using_string_false
2097
+ # When the evaluated string returns false
2098
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>N_("hoo %d"), :unless => "false")
2099
+
2100
+ GetText.set_locale_all "ja"
2101
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2102
+ assert !t.valid?
2103
+ assert t.errors.on(:title)
2104
+ assert_equal "タイトル ふー5", t.errors.full_messages[0]
2105
+ assert_equal "ふー5", t.errors["title"]
2106
+
2107
+ GetText.set_locale_all "en"
2108
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2109
+ assert !t.valid?
2110
+ assert t.errors.on(:title)
2111
+ assert_equal "Title hoo 5", t.errors.full_messages[0]
2112
+ assert_equal "hoo 5", t.errors["title"]
2113
+ end
2114
+
2115
+ def test_if_validation_using_block_true_fn
2116
+ # When the block returns true
2117
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>N_("%{fn} hoo %d"),
2118
+ :if => Proc.new { |r| r.content.size > 4 } )
2119
+
2120
+ GetText.set_locale_all "ja"
2121
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2122
+ assert !t.valid?
2123
+ assert t.errors.on(:title)
2124
+ assert_equal "タイトルふー5", t.errors.full_messages[0]
2125
+ assert_equal "タイトルふー5", t.errors["title"]
2126
+
2127
+ GetText.set_locale_all "en"
2128
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2129
+ assert !t.valid?
2130
+ assert t.errors.on(:title)
2131
+ assert_equal "Title hoo 5", t.errors.full_messages[0]
2132
+ assert_equal "Title hoo 5", t.errors["title"]
2133
+ end
2134
+
2135
+ def test_if_validation_using_block_true
2136
+ # When the block returns true
2137
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>N_("hoo %d"),
2138
+ :if => Proc.new { |r| r.content.size > 4 } )
2139
+
2140
+ GetText.set_locale_all "ja"
2141
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2142
+ assert !t.valid?
2143
+ assert t.errors.on(:title)
2144
+ assert_equal "タイトル ふー5", t.errors.full_messages[0]
2145
+ assert_equal "ふー5", t.errors["title"]
2146
+
2147
+ GetText.set_locale_all "en"
2148
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2149
+ assert !t.valid?
2150
+ assert t.errors.on(:title)
2151
+ assert_equal "Title hoo 5", t.errors.full_messages[0]
2152
+ assert_equal "hoo 5", t.errors["title"]
2153
+ end
2154
+
1572
2155
  def test_conditional_validation_using_method_true_fn
1573
2156
  # When the method returns true
1574
2157
  Topic.validates_length_of( :title, :maximum=>5, :too_long=> N_("%{fn} hoo %d"), :if => :condition_is_true )
@@ -1576,8 +2159,8 @@ class ValidationsTest < Test::Unit::TestCase
1576
2159
  t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
1577
2160
  assert !t.valid?
1578
2161
  assert t.errors.on(:title)
1579
- assert_equal "タイトルふー5", t.errors.on("title")
1580
2162
  assert_equal "タイトルふー5", t.errors.full_messages[0]
2163
+ assert_equal "タイトルふー5", t.errors.on("title")
1581
2164
 
1582
2165
  GetText.set_locale_all "en"
1583
2166
  t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
@@ -1587,6 +2170,54 @@ class ValidationsTest < Test::Unit::TestCase
1587
2170
  assert_equal "Title hoo 5", t.errors.on("title")
1588
2171
  end
1589
2172
 
2173
+ =begin
2174
+ Don't need this
2175
+ def test_unless_validation_using_block_true
2176
+ end
2177
+ def test_if_validation_using_block_false
2178
+ end
2179
+ =end
2180
+
2181
+ def test_unless_validation_using_block_false_fn
2182
+ # When the block returns false
2183
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>N_("%{fn} hoo %d"),
2184
+ :unless => Proc.new { |r| r.title != "uhohuhoh"} )
2185
+
2186
+ GetText.set_locale_all "ja_JP.UTF-8"
2187
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2188
+ assert !t.valid?
2189
+ assert t.errors.on(:title)
2190
+ assert_equal "タイトルふー5", t.errors.full_messages[0]
2191
+ assert_equal "タイトルふー5", t.errors.on("title")
2192
+
2193
+ GetText.set_locale_all "en"
2194
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2195
+ assert !t.valid?
2196
+ assert t.errors.on(:title)
2197
+ assert_equal "Title hoo 5", t.errors.full_messages[0]
2198
+ assert_equal "Title hoo 5", t.errors["title"]
2199
+ end
2200
+
2201
+ def test_unless_validation_using_block_false
2202
+ # When the block returns false
2203
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>N_("hoo %d"),
2204
+ :unless => Proc.new { |r| r.title != "uhohuhoh"} )
2205
+
2206
+ GetText.set_locale_all "ja_JP.UTF-8"
2207
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2208
+ assert !t.valid?
2209
+ assert t.errors.on(:title)
2210
+ assert_equal "タイトル ふー5", t.errors.full_messages[0]
2211
+ assert_equal "ふー5", t.errors.on("title")
2212
+
2213
+ GetText.set_locale_all "en"
2214
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
2215
+ assert !t.valid?
2216
+ assert t.errors.on(:title)
2217
+ assert_equal "Title hoo 5", t.errors.full_messages[0]
2218
+ assert_equal "hoo 5", t.errors["title"]
2219
+ end
2220
+
1590
2221
  def test_conditional_validation_using_method_true
1591
2222
  # When the method returns true
1592
2223
  Topic.validates_length_of( :title, :maximum=>5, :too_long=> N_("hoo %d"), :if => :condition_is_true )
@@ -1732,6 +2363,12 @@ class ValidationsTest < Test::Unit::TestCase
1732
2363
  end
1733
2364
  end
1734
2365
 
2366
+ =begin
2367
+ #Don't need this
2368
+ def test_validation_with_if_as_string
2369
+ end
2370
+ =end
2371
+
1735
2372
  def test_default_validates_numericality_of
1736
2373
  GetText.set_locale_all "ja_JP.UTF-8"
1737
2374
  Topic.validates_numericality_of :approved
@@ -1742,7 +2379,7 @@ class ValidationsTest < Test::Unit::TestCase
1742
2379
  topic = Topic.create("title" => "numeric test", "content" => "whatever", "approved" => "aaa")
1743
2380
  assert_equal "Approved is not a number", topic.errors.on(:approved)
1744
2381
  assert_equal "Approved is not a number", topic.errors.full_messages[0]
1745
- end
2382
+ end
1746
2383
 
1747
2384
  def test_inherited_messages
1748
2385
  GetText.set_locale_all "ja_JP.UTF-8"
@@ -1758,29 +2395,35 @@ class ValidationsTest < Test::Unit::TestCase
1758
2395
 
1759
2396
  t = Reply.create
1760
2397
  assert !t.save
1761
- assert_equal "Replyタイトル 空です。", t.errors.full_messages[0]
1762
- assert_equal "Reply内容 空です。", t.errors.full_messages[1]
1763
- assert_equal "空です。", t.errors.on(:title)
1764
- assert_equal "空です。", t.errors.on(:content)
2398
+ assert_equal "Replyタイトルを入力してください。", t.errors.full_messages[0]
2399
+ assert_equal "Replyタイトル 空です。", t.errors.full_messages[1]
2400
+ assert_equal "Reply内容を入力してください。", t.errors.full_messages[2]
2401
+ assert_equal "Reply内容 空です。", t.errors.full_messages[3]
2402
+ assert_equal ["Replyタイトルを入力してください。","空です。"], t.errors.on(:title)
2403
+ assert_equal ["Reply内容を入力してください。", "空です。"], t.errors.on(:content)
1765
2404
 
1766
2405
  t = Reply.create
1767
2406
  t.title = "Wrong Create"
1768
2407
  assert !t.save
1769
2408
  assert_equal "Replyタイトル が不正に生成されました。", t.errors.full_messages[0]
1770
- assert_equal "Reply内容 空です。", t.errors.full_messages[1]
2409
+ assert_equal "Reply内容を入力してください。", t.errors.full_messages[1]
2410
+ assert_equal "Reply内容 空です。", t.errors.full_messages[2]
1771
2411
 
1772
2412
  t = SillyReply.create
1773
2413
  assert !t.save
1774
- assert_equal "Sillyタイトル 空です。", t.errors.full_messages[0]
1775
- assert_equal "Silly内容 空です。", t.errors.full_messages[1]
1776
- assert_equal "空です。", t.errors.on(:title)
1777
- assert_equal "空です。", t.errors.on(:content)
2414
+ assert_equal "Sillyタイトルを入力してください。", t.errors.full_messages[0]
2415
+ assert_equal "Sillyタイトル 空です。", t.errors.full_messages[1]
2416
+ assert_equal "Silly内容を入力してください。", t.errors.full_messages[2]
2417
+ assert_equal "Silly内容 空です。", t.errors.full_messages[3]
2418
+ assert_equal ["Sillyタイトルを入力してください。","空です。"], t.errors.on(:title)
2419
+ assert_equal ["Silly内容を入力してください。","空です。"], t.errors.on(:content)
1778
2420
 
1779
2421
  t = SillyReply.create
1780
2422
  t.title = "Wrong Create"
1781
2423
  assert !t.save
1782
2424
  assert_equal "Sillyタイトル が不正に生成されました。", t.errors.full_messages[0]
1783
- assert_equal "Silly内容 空です。", t.errors.full_messages[1]
2425
+ assert_equal "Silly内容を入力してください。", t.errors.full_messages[1]
2426
+ assert_equal "Silly内容 空です。", t.errors.full_messages[2]
1784
2427
  end
1785
2428
 
1786
2429
  def test_original_model_with_validation
@@ -1800,3 +2443,164 @@ class ValidationsTest < Test::Unit::TestCase
1800
2443
  end
1801
2444
  end
1802
2445
 
2446
+ class ValidatesNumericalityTest < Test::Unit::TestCase
2447
+ include GetText
2448
+
2449
+ NIL = [nil]
2450
+ BLANK = ["", " ", " \t \r \n"]
2451
+ BIGDECIMAL_STRINGS = %w(12345678901234567890.1234567890) # 30 significent digits
2452
+ FLOAT_STRINGS = %w(0.0 +0.0 -0.0 10.0 10.5 -10.5 -0.0001 -090.1 90.1e1 -90.1e5 -90.1e-5 90e-5)
2453
+ INTEGER_STRINGS = %w(0 +0 -0 10 +10 -10 0090 -090)
2454
+ FLOATS = [0.0, 10.0, 10.5, -10.5, -0.0001] + FLOAT_STRINGS
2455
+ INTEGERS = [0, 10, -10] + INTEGER_STRINGS
2456
+ BIGDECIMAL = BIGDECIMAL_STRINGS.collect! { |bd| BigDecimal.new(bd) }
2457
+ JUNK = ["not a number", "42 not a number", "0xdeadbeef", "00-1", "--3", "+-3", "+3-1", "-+019.0", "12.12.13.12", "123\nnot a number"]
2458
+
2459
+ def setup
2460
+ bindtextdomain_to(Topic, "active_record")
2461
+
2462
+ Topic.instance_variable_set("@validate_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
2463
+ Topic.instance_variable_set("@validate_on_create_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
2464
+ Topic.instance_variable_set("@validate_on_update_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
2465
+ end
2466
+
2467
+ def test_default_validates_numericality_of
2468
+ Topic.validates_numericality_of :approved
2469
+
2470
+ invalid!(NIL + BLANK + JUNK)
2471
+ # valid!(FLOATS + INTEGERS + BIGDECIMAL)
2472
+ end
2473
+
2474
+ def test_validates_numericality_of_with_nil_allowed
2475
+ Topic.validates_numericality_of :approved, :allow_nil => true
2476
+
2477
+ invalid!(BLANK + JUNK)
2478
+ # valid!(NIL + FLOATS + INTEGERS + BIGDECIMAL)
2479
+ end
2480
+
2481
+ def test_validates_numericality_of_with_integer_only
2482
+ Topic.validates_numericality_of :approved, :only_integer => true
2483
+
2484
+ invalid!(NIL + BLANK + JUNK + FLOATS + BIGDECIMAL)
2485
+ # valid!(INTEGERS)
2486
+ end
2487
+
2488
+ def test_validates_numericality_of_with_integer_only_and_nil_allowed
2489
+ Topic.validates_numericality_of :approved, :only_integer => true, :allow_nil => true
2490
+
2491
+ invalid!(BLANK + JUNK + FLOATS + BIGDECIMAL)
2492
+ # valid!(NIL + INTEGERS)
2493
+ end
2494
+
2495
+ def test_validates_numericality_with_greater_than
2496
+ Topic.validates_numericality_of :approved, :greater_than => 10
2497
+
2498
+ invalid!([-10, 10], 'Approved must be greater than 10',
2499
+ '承認は10より大きい値にしてください。')
2500
+ # valid!([11])
2501
+ end
2502
+
2503
+ def test_validates_numericality_with_greater_than_or_equal
2504
+ Topic.validates_numericality_of :approved, :greater_than_or_equal_to => 10
2505
+
2506
+ invalid!([-9, 9], 'Approved must be greater than or equal to 10',
2507
+ "承認は10以上の値にしてください。")
2508
+ # valid!([10])
2509
+ end
2510
+
2511
+ def test_validates_numericality_with_equal_to
2512
+ Topic.validates_numericality_of :approved, :equal_to => 10
2513
+
2514
+ invalid!([-10, 11], 'Approved must be equal to 10',
2515
+ "承認は10にしてください。")
2516
+ # valid!([10])
2517
+ end
2518
+
2519
+ def test_validates_numericality_with_less_than
2520
+ Topic.validates_numericality_of :approved, :less_than => 10
2521
+
2522
+ invalid!([10], 'Approved must be less than 10',
2523
+ "承認は10より小さい値にしてください。")
2524
+ # valid!([-9, 9])
2525
+ end
2526
+
2527
+ def test_validates_numericality_with_less_than_or_equal_to
2528
+ Topic.validates_numericality_of :approved, :less_than_or_equal_to => 10
2529
+
2530
+ invalid!([11], 'Approved must be less than or equal to 10')
2531
+ # valid!([-10, 10])
2532
+ end
2533
+
2534
+ def test_validates_numericality_with_odd
2535
+ Topic.validates_numericality_of :approved, :odd => true
2536
+
2537
+ invalid!([-2, 2], 'Approved must be odd',
2538
+ "承認は奇数にしてください。")
2539
+ # valid!([-1, 1])
2540
+ end
2541
+
2542
+ def test_validates_numericality_with_even
2543
+ Topic.validates_numericality_of :approved, :even => true
2544
+
2545
+ invalid!([-1, 1], 'Approved must be even',
2546
+ "承認は偶数にしてください。")
2547
+ # valid!([-2, 2])
2548
+ end
2549
+
2550
+ def test_validates_numericality_with_greater_than_less_than_and_even
2551
+ Topic.validates_numericality_of :approved, :greater_than => 1, :less_than => 4, :even => true
2552
+
2553
+ invalid!([1, 3, 4])
2554
+ # valid!([2])
2555
+ end
2556
+
2557
+ def test_validates_numericality_with_numeric_message
2558
+ Topic.validates_numericality_of :approved, :less_than => 4, :message => N_("smaller than %d")
2559
+ topic = Topic.new("title" => "numeric test", "approved" => 10)
2560
+
2561
+ assert !topic.valid?
2562
+ assert_equal "Approved smaller than 4", topic.errors.full_messages[0]
2563
+ assert_equal "smaller than 4", topic.errors.on(:approved)
2564
+
2565
+ Topic.validates_numericality_of :approved, :greater_than => 4, :message => N_("greater than %d")
2566
+ topic = Topic.new("title" => "numeric test", "approved" => 1)
2567
+
2568
+ assert !topic.valid?
2569
+ assert_equal "Approved greater than 4", topic.errors.full_messages[0]
2570
+ assert_equal "greater than 4", topic.errors.on(:approved)
2571
+ end
2572
+
2573
+ private
2574
+ def invalid!(values, error=nil, errorj=nil)
2575
+ with_each_topic_approved_value(values) do |topic, value|
2576
+ GetText.set_locale_all "ja"
2577
+ assert !topic.valid?, "#{value.inspect} not rejected as a number"
2578
+ assert topic.errors.on(:approved)
2579
+ assert_equal errorj, topic.errors.full_messages[0] if errorj
2580
+ assert_equal errorj, topic.errors.on(:approved) if errorj
2581
+ end
2582
+
2583
+ with_each_topic_approved_value(values) do |topic, value|
2584
+ GetText.set_locale_all "en"
2585
+ assert !topic.valid?, "#{value.inspect} not rejected as a number"
2586
+ assert topic.errors.on(:approved)
2587
+ assert_equal error, topic.errors.full_messages[0] if error
2588
+ assert_equal error, topic.errors.on(:approved) if error
2589
+ end
2590
+ end
2591
+ =begin
2592
+ # Don't need this
2593
+ def valid!(values)
2594
+ with_each_topic_approved_value(values) do |topic, value|
2595
+ assert topic.valid?, "#{value.inspect} not accepted as a number"
2596
+ end
2597
+ end
2598
+ =end
2599
+ def with_each_topic_approved_value(values)
2600
+ topic = Topic.new("title" => "numeric test", "content" => "whatever")
2601
+ values.each do |value|
2602
+ topic.approved = value
2603
+ yield topic, value
2604
+ end
2605
+ end
2606
+ end