waw 0.2.2

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 (199) hide show
  1. data/LICENCE.rdoc +25 -0
  2. data/README.rdoc +32 -0
  3. data/bin/waw +32 -0
  4. data/bin/waw-profile +26 -0
  5. data/bin/waw-start +26 -0
  6. data/bin/wspec +33 -0
  7. data/layouts/empty/Rakefile +14 -0
  8. data/layouts/empty/config.ru +5 -0
  9. data/layouts/empty/config/commons.cfg +31 -0
  10. data/layouts/empty/config/devel.cfg +21 -0
  11. data/layouts/empty/ignore +7 -0
  12. data/layouts/empty/logs/dontforgetme +0 -0
  13. data/layouts/empty/resources/messages.rs +1 -0
  14. data/layouts/empty/test/wspec/site_respond.wspec +3 -0
  15. data/layouts/empty/test/wspec/test_all.rb +13 -0
  16. data/layouts/empty/waw.deploy +1 -0
  17. data/layouts/empty/waw.routing +6 -0
  18. data/layouts/static/dependencies +1 -0
  19. data/layouts/static/public/.wawaccess +18 -0
  20. data/layouts/static/public/css/style.css +0 -0
  21. data/layouts/static/public/images/dontforgetme +0 -0
  22. data/layouts/static/public/js/project.js +0 -0
  23. data/layouts/static/public/pages/.wawaccess +30 -0
  24. data/layouts/static/public/pages/404.wtpl +1 -0
  25. data/layouts/static/public/pages/index.wtpl +5 -0
  26. data/layouts/static/public/templates/.wawaccess +9 -0
  27. data/layouts/static/public/templates/layout.wtpl +17 -0
  28. data/layouts/static/test/wspec/static_pages_are_served.wspec +21 -0
  29. data/layouts/static/waw.routing +8 -0
  30. data/lib/waw.rb +99 -0
  31. data/lib/waw/commands/command.rb +115 -0
  32. data/lib/waw/commands/profile_command.rb +66 -0
  33. data/lib/waw/commands/start_command.rb +59 -0
  34. data/lib/waw/config.rb +110 -0
  35. data/lib/waw/controller.rb +25 -0
  36. data/lib/waw/controllers/action/action.rb +91 -0
  37. data/lib/waw/controllers/action/action_utils.rb +30 -0
  38. data/lib/waw/controllers/action/js_generation.rb +116 -0
  39. data/lib/waw/controllers/action_controller.rb +133 -0
  40. data/lib/waw/controllers/error/backtrace.rb +54 -0
  41. data/lib/waw/controllers/error_handler.rb +62 -0
  42. data/lib/waw/controllers/json_controller.rb +31 -0
  43. data/lib/waw/controllers/no_cache.rb +22 -0
  44. data/lib/waw/controllers/static/match.rb +80 -0
  45. data/lib/waw/controllers/static/waw_access.rb +235 -0
  46. data/lib/waw/controllers/static/waw_access_dsl.rb +48 -0
  47. data/lib/waw/controllers/static_controller.rb +37 -0
  48. data/lib/waw/default_config.cfg +14 -0
  49. data/lib/waw/environment_utils.rb +57 -0
  50. data/lib/waw/errors.rb +4 -0
  51. data/lib/waw/ext.rb +3 -0
  52. data/lib/waw/ext/core.rb +4 -0
  53. data/lib/waw/ext/core/hash.rb +47 -0
  54. data/lib/waw/ext/core/logger.rb +10 -0
  55. data/lib/waw/ext/core/module.rb +20 -0
  56. data/lib/waw/ext/core/object.rb +29 -0
  57. data/lib/waw/ext/rack.rb +19 -0
  58. data/lib/waw/ext/rack/builder.rb +43 -0
  59. data/lib/waw/ext/rack/delegator.rb +51 -0
  60. data/lib/waw/ext/rack/urlmap.rb +55 -0
  61. data/lib/waw/ext/wlang.rb +1 -0
  62. data/lib/waw/ext/wlang/hosted_language.rb +21 -0
  63. data/lib/waw/fullstate.rb +8 -0
  64. data/lib/waw/fullstate/on_class.rb +37 -0
  65. data/lib/waw/fullstate/on_instance.rb +27 -0
  66. data/lib/waw/fullstate/variable.rb +36 -0
  67. data/lib/waw/kern.rb +6 -0
  68. data/lib/waw/kern/app.rb +48 -0
  69. data/lib/waw/kern/empty/waw.deploy +0 -0
  70. data/lib/waw/kern/empty/waw.routing +1 -0
  71. data/lib/waw/kern/freezed_state.rb +32 -0
  72. data/lib/waw/kern/hooks.rb +53 -0
  73. data/lib/waw/kern/lifecycle.rb +248 -0
  74. data/lib/waw/kern/living_state.rb +87 -0
  75. data/lib/waw/kern/utils.rb +27 -0
  76. data/lib/waw/resource_collection.rb +100 -0
  77. data/lib/waw/restart.rb +32 -0
  78. data/lib/waw/routing.rb +43 -0
  79. data/lib/waw/routing/action_routing.rb +78 -0
  80. data/lib/waw/routing/dsl.rb +45 -0
  81. data/lib/waw/routing/feedback.rb +23 -0
  82. data/lib/waw/routing/form_validation_feedback.rb +36 -0
  83. data/lib/waw/routing/javascript.rb +17 -0
  84. data/lib/waw/routing/redirect.rb +26 -0
  85. data/lib/waw/routing/refresh.rb +17 -0
  86. data/lib/waw/routing/routing_rule.rb +16 -0
  87. data/lib/waw/scope_utils.rb +69 -0
  88. data/lib/waw/session.rb +51 -0
  89. data/lib/waw/testing.rb +1 -0
  90. data/lib/waw/tools/mail.rb +4 -0
  91. data/lib/waw/tools/mail/mail.rb +119 -0
  92. data/lib/waw/tools/mail/mail_agent.rb +123 -0
  93. data/lib/waw/tools/mail/mailbox.rb +62 -0
  94. data/lib/waw/tools/mail/template.rb +38 -0
  95. data/lib/waw/utils/dsl_helper.rb +116 -0
  96. data/lib/waw/validation.rb +175 -0
  97. data/lib/waw/validation/and_validator.rb +27 -0
  98. data/lib/waw/validation/array_validations.rb +38 -0
  99. data/lib/waw/validation/boolean_validator.rb +32 -0
  100. data/lib/waw/validation/comparison_validations.rb +45 -0
  101. data/lib/waw/validation/date_validator.rb +31 -0
  102. data/lib/waw/validation/default_validator.rb +30 -0
  103. data/lib/waw/validation/dsl_ruby_extensions.rb +11 -0
  104. data/lib/waw/validation/errors.rb +17 -0
  105. data/lib/waw/validation/ext.rb +3 -0
  106. data/lib/waw/validation/file_validator.rb +30 -0
  107. data/lib/waw/validation/float_validator.rb +19 -0
  108. data/lib/waw/validation/helpers.rb +67 -0
  109. data/lib/waw/validation/integer_validator.rb +16 -0
  110. data/lib/waw/validation/isin_validator.rb +24 -0
  111. data/lib/waw/validation/mandatory_validator.rb +17 -0
  112. data/lib/waw/validation/missing_validator.rb +17 -0
  113. data/lib/waw/validation/not_validator.rb +20 -0
  114. data/lib/waw/validation/or_validator.rb +34 -0
  115. data/lib/waw/validation/regexp_validator.rb +29 -0
  116. data/lib/waw/validation/same_validator.rb +16 -0
  117. data/lib/waw/validation/signature.rb +157 -0
  118. data/lib/waw/validation/size_validations.rb +44 -0
  119. data/lib/waw/validation/string_validator.rb +15 -0
  120. data/lib/waw/validation/validator.rb +48 -0
  121. data/lib/waw/wawgen.rb +2 -0
  122. data/lib/waw/wawgen/create.rb +166 -0
  123. data/lib/waw/wawgen/project.rb +25 -0
  124. data/lib/waw/wspec.rb +5 -0
  125. data/lib/waw/wspec/browser.rb +240 -0
  126. data/lib/waw/wspec/dsl.rb +201 -0
  127. data/lib/waw/wspec/html_analysis.rb +136 -0
  128. data/lib/waw/wspec/html_analysis/tag.rb +56 -0
  129. data/lib/waw/wspec/runner.rb +70 -0
  130. data/lib/waw/wspec/scenario.rb +35 -0
  131. data/lib/waw/wspec/suite.rb +54 -0
  132. data/test/bricks/error_handler/config/test.cfg +2 -0
  133. data/test/bricks/error_handler/logs/webapp.log +1411 -0
  134. data/test/bricks/error_handler/test/error_handler.wspec +16 -0
  135. data/test/bricks/error_handler/waw.deploy +1 -0
  136. data/test/bricks/error_handler/waw.routing +27 -0
  137. data/test/integration/waw_create_integration_test.rb +24 -0
  138. data/test/spec/assumptions_spec.rb +30 -0
  139. data/test/spec/controllers/action_controller_spec.rb +14 -0
  140. data/test/spec/controllers/static/waw_access_spec.rb +112 -0
  141. data/test/spec/environment_utils_spec.rb +15 -0
  142. data/test/spec/ext/core/hash_spec.rb +58 -0
  143. data/test/spec/fixtures.rb +41 -0
  144. data/test/spec/fixtures/action/config/default.cfg +2 -0
  145. data/test/spec/fixtures/action/lib/action_controller_test.rb +12 -0
  146. data/test/spec/fixtures/action/waw.deploy +1 -0
  147. data/test/spec/fixtures/action/waw.routing +6 -0
  148. data/test/spec/fixtures/empty/waw.deploy +0 -0
  149. data/test/spec/fixtures/empty/waw.routing +0 -0
  150. data/test/spec/fullstate/on_class_spec.rb +59 -0
  151. data/test/spec/fullstate/on_instance_spec.rb +59 -0
  152. data/test/spec/fullstate/session_spec.rb +43 -0
  153. data/test/spec/fullstate/variable_spec.rb +55 -0
  154. data/test/spec/resource_collection_spec.rb +50 -0
  155. data/test/spec/test_all.rb +9 -0
  156. data/test/spec/tools/mail/mail_agent_spec.rb +116 -0
  157. data/test/spec/tools/mail/mail_spec.rb +56 -0
  158. data/test/spec/tools/mail/mailbox_spec.rb +57 -0
  159. data/test/spec/tools/mail/template_spec.rb +47 -0
  160. data/test/spec/validation/array_validation_spec.rb +63 -0
  161. data/test/spec/validation/array_validator_spec.rb +17 -0
  162. data/test/spec/validation/date_validation_spec.rb +35 -0
  163. data/test/spec/validation/default_validation_spec.rb +37 -0
  164. data/test/spec/validation/disjuctive_validation_spec.rb +33 -0
  165. data/test/spec/validation/errors_spec.rb +37 -0
  166. data/test/spec/validation/file_validator_spec.rb +34 -0
  167. data/test/spec/validation/mail_validation_spec.rb +51 -0
  168. data/test/spec/validation/missing_validation_spec.rb +43 -0
  169. data/test/spec/validation/same_validation_spec.rb +24 -0
  170. data/test/spec/validation/signature_intuition_spec.rb +37 -0
  171. data/test/spec/validation/signature_spec.rb +164 -0
  172. data/test/spec/validation/validation_spec.rb +28 -0
  173. data/test/spec/wspec/html_analysis/tag_spec.rb +38 -0
  174. data/test/spec/wspec/html_analysis_spec.rb +170 -0
  175. data/test/unit/test_all.rb +8 -0
  176. data/test/unit/waw/app_test.rb +126 -0
  177. data/test/unit/waw/app_test/config/commons.cfg +2 -0
  178. data/test/unit/waw/app_test/config/devel.cfg +1 -0
  179. data/test/unit/waw/config_test.rb +54 -0
  180. data/test/unit/waw/controllers/action_controller_test.rb +76 -0
  181. data/test/unit/waw/controllers/action_test.rb +35 -0
  182. data/test/unit/waw/controllers/example_action_controller_test.rb +24 -0
  183. data/test/unit/waw/controllers/multiple_action_controller_test.rb +78 -0
  184. data/test/unit/waw/controllers/static/example/css/example.css +1 -0
  185. data/test/unit/waw/controllers/static/example/index.html +1 -0
  186. data/test/unit/waw/controllers/static/example/js/example.js +1 -0
  187. data/test/unit/waw/controllers/static/example/pages/hello.wtpl +1 -0
  188. data/test/unit/waw/controllers/static/waw_access_test.rb +76 -0
  189. data/test/unit/waw/ext/rack_test.rb +74 -0
  190. data/test/unit/waw/resource_collection_test.rb +49 -0
  191. data/test/unit/waw/resources.txt +4 -0
  192. data/test/unit/waw/routing/routing_test.rb +26 -0
  193. data/test/unit/waw/utils/dsl_helper_test.rb +79 -0
  194. data/test/unit/waw/utils/dsl_helper_test_extensions1.rb +4 -0
  195. data/test/unit/waw/validation/signature_test.rb +193 -0
  196. data/test/unit/waw/validation_test.rb +319 -0
  197. data/test/unit/waw/wspec/html_analysis_test.html +81 -0
  198. data/test/unit/waw/wspec/html_analysis_test.rb +26 -0
  199. metadata +272 -0
@@ -0,0 +1,4 @@
1
+ class String
2
+ def upcase; self; end
3
+ def downcase; self; end
4
+ end
@@ -0,0 +1,193 @@
1
+ require 'waw'
2
+ require 'test/unit'
3
+ module Waw
4
+ module Validation
5
+ class SignatureTest < Test::Unit::TestCase
6
+
7
+ def test_simple_case
8
+ signature = Signature.new do
9
+ validation :name, Waw::Validation.mandatory, :missing_name
10
+ end
11
+ assert_equal [false, [:missing_name]], signature.apply(:name => nil)
12
+ assert_equal [true, {:name => "blambeau"}], signature.apply(:name => "blambeau")
13
+ end
14
+
15
+ def test_supports_multiple_rules
16
+ signature = Signature.new do
17
+ validation :name, Waw::Validation.mandatory, :missing_name
18
+ validation :age, (Waw::Validation.mandatory & Waw::Validation.validator{|v| v>18}), :bad_age
19
+ end
20
+ assert_equal [false, [:missing_name, :bad_age]], signature.apply(:name => nil)
21
+ assert_equal [false, [:bad_age]], signature.apply(:name => "blambeau", :age => nil)
22
+ assert_equal [true, {:name => "blambeau", :age => 20}], signature.apply(:name => "blambeau", :age => 20)
23
+ end
24
+
25
+ def test_typical_web_scenario
26
+ signature = Waw::Validation.signature do
27
+ validation :mail, Waw::Validation.mail, :bad_email
28
+ validation [:password, :confirm], Waw::Validation.same, :passwords_dont_match
29
+ validation :age, Waw::Validation.missing | (Waw::Validation.integer & (Waw::Validation.is >= 18)), :bad_age
30
+ end
31
+
32
+ ok, values = signature.apply(:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => 29)
33
+ assert_equal({:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => 29}, values)
34
+ assert_equal true, ok
35
+
36
+ ok, values = signature.apply(:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass2", :age => 29)
37
+ assert_equal false, ok
38
+ assert_equal [:passwords_dont_match], values
39
+
40
+ ok, values = signature.apply(:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass")
41
+ assert_equal({:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => nil}, values)
42
+ assert_equal true, ok
43
+
44
+ ok, values = signature.apply(:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => '')
45
+ assert_equal({:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => nil}, values)
46
+ assert_equal true, ok
47
+
48
+ ok, values = signature.apply(:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => "19")
49
+ assert_equal({:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => 19}, values)
50
+ assert_equal true, ok
51
+ end
52
+
53
+ def test_typical_web_scenario_sc2
54
+ signature = Waw::Validation.signature do
55
+ validation :mail, mail, :bad_email
56
+ validation [:password, :confirm], same, :passwords_dont_match
57
+ validation :age, (integer & (is >= 18)) | missing, :bad_age
58
+ validation :newsletter, (boolean | default(false)), :bad_newsletter
59
+ end
60
+
61
+ ok, values = signature.apply(:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => 29)
62
+ assert_equal({:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => 29, :newsletter => false}, values)
63
+ assert_equal true, ok
64
+
65
+ ok, values = signature.apply(:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => '29', :newsletter => nil)
66
+ assert_equal({:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => 29, :newsletter => false}, values)
67
+ assert_equal true, ok
68
+
69
+ ok, values = signature.apply(:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => '29', :newsletter => 'false')
70
+ assert_equal({:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => 29, :newsletter => false}, values)
71
+ assert_equal true, ok
72
+
73
+ ok, values = signature.apply(:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => '29', :newsletter => 'true')
74
+ assert_equal({:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => 29, :newsletter => true}, values)
75
+ assert_equal true, ok
76
+
77
+ ok, values = signature.apply(:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass", :age => '29', :newsletter => 'hello')
78
+ assert_equal false, ok
79
+ assert_equal [:bad_newsletter], values
80
+ end
81
+
82
+ def test_typical_web_scenario_sc3
83
+ signature = Waw::Validation.signature do
84
+ validation :mail, mandatory & mail, :bad_email
85
+ validation [:password, :confirm], mandatory & same, :passwords_dont_match
86
+ end
87
+ ok, values = signature.apply(:mail => "blambeau@gmail.com", :password => "pass", :confirm => "pass")
88
+ assert_equal true, ok
89
+ ok, values = signature.apply(:mail => "blambeau@gmail.com", :password => "", :confirm => "")
90
+ assert_equal false, ok
91
+ assert_equal [:passwords_dont_match], values
92
+ ok, values = signature.apply(:mail => "blambeau@gmail.com", :password => nil, :confirm => nil)
93
+ assert_equal false, ok
94
+ assert_equal [:passwords_dont_match], values
95
+ ok, values = signature.apply(:mail => "blambeau@gmail.com")
96
+ assert_equal false, ok
97
+ assert_equal [:passwords_dont_match], values
98
+ end
99
+
100
+ def assert_signature_passes(expected, signature=nil, &block)
101
+ signature = Waw::Validation.signature(&block) unless signature
102
+ ok, converted = signature.apply(expected)
103
+ assert_equal true, ok
104
+ converted
105
+ end
106
+
107
+ def assert_signature_does_not_pass(expected, signature=nil, &block)
108
+ signature = Waw::Validation.signature(&block) unless signature
109
+ ok, converted = signature.apply(expected)
110
+ assert_equal false, ok
111
+ converted
112
+ end
113
+
114
+ def test_missing_and_default_intuition
115
+ # mandatory mail
116
+ get = assert_signature_passes(:mail => "blambeau@gmail.com") {
117
+ validation :mail, mail, :bad_mail
118
+ }
119
+ assert_equal "blambeau@gmail.com", get[:mail]
120
+ get = assert_signature_does_not_pass(:mail => nil) {
121
+ validation :mail, mail, :bad_mail
122
+ }
123
+ assert_equal [:bad_mail], get
124
+ get = assert_signature_does_not_pass(:mail => "") {
125
+ validation :mail, mail, :bad_mail
126
+ }
127
+ assert_equal [:bad_mail], get
128
+ get = assert_signature_does_not_pass(:mail => "blambeaugmail.com") {
129
+ validation :mail, mail, :bad_mail
130
+ }
131
+ assert_equal [:bad_mail], get
132
+
133
+ # optional valid mail
134
+ get = assert_signature_passes(:mail => "blambeau@gmail.com") {
135
+ validation :mail, mail | missing, :bad_mail
136
+ }
137
+ assert_equal "blambeau@gmail.com", get[:mail]
138
+ get = assert_signature_passes(:mail => "blambeau@gmail.com") {
139
+ validation :mail, missing | mail, :bad_mail
140
+ }
141
+ assert_equal "blambeau@gmail.com", get[:mail]
142
+ get = assert_signature_passes(:mail => "") {
143
+ validation :mail, mail | missing, :bad_mail
144
+ }
145
+ assert_equal nil, get[:mail]
146
+ get = assert_signature_passes(:mail => nil) {
147
+ validation :mail, missing | mail, :bad_mail
148
+ }
149
+ assert_equal nil, get[:mail]
150
+ get = assert_signature_passes(:mail => nil) {
151
+ validation :mail, mail | missing, :bad_mail
152
+ }
153
+ assert_equal nil, get[:mail]
154
+ get = assert_signature_does_not_pass(:mail => "blambeaugmail.com") {
155
+ validation :mail, mail | missing, :bad_mail
156
+ }
157
+ assert_equal [:bad_mail], get
158
+
159
+ # optional valid mail, with default
160
+ get = assert_signature_passes(:mail => "blambeau@gmail.com") {
161
+ validation :mail, mail | default("info@gmail.com"), :bad_mail
162
+ }
163
+ assert_equal "blambeau@gmail.com", get[:mail]
164
+
165
+ get = assert_signature_passes(:mail => "blambeau@gmail.com") {
166
+ validation :mail, default("info@gmail.com") | mail, :bad_mail
167
+ }
168
+ assert_equal "blambeau@gmail.com", get[:mail]
169
+
170
+ get = assert_signature_passes(:mail => nil) {
171
+ validation :mail, mail | default("info@gmail.com"), :bad_mail
172
+ }
173
+ assert_equal "info@gmail.com", get[:mail]
174
+
175
+ get = assert_signature_passes(:mail => nil) {
176
+ validation :mail, default("info@gmail.com") | mail, :bad_mail
177
+ }
178
+ assert_equal "info@gmail.com", get[:mail]
179
+
180
+ get = assert_signature_passes(:mail => " ") {
181
+ validation :mail, mail | default("info@gmail.com"), :bad_mail
182
+ }
183
+ assert_equal "info@gmail.com", get[:mail]
184
+
185
+ get = assert_signature_does_not_pass(:mail => "blambeaugmail.com") {
186
+ validation :mail, mail | default("info@gmail.com"), :bad_mail
187
+ }
188
+ assert_equal [:bad_mail], get
189
+ end
190
+
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,319 @@
1
+ require 'waw'
2
+ require 'test/unit'
3
+ module Waw
4
+ class ValidationTest < Test::Unit::TestCase
5
+
6
+ MISSING = [nil, "", " ", " "]
7
+ NOT_MISSING = [self, 0, -1, 1, 12.0, -1000, true, false, "hello"]
8
+ MIX = (MISSING + NOT_MISSING)
9
+
10
+ def method_missing(name, *args, &block)
11
+ Waw::Validation.send(name, *args, &block)
12
+ end
13
+
14
+ def test_is_missing?
15
+ assert MISSING.all?{|v| is_missing?(v)}
16
+ assert !NOT_MISSING.any?{|v| is_missing?(v)}
17
+ end
18
+
19
+ def test_all_missing?
20
+ assert all_missing?(MISSING)
21
+ assert !all_missing?(NOT_MISSING)
22
+ assert !all_missing?(MIX)
23
+ end
24
+
25
+ def test_any_missing?
26
+ assert any_missing?(MISSING)
27
+ assert !any_missing?(NOT_MISSING)
28
+ assert any_missing?(MIX)
29
+ end
30
+
31
+ def test_no_missing?
32
+ assert no_missing?(NOT_MISSING)
33
+ assert !no_missing?(MISSING)
34
+ assert !no_missing?(MIX)
35
+ end
36
+
37
+ def test_missings_to_nil
38
+ assert_equal MISSING.collect{|v| nil}, missings_to_nil(MISSING)
39
+ assert_equal NOT_MISSING, missings_to_nil(NOT_MISSING)
40
+ end
41
+
42
+ def test_missing
43
+ assert Waw::Validation::Validator===missing
44
+ assert !NOT_MISSING.any?{|v| missing===v}
45
+ assert MISSING.all?{|v| missing===v}
46
+ NOT_MISSING.each do |val|
47
+ assert_equal [false, [val]], missing =~ val
48
+ end
49
+ MISSING.each do |val|
50
+ assert_equal [true, [nil]], missing =~ val
51
+ end
52
+ assert_equal [false, [self, nil]], missing.=~(self, nil)
53
+ assert_equal [false, [nil, self]], missing.=~(nil, self)
54
+ assert_equal [true, [nil, nil, nil]], missing.=~(" ", " ", nil)
55
+ end
56
+
57
+ def test_mandatory
58
+ assert Waw::Validation::Validator===mandatory
59
+ assert NOT_MISSING.all?{|v| mandatory===v}
60
+ assert !MISSING.any?{|v| mandatory===v}
61
+ NOT_MISSING.each do |val|
62
+ assert_equal [true, [val]], mandatory =~ val
63
+ end
64
+ MISSING.each do |val|
65
+ assert_equal [false, [val]], mandatory =~ val
66
+ end
67
+ end
68
+
69
+ def test_default
70
+ assert_raise ::Waw::WawError do
71
+ ::Waw::Validation.default
72
+ end
73
+ assert ::Waw::Validation::Validator === default(12)
74
+ assert MISSING.all?{|v| default("ok")===v}
75
+ assert !NOT_MISSING.any?{|v| default("ok")===v}
76
+ NOT_MISSING.each do |val|
77
+ assert_equal [false, [val]], default("ok") =~ val
78
+ end
79
+ MISSING.each do |val|
80
+ assert_equal [true, ["ok"]], default("ok") =~ val
81
+ end
82
+ assert_equal [false, [nil, 12]], default("ok").=~(nil, 12)
83
+ assert_equal [false, ["", 12]], default("ok").=~("", 12)
84
+ end
85
+
86
+ def test_same
87
+ assert ::Waw::Validation::Validator === same
88
+ assert NOT_MISSING.all?{|v| same.===(v,v)}
89
+ assert !MISSING.any?{|v| same.===(v,v)}
90
+ assert same.===(12, 12)
91
+ assert same.===(12, 12, 12)
92
+ assert !same.===(12, 13)
93
+ assert !same.===(12, 12, 13)
94
+ assert !same.===(12, nil)
95
+ assert !same.===(nil, nil)
96
+ assert_equal [true, [12, 12]], same.=~(12, 12)
97
+ assert_equal [false, [12, ""]], same.=~(12, "")
98
+ assert_equal [false, [12, nil]], same.=~(12, nil)
99
+ end
100
+
101
+ def test_isin
102
+ assert ::Waw::Validation::Validator === isin
103
+ MIX.each do |val|
104
+ assert_equal false, isin(101, "not present", /^$/)===val
105
+ assert_equal true, isin(val)===val
106
+ end
107
+ assert_equal true, isin(nil)===nil
108
+ assert_equal true, isin("hello", "world")==="hello"
109
+ assert_equal true, isin("hello", "world")==="world"
110
+ assert_equal [true, ["hello", "world"]], isin("hello", "world", "happy").=~("hello", "world")
111
+ assert_equal [false, ["hello", "world"]], isin("hell", "world", "happy").=~("hello", "world")
112
+ end
113
+
114
+ def test_boolean
115
+ assert [true, false].all?{|v| boolean===v}
116
+ assert !MISSING.any?{|v| boolean === v}
117
+ assert !NOT_MISSING.all?{|v| boolean === v}
118
+ assert_equal [true, [true, false]], boolean.=~(true, false)
119
+ assert_equal [true, [true, false]], boolean.=~('true', false)
120
+ assert_equal [true, [true, false]], boolean.=~(' true ', false)
121
+ assert_equal [true, [true, false]], boolean.=~(' true ', "false ")
122
+ assert_equal [false, [self]], boolean.=~(self)
123
+ end
124
+
125
+ def test_integer
126
+ assert [1, 12, 0].all?{|v| integer===v}
127
+ assert !MISSING.any?{|v| integer===v}
128
+ assert !NOT_MISSING.all?{|v| integer===v}
129
+ assert !["hello", self].any?{|v| integer===v}
130
+ assert_equal [true, [0, 12]], integer.=~(0, 12)
131
+ assert_equal [true, [0, 12]], integer.=~('0', 12)
132
+ assert_equal [true, [0, 12]], integer.=~(' 0 ', 12)
133
+ assert_equal [true, [0, 12]], integer.=~('0', '12')
134
+ assert_equal [true, [0, 12]], integer.=~('+0', '+12')
135
+ assert_equal [true, [0, -12]], integer.=~('+0', '-12')
136
+ assert_equal [false, ['0', nil]], integer.=~('0', nil)
137
+ assert_equal [false, [0, nil]], integer.=~(0, nil)
138
+ assert_equal [false, [0, ""]], integer.=~(0, "")
139
+ assert_equal [false, ['hello']], integer.=~('hello')
140
+ assert_equal [false, ['hello12']], integer.=~('hello12')
141
+ assert_equal [false, [self]], integer.=~(self)
142
+ end
143
+
144
+ def test_float
145
+ assert [1.0, 0.0, -10.0].all?{|v| float===v}
146
+ assert !MISSING.any?{|v| float===v}
147
+ assert !NOT_MISSING.all?{|v| float===v}
148
+ assert_equal [true, [0.0, -12.0]], float.=~(0.0, -12.0)
149
+ assert_equal [false, [0.0, nil]], float.=~(0.0, nil)
150
+ assert_equal [true, [0.0, -12.0]], float.=~("0.0", "-12.0")
151
+ assert_equal [true, [0.0, -12.0]], float.=~("0", "-12")
152
+ assert_equal [true, [0.0, -12.0]], float.=~(".0", "-12.0")
153
+ assert_equal [true, [0.2]], float.=~(".2")
154
+ assert_equal [true, [1.2e3]], float.=~(1.2e3)
155
+ assert_equal [true, [1.2e3]], float.=~("1.2e3")
156
+ assert_equal [true, [1.2e3]], float.=~("1.2E3")
157
+ assert_equal [true, [0.2e3]], float.=~(".2E3")
158
+ assert_equal [false, [0.0, "hello"]], float.=~(0.0, "hello")
159
+ assert_equal [false, [0.0, "h12.0"]], float.=~(0.0, "h12.0")
160
+ end
161
+
162
+ def test_mail
163
+ ["blambeau@gmail.com",
164
+ " blambeau@gmail.com ",
165
+ "x@fmail.com",
166
+ "blambeau@acm-sc.be",
167
+ "blambeau@info.uclouvain.be",
168
+ "blambeau12@info.uclouvain.be",
169
+ "blambeau12@info.uclouvain.be",
170
+ "llambeau@hit-radio.be"].each do |v|
171
+ assert mail===v, "#{v} is a valid e-mail"
172
+ end
173
+ assert !MIX.any?{|v| mail===v}
174
+ assert !(mail === "blambeuamail")
175
+ assert !(mail === "blambeuamail@")
176
+ assert !(mail === "@gmail.com")
177
+ assert !(mail === "12")
178
+ end
179
+
180
+ def test_weburl
181
+ ["http://www.google.com/",
182
+ "https://www.google.com/",
183
+ "http://www.google.com",
184
+ "http://www.google.net",
185
+ "https://www.google.com/some/path",
186
+ "https://www.google.com/some/path?and=a&query=12",
187
+ "https://www.google.com/some/path?and=a&query=12&that=",
188
+ "https://www.google.com:9292/some/path?and=a&query=12&that=",
189
+ " https://www.google.com:9292/some/path?and=a&query=12&that= ",
190
+ ].each do |v|
191
+ assert weburl===v, "#{v} is a valid web url"
192
+ end
193
+ end
194
+
195
+ def test_size
196
+ # just because it seems that a method size exists in Test::Unit::TestCase
197
+ thesize = ::Waw::Validation.size
198
+ assert_equal ::Waw::Validation::SizeValidations.object_id, thesize.object_id
199
+
200
+ first, second = (::Waw::Validation::SizeValidations == 2), (::Waw::Validation::SizeValidations == 0)
201
+ assert_equal false, first.object_id===second.object_id, "Different size validators"
202
+
203
+ [(thesize == 2), (thesize <= 2), (thesize >= 2), (thesize < 2), (thesize > 2)].all?{|v| ::Waw::Validation::Validator===v}
204
+
205
+ first, second = (thesize.==(2)), (thesize.==(0))
206
+ assert_equal false, first.object_id===second.object_id, "Different size validators"
207
+
208
+ assert ::Waw::Validation::SizeValidations.has_size?([])
209
+ assert [].size <= 2
210
+
211
+ assert (thesize == 0)===[], "Empty array has size == 0"
212
+ [" ", [1, 2]].each do |v|
213
+ assert((thesize == 2).===(v), "|#{v}| has exactly a size of 2")
214
+ assert(!(thesize == 3).===(v), "|#{v}| has not a size of 3")
215
+ assert(((thesize <= 2)===v), "|#{v}| has size <= 2")
216
+ assert(((thesize >= 2)===v), "|#{v}| has size >= 2")
217
+ assert(!((thesize > 2)===v), "|#{v}| has not size > 2")
218
+ assert(!((thesize < 2)===v), "|#{v}| has not size < 2")
219
+ end
220
+ MISSING.each do |v|
221
+ assert_equal false, (thesize==100).===(v)
222
+ #assert_equal false, (thesize<=100).===(v) # not true because of ""
223
+ assert_equal false, (thesize>=100).===(v)
224
+ #assert_equal false, (thesize<100).===(v) # not true because of ""
225
+ assert_equal false, (thesize>100).===(v)
226
+ end
227
+ assert_nothing_raised do
228
+ assert_equal false, Object.new.respond_to?(:size)
229
+ assert_equal false, (thesize>100).===(Object.new)
230
+ assert_equal false, (thesize>self).===(Object.new)
231
+ assert_equal false, (thesize>"hello").===(Object.new)
232
+ assert_equal false, (thesize>self).===(" ")
233
+ assert_equal false, (thesize>"hello").===(" ")
234
+ end
235
+ end
236
+
237
+ def test_is
238
+ # Ensure that we are talking about the validator
239
+ assert_equal false, self.respond_to?(:is)
240
+ assert ::Waw::Validation::ComparisonValidations.object_id==is.object_id
241
+ assert ::Waw::Validation::Validator===(is==2)
242
+ MISSING.each do |val|
243
+ assert_equal false, (is==345678)===val
244
+ assert_equal false, (is<=345678)===val
245
+ assert_equal false, (is>=345678)===val
246
+ assert_equal false, (is<345678)===val
247
+ assert_equal false, (is>345678)===val
248
+ end
249
+ assert_equal true, (is == 2)===2
250
+ assert_equal true, (is <= 2)===2
251
+ assert_equal true, (is >= 2)===2
252
+ assert_equal true, (is < 2)===1
253
+ assert_equal true, (is > 2)===3
254
+ assert_equal false, (is > 2)==="hello"
255
+ assert_equal [true, [3]], (is < 10) =~ 3
256
+ assert_equal [false, ["hello"]], (is < 10) =~ "hello"
257
+ assert_equal [false, ["3"]], (is < 10) =~ "3"
258
+ assert_equal true, is.in(1, 2, 3)===3
259
+ assert_equal false, is.in(1, 2, 3)===4
260
+ assert_equal [true, [1, 2]], is.in(1, 2, 3).=~(1, 2)
261
+ end
262
+
263
+ def test_historical_first
264
+ assert Waw::Validation.mandatory===false, "Waw::Validation.mandatory===false"
265
+ assert Waw::Validation.mandatory===true, "Waw::Validation.mandatory===true"
266
+ assert Waw::Validation.mandatory===0, "Waw::Validation.mandatory===0"
267
+ assert Waw::Validation.mandatory===1, "Waw::Validation.mandatory===1"
268
+ assert Waw::Validation.mandatory.not===nil, "Waw::Validation.mandatory.not===nil"
269
+
270
+ # assert (Waw::Validation.size > 0)==="12", "(Waw::Validation.size > 0)==='12'"
271
+ # assert (Waw::Validation.size > 0).not==="", "(Waw::Validation.size > 0).not==="
272
+ # assert (Waw::Validation.size >= 0)==="12", "(Waw::Validation.size >= 0)==='12'"
273
+ # assert (Waw::Validation.size >= 0)==="", "(Waw::Validation.size >= 0)==="
274
+ #
275
+ # assert (Waw::Validation.size > 0)===[:hello], "(Waw::Validation.size > 0)===[:hello]"
276
+ # assert (Waw::Validation.size > 0).not===[], "(Waw::Validation.size > 0).not===[]"
277
+ #
278
+ # assert (Waw::Validation.size == 0)===[]
279
+ # assert !((Waw::Validation.size == 10)===[])
280
+
281
+ assert Waw::Validation::Array[String] === []
282
+ assert Waw::Validation::Array[String] === ["coucou", "hello"]
283
+ assert !(Waw::Validation::Array[String] === [12])
284
+ assert !(Waw::Validation::Array[String] === ["coucou", 12])
285
+ assert Waw::Validation::Array[Waw::Validation.size>2] === ["coucou", "hello"]
286
+ assert !(Waw::Validation::Array[Waw::Validation.size>2] === ["coucou", "h"])
287
+ end
288
+
289
+ def test_validator
290
+ validator = Waw::Validation.validator{|val| Integer===val and val>10}
291
+ assert_equal true, validator===11
292
+ assert_equal false, validator===10
293
+ assert_equal false, validator===7
294
+ assert_equal false, validator==="10"
295
+ end
296
+
297
+ def test_validator_accepts_multiple_arguments
298
+ validator = Waw::Validation.validator{|val1, val2| val1==val2}
299
+ assert_equal true, validator.validate("hello", "hello")
300
+ assert_equal false, validator.validate("hello", 10)
301
+ assert_equal true, validator.validate(10, 10)
302
+ end
303
+
304
+ def test_validator_conjunction
305
+ val = (Waw::Validation.mandatory & Waw::Validation.validator{|v| v>10})
306
+ assert_equal true, val===11
307
+ assert_equal false, val===10
308
+ assert_equal false, val===nil
309
+ end
310
+
311
+ def test_validator_disjunction
312
+ val = (Waw::Validation::validator{|v| v<10} | Waw::Validation.validator{|v| v>10})
313
+ assert_equal true, val===11
314
+ assert_equal false, val===10
315
+ assert_equal true, val===9
316
+ end
317
+
318
+ end
319
+ end