ryanbriones-ZenTest 3.11.1

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 (70) hide show
  1. data/History.txt +523 -0
  2. data/Manifest.txt +69 -0
  3. data/README.txt +110 -0
  4. data/Rakefile +68 -0
  5. data/articles/Article.css +721 -0
  6. data/articles/getting_started_with_autotest.html +532 -0
  7. data/articles/how_to_use_zentest.txt +393 -0
  8. data/bin/autotest +55 -0
  9. data/bin/multiruby +40 -0
  10. data/bin/multiruby_setup +68 -0
  11. data/bin/rails_test_audit +80 -0
  12. data/bin/unit_diff +38 -0
  13. data/bin/zentest +28 -0
  14. data/example.txt +42 -0
  15. data/example1.rb +7 -0
  16. data/example2.rb +15 -0
  17. data/example_dot_autotest.rb +45 -0
  18. data/lib/autotest.rb +654 -0
  19. data/lib/autotest/autoupdate.rb +26 -0
  20. data/lib/autotest/camping.rb +37 -0
  21. data/lib/autotest/cctray.rb +57 -0
  22. data/lib/autotest/discover.rb +6 -0
  23. data/lib/autotest/emacs.rb +35 -0
  24. data/lib/autotest/email_notify.rb +66 -0
  25. data/lib/autotest/fixtures.rb +12 -0
  26. data/lib/autotest/growl.rb +28 -0
  27. data/lib/autotest/heckle.rb +14 -0
  28. data/lib/autotest/html_report.rb +31 -0
  29. data/lib/autotest/jabber_notify.rb +111 -0
  30. data/lib/autotest/kdenotify.rb +14 -0
  31. data/lib/autotest/menu.rb +51 -0
  32. data/lib/autotest/migrate.rb +7 -0
  33. data/lib/autotest/notify.rb +34 -0
  34. data/lib/autotest/once.rb +9 -0
  35. data/lib/autotest/pretty.rb +83 -0
  36. data/lib/autotest/rails.rb +81 -0
  37. data/lib/autotest/rcov.rb +22 -0
  38. data/lib/autotest/redgreen.rb +21 -0
  39. data/lib/autotest/restart.rb +11 -0
  40. data/lib/autotest/screen.rb +73 -0
  41. data/lib/autotest/shame.rb +45 -0
  42. data/lib/autotest/snarl.rb +51 -0
  43. data/lib/autotest/timestamp.rb +9 -0
  44. data/lib/functional_test_matrix.rb +92 -0
  45. data/lib/multiruby.rb +401 -0
  46. data/lib/test/rails.rb +295 -0
  47. data/lib/test/rails/controller_test_case.rb +382 -0
  48. data/lib/test/rails/functional_test_case.rb +79 -0
  49. data/lib/test/rails/helper_test_case.rb +64 -0
  50. data/lib/test/rails/ivar_proxy.rb +31 -0
  51. data/lib/test/rails/pp_html_document.rb +74 -0
  52. data/lib/test/rails/rake_tasks.rb +50 -0
  53. data/lib/test/rails/render_tree.rb +93 -0
  54. data/lib/test/rails/test_case.rb +28 -0
  55. data/lib/test/rails/view_test_case.rb +597 -0
  56. data/lib/test/zentest_assertions.rb +134 -0
  57. data/lib/unit_diff.rb +259 -0
  58. data/lib/zentest.rb +566 -0
  59. data/lib/zentest_mapping.rb +99 -0
  60. data/test/test_autotest.rb +449 -0
  61. data/test/test_help.rb +36 -0
  62. data/test/test_rails_autotest.rb +229 -0
  63. data/test/test_rails_controller_test_case.rb +58 -0
  64. data/test/test_rails_helper_test_case.rb +48 -0
  65. data/test/test_rails_view_test_case.rb +275 -0
  66. data/test/test_unit_diff.rb +319 -0
  67. data/test/test_zentest.rb +566 -0
  68. data/test/test_zentest_assertions.rb +128 -0
  69. data/test/test_zentest_mapping.rb +222 -0
  70. metadata +151 -0
@@ -0,0 +1,319 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ require 'test/unit'
4
+ require 'stringio'
5
+
6
+ $TESTING = true
7
+
8
+ require 'unit_diff'
9
+
10
+ class TestUnitDiff < Test::Unit::TestCase
11
+
12
+ def setup
13
+ @diff = UnitDiff.new
14
+ end
15
+
16
+ def test_input
17
+ header = "Loaded suite ./blah\nStarted\nFF\nFinished in 0.035332 seconds.\n\n"
18
+ input = "#{header} 1) Failure:\ntest_test1(TestBlah) [./blah.rb:25]:\n<\"line1\\nline2\\nline3\\n\"> expected but was\n<\"line4\\nline5\\nline6\\n\">.\n\n 2) Failure:\ntest_test2(TestBlah) [./blah.rb:29]:\n<\"line1\"> expected but was\n<\"line2\\nline3\\n\\n\">.\n\n2 tests, 2 assertions, 2 failures, 0 errors\n"
19
+
20
+ # TODO: I think I'd like a separate footer array as well
21
+ expected = [[[" 1) Failure:\n", "test_test1(TestBlah) [./blah.rb:25]:\n", "<\"line1\\nline2\\nline3\\n\"> expected but was\n", "<\"line4\\nline5\\nline6\\n\">.\n"],
22
+ [" 2) Failure:\n", "test_test2(TestBlah) [./blah.rb:29]:\n", "<\"line1\"> expected but was\n", "<\"line2\\nline3\\n\\n\">.\n"]],
23
+ ["\n", "2 tests, 2 assertions, 2 failures, 0 errors\n"]]
24
+
25
+ util_unit_diff(header, input, expected, :parse_input)
26
+ end
27
+
28
+ def test_input_miniunit
29
+ header = "Loaded suite -e\nStarted\nF\nFinished in 0.035332 seconds.\n\n"
30
+ input = "#{header} 1) Failure:
31
+ test_blah(TestBlah) [./blah.rb:25]:
32
+ Expected ['a', 'b', 'c'], not ['a', 'c', 'b'].
33
+
34
+ 1 tests, 1 assertions, 1 failures, 0 errors
35
+ "
36
+
37
+ expected = [[[" 1) Failure:\n",
38
+ "test_blah(TestBlah) [./blah.rb:25]:\n",
39
+ "Expected ['a', 'b', 'c'], not ['a', 'c', 'b'].\n"]],
40
+ ["\n", "1 tests, 1 assertions, 1 failures, 0 errors\n"]]
41
+
42
+ util_unit_diff(header, input, expected, :parse_input)
43
+ end
44
+
45
+ def test_input_mspec
46
+ header = <<-HEADER
47
+ Started
48
+ .......F
49
+ Finished in 0.1 seconds
50
+
51
+ HEADER
52
+
53
+ failure = <<-FAILURE
54
+ 1)
55
+ The unless expression should fail FAILED
56
+ Expected nil to equal "baz":
57
+ FAILURE
58
+
59
+ backtrace = <<-BACKTRACE
60
+ PositiveExpectation#== at spec/mspec.rb:217
61
+ main.__script__ {} at spec/language/unless_spec.rb:49
62
+ Proc#call at kernel/core/proc.rb:127
63
+ SpecRunner#it at spec/mspec.rb:368
64
+ main.it at spec/mspec.rb:412
65
+ main.__script__ {} at spec/language/unless_spec.rb:48
66
+ Proc#call at kernel/core/proc.rb:127
67
+ SpecRunner#describe at spec/mspec.rb:378
68
+ main.describe at spec/mspec.rb:408
69
+ main.__script__ at spec/language/unless_spec.rb:3
70
+ CompiledMethod#as_script at kernel/bootstrap/primitives.rb:41
71
+ main.load at kernel/core/compile.rb:150
72
+ main.__script__ {} at last_mspec.rb:11
73
+ Array#each {} at kernel/core/array.rb:545
74
+ Integer(Fixnum)#times at kernel/core/integer.rb:15
75
+ Array#each at kernel/core/array.rb:545
76
+ main.__script__ at last_mspec.rb:16
77
+ CompiledMethod#as_script at kernel/bootstrap/primitives.rb:41
78
+ main.load at kernel/core/compile.rb:150
79
+ main.__script__ at kernel/loader.rb:145
80
+ BACKTRACE
81
+
82
+ footer = "\n8 examples, 1 failures\n"
83
+ input = header + failure + backtrace + footer
84
+
85
+ expected_backtrace = backtrace.split("\n").map {|l| "#{l}\n"}
86
+ expected = [[["1)\n", "The unless expression should fail FAILED\n",
87
+ "Expected nil to equal \"baz\":\n",
88
+ *expected_backtrace]],
89
+ ["\n", "8 examples, 1 failures\n"]]
90
+ util_unit_diff(header, input, expected, :parse_input)
91
+ end
92
+
93
+ def test_input_mspec_multiline
94
+ header = <<-HEADER
95
+ Started
96
+ .......F
97
+ Finished in 0.1 seconds
98
+
99
+ HEADER
100
+
101
+ failure = <<-FAILURE
102
+ 1)
103
+ Compiler compiles a case without an argument FAILED
104
+ Expected #<TestGenerator [[:push, :false], [:gif, #<Label 5>], [:push_literal, "foo"], [:string_dup], [:goto, #<Label 19>], [:set_label, #<Label 5>], [:push, :nil], [:gif, #<Label 10>], [:push_literal, "foo"], [:string_dup], [:goto, #<Label 19>], [:set_label, #<Label 10>], [:push, 2], [:push, 1], [:send, :==, 1, false], [:gif, #<Label 17>], [:push_literal, "bar"], [:string_dup], [:goto, #<Label 19>], [:set_label, #<Label 17>], [:push_literal, "baz"], [:string_dup], [:set_label, #<Label 19>]]
105
+ to equal #<TestGenerator [[:push, false], [:gif, #<Label 5>], [:push, "foo"], [:string_dup], [:goto, #<Label 6>], [:set_label, #<Label 5>], [:push, nil], [:set_label, #<Label 6>], [:pop], [:push, nil], [:gif, #<Label 12>], [:push, "foo"], [:string_dup], [:goto, #<Label 13>], [:set_label, #<Label 12>], [:push, nil], [:set_label, #<Label 13>], [:pop], [:push, 2], [:push, 1], [:send, :==, 1], [:gif, #<Label 21>], [:push, "bar"], [:string_dup], [:goto, #<Label 23>], [:set_label, #<Label 21>], [:push_literal, "baz"], [:string_dup], [:set_label, #<Label 23>], [:sret]]:
106
+ FAILURE
107
+
108
+ backtrace = <<-BACKTRACE
109
+ PositiveExpectation#== at spec/mspec.rb:216
110
+ main.gen at ./compiler2/spec/helper.rb:125
111
+ main.__script__ {} at compiler2/spec/control_spec.rb:448
112
+ BACKTRACE
113
+
114
+ footer = "\n8 examples, 1 failures\n"
115
+ input = header + failure + backtrace + footer
116
+
117
+ expected_backtrace = backtrace.split("\n").map {|l| "#{l}\n"}
118
+ expected_failure = failure.split("\n").map {|l| "#{l}\n"}
119
+ expected = [[[*(expected_failure + expected_backtrace)]],
120
+ ["\n", "8 examples, 1 failures\n"]]
121
+ util_unit_diff(header, input, expected, :parse_input)
122
+ end
123
+
124
+ def test_unit_diff_empty # simulates broken pipe at the least
125
+ input = ""
126
+ expected = ""
127
+ util_unit_diff("", "", "")
128
+ end
129
+
130
+ def test_parse_diff_angles
131
+ input = [" 1) Failure:\n",
132
+ "test_test1(TestBlah) [./blah.rb:25]:\n",
133
+ "<\"<html>\"> expected but was\n",
134
+ "<\"<body>\">.\n"
135
+ ]
136
+
137
+ expected = [[" 1) Failure:\n", "test_test1(TestBlah) [./blah.rb:25]:\n"],
138
+ ["<html>"],
139
+ ["<body>"],
140
+ []]
141
+
142
+ assert_equal expected, @diff.parse_diff(input)
143
+ end
144
+
145
+ def test_parse_diff_miniunit
146
+ input = [" 1) Failure:\n",
147
+ "test_blah(TestBlah) [./blah.rb:25]:\n",
148
+ "Expected ['a', 'b', 'c'], not ['a', 'c', 'b'].\n"]
149
+
150
+ expected = [[" 1) Failure:\n", "test_blah(TestBlah) [./blah.rb:25]:\n"],
151
+ ["['a', 'b', 'c']"],
152
+ ["['a', 'c', 'b']"],
153
+ []]
154
+
155
+ assert_equal expected, @diff.parse_diff(input)
156
+ end
157
+
158
+ def test_parse_diff_miniunit_multiline
159
+ input = [" 1) Failure:\n",
160
+ "test_blah(TestBlah) [./blah.rb:25]:\n",
161
+ "Expected ['a',\n'b',\n'c'], not ['a',\n'c',\n'b'].\n"]
162
+
163
+ expected = [[" 1) Failure:\n", "test_blah(TestBlah) [./blah.rb:25]:\n"],
164
+ ["['a',\n'b',\n'c']"],
165
+ ["['a',\n'c',\n'b']"],
166
+ []]
167
+
168
+ assert_equal expected, @diff.parse_diff(input)
169
+ end
170
+ def test_parse_diff1
171
+ input = [" 1) Failure:\n",
172
+ "test_test1(TestBlah) [./blah.rb:25]:\n",
173
+ "<\"line1\\nline2\\nline3\\n\"> expected but was\n",
174
+ "<\"line4\\nline5\\nline6\\n\">.\n"
175
+ ]
176
+
177
+ expected = [[" 1) Failure:\n", "test_test1(TestBlah) [./blah.rb:25]:\n"], ["line1\\nline2\\nline3\\n"], ["line4\\nline5\\nline6\\n"], []]
178
+
179
+ assert_equal expected, @diff.parse_diff(input)
180
+ end
181
+
182
+ def test_parse_diff2
183
+ input = [" 2) Failure:\n",
184
+ "test_test2(TestBlah) [./blah.rb:29]:\n",
185
+ "<\"line1\"> expected but was\n",
186
+ "<\"line2\\nline3\\n\\n\">.\n"
187
+ ]
188
+
189
+ expected = [[" 2) Failure:\n",
190
+ "test_test2(TestBlah) [./blah.rb:29]:\n"],
191
+ ["line1"],
192
+ ["line2\\nline3\\n\\n"],
193
+ []
194
+ ]
195
+
196
+ assert_equal expected, @diff.parse_diff(input)
197
+ end
198
+
199
+ def test_parse_diff3
200
+ input = [" 13) Failure:\n",
201
+ "test_case_stmt(TestRubyToRubyC) [./r2ctestcase.rb:1198]:\n",
202
+ "Unknown expected data.\n",
203
+ "<false> is not true.\n"]
204
+
205
+ expected = [[" 13) Failure:\n", "test_case_stmt(TestRubyToRubyC) [./r2ctestcase.rb:1198]:\n", "Unknown expected data.\n"], ["<false> is not true.\n"], nil, []]
206
+
207
+ assert_equal expected, @diff.parse_diff(input)
208
+ end
209
+
210
+ def test_parse_diff_suspect_equals
211
+ input = ["1) Failure:\n",
212
+ "test_util_capture(AssertionsTest) [test/test_zentest_assertions.rb:53]:\n",
213
+ "<\"out\"> expected but was\n",
214
+ "<\"out\">.\n"]
215
+ expected = [["1) Failure:\n",
216
+ "test_util_capture(AssertionsTest) [test/test_zentest_assertions.rb:53]:\n"],
217
+ ["out"],
218
+ ["out"], []]
219
+
220
+ assert_equal expected, @diff.parse_diff(input)
221
+ end
222
+
223
+ def test_parse_diff_NOT_suspect_equals
224
+ input = ["1) Failure:\n",
225
+ "test_util_capture(AssertionsTest) [test/test_zentest_assertions.rb:53]:\n",
226
+ "<\"out\"> expected but was\n",
227
+ "<\"out\\n\">.\n"]
228
+ expected = [["1) Failure:\n",
229
+ "test_util_capture(AssertionsTest) [test/test_zentest_assertions.rb:53]:\n"],
230
+ ["out"],
231
+ ["out\\n"], []]
232
+
233
+ assert_equal expected, @diff.parse_diff(input)
234
+ end
235
+
236
+ def test_parse_diff_mspec
237
+ input = ["1)\n", "The unless expression should fail FAILED\n",
238
+ "Expected nil to equal \"baz\":\n",
239
+ " PositiveExpectation#== at spec/mspec.rb:217\n"]
240
+
241
+ expected = [["1)\n", "The unless expression should fail FAILED\n"],
242
+ ["nil"],
243
+ ["\"baz\""],
244
+ [" PositiveExpectation#== at spec/mspec.rb:217"]]
245
+
246
+ assert_equal expected, @diff.parse_diff(input)
247
+ end
248
+
249
+ def test_parse_diff_mspec_multiline
250
+ input = ["1)\n", "The unless expression should fail FAILED\n",
251
+ "Expected #<TestGenerator [[:push, :true],\n", " [:dup]\n", "]\n",
252
+ "to equal #<TestGenerator [[:pop],\n", " [:dup]\n", "]:\n",
253
+ " PositiveExpectation#== at spec/mspec.rb:217\n"]
254
+
255
+ expected = [["1)\n", "The unless expression should fail FAILED\n"],
256
+ ["#<TestGenerator [[:push, :true],\n", " [:dup]\n", "]"],
257
+ ["#<TestGenerator [[:pop],\n", " [:dup]\n", "]"],
258
+ [" PositiveExpectation#== at spec/mspec.rb:217"]]
259
+
260
+ assert_equal expected, @diff.parse_diff(input)
261
+ end
262
+
263
+ def test_unit_diff_angles
264
+ header = "Loaded suite ./blah\nStarted\nF\nFinished in 0.035332 seconds.\n\n"
265
+ input = "#{header} 1) Failure:\ntest_test1(TestBlah) [./blah.rb:25]:\n<\"<html>\"> expected but was\n<\"<body>\">.\n\n1 tests, 1 assertions, 1 failures, 0 errors\n"
266
+ expected = "1) Failure:\ntest_test1(TestBlah) [./blah.rb:25]:\n1c1\n< <html>\n---\n> <body>\n\n1 tests, 1 assertions, 1 failures, 0 errors"
267
+
268
+ util_unit_diff(header, input, expected)
269
+ end
270
+
271
+ def test_unit_diff1
272
+ header = "Loaded suite ./blah\nStarted\nF\nFinished in 0.035332 seconds.\n\n"
273
+ input = "#{header} 1) Failure:\ntest_test1(TestBlah) [./blah.rb:25]:\n<\"line1\\nline2\\nline3\\n\"> expected but was\n<\"line4\\nline5\\nline6\\n\">.\n\n1 tests, 1 assertions, 1 failures, 0 errors\n"
274
+ expected = "1) Failure:\ntest_test1(TestBlah) [./blah.rb:25]:\n1,3c1,3\n< line1\n< line2\n< line3\n---\n> line4\n> line5\n> line6\n\n1 tests, 1 assertions, 1 failures, 0 errors"
275
+
276
+ util_unit_diff(header, input, expected)
277
+ end
278
+
279
+ def test_unit_diff2
280
+ header = "Loaded suite ./blah\nStarted\nFF\nFinished in 0.035332 seconds.\n\n"
281
+ input = "#{header} 1) Failure:\ntest_test1(TestBlah) [./blah.rb:25]:\n<\"line1\\nline2\\nline3\\n\"> expected but was\n<\"line4\\nline5\\nline6\\n\">.\n\n 2) Failure:\ntest_test2(TestBlah) [./blah.rb:29]:\n<\"line1\"> expected but was\n<\"line2\\nline3\\n\\n\">.\n\n2 tests, 2 assertions, 2 failures, 0 errors\n"
282
+ expected = "1) Failure:\ntest_test1(TestBlah) [./blah.rb:25]:\n1,3c1,3\n< line1\n< line2\n< line3\n---\n> line4\n> line5\n> line6\n\n2) Failure:\ntest_test2(TestBlah) [./blah.rb:29]:\n1c1,4\n< line1\n---\n> line2\n> line3\n> \n> \n\n2 tests, 2 assertions, 2 failures, 0 errors"
283
+
284
+ util_unit_diff(header, input, expected)
285
+ end
286
+
287
+ def test_unit_diff3
288
+ header = ""
289
+ input = " 13) Failure:\ntest_case_stmt(TestRubyToRubyC) [./r2ctestcase.rb:1198]:\nUnknown expected data.\n<false> is not true.\n"
290
+ expected = "13) Failure:\ntest_case_stmt(TestRubyToRubyC) [./r2ctestcase.rb:1198]:\nUnknown expected data.\n<false> is not true."
291
+
292
+ util_unit_diff(header, input, expected)
293
+ end
294
+
295
+ def test_unit_diff_suspect_equals
296
+ header = "Loaded suite ./blah\nStarted\n.............................................F............................................\nFinished in 0.834671 seconds.\n\n"
297
+ footer = "90 tests, 241 assertions, 1 failures, 0 errors"
298
+ input = "#{header} 1) Failure:\ntest_unit_diff_suspect_equals(TestUnitDiff) [./test/test_unit_diff.rb:122]:\n<\"out\"> expected but was\n<\"out\">.\n\n#{footer}"
299
+ expected = "1) Failure:\ntest_unit_diff_suspect_equals(TestUnitDiff) [./test/test_unit_diff.rb:122]:\n[no difference--suspect ==]\n\n#{footer}"
300
+
301
+ util_unit_diff(header, input, expected)
302
+ end
303
+
304
+ def test_unit_diff_NOT_suspect_equals
305
+ header = "Loaded suite ./blah\nStarted\n.\nFinished in 0.0 seconds.\n\n"
306
+ input = "#{header} 1) Failure:\ntest_blah(TestBlah)\n<\"out\"> expected but was\n<\"out\\n\">.\n\n1 tests, 1 assertions, 1 failures, 0 errors"
307
+ expected = "1) Failure:\ntest_blah(TestBlah)\n1a2\n> \n\n1 tests, 1 assertions, 1 failures, 0 errors"
308
+
309
+ util_unit_diff(header, input, expected)
310
+ end
311
+
312
+ def util_unit_diff(header, input, expected, msg=:unit_diff)
313
+ output = StringIO.new("")
314
+ actual = @diff.send(msg, StringIO.new(input), output)
315
+ assert_equal header, output.string, "header output"
316
+ assert_equal expected, actual
317
+ end
318
+ end
319
+
@@ -0,0 +1,566 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ if defined? RUBY_ENGINE then
4
+ warn "rubinius does not support features required by zentest. Skipping tests"
5
+ return
6
+ end
7
+
8
+ require 'test/unit' unless defined? $ZENTEST and $ZENTEST
9
+
10
+ $TESTING = true
11
+
12
+ # I do this so I can still run ZenTest against the tests and itself...
13
+ require 'zentest' unless defined? $ZENTEST
14
+
15
+ class TrueClass # stupid YAML is breaking my tests. Enters via Test::Rails
16
+ remove_method :taguri, :taguri=, :to_yaml rescue nil
17
+ end
18
+
19
+ # These are just classes set up for quick testing.
20
+ # TODO: need to test a compound class name Mod::Cls
21
+
22
+ class Cls1 # ZenTest SKIP
23
+ def meth1; end
24
+ def self.meth2; end
25
+ end
26
+
27
+ class TestCls1 # ZenTest SKIP
28
+ def setup; end
29
+ def teardown; end
30
+ def test_meth1; end
31
+ def test_meth2; assert(true, "something"); end
32
+ end
33
+
34
+ class SuperDuper # ZenTest SKIP
35
+ def self.cls_inherited; end
36
+ def inherited; end
37
+ def overridden; end
38
+ end
39
+
40
+ class LowlyOne < SuperDuper # ZenTest SKIP
41
+ def self.cls_extended; end
42
+ def overridden; end
43
+ def extended; end
44
+ def pretty_print; end
45
+ def pretty_print_cycle; end
46
+ end
47
+
48
+ # This is the good case where there are no missing methods on either side.
49
+
50
+ class Blah0
51
+ def missingtest; end
52
+ def notmissing1; end
53
+ def notmissing2; end
54
+
55
+ # found by zentest on testcase1.rb
56
+ def missingimpl; end
57
+ end
58
+
59
+ class TestBlah0
60
+ def setup; end
61
+ def teardown; end
62
+
63
+ def test_notmissing1
64
+ assert(true, "a test")
65
+ end
66
+ def test_notmissing2_ext1
67
+ assert(true, "a test")
68
+ end
69
+ def test_notmissing2_ext2
70
+ flunk("a failed test")
71
+ end
72
+ def test_missingimpl; end
73
+ def test_missingtest; end
74
+ end
75
+
76
+ class Blah1
77
+ def missingtest; end
78
+ def notmissing1; end
79
+ def notmissing2; end
80
+ end
81
+
82
+ class TestBlah1
83
+ def test_notmissing1; end
84
+ def test_notmissing2_ext1; end
85
+ def test_notmissing2_ext2; end
86
+ def test_missingimpl; Blah1.new.missingimpl; end
87
+ def test_integration_blah1; end
88
+ def test_integration_blah2; end
89
+ def test_integration_blah3; end
90
+ end
91
+
92
+ module Something2
93
+ class Blah2
94
+ def missingtest; end
95
+ def notmissing1; end
96
+ def notmissing2; end
97
+ end
98
+ end
99
+
100
+ module TestSomething2
101
+ class TestBlah2
102
+ def test_notmissing1; end
103
+ def test_notmissing2_ext1; end
104
+ def test_notmissing2_ext2; end
105
+ def test_missingimpl; end
106
+ end
107
+ end
108
+
109
+ # only test classes
110
+ class TestBlah3
111
+ def test_missingimpl; end
112
+ end
113
+ # only regular classes
114
+ class Blah4
115
+ def missingtest1; end
116
+ def missingtest2; end
117
+ end
118
+
119
+ # subclassing a builtin class
120
+ class MyHash5 < Hash
121
+ def []; end
122
+ def missingtest1; end
123
+ end
124
+
125
+ # nested class
126
+ module MyModule6
127
+ class MyClass6
128
+ def []; end
129
+ def missingtest1; end
130
+ end
131
+ end
132
+
133
+ # nested class
134
+ module MyModule7; end # in 1.9+ you'll not need this
135
+ class MyModule7::MyClass7
136
+ def []; end
137
+ def missingtest1; end
138
+ end
139
+
140
+ class MyClass8
141
+ def self.foobar; end
142
+ def MyClass8.foobaz; end
143
+ end
144
+
145
+ class TestTrueClass; end
146
+
147
+ class TestZenTest < Test::Unit::TestCase
148
+
149
+ def setup
150
+ @tester = ZenTest.new()
151
+ end
152
+
153
+ ############################################################
154
+ # Utility Methods
155
+
156
+ def util_simple_setup
157
+ @tester.klasses = {
158
+ "Something" =>
159
+ {
160
+ "method1" => true,
161
+ "method1!" => true,
162
+ "method1=" => true,
163
+ "method1?" => true,
164
+ "attrib" => true,
165
+ "attrib=" => true,
166
+ "equal?" => true,
167
+ "self.method3" => true,
168
+ "self.[]" => true,
169
+ },
170
+ }
171
+ @tester.test_klasses = {
172
+ "TestSomething" =>
173
+ {
174
+ "test_class_method4" => true,
175
+ "test_method2" => true,
176
+ "setup" => true,
177
+ "teardown" => true,
178
+ "test_class_index" => true,
179
+ },
180
+ }
181
+ @tester.inherited_methods = @tester.test_klasses.merge(@tester.klasses)
182
+ @generated_code = "
183
+ require 'test/unit' unless defined? $ZENTEST and $ZENTEST
184
+
185
+ class Something
186
+ def self.method4(*args)
187
+ raise NotImplementedError, 'Need to write self.method4'
188
+ end
189
+
190
+ def method2(*args)
191
+ raise NotImplementedError, 'Need to write method2'
192
+ end
193
+ end
194
+
195
+ class TestSomething < Test::Unit::TestCase
196
+ def test_class_method3
197
+ raise NotImplementedError, 'Need to write test_class_method3'
198
+ end
199
+
200
+ def test_attrib
201
+ raise NotImplementedError, 'Need to write test_attrib'
202
+ end
203
+
204
+ def test_attrib_equals
205
+ raise NotImplementedError, 'Need to write test_attrib_equals'
206
+ end
207
+
208
+ def test_equal_eh
209
+ raise NotImplementedError, 'Need to write test_equal_eh'
210
+ end
211
+
212
+ def test_method1
213
+ raise NotImplementedError, 'Need to write test_method1'
214
+ end
215
+
216
+ def test_method1_bang
217
+ raise NotImplementedError, 'Need to write test_method1_bang'
218
+ end
219
+
220
+ def test_method1_eh
221
+ raise NotImplementedError, 'Need to write test_method1_eh'
222
+ end
223
+
224
+ def test_method1_equals
225
+ raise NotImplementedError, 'Need to write test_method1_equals'
226
+ end
227
+ end
228
+
229
+ # Number of errors detected: 10
230
+ "
231
+ end
232
+
233
+ ############################################################
234
+ # Accessors & Adders:
235
+
236
+ def test_initialize
237
+ refute_nil(@tester, "Tester must be initialized")
238
+ # TODO: should do more at this stage
239
+ end
240
+
241
+ ############################################################
242
+ # Converters and Testers:
243
+
244
+ def test_is_test_class
245
+ # classes
246
+ assert(@tester.is_test_class(TestCls1),
247
+ "All test classes must start with Test")
248
+ assert(!@tester.is_test_class(Cls1),
249
+ "Classes not starting with Test must not be test classes")
250
+ # strings
251
+ assert(@tester.is_test_class("TestCls1"),
252
+ "All test classes must start with Test")
253
+ assert(@tester.is_test_class("TestMod::TestCls1"),
254
+ "All test modules must start with test as well")
255
+ assert(!@tester.is_test_class("Cls1"),
256
+ "Classes not starting with Test must not be test classes")
257
+ assert(!@tester.is_test_class("NotTestMod::TestCls1"),
258
+ "Modules not starting with Test must not be test classes")
259
+ assert(!@tester.is_test_class("NotTestMod::NotTestCls1"),
260
+ "All names must start with Test to be test classes")
261
+ end
262
+
263
+ def test_is_test_class_reversed
264
+ old = $r
265
+ $r = true
266
+ assert(@tester.is_test_class("Cls1Test"),
267
+ "Reversed: All test classes must end with Test")
268
+ assert(@tester.is_test_class("ModTest::Cls1Test"),
269
+ "Reversed: All test classes must end with Test")
270
+ assert(!@tester.is_test_class("TestMod::TestCls1"),
271
+ "Reversed: All test classes must end with Test")
272
+ $r = old
273
+ end
274
+
275
+ def test_convert_class_name
276
+
277
+ assert_equal('Cls1', @tester.convert_class_name(TestCls1))
278
+ assert_equal('TestCls1', @tester.convert_class_name(Cls1))
279
+
280
+ assert_equal('Cls1', @tester.convert_class_name('TestCls1'))
281
+ assert_equal('TestCls1', @tester.convert_class_name('Cls1'))
282
+
283
+ assert_equal('TestModule::TestCls1',
284
+ @tester.convert_class_name('Module::Cls1'))
285
+ assert_equal('Module::Cls1',
286
+ @tester.convert_class_name('TestModule::TestCls1'))
287
+ end
288
+
289
+ def test_convert_class_name_reversed
290
+ old = $r
291
+ $r = true
292
+
293
+ assert_equal('Cls1', @tester.convert_class_name("Cls1Test"))
294
+ assert_equal('Cls1Test', @tester.convert_class_name(Cls1))
295
+
296
+ assert_equal('Cls1', @tester.convert_class_name('Cls1Test'))
297
+ assert_equal('Cls1Test', @tester.convert_class_name('Cls1'))
298
+
299
+ assert_equal('ModuleTest::Cls1Test',
300
+ @tester.convert_class_name('Module::Cls1'))
301
+ assert_equal('Module::Cls1',
302
+ @tester.convert_class_name('ModuleTest::Cls1Test'))
303
+ $r = old
304
+ end
305
+
306
+ ############################################################
307
+ # Missing Classes and Methods:
308
+
309
+ def test_missing_methods_empty
310
+ missing = @tester.missing_methods
311
+ assert_equal({}, missing)
312
+ end
313
+
314
+ def test_add_missing_method_normal
315
+ @tester.add_missing_method("SomeClass", "some_method")
316
+ missing = @tester.missing_methods
317
+ assert_equal({"SomeClass" => { "some_method" => true } }, missing)
318
+ end
319
+
320
+ def test_add_missing_method_duplicates
321
+ @tester.add_missing_method("SomeClass", "some_method")
322
+ @tester.add_missing_method("SomeClass", "some_method")
323
+ @tester.add_missing_method("SomeClass", "some_method")
324
+ missing = @tester.missing_methods
325
+ assert_equal({"SomeClass" => { "some_method" => true } }, missing)
326
+ end
327
+
328
+ def test_analyze_simple
329
+ self.util_simple_setup
330
+
331
+ @tester.analyze
332
+ missing = @tester.missing_methods
333
+ expected = {
334
+ "Something" => {
335
+ "method2" => true,
336
+ "self.method4" => true,
337
+ },
338
+ "TestSomething" => {
339
+ "test_class_method3" => true,
340
+ "test_attrib" => true,
341
+ "test_attrib_equals" => true,
342
+ "test_equal_eh" => true,
343
+ "test_method1" => true,
344
+ "test_method1_eh"=>true,
345
+ "test_method1_bang"=>true,
346
+ "test_method1_equals"=>true,
347
+ }
348
+ }
349
+ assert_equal(expected, missing)
350
+ end
351
+
352
+ def test_create_method
353
+ list = @tester.create_method(" ", 1, "wobble")
354
+ assert_equal([" def wobble(*args)",
355
+ " raise NotImplementedError, 'Need to write wobble'",
356
+ " end"],list)
357
+ end
358
+
359
+ def test_methods_and_tests
360
+ @tester.process_class("ZenTest")
361
+ @tester.process_class("TestZenTest")
362
+ m,t = @tester.methods_and_tests("ZenTest", "TestZenTest")
363
+ assert(m.include?("methods_and_tests"))
364
+ assert(t.include?("test_methods_and_tests"))
365
+ end
366
+
367
+ def test_generate_code_simple
368
+ self.util_simple_setup
369
+
370
+ @tester.analyze
371
+ str = @tester.generate_code[1..-1].join("\n")
372
+ exp = @generated_code
373
+
374
+ assert_equal(exp, str)
375
+ end
376
+
377
+ def test_get_class_good
378
+ assert_equal(Object, @tester.get_class("Object"))
379
+ end
380
+
381
+ def test_get_class_bad
382
+ assert_nil(@tester.get_class("ZZZObject"))
383
+ end
384
+
385
+ def test_get_inherited_methods_for_subclass
386
+ expect = { "inherited" => true, "overridden" => true }
387
+ result = @tester.get_inherited_methods_for("LowlyOne", false)
388
+
389
+ assert_equal(expect, result)
390
+ end
391
+
392
+ def test_get_inherited_methods_for_subclass_full
393
+ expect = Object.instance_methods + %w( inherited overridden )
394
+ expect.map! { |m| m.to_s }
395
+ result = @tester.get_inherited_methods_for("LowlyOne", true)
396
+
397
+ assert_equal(expect.sort, result.keys.sort)
398
+ end
399
+
400
+ def test_get_inherited_methods_for_superclass
401
+ expect = { }
402
+ result = @tester.get_inherited_methods_for("SuperDuper", false)
403
+
404
+ assert_equal(expect.keys.sort, result.keys.sort)
405
+ end
406
+
407
+ def test_get_inherited_methods_for_superclass_full
408
+ expect = Object.instance_methods.map { |m| m.to_s }
409
+ result = @tester.get_inherited_methods_for("SuperDuper", true)
410
+
411
+ assert_equal(expect.sort, result.keys.sort)
412
+ end
413
+
414
+ def test_get_methods_for_subclass
415
+ expect = {
416
+ "self.cls_extended" => true,
417
+ "overridden" => true,
418
+ "extended" => true
419
+ }
420
+ result = @tester.get_methods_for("LowlyOne")
421
+
422
+ assert_equal(expect, result)
423
+ end
424
+
425
+ def test_get_methods_for_subclass_full
426
+ expect = {
427
+ "self.cls_inherited" => true,
428
+ "self.cls_extended" => true,
429
+ "overridden" => true,
430
+ "extended" => true
431
+ }
432
+ result = @tester.get_methods_for("LowlyOne", true)
433
+
434
+ assert_equal(expect, result)
435
+ end
436
+
437
+ def test_get_methods_for_superclass
438
+ expect = {
439
+ "self.cls_inherited" => true,
440
+ "overridden" => true,
441
+ "inherited" => true }
442
+ result = @tester.get_methods_for("SuperDuper")
443
+
444
+ assert_equal(expect, result)
445
+ end
446
+
447
+ def test_result
448
+ self.util_simple_setup
449
+
450
+ @tester.analyze
451
+ @tester.generate_code
452
+ str = @tester.result.split($/, 2).last
453
+ exp = @generated_code
454
+
455
+ assert_equal(exp, str)
456
+ end
457
+
458
+ def test_load_file
459
+ # HACK raise NotImplementedError, 'Need to write test_load_file'
460
+ end
461
+
462
+ def test_scan_files
463
+ # HACK raise NotImplementedError, 'Need to write test_scan_files'
464
+ end
465
+
466
+ def test_process_class
467
+ assert_equal({}, @tester.klasses)
468
+ assert_equal({}, @tester.test_klasses)
469
+ assert_equal({}, @tester.inherited_methods["SuperDuper"])
470
+ @tester.process_class("SuperDuper")
471
+ assert_equal({"SuperDuper"=> {
472
+ "self.cls_inherited"=>true,
473
+ "inherited"=>true,
474
+ "overridden"=>true}},
475
+ @tester.klasses)
476
+ assert_equal({}, @tester.test_klasses)
477
+ assert_equal({}, @tester.inherited_methods["SuperDuper"])
478
+ end
479
+
480
+ def test_klasses_equals
481
+ self.util_simple_setup
482
+ assert_equal({"Something"=> {
483
+ "self.method3"=>true,
484
+ "equal?"=>true,
485
+ "attrib="=>true,
486
+ "self.[]"=>true,
487
+ "method1"=>true,
488
+ "method1="=>true,
489
+ "method1?"=>true,
490
+ "method1!"=>true,
491
+ "method1"=>true,
492
+ "attrib"=>true}}, @tester.klasses)
493
+ @tester.klasses= {"whoopie" => {}}
494
+ assert_equal({"whoopie"=> {}}, @tester.klasses)
495
+ end
496
+
497
+ # REFACTOR: this should probably be cleaned up and on ZenTest side
498
+ def util_testcase(*klasses)
499
+ zentest = ZenTest.new
500
+ klasses.each do |klass|
501
+ zentest.process_class(klass)
502
+ end
503
+ zentest.analyze
504
+ zentest.generate_code
505
+ return zentest.result.split("\n")[1..-1].join("\n")
506
+ end
507
+
508
+ def test_testcase0
509
+ expected = '# Number of errors detected: 0'
510
+ assert_equal expected, util_testcase("Blah0", "TestBlah0")
511
+ end
512
+
513
+ def test_testcase1
514
+ expected = "\nrequire 'test/unit' unless defined? $ZENTEST and $ZENTEST\n\nclass Blah1\n def missingimpl(*args)\n raise NotImplementedError, 'Need to write missingimpl'\n end\nend\n\nclass TestBlah1 < Test::Unit::TestCase\n def test_missingtest\n raise NotImplementedError, 'Need to write test_missingtest'\n end\nend\n\n# Number of errors detected: 2"
515
+
516
+ assert_equal expected, util_testcase("Blah1", "TestBlah1")
517
+ end
518
+
519
+ def test_testcase2
520
+ expected = "\nrequire 'test/unit' unless defined? $ZENTEST and $ZENTEST\n\nmodule Something2\n class Blah2\n def missingimpl(*args)\n raise NotImplementedError, 'Need to write missingimpl'\n end\n end\nend\n\nmodule TestSomething2\n class TestBlah2 < Test::Unit::TestCase\n def test_missingtest\n raise NotImplementedError, 'Need to write test_missingtest'\n end\n end\nend\n\n# Number of errors detected: 2"
521
+
522
+ assert_equal expected, util_testcase("Something2::Blah2", "TestSomething2::TestBlah2")
523
+ end
524
+
525
+ def test_testcase3
526
+ expected = "\nrequire 'test/unit' unless defined? $ZENTEST and $ZENTEST\n\nclass Blah3\n def missingimpl(*args)\n raise NotImplementedError, 'Need to write missingimpl'\n end\nend\n\n# Number of errors detected: 1"
527
+
528
+ assert_equal expected, util_testcase("TestBlah3")
529
+ end
530
+
531
+ def test_testcase4
532
+ expected = "\nrequire 'test/unit' unless defined? $ZENTEST and $ZENTEST\n\nclass TestBlah4 < Test::Unit::TestCase\n def test_missingtest1\n raise NotImplementedError, 'Need to write test_missingtest1'\n end\n\n def test_missingtest2\n raise NotImplementedError, 'Need to write test_missingtest2'\n end\nend\n\n# Number of errors detected: 3"
533
+
534
+ assert_equal expected, util_testcase("Blah4")
535
+ end
536
+
537
+ def test_testcase5
538
+ expected = "\nrequire 'test/unit' unless defined? $ZENTEST and $ZENTEST\n\nclass TestMyHash5 < Test::Unit::TestCase\n def test_index\n raise NotImplementedError, 'Need to write test_index'\n end\n\n def test_missingtest1\n raise NotImplementedError, 'Need to write test_missingtest1'\n end\nend\n\n# Number of errors detected: 3"
539
+
540
+ assert_equal expected, util_testcase("MyHash5")
541
+ end
542
+
543
+ def test_testcase6
544
+ expected = "\nrequire 'test/unit' unless defined? $ZENTEST and $ZENTEST\n\nmodule TestMyModule6\n class TestMyClass6 < Test::Unit::TestCase\n def test_index\n raise NotImplementedError, 'Need to write test_index'\n end\n\n def test_missingtest1\n raise NotImplementedError, 'Need to write test_missingtest1'\n end\n end\nend\n\n# Number of errors detected: 3"
545
+
546
+ assert_equal expected, util_testcase("MyModule6::MyClass6")
547
+ end
548
+
549
+ def test_testcase7
550
+ expected = "\nrequire 'test/unit' unless defined? $ZENTEST and $ZENTEST\n\nmodule TestMyModule7\n class TestMyClass7 < Test::Unit::TestCase\n def test_index\n raise NotImplementedError, 'Need to write test_index'\n end\n\n def test_missingtest1\n raise NotImplementedError, 'Need to write test_missingtest1'\n end\n end\nend\n\n# Number of errors detected: 3"
551
+
552
+ assert_equal expected, util_testcase("MyModule7::MyClass7")
553
+ end
554
+
555
+ def test_testcase8
556
+ expected = "\nrequire 'test/unit' unless defined? $ZENTEST and $ZENTEST\n\nclass TestMyClass8 < Test::Unit::TestCase\n def test_class_foobar\n raise NotImplementedError, 'Need to write test_class_foobar'\n end\n\n def test_class_foobaz\n raise NotImplementedError, 'Need to write test_class_foobaz'\n end\nend\n\n# Number of errors detected: 3"
557
+
558
+ assert_equal expected, util_testcase("MyClass8")
559
+ end
560
+
561
+ def test_testcase9
562
+ expected = "\nrequire 'test/unit' unless defined? $ZENTEST and $ZENTEST\n\nclass TestTrueClass < Test::Unit::TestCase\n def test_and\n raise NotImplementedError, 'Need to write test_and'\n end\n\n def test_carat\n raise NotImplementedError, 'Need to write test_carat'\n end\n\n def test_or\n raise NotImplementedError, 'Need to write test_or'\n end\n\n def test_to_s\n raise NotImplementedError, 'Need to write test_to_s'\n end\nend\n\n# Number of errors detected: 4"
563
+
564
+ assert_equal expected, util_testcase("TestTrueClass")
565
+ end
566
+ end