ZenTest 3.0.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.
- data/History.txt +104 -0
- data/LinuxJournalArticle.txt +393 -0
- data/Manifest.txt +27 -0
- data/README.txt +123 -0
- data/Rakefile +98 -0
- data/bin/ZenTest +28 -0
- data/bin/autotest +12 -0
- data/bin/unit_diff +40 -0
- data/example.txt +41 -0
- data/example1.rb +7 -0
- data/example2.rb +15 -0
- data/lib/ZenTest.rb +536 -0
- data/lib/autotest.rb +202 -0
- data/lib/rails_autotest.rb +57 -0
- data/lib/unit_diff.rb +200 -0
- data/test/data/normal/lib/photo.rb +0 -0
- data/test/data/normal/test/test_camelcase.rb +0 -0
- data/test/data/normal/test/test_photo.rb +0 -0
- data/test/data/normal/test/test_route.rb +0 -0
- data/test/data/normal/test/test_user.rb +0 -0
- data/test/data/rails/test/fixtures/routes.yml +0 -0
- data/test/data/rails/test/functional/route_controller_test.rb +0 -0
- data/test/data/rails/test/unit/route_test.rb +0 -0
- data/test/test_autotest.rb +179 -0
- data/test/test_rails_autotest.rb +55 -0
- data/test/test_unit_diff.rb +95 -0
- data/test/test_zentest.rb +670 -0
- metadata +103 -0
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,179 @@
|
|
1
|
+
$TESTING = true
|
2
|
+
|
3
|
+
require 'stringio'
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
require 'autotest'
|
7
|
+
|
8
|
+
class Autotest
|
9
|
+
|
10
|
+
attr_accessor :system_responses
|
11
|
+
attr_reader :files
|
12
|
+
|
13
|
+
def system(cmd)
|
14
|
+
@system_responses ||= []
|
15
|
+
raise 'Out of system responses' if @system_responses.empty?
|
16
|
+
return @system_responses.shift
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_accessor :backtick_responses
|
20
|
+
|
21
|
+
def `(cmd) # ` appeases emacs
|
22
|
+
@backtick_responses ||= []
|
23
|
+
raise 'Out of backtick responses' if @backtick_responses.empty?
|
24
|
+
return @backtick_responses.shift
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
class TestAutotest < Test::Unit::TestCase
|
30
|
+
|
31
|
+
def setup
|
32
|
+
@photo_file = 'test/data/normal/lib/photo.rb'
|
33
|
+
@photo_test_file = 'test/data/normal/test/test_photo.rb'
|
34
|
+
@route_test_file = 'test/data/normal/test/test_route.rb'
|
35
|
+
@user_test_file = 'test/data/normal/test/test_user.rb'
|
36
|
+
@camelcase_test_file = 'test/data/normal/test/test_camelcase.rb'
|
37
|
+
|
38
|
+
util_touch @photo_file, (Time.now - 60)
|
39
|
+
util_touch @photo_test_file, (Time.now - 60)
|
40
|
+
util_touch @camelcase_test_file, (Time.now - 60)
|
41
|
+
|
42
|
+
@at = Autotest.new
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_failed_test_files_not_updated
|
46
|
+
klass = 'TestPhoto'
|
47
|
+
tests = [@user_test_file, @photo_test_file]
|
48
|
+
|
49
|
+
@at.updated? @photo_test_file
|
50
|
+
|
51
|
+
failed_files = @at.failed_test_files klass, tests
|
52
|
+
|
53
|
+
assert_equal [], failed_files
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_failed_test_files_updated
|
57
|
+
klass = 'TestPhoto'
|
58
|
+
tests = [@user_test_file, @photo_test_file]
|
59
|
+
|
60
|
+
@at.updated? @photo_test_file
|
61
|
+
util_touch @photo_test_file
|
62
|
+
|
63
|
+
failed_files = @at.failed_test_files klass, tests
|
64
|
+
|
65
|
+
assert_equal [@photo_test_file], failed_files
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_failed_test_files_updated_camelcase
|
69
|
+
klass = 'TestCamelCase'
|
70
|
+
tests = [@camelcase_test_file]
|
71
|
+
|
72
|
+
@at.updated? @camelcase_test_file
|
73
|
+
util_touch @camelcase_test_file
|
74
|
+
|
75
|
+
failed_files = @at.failed_test_files klass, tests
|
76
|
+
|
77
|
+
assert_equal [@camelcase_test_file], failed_files
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_failed_test_files_updated_implementation
|
81
|
+
klass = 'TestPhoto'
|
82
|
+
tests = [@user_test_file, @photo_test_file]
|
83
|
+
|
84
|
+
@at.updated? @photo_file
|
85
|
+
util_touch @photo_file
|
86
|
+
|
87
|
+
failed_files = @at.failed_test_files klass, tests
|
88
|
+
|
89
|
+
assert_equal [@photo_test_file], failed_files
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_map_file_names
|
93
|
+
@at.files['test/test_autotest.rb'] = Time.at 1
|
94
|
+
@at.files['lib/autotest.rb'] = Time.at 1
|
95
|
+
|
96
|
+
file_names = [
|
97
|
+
'lib/autotest.rb',
|
98
|
+
'lib/auto_test.rb',
|
99
|
+
'test/test_autotest.rb',
|
100
|
+
]
|
101
|
+
|
102
|
+
expected = [
|
103
|
+
[['test/test_autotest.rb']],
|
104
|
+
[['test/test_autotest.rb']],
|
105
|
+
[['test/test_autotest.rb']],
|
106
|
+
]
|
107
|
+
|
108
|
+
file_names.each_with_index do |name, i|
|
109
|
+
assert_equal expected[i], @at.map_file_names([name]), "test #{i}, #{name}"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_retest_failed_modified
|
114
|
+
failed = [['test_route', 'TestPhoto']]
|
115
|
+
tests = [@photo_test_file]
|
116
|
+
|
117
|
+
@at.system_responses = [true]
|
118
|
+
|
119
|
+
util_touch @photo_test_file
|
120
|
+
|
121
|
+
out, err = util_capture do
|
122
|
+
@at.retest_failed failed, tests
|
123
|
+
end
|
124
|
+
|
125
|
+
out = out.split $/
|
126
|
+
|
127
|
+
assert_equal "# Rerunning failures: #{@photo_test_file}", out.shift
|
128
|
+
assert_equal "+ ruby -Ilib:test -S testrb -n test_route #{@photo_test_file}", out.shift
|
129
|
+
|
130
|
+
assert_equal true, @at.system_responses.empty?
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_updated_eh
|
134
|
+
assert_equal true, @at.updated?(@photo_test_file), 'Not in @files'
|
135
|
+
assert_equal false, @at.updated?(@photo_test_file), 'In @files'
|
136
|
+
@at.files[@photo_test_file] = Time.at 1
|
137
|
+
util_touch @photo_test_file
|
138
|
+
assert_equal true, @at.updated?(@photo_test_file), 'Touched'
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_updated_files
|
142
|
+
Dir.chdir 'test/data/normal' do
|
143
|
+
@at.updated_files
|
144
|
+
end
|
145
|
+
|
146
|
+
expected = {
|
147
|
+
'lib/photo.rb' => File.stat(@photo_file).mtime,
|
148
|
+
'test/test_photo.rb' => File.stat(@photo_test_file).mtime,
|
149
|
+
'test/test_route.rb' => File.stat(@route_test_file).mtime,
|
150
|
+
'test/test_user.rb' => File.stat(@user_test_file).mtime,
|
151
|
+
'test/test_camelcase.rb' => File.stat(@camelcase_test_file).mtime,
|
152
|
+
}
|
153
|
+
|
154
|
+
assert_equal expected, @at.files
|
155
|
+
|
156
|
+
util_touch @photo_test_file
|
157
|
+
|
158
|
+
assert_not_equal expected['test_photo.rb'], @at.files
|
159
|
+
end
|
160
|
+
|
161
|
+
def util_capture
|
162
|
+
old_stdout = $stdout
|
163
|
+
old_stderr = $stderr
|
164
|
+
out = StringIO.new
|
165
|
+
err = StringIO.new
|
166
|
+
$stdout = out
|
167
|
+
$stderr = err
|
168
|
+
yield
|
169
|
+
return out.string, err.string
|
170
|
+
ensure
|
171
|
+
$stdout = old_stdout
|
172
|
+
$stderr = old_stderr
|
173
|
+
end
|
174
|
+
|
175
|
+
def util_touch(file, t = Time.now)
|
176
|
+
File.utime(t, t, file)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'test_autotest'
|
2
|
+
require 'rails_autotest'
|
3
|
+
|
4
|
+
class TestRailsAutotest < TestAutotest
|
5
|
+
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
@at = RailsAutotest.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_map_file_names
|
12
|
+
file_names = [
|
13
|
+
'./app/helpers/application_helper.rb',
|
14
|
+
'./test/fixtures/routes.yml',
|
15
|
+
'./test/unit/photo_test.rb',
|
16
|
+
'./app/models/photo.rb',
|
17
|
+
'./app/controllers/application.rb',
|
18
|
+
'./app/controllers/route_controller.rb',
|
19
|
+
'./app/views/layouts/default.rhtml',
|
20
|
+
'./app/views/route/index.rhtml',
|
21
|
+
'./app/helpers/route_helper.rb',
|
22
|
+
]
|
23
|
+
|
24
|
+
expected = [
|
25
|
+
# ApplicationHelper
|
26
|
+
[[], ['test/functional/route_controller_test.rb']],
|
27
|
+
# fixture
|
28
|
+
[['test/unit/route_test.rb'],
|
29
|
+
['test/functional/route_controller_test.rb']],
|
30
|
+
# test
|
31
|
+
[['test/unit/photo_test.rb'], []],
|
32
|
+
# model
|
33
|
+
[['test/unit/photo_test.rb'], []],
|
34
|
+
# ApplicationController
|
35
|
+
[[], ['test/functional/dummy_controller_test.rb']],
|
36
|
+
# controller
|
37
|
+
[[], ['test/functional/route_controller_test.rb']],
|
38
|
+
# layout
|
39
|
+
[[], []],
|
40
|
+
# view
|
41
|
+
[[], ['test/functional/route_controller_test.rb']],
|
42
|
+
# helper
|
43
|
+
[[], ['test/functional/route_controller_test.rb']],
|
44
|
+
]
|
45
|
+
|
46
|
+
Dir.chdir 'test/data/rails' do
|
47
|
+
file_names.each_with_index do |name, i|
|
48
|
+
assert_equal expected[i], @at.map_file_names([name]),
|
49
|
+
"test #{i}, #{name}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
@@ -0,0 +1,95 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
$TESTING = true
|
6
|
+
|
7
|
+
require 'unit_diff'
|
8
|
+
|
9
|
+
class TestUnitDiff < Test::Unit::TestCase
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@diff = UnitDiff.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_input
|
16
|
+
input = "Loaded suite ./blah\nStarted\nFF\nFinished in 0.035332 seconds.\n\n 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"
|
17
|
+
|
18
|
+
# TODO: I think I'd like a separate footer array as well
|
19
|
+
expected = [
|
20
|
+
["Loaded suite ./blah\n", "Started\n", "FF\n", "Finished in 0.035332 seconds.\n"],
|
21
|
+
[
|
22
|
+
[" 1) Failure:\n", "test_test1(TestBlah) [./blah.rb:25]:\n", "<\"line1\\nline2\\nline3\\n\"> expected but was\n", "<\"line4\\nline5\\nline6\\n\">.\n"],
|
23
|
+
[" 2) Failure:\n", "test_test2(TestBlah) [./blah.rb:29]:\n", "<\"line1\"> expected but was\n", "<\"line2\\nline3\\n\\n\">.\n"],
|
24
|
+
],
|
25
|
+
["\n", "2 tests, 2 assertions, 2 failures, 0 errors\n"]
|
26
|
+
]
|
27
|
+
|
28
|
+
assert_equal expected, @diff.input(input)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_parse_diff1
|
32
|
+
input = [" 1) Failure:\n",
|
33
|
+
"test_test1(TestBlah) [./blah.rb:25]:\n",
|
34
|
+
"<\"line1\\nline2\\nline3\\n\"> expected but was\n",
|
35
|
+
"<\"line4\\nline5\\nline6\\n\">.\n"
|
36
|
+
]
|
37
|
+
|
38
|
+
expected = [[" 1) Failure:\n", "test_test1(TestBlah) [./blah.rb:25]:\n"], ["line1\\nline2\\nline3\\n"], ["line4\\nline5\\nline6\\n"]]
|
39
|
+
|
40
|
+
assert_equal expected, @diff.parse_diff(input)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_parse_diff2
|
44
|
+
input = [" 2) Failure:\n",
|
45
|
+
"test_test2(TestBlah) [./blah.rb:29]:\n",
|
46
|
+
"<\"line1\"> expected but was\n",
|
47
|
+
"<\"line2\\nline3\\n\\n\">.\n"
|
48
|
+
]
|
49
|
+
|
50
|
+
expected = [[" 2) Failure:\n",
|
51
|
+
"test_test2(TestBlah) [./blah.rb:29]:\n"],
|
52
|
+
["line1"],
|
53
|
+
["line2\\nline3\\n\\n"]
|
54
|
+
]
|
55
|
+
|
56
|
+
assert_equal expected, @diff.parse_diff(input)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_parse_diff3
|
60
|
+
input = [" 13) Failure:\n",
|
61
|
+
"test_case_stmt(TestRubyToRubyC) [./r2ctestcase.rb:1198]:\n",
|
62
|
+
"Unknown expected data.\n",
|
63
|
+
"<false> is not true.\n"]
|
64
|
+
|
65
|
+
expected = [[" 13) Failure:\n", "test_case_stmt(TestRubyToRubyC) [./r2ctestcase.rb:1198]:\n", "Unknown expected data.\n"], ["<false> is not true.\n"], nil]
|
66
|
+
|
67
|
+
assert_equal expected, @diff.parse_diff(input)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_unit_diff1
|
71
|
+
input = "Loaded suite ./blah\nStarted\nF\nFinished in 0.035332 seconds.\n\n 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"
|
72
|
+
|
73
|
+
expected = "Loaded suite ./blah\nStarted\nF\nFinished in 0.035332 seconds.\n\n1) 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"
|
74
|
+
|
75
|
+
assert_equal expected, @diff.unit_diff(input)
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_unit_diff2
|
79
|
+
input = "Loaded suite ./blah\nStarted\nFF\nFinished in 0.035332 seconds.\n\n 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"
|
80
|
+
|
81
|
+
expected = "Loaded suite ./blah\nStarted\nFF\nFinished in 0.035332 seconds.\n\n1) 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,3\n< line1\n---\n> line2\n> line3\n>\n\n2 tests, 2 assertions, 2 failures, 0 errors"
|
82
|
+
|
83
|
+
assert_equal expected, @diff.unit_diff(input)
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_unit_diff3
|
87
|
+
input = " 13) Failure:\ntest_case_stmt(TestRubyToRubyC) [./r2ctestcase.rb:1198]:\nUnknown expected data.\n<false> is not true.\n"
|
88
|
+
|
89
|
+
expected = "13) Failure:\ntest_case_stmt(TestRubyToRubyC) [./r2ctestcase.rb:1198]:\nUnknown expected data.\n<false> is not true."
|
90
|
+
|
91
|
+
assert_equal expected, @diff.unit_diff(input)
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
@@ -0,0 +1,670 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
|
3
|
+
require 'test/unit' unless defined? $ZENTEST and $ZENTEST
|
4
|
+
|
5
|
+
$TESTING = true
|
6
|
+
|
7
|
+
# I do this so I can still run ZenTest against the tests and itself...
|
8
|
+
#if __FILE__ == $0 then
|
9
|
+
puts "Requiring ZenTest"
|
10
|
+
require 'ZenTest'
|
11
|
+
#end
|
12
|
+
|
13
|
+
# These are just classes set up for quick testing.
|
14
|
+
# TODO: need to test a compound class name Mod::Cls
|
15
|
+
|
16
|
+
class Cls1 # ZenTest SKIP
|
17
|
+
def meth1; end
|
18
|
+
def self.meth2; end
|
19
|
+
end
|
20
|
+
|
21
|
+
class TestCls1 # ZenTest SKIP
|
22
|
+
def setup; end
|
23
|
+
def teardown; end
|
24
|
+
def test_meth1; end
|
25
|
+
def test_meth2; assert(true, "something"); end
|
26
|
+
end
|
27
|
+
|
28
|
+
class SuperDuper # ZenTest SKIP
|
29
|
+
def self.cls_inherited; end
|
30
|
+
def inherited; end
|
31
|
+
def overridden; end
|
32
|
+
end
|
33
|
+
|
34
|
+
class LowlyOne < SuperDuper # ZenTest SKIP
|
35
|
+
def self.cls_extended; end
|
36
|
+
def overridden; end
|
37
|
+
def extended; end
|
38
|
+
end
|
39
|
+
|
40
|
+
# This is the good case where there are no missing methods on either side.
|
41
|
+
|
42
|
+
class Blah0
|
43
|
+
def missingtest; end
|
44
|
+
def notmissing1; end
|
45
|
+
def notmissing2; end
|
46
|
+
|
47
|
+
# found by zentest on testcase1.rb
|
48
|
+
def missingimpl; end
|
49
|
+
end
|
50
|
+
|
51
|
+
class TestBlah0
|
52
|
+
def setup; end
|
53
|
+
def teardown; end
|
54
|
+
|
55
|
+
def test_notmissing1
|
56
|
+
assert(true, "a test")
|
57
|
+
end
|
58
|
+
def test_notmissing2_ext1
|
59
|
+
assert(true, "a test")
|
60
|
+
end
|
61
|
+
def test_notmissing2_ext2
|
62
|
+
flunk("a failed test")
|
63
|
+
end
|
64
|
+
def test_missingimpl; end
|
65
|
+
def test_missingtest; end
|
66
|
+
end
|
67
|
+
|
68
|
+
class Blah1
|
69
|
+
def missingtest; end
|
70
|
+
def notmissing1; end
|
71
|
+
def notmissing2; end
|
72
|
+
end
|
73
|
+
|
74
|
+
class TestBlah1
|
75
|
+
def test_notmissing1; end
|
76
|
+
def test_notmissing2_ext1; end
|
77
|
+
def test_notmissing2_ext2; end
|
78
|
+
def test_missingimpl; Blah1.new.missingimpl; end
|
79
|
+
def test_integration_blah1; end
|
80
|
+
def test_integration_blah2; end
|
81
|
+
def test_integration_blah3; end
|
82
|
+
end
|
83
|
+
|
84
|
+
module Something2
|
85
|
+
class Blah2
|
86
|
+
def missingtest; end
|
87
|
+
def notmissing1; end
|
88
|
+
def notmissing2; end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
module TestSomething2
|
93
|
+
class TestBlah2
|
94
|
+
def test_notmissing1; end
|
95
|
+
def test_notmissing2_ext1; end
|
96
|
+
def test_notmissing2_ext2; end
|
97
|
+
def test_missingimpl; end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# only test classes
|
102
|
+
class TestBlah3
|
103
|
+
def test_missingimpl; end
|
104
|
+
end
|
105
|
+
# only regular classes
|
106
|
+
class Blah4
|
107
|
+
def missingtest1; end
|
108
|
+
def missingtest2; end
|
109
|
+
end
|
110
|
+
|
111
|
+
# subclassing a builtin class
|
112
|
+
class MyHash5 < Hash
|
113
|
+
def []; end
|
114
|
+
def missingtest1; end
|
115
|
+
end
|
116
|
+
|
117
|
+
# nested class
|
118
|
+
module MyModule6
|
119
|
+
class MyClass6
|
120
|
+
def []; end
|
121
|
+
def missingtest1; end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# nested class
|
126
|
+
module MyModule7; end # in 1.9+ you'll not need this
|
127
|
+
class MyModule7::MyClass7
|
128
|
+
def []; end
|
129
|
+
def missingtest1; end
|
130
|
+
end
|
131
|
+
|
132
|
+
class MyClass8
|
133
|
+
def self.foobar; end
|
134
|
+
def MyClass8.foobaz; end
|
135
|
+
end
|
136
|
+
|
137
|
+
class TestTrueClass
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
class TestZenTest < Test::Unit::TestCase
|
142
|
+
|
143
|
+
def setup
|
144
|
+
@tester = ZenTest.new()
|
145
|
+
end
|
146
|
+
|
147
|
+
############################################################
|
148
|
+
# Utility Methods
|
149
|
+
|
150
|
+
def util_simple_setup
|
151
|
+
@tester.klasses = {
|
152
|
+
"Something" =>
|
153
|
+
{
|
154
|
+
"method1" => true,
|
155
|
+
"method1!" => true,
|
156
|
+
"method1=" => true,
|
157
|
+
"method1?" => true,
|
158
|
+
"attrib" => true,
|
159
|
+
"attrib=" => true,
|
160
|
+
"equal?" => true,
|
161
|
+
"self.method3" => true,
|
162
|
+
"self.[]" => true,
|
163
|
+
},
|
164
|
+
}
|
165
|
+
@tester.test_klasses = {
|
166
|
+
"TestSomething" =>
|
167
|
+
{
|
168
|
+
"test_class_method4" => true,
|
169
|
+
"test_method2" => true,
|
170
|
+
"setup" => true,
|
171
|
+
"teardown" => true,
|
172
|
+
"test_class_index" => true,
|
173
|
+
},
|
174
|
+
}
|
175
|
+
@tester.inherited_methods = @tester.test_klasses.merge(@tester.klasses)
|
176
|
+
@generated_code = "
|
177
|
+
require 'test/unit' unless defined? $ZENTEST and $ZENTEST
|
178
|
+
|
179
|
+
class Something
|
180
|
+
def self.method4(*args)
|
181
|
+
raise NotImplementedError, 'Need to write self.method4'
|
182
|
+
end
|
183
|
+
|
184
|
+
def method2(*args)
|
185
|
+
raise NotImplementedError, 'Need to write method2'
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
class TestSomething < Test::Unit::TestCase
|
190
|
+
def test_class_method3
|
191
|
+
raise NotImplementedError, 'Need to write test_class_method3'
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_attrib
|
195
|
+
raise NotImplementedError, 'Need to write test_attrib'
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_attrib_equals
|
199
|
+
raise NotImplementedError, 'Need to write test_attrib_equals'
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_equal_eh
|
203
|
+
raise NotImplementedError, 'Need to write test_equal_eh'
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_method1
|
207
|
+
raise NotImplementedError, 'Need to write test_method1'
|
208
|
+
end
|
209
|
+
|
210
|
+
def test_method1_bang
|
211
|
+
raise NotImplementedError, 'Need to write test_method1_bang'
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_method1_eh
|
215
|
+
raise NotImplementedError, 'Need to write test_method1_eh'
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_method1_equals
|
219
|
+
raise NotImplementedError, 'Need to write test_method1_equals'
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
# Number of errors detected: 10
|
224
|
+
"
|
225
|
+
end
|
226
|
+
|
227
|
+
############################################################
|
228
|
+
# Accessors & Adders:
|
229
|
+
|
230
|
+
def test_initialize
|
231
|
+
assert_not_nil(@tester, "Tester must be initialized")
|
232
|
+
# TODO: should do more at this stage
|
233
|
+
end
|
234
|
+
|
235
|
+
############################################################
|
236
|
+
# Converters and Testers:
|
237
|
+
|
238
|
+
def test_is_test_class
|
239
|
+
# classes
|
240
|
+
assert(@tester.is_test_class(TestCls1),
|
241
|
+
"All test classes must start with Test")
|
242
|
+
assert(!@tester.is_test_class(Cls1),
|
243
|
+
"Classes not starting with Test must not be test classes")
|
244
|
+
# strings
|
245
|
+
assert(@tester.is_test_class("TestCls1"),
|
246
|
+
"All test classes must start with Test")
|
247
|
+
assert(@tester.is_test_class("TestMod::TestCls1"),
|
248
|
+
"All test modules must start with test as well")
|
249
|
+
assert(!@tester.is_test_class("Cls1"),
|
250
|
+
"Classes not starting with Test must not be test classes")
|
251
|
+
assert(!@tester.is_test_class("NotTestMod::TestCls1"),
|
252
|
+
"Modules not starting with Test must not be test classes")
|
253
|
+
assert(!@tester.is_test_class("NotTestMod::NotTestCls1"),
|
254
|
+
"All names must start with Test to be test classes")
|
255
|
+
end
|
256
|
+
|
257
|
+
def test_is_test_class_reversed
|
258
|
+
old = $r
|
259
|
+
$r = true
|
260
|
+
assert(@tester.is_test_class("Cls1Test"),
|
261
|
+
"Reversed: All test classes must end with Test")
|
262
|
+
assert(@tester.is_test_class("ModTest::Cls1Test"),
|
263
|
+
"Reversed: All test classes must end with Test")
|
264
|
+
assert(!@tester.is_test_class("TestMod::TestCls1"),
|
265
|
+
"Reversed: All test classes must end with Test")
|
266
|
+
$r = old
|
267
|
+
end
|
268
|
+
|
269
|
+
def test_convert_class_name
|
270
|
+
|
271
|
+
assert_equal('Cls1', @tester.convert_class_name(TestCls1))
|
272
|
+
assert_equal('TestCls1', @tester.convert_class_name(Cls1))
|
273
|
+
|
274
|
+
assert_equal('Cls1', @tester.convert_class_name('TestCls1'))
|
275
|
+
assert_equal('TestCls1', @tester.convert_class_name('Cls1'))
|
276
|
+
|
277
|
+
assert_equal('TestModule::TestCls1',
|
278
|
+
@tester.convert_class_name('Module::Cls1'))
|
279
|
+
assert_equal('Module::Cls1',
|
280
|
+
@tester.convert_class_name('TestModule::TestCls1'))
|
281
|
+
end
|
282
|
+
|
283
|
+
def test_convert_class_name_reversed
|
284
|
+
old = $r
|
285
|
+
$r = true
|
286
|
+
|
287
|
+
assert_equal('Cls1', @tester.convert_class_name("Cls1Test"))
|
288
|
+
assert_equal('Cls1Test', @tester.convert_class_name(Cls1))
|
289
|
+
|
290
|
+
assert_equal('Cls1', @tester.convert_class_name('Cls1Test'))
|
291
|
+
assert_equal('Cls1Test', @tester.convert_class_name('Cls1'))
|
292
|
+
|
293
|
+
assert_equal('ModuleTest::Cls1Test',
|
294
|
+
@tester.convert_class_name('Module::Cls1'))
|
295
|
+
assert_equal('Module::Cls1',
|
296
|
+
@tester.convert_class_name('ModuleTest::Cls1Test'))
|
297
|
+
$r = old
|
298
|
+
end
|
299
|
+
|
300
|
+
############################################################
|
301
|
+
# Missing Classes and Methods:
|
302
|
+
|
303
|
+
def test_missing_methods_empty
|
304
|
+
missing = @tester.missing_methods
|
305
|
+
assert_equal({}, missing)
|
306
|
+
end
|
307
|
+
|
308
|
+
def test_add_missing_method_normal
|
309
|
+
@tester.add_missing_method("SomeClass", "some_method")
|
310
|
+
missing = @tester.missing_methods
|
311
|
+
assert_equal({"SomeClass" => { "some_method" => true } }, missing)
|
312
|
+
end
|
313
|
+
|
314
|
+
def test_add_missing_method_duplicates
|
315
|
+
@tester.add_missing_method("SomeClass", "some_method")
|
316
|
+
@tester.add_missing_method("SomeClass", "some_method")
|
317
|
+
@tester.add_missing_method("SomeClass", "some_method")
|
318
|
+
missing = @tester.missing_methods
|
319
|
+
assert_equal({"SomeClass" => { "some_method" => true } }, missing)
|
320
|
+
end
|
321
|
+
|
322
|
+
def test_analyze_simple
|
323
|
+
self.util_simple_setup
|
324
|
+
|
325
|
+
@tester.analyze
|
326
|
+
missing = @tester.missing_methods
|
327
|
+
expected = {
|
328
|
+
"Something" => {
|
329
|
+
"method2" => true,
|
330
|
+
"self.method4" => true,
|
331
|
+
},
|
332
|
+
"TestSomething" => {
|
333
|
+
"test_class_method3" => true,
|
334
|
+
"test_attrib" => true,
|
335
|
+
"test_attrib_equals" => true,
|
336
|
+
"test_equal_eh" => true,
|
337
|
+
"test_method1" => true,
|
338
|
+
"test_method1_eh"=>true,
|
339
|
+
"test_method1_bang"=>true,
|
340
|
+
"test_method1_equals"=>true,
|
341
|
+
}
|
342
|
+
}
|
343
|
+
assert_equal(expected, missing)
|
344
|
+
end
|
345
|
+
|
346
|
+
def test_generate_code_simple
|
347
|
+
self.util_simple_setup
|
348
|
+
|
349
|
+
@tester.analyze
|
350
|
+
str = @tester.generate_code[1..-1].join("\n")
|
351
|
+
exp = @generated_code
|
352
|
+
|
353
|
+
assert_equal(exp, str)
|
354
|
+
end
|
355
|
+
|
356
|
+
def test_get_class_good
|
357
|
+
assert_equal(Object, @tester.get_class("Object"))
|
358
|
+
end
|
359
|
+
|
360
|
+
def test_get_class_bad
|
361
|
+
assert_nil(@tester.get_class("ZZZObject"))
|
362
|
+
end
|
363
|
+
|
364
|
+
def test_get_inherited_methods_for_subclass
|
365
|
+
expect = { "inherited" => true, "overridden" => true }
|
366
|
+
result = @tester.get_inherited_methods_for("LowlyOne", false)
|
367
|
+
|
368
|
+
assert_equal(expect, result)
|
369
|
+
end
|
370
|
+
|
371
|
+
def test_get_inherited_methods_for_subclass_full
|
372
|
+
expect = Object.instance_methods + %w( inherited overridden )
|
373
|
+
result = @tester.get_inherited_methods_for("LowlyOne", true)
|
374
|
+
|
375
|
+
assert_equal(expect.sort, result.keys.sort)
|
376
|
+
end
|
377
|
+
|
378
|
+
def test_get_inherited_methods_for_superclass
|
379
|
+
expect = { }
|
380
|
+
result = @tester.get_inherited_methods_for("SuperDuper", false)
|
381
|
+
|
382
|
+
assert_equal(expect.keys.sort, result.keys.sort)
|
383
|
+
end
|
384
|
+
|
385
|
+
def test_get_inherited_methods_for_superclass_full
|
386
|
+
expect = Object.instance_methods
|
387
|
+
result = @tester.get_inherited_methods_for("SuperDuper", true)
|
388
|
+
|
389
|
+
assert_equal(expect.sort, result.keys.sort)
|
390
|
+
end
|
391
|
+
|
392
|
+
def test_get_methods_for_subclass
|
393
|
+
expect = {
|
394
|
+
"self.cls_extended" => true,
|
395
|
+
"overridden" => true,
|
396
|
+
"extended" => true
|
397
|
+
}
|
398
|
+
result = @tester.get_methods_for("LowlyOne")
|
399
|
+
|
400
|
+
assert_equal(expect, result)
|
401
|
+
end
|
402
|
+
|
403
|
+
def test_get_methods_for_subclass_full
|
404
|
+
expect = {
|
405
|
+
"self.cls_inherited" => true,
|
406
|
+
"self.cls_extended" => true,
|
407
|
+
"overridden" => true,
|
408
|
+
"extended" => true
|
409
|
+
}
|
410
|
+
result = @tester.get_methods_for("LowlyOne", true)
|
411
|
+
|
412
|
+
assert_equal(expect, result)
|
413
|
+
end
|
414
|
+
|
415
|
+
def test_get_methods_for_superclass
|
416
|
+
expect = {
|
417
|
+
"self.cls_inherited" => true,
|
418
|
+
"overridden" => true,
|
419
|
+
"inherited" => true }
|
420
|
+
result = @tester.get_methods_for("SuperDuper")
|
421
|
+
|
422
|
+
assert_equal(expect, result)
|
423
|
+
end
|
424
|
+
|
425
|
+
def test_result
|
426
|
+
self.util_simple_setup
|
427
|
+
|
428
|
+
@tester.analyze
|
429
|
+
@tester.generate_code
|
430
|
+
str = @tester.result.split($/, 2).last
|
431
|
+
exp = @generated_code
|
432
|
+
|
433
|
+
assert_equal(exp, str)
|
434
|
+
end
|
435
|
+
|
436
|
+
def test_load_file
|
437
|
+
# HACK raise NotImplementedError, 'Need to write test_load_file'
|
438
|
+
end
|
439
|
+
|
440
|
+
def test_scan_files
|
441
|
+
# HACK raise NotImplementedError, 'Need to write test_scan_files'
|
442
|
+
end
|
443
|
+
|
444
|
+
def test_process_class
|
445
|
+
assert_equal({}, @tester.klasses)
|
446
|
+
assert_equal({}, @tester.test_klasses)
|
447
|
+
assert_equal({}, @tester.inherited_methods["SuperDuper"])
|
448
|
+
@tester.process_class("SuperDuper")
|
449
|
+
assert_equal({"SuperDuper"=> {
|
450
|
+
"self.cls_inherited"=>true,
|
451
|
+
"inherited"=>true,
|
452
|
+
"overridden"=>true}},
|
453
|
+
@tester.klasses)
|
454
|
+
assert_equal({}, @tester.test_klasses)
|
455
|
+
assert_equal({}, @tester.inherited_methods["SuperDuper"])
|
456
|
+
end
|
457
|
+
|
458
|
+
def test_normal_to_test
|
459
|
+
self.util_simple_setup
|
460
|
+
assert_equal("test_method1", @tester.normal_to_test("method1"))
|
461
|
+
assert_equal("test_method1_bang", @tester.normal_to_test("method1!"))
|
462
|
+
assert_equal("test_method1_eh", @tester.normal_to_test("method1?"))
|
463
|
+
assert_equal("test_method1_equals", @tester.normal_to_test("method1="))
|
464
|
+
end
|
465
|
+
|
466
|
+
def test_normal_to_test_cls
|
467
|
+
self.util_simple_setup
|
468
|
+
assert_equal("test_class_method1", @tester.normal_to_test("self.method1"))
|
469
|
+
assert_equal("test_class_method1_bang", @tester.normal_to_test("self.method1!"))
|
470
|
+
assert_equal("test_class_method1_eh", @tester.normal_to_test("self.method1?"))
|
471
|
+
assert_equal("test_class_method1_equals", @tester.normal_to_test("self.method1="))
|
472
|
+
end
|
473
|
+
|
474
|
+
def test_normal_to_test_operators
|
475
|
+
self.util_simple_setup
|
476
|
+
assert_equal("test_and", @tester.normal_to_test("&"))
|
477
|
+
assert_equal("test_bang", @tester.normal_to_test("!"))
|
478
|
+
assert_equal("test_carat", @tester.normal_to_test("^"))
|
479
|
+
assert_equal("test_div", @tester.normal_to_test("/"))
|
480
|
+
assert_equal("test_equalstilde", @tester.normal_to_test("=~"))
|
481
|
+
assert_equal("test_minus", @tester.normal_to_test("-"))
|
482
|
+
assert_equal("test_or", @tester.normal_to_test("|"))
|
483
|
+
assert_equal("test_percent", @tester.normal_to_test("%"))
|
484
|
+
assert_equal("test_plus", @tester.normal_to_test("+"))
|
485
|
+
assert_equal("test_tilde", @tester.normal_to_test("~"))
|
486
|
+
end
|
487
|
+
|
488
|
+
def test_normal_to_test_overlap
|
489
|
+
self.util_simple_setup
|
490
|
+
assert_equal("test_equals2", @tester.normal_to_test("=="))
|
491
|
+
assert_equal("test_equals3", @tester.normal_to_test("==="))
|
492
|
+
assert_equal("test_ge", @tester.normal_to_test(">="))
|
493
|
+
assert_equal("test_gt", @tester.normal_to_test(">"))
|
494
|
+
assert_equal("test_gt2", @tester.normal_to_test(">>"))
|
495
|
+
assert_equal("test_index", @tester.normal_to_test("[]"))
|
496
|
+
assert_equal("test_index_equals", @tester.normal_to_test("[]="))
|
497
|
+
assert_equal("test_lt", @tester.normal_to_test("<"))
|
498
|
+
assert_equal("test_lt2", @tester.normal_to_test("<\<"))
|
499
|
+
assert_equal("test_lte", @tester.normal_to_test("<="))
|
500
|
+
assert_equal("test_method", @tester.normal_to_test("method"))
|
501
|
+
assert_equal("test_method_equals", @tester.normal_to_test("method="))
|
502
|
+
assert_equal("test_spaceship", @tester.normal_to_test("<=>"))
|
503
|
+
assert_equal("test_times", @tester.normal_to_test("*"))
|
504
|
+
assert_equal("test_times2", @tester.normal_to_test("**"))
|
505
|
+
assert_equal("test_unary_minus", @tester.normal_to_test("@-"))
|
506
|
+
assert_equal("test_unary_plus", @tester.normal_to_test("@+"))
|
507
|
+
assert_equal("test_class_index", @tester.normal_to_test("self.[]"))
|
508
|
+
end
|
509
|
+
|
510
|
+
def test_test_to_normal
|
511
|
+
self.util_simple_setup
|
512
|
+
assert_equal("method1!", @tester.test_to_normal("test_method1_bang", "Something"))
|
513
|
+
assert_equal("method1", @tester.test_to_normal("test_method1", "Something"))
|
514
|
+
assert_equal("method1=", @tester.test_to_normal("test_method1_equals", "Something"))
|
515
|
+
assert_equal("method1?", @tester.test_to_normal("test_method1_eh", "Something"))
|
516
|
+
end
|
517
|
+
|
518
|
+
def test_test_to_normal_cls
|
519
|
+
self.util_simple_setup
|
520
|
+
assert_equal("self.method1", @tester.test_to_normal("test_class_method1"))
|
521
|
+
assert_equal("self.method1!", @tester.test_to_normal("test_class_method1_bang"))
|
522
|
+
assert_equal("self.method1?", @tester.test_to_normal("test_class_method1_eh"))
|
523
|
+
assert_equal("self.method1=", @tester.test_to_normal("test_class_method1_equals"))
|
524
|
+
assert_equal("self.[]", @tester.test_to_normal("test_class_index"))
|
525
|
+
end
|
526
|
+
|
527
|
+
def test_test_to_normal_extended
|
528
|
+
self.util_simple_setup
|
529
|
+
assert_equal("equal?", @tester.test_to_normal("test_equal_eh_extension", "Something"))
|
530
|
+
assert_equal("equal?", @tester.test_to_normal("test_equal_eh_extension_again", "Something"))
|
531
|
+
assert_equal("method1", @tester.test_to_normal("test_method1_extension", "Something"))
|
532
|
+
assert_equal("method1", @tester.test_to_normal("test_method1_extension_again", "Something"))
|
533
|
+
end
|
534
|
+
|
535
|
+
def test_test_to_normal_mapped
|
536
|
+
self.util_simple_setup
|
537
|
+
assert_equal("*", @tester.test_to_normal("test_times"))
|
538
|
+
assert_equal("*", @tester.test_to_normal("test_times_ext"))
|
539
|
+
assert_equal("==", @tester.test_to_normal("test_equals2"))
|
540
|
+
assert_equal("==", @tester.test_to_normal("test_equals2_ext"))
|
541
|
+
assert_equal("===", @tester.test_to_normal("test_equals3"))
|
542
|
+
assert_equal("===", @tester.test_to_normal("test_equals3_ext"))
|
543
|
+
assert_equal("[]", @tester.test_to_normal("test_index"))
|
544
|
+
assert_equal("[]", @tester.test_to_normal("test_index_ext"))
|
545
|
+
assert_equal("[]=", @tester.test_to_normal("test_index_equals"))
|
546
|
+
assert_equal("[]=", @tester.test_to_normal("test_index_equals_ext"))
|
547
|
+
end
|
548
|
+
|
549
|
+
def test_test_to_normal_operators
|
550
|
+
self.util_simple_setup
|
551
|
+
assert_equal("&", @tester.test_to_normal("test_and"))
|
552
|
+
assert_equal("!", @tester.test_to_normal("test_bang"))
|
553
|
+
assert_equal("^", @tester.test_to_normal("test_carat"))
|
554
|
+
assert_equal("/", @tester.test_to_normal("test_div"))
|
555
|
+
assert_equal("=~", @tester.test_to_normal("test_equalstilde"))
|
556
|
+
assert_equal("-", @tester.test_to_normal("test_minus"))
|
557
|
+
assert_equal("|", @tester.test_to_normal("test_or"))
|
558
|
+
assert_equal("%", @tester.test_to_normal("test_percent"))
|
559
|
+
assert_equal("+", @tester.test_to_normal("test_plus"))
|
560
|
+
assert_equal("~", @tester.test_to_normal("test_tilde"))
|
561
|
+
end
|
562
|
+
|
563
|
+
def test_test_to_normal_overlap
|
564
|
+
self.util_simple_setup
|
565
|
+
assert_equal("==", @tester.test_to_normal("test_equals2"))
|
566
|
+
assert_equal("===", @tester.test_to_normal("test_equals3"))
|
567
|
+
assert_equal(">=", @tester.test_to_normal("test_ge"))
|
568
|
+
assert_equal(">", @tester.test_to_normal("test_gt"))
|
569
|
+
assert_equal(">>", @tester.test_to_normal("test_gt2"))
|
570
|
+
assert_equal("[]", @tester.test_to_normal("test_index"))
|
571
|
+
assert_equal("[]=", @tester.test_to_normal("test_index_equals"))
|
572
|
+
assert_equal("<", @tester.test_to_normal("test_lt"))
|
573
|
+
assert_equal("<\<", @tester.test_to_normal("test_lt2"))
|
574
|
+
assert_equal("<=", @tester.test_to_normal("test_lte"))
|
575
|
+
assert_equal("<=>", @tester.test_to_normal("test_spaceship"))
|
576
|
+
assert_equal("*", @tester.test_to_normal("test_times"))
|
577
|
+
assert_equal("**", @tester.test_to_normal("test_times2"))
|
578
|
+
assert_equal("@-", @tester.test_to_normal("test_unary_minus"))
|
579
|
+
assert_equal("@+", @tester.test_to_normal("test_unary_plus"))
|
580
|
+
end
|
581
|
+
|
582
|
+
def test_klasses_equals
|
583
|
+
self.util_simple_setup
|
584
|
+
assert_equal({"Something"=> {
|
585
|
+
"self.method3"=>true,
|
586
|
+
"equal?"=>true,
|
587
|
+
"attrib="=>true,
|
588
|
+
"self.[]"=>true,
|
589
|
+
"method1"=>true,
|
590
|
+
"method1="=>true,
|
591
|
+
"method1?"=>true,
|
592
|
+
"method1!"=>true,
|
593
|
+
"method1"=>true,
|
594
|
+
"attrib"=>true}}, @tester.klasses)
|
595
|
+
@tester.klasses= {"whoopie" => {}}
|
596
|
+
assert_equal({"whoopie"=> {}}, @tester.klasses)
|
597
|
+
end
|
598
|
+
|
599
|
+
# REFACTOR: this should probably be cleaned up and on ZenTest side
|
600
|
+
def util_testcase(*klasses)
|
601
|
+
zentest = ZenTest.new
|
602
|
+
klasses.each do |klass|
|
603
|
+
zentest.process_class(klass)
|
604
|
+
end
|
605
|
+
zentest.analyze
|
606
|
+
zentest.generate_code
|
607
|
+
return zentest.result.split("\n")[1..-1].join("\n")
|
608
|
+
end
|
609
|
+
|
610
|
+
def test_testcase0
|
611
|
+
expected = '# Number of errors detected: 0'
|
612
|
+
assert_equal expected, util_testcase("Blah0", "TestBlah0")
|
613
|
+
end
|
614
|
+
|
615
|
+
def test_testcase1
|
616
|
+
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"
|
617
|
+
|
618
|
+
assert_equal expected, util_testcase("Blah1", "TestBlah1")
|
619
|
+
end
|
620
|
+
|
621
|
+
def test_testcase2
|
622
|
+
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"
|
623
|
+
|
624
|
+
assert_equal expected, util_testcase("Something2::Blah2", "TestSomething2::TestBlah2")
|
625
|
+
end
|
626
|
+
|
627
|
+
def test_testcase3
|
628
|
+
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"
|
629
|
+
|
630
|
+
assert_equal expected, util_testcase("TestBlah3")
|
631
|
+
end
|
632
|
+
|
633
|
+
def test_testcase4
|
634
|
+
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"
|
635
|
+
|
636
|
+
assert_equal expected, util_testcase("Blah4")
|
637
|
+
end
|
638
|
+
|
639
|
+
def test_testcase5
|
640
|
+
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"
|
641
|
+
|
642
|
+
assert_equal expected, util_testcase("MyHash5")
|
643
|
+
end
|
644
|
+
|
645
|
+
def test_testcase6
|
646
|
+
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"
|
647
|
+
|
648
|
+
assert_equal expected, util_testcase("MyModule6::MyClass6")
|
649
|
+
end
|
650
|
+
|
651
|
+
def test_testcase7
|
652
|
+
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"
|
653
|
+
|
654
|
+
assert_equal expected, util_testcase("MyModule7::MyClass7")
|
655
|
+
end
|
656
|
+
|
657
|
+
def test_testcase8
|
658
|
+
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"
|
659
|
+
|
660
|
+
assert_equal expected, util_testcase("MyClass8")
|
661
|
+
end
|
662
|
+
|
663
|
+
def test_testcase9
|
664
|
+
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"
|
665
|
+
|
666
|
+
assert_equal expected, util_testcase("TestTrueClass")
|
667
|
+
end
|
668
|
+
|
669
|
+
end
|
670
|
+
|