gettext 1.91.0 → 1.92.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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