zombie-chaser 0.0.3 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. data/History.txt +22 -0
  2. data/README.txt +57 -47
  3. data/Rakefile +26 -24
  4. data/bin/zombie-chaser +77 -79
  5. data/lib/{chaser.rb → zombie-chaser/chaser.rb} +392 -373
  6. data/lib/zombie-chaser/human.rb +312 -0
  7. data/{ui → lib/zombie-chaser}/icons/death.png +0 -0
  8. data/{ui → lib/zombie-chaser}/icons/robot.png +0 -0
  9. data/lib/zombie-chaser/interface.rb +153 -0
  10. data/{ui → lib/zombie-chaser}/sprites/robot-attacking.png +0 -0
  11. data/{ui → lib/zombie-chaser}/sprites/robot-dead.png +0 -0
  12. data/{ui → lib/zombie-chaser}/sprites/robot-dying.png +0 -0
  13. data/{ui → lib/zombie-chaser}/sprites/robot-idle.png +0 -0
  14. data/{ui → lib/zombie-chaser}/sprites/robot-moving.png +0 -0
  15. data/{ui → lib/zombie-chaser}/sprites/robot-turning.png +0 -0
  16. data/{ui → lib/zombie-chaser}/sprites/tank-attacking.png +0 -0
  17. data/{ui → lib/zombie-chaser}/sprites/tank-dead.png +0 -0
  18. data/{ui → lib/zombie-chaser}/sprites/tank-idle.png +0 -0
  19. data/{ui → lib/zombie-chaser}/sprites/tank-moving.png +0 -0
  20. data/{ui → lib/zombie-chaser}/sprites/tank-turning.png +0 -0
  21. data/{ui → lib/zombie-chaser}/sprites/witch-attacking.png +0 -0
  22. data/{ui → lib/zombie-chaser}/sprites/witch-dead.png +0 -0
  23. data/{ui → lib/zombie-chaser}/sprites/witch-idle.png +0 -0
  24. data/{ui → lib/zombie-chaser}/sprites/witch-moving.png +0 -0
  25. data/{ui → lib/zombie-chaser}/sprites/witch-turning.png +0 -0
  26. data/{ui → lib/zombie-chaser}/sprites/zombie-attacking.png +0 -0
  27. data/{ui → lib/zombie-chaser}/sprites/zombie-dead.png +0 -0
  28. data/{ui → lib/zombie-chaser}/sprites/zombie-dying.png +0 -0
  29. data/{ui → lib/zombie-chaser}/sprites/zombie-idle.png +0 -0
  30. data/{ui → lib/zombie-chaser}/sprites/zombie-moving.png +0 -0
  31. data/{ui → lib/zombie-chaser}/sprites/zombie-turning.png +0 -0
  32. data/lib/zombie-chaser/test_unit_handler.rb +78 -0
  33. data/{ui → lib/zombie-chaser}/tiles/grass.png +0 -0
  34. data/{ui → lib/zombie-chaser}/tiles/shrubbery.png +0 -0
  35. data/{ui → lib/zombie-chaser}/ui.rb +165 -127
  36. data/lib/{world.rb → zombie-chaser/world.rb} +105 -98
  37. data/lib/zombie-chaser/zombie_test_chaser.rb +139 -0
  38. data/test/fixtures/chased.rb +56 -56
  39. data/test/integration.rb +58 -0
  40. data/test/test_chaser.rb +150 -144
  41. data/test/test_unit.rb +2 -2
  42. data/test/test_zombie.rb +302 -108
  43. data/zombie-chaser.gemspec +88 -88
  44. metadata +40 -46
  45. data/lib/human.rb +0 -189
  46. data/lib/interface.rb +0 -86
  47. data/lib/test_unit_handler.rb +0 -43
  48. data/lib/zombie_test_chaser.rb +0 -133
@@ -0,0 +1,139 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "test/unit/collector/objectspace"
4
+ require "test/unit/ui/testrunnermediator"
5
+ require 'zombie-chaser/chaser'
6
+
7
+ # Make sure test/unit doesn't swallow our timeout
8
+ begin
9
+ Test::Unit::TestCase::PASSTHROUGH_EXCEPTIONS << Chaser::Timeout
10
+ rescue NameError
11
+ # ignore
12
+ end
13
+
14
+ class ZombieTestChaser < Chaser
15
+
16
+ VERSION = '0.1.0' #This should be used, but isn't, in Rakefile.
17
+
18
+ @@test_pattern = 'test/test_*.rb'
19
+ @@tests_loaded = false
20
+ @@world = nil
21
+
22
+ def self.test_pattern=(value)
23
+ @@test_pattern = value
24
+ end
25
+
26
+ def self.create_world
27
+ @@tests_loaded = true
28
+ @@world = World.new_using_test_unit_handler(@@test_pattern)
29
+ end
30
+
31
+ def self.world
32
+ @@world
33
+ end
34
+
35
+ def self.current_class_names(exclude_list)
36
+ result = []
37
+ ObjectSpace.each_object(Class) do |klass|
38
+ next if klass.to_s.include?("Class:0x")
39
+ next unless klass.ancestors.all? {|ancestor| (ancestor.to_s.split(/::/) & exclude_list).empty?}
40
+ result << klass.to_s
41
+ end
42
+ result
43
+ end
44
+
45
+ def self.validate(klass_name = nil, method_name = nil, force = false)
46
+ pre_existing_class_names = self.current_class_names([]) unless klass_name
47
+ create_world
48
+
49
+ if klass_name
50
+ klass = klass_name.to_class
51
+ # Does the method exist?
52
+ klass_methods = klass.singleton_methods(false).collect {|meth| "self.#{meth}"}
53
+ if method_name
54
+ if method_name =~ /self\./
55
+ abort "Unknown method: #{klass_name}.#{method_name.gsub('self.', '')}" unless klass_methods.include? method_name
56
+ else
57
+ abort "Unknown method: #{klass_name}##{method_name}" unless klass.instance_methods(false).map{|sym| sym.to_s}.include? method_name
58
+ end
59
+ end
60
+ end
61
+
62
+ initial_time = Time.now
63
+
64
+ chaser = self.new(klass_name)
65
+
66
+ all_good = nil
67
+
68
+ chaser.while_world_running do
69
+
70
+ passed = chaser.human_survives?
71
+
72
+ unless force or passed then
73
+ abort "Initial run of tests failed... fix and run chaser again"
74
+ end
75
+
76
+ if self.guess_timeout? then
77
+ running_time = Time.now - initial_time
78
+ adjusted_timeout = (running_time * 2 < 5) ? 5 : (running_time * 2).ceil
79
+ self.timeout = adjusted_timeout
80
+ end
81
+
82
+ chaser.interface_puts "Timeout set to #{adjusted_timeout} seconds."
83
+
84
+ if passed then
85
+ chaser.interface_puts "Initial tests pass. Let's rumble."
86
+ else
87
+ chaser.interface_puts "Initial tests failed but you forced things. Let's rumble."
88
+ end
89
+ chaser.interface_puts
90
+
91
+ counts = Hash.new(0)
92
+
93
+ klass_names = klass_name ? Array(klass_name) : self.current_class_names(["Test"]) - pre_existing_class_names
94
+ klass_names.each do |block_klass_name|
95
+ block_klass = block_klass_name.to_class
96
+
97
+ methods = method_name ? Array(method_name) : block_klass.instance_methods(false) + block_klass.singleton_methods(false).collect {|meth| "self.#{meth}"}
98
+
99
+ methods.sort_by{|x| x.to_s}.each do |block_method_name|
100
+ result = self.new(block_klass_name, block_method_name).validate
101
+ counts[result] += 1
102
+ end
103
+ end
104
+ all_good = counts[false] == 0
105
+
106
+ chaser.interface_puts "Chaser Results:",
107
+ "",
108
+ "Passed : %3d" % counts[true],
109
+ "Failed : %3d" % counts[false],
110
+ ""
111
+
112
+ if all_good then
113
+ chaser.interface_puts "All chasing was thwarted! YAY!!!"
114
+ else
115
+ chaser.interface_puts "Improve the tests and try again."
116
+ end
117
+
118
+ end
119
+ all_good
120
+ end
121
+
122
+ def human_survives?
123
+ self.class.world.run_human
124
+ end
125
+
126
+ def zombie_survives?
127
+ self.class.world.run_next_zombie
128
+ end
129
+
130
+ def while_world_running
131
+ self.class.world.while_world_running{yield}
132
+ end
133
+
134
+ def initialize(klass_name=nil, method_name=nil)
135
+ self.class.create_world unless @@tests_loaded
136
+ super(klass_name, method_name, Reporter.new(self.class.world.interface))
137
+ end
138
+
139
+ end
@@ -1,56 +1,56 @@
1
- class Chased
2
- def add(a,b)
3
- a + b
4
- end
5
-
6
- def say_hello
7
- "G'day!"
8
- end
9
-
10
- def self.static_method
11
- "Zap!"
12
- end
13
-
14
- def block_using_instance_method
15
- result = []
16
- block_yielding_instance_method do |i|
17
- result << i * 2
18
- end
19
- result
20
- end
21
-
22
- def block_yielding_instance_method
23
- yield 1
24
- yield 2
25
- yield 3
26
- end
27
-
28
- def self.block_using_class_method
29
- result = []
30
- block_yielding_class_method do |i|
31
- result << i * 2
32
- end
33
- result
34
- end
35
-
36
- def self.block_yielding_class_method
37
- yield 1
38
- yield 2
39
- end
40
-
41
- def [](x)
42
- x * 2
43
- end
44
-
45
- def self.[](x)
46
- x * 2
47
- end
48
-
49
- def question?
50
- "exclamation!"
51
- end
52
-
53
- def foo=(x)
54
- nil
55
- end
56
- end
1
+ class Chased
2
+ def add(a,b)
3
+ a + b
4
+ end
5
+
6
+ def say_hello
7
+ "G'day!"
8
+ end
9
+
10
+ def self.static_method
11
+ "Zap!"
12
+ end
13
+
14
+ def block_using_instance_method
15
+ result = []
16
+ block_yielding_instance_method do |i|
17
+ result << i * 2
18
+ end
19
+ result
20
+ end
21
+
22
+ def block_yielding_instance_method
23
+ yield 1
24
+ yield 2
25
+ yield 3
26
+ end
27
+
28
+ def self.block_using_class_method
29
+ result = []
30
+ block_yielding_class_method do |i|
31
+ result << i * 2
32
+ end
33
+ result
34
+ end
35
+
36
+ def self.block_yielding_class_method
37
+ yield 1
38
+ yield 2
39
+ end
40
+
41
+ def [](x)
42
+ x * 2
43
+ end
44
+
45
+ def self.[](x)
46
+ x * 2
47
+ end
48
+
49
+ def question?
50
+ "exclamation!"
51
+ end
52
+
53
+ def foo=(x)
54
+ nil
55
+ end
56
+ end
@@ -0,0 +1,58 @@
1
+ require "test/unit"
2
+
3
+ module TestIntegrationHelper
4
+ def output_text_for_command(command)
5
+ output_file = IO.popen(command)
6
+ output_text = output_file.read
7
+ output_text
8
+ end
9
+ end
10
+
11
+ class TestIntegration < Test::Unit::TestCase
12
+ include TestIntegrationHelper
13
+
14
+ EXAMPLE_DIRECTORY = "../exemplor-chaser-sample_target/"
15
+ LARGE_TEST_EXAMPLE_DIRECTORY = "../bioruby-blessed/"
16
+ BIT_BUCKET_FILENAME = RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null'
17
+
18
+ def setup
19
+ raise "Don't have example directory" unless File.exist?(EXAMPLE_DIRECTORY)
20
+ raise "Don't have large test example directory" unless File.exist?(LARGE_TEST_EXAMPLE_DIRECTORY)
21
+ raise "Don't have bit bucket filename" unless File.exist?(BIT_BUCKET_FILENAME)
22
+ @execution_command = "ruby -Ilib"
23
+ end
24
+
25
+ def test_exit_value_for_partial_test
26
+ assert_equal false, system("#{@execution_command} -I../exemplor-chaser-sample_target bin/zombie-chaser MyMath --tests ../exemplor-chaser-sample_target/partial_test_unit.rb --console > #{BIT_BUCKET_FILENAME}"), "Doesn't regard incomplete tests as a failure"
27
+ end
28
+
29
+ def test_exit_value_for_full_test
30
+ assert_equal true, system("#{@execution_command} -I../exemplor-chaser-sample_target bin/zombie-chaser MyMath --tests ../exemplor-chaser-sample_target/full_test_unit.rb --console > #{BIT_BUCKET_FILENAME}"), "Doesn't regard complete tests as a success"
31
+ end
32
+
33
+ def test_class_methods_dont_cause_errors
34
+ output_text = output_text_for_command("#{@execution_command} -I../bioruby-blessed/lib/ bin/zombie-chaser Bio::Sequence::NA --test ../bioruby-blessed/test/unit/bio/sequence/test_na.rb --console")
35
+ assert_match(/Chaser Results/, output_text, "Error raised during test due to class methods")
36
+ end
37
+
38
+ def test_messages_arent_on_same_line_as_nethack_representation
39
+ output_text = output_text_for_command("#{@execution_command} -I../exemplor-chaser-sample_target bin/zombie-chaser MyMath --tests ../exemplor-chaser-sample_target/full_test_unit.rb --console")
40
+ assert_no_match(/@.*The mutant didn't survive/, output_text, "Doesn't put messages on a new line")
41
+ end
42
+
43
+ def test_output_ends_with_newline
44
+ output_text = output_text_for_command("#{@execution_command} -I../exemplor-chaser-sample_target bin/zombie-chaser MyMath --tests ../exemplor-chaser-sample_target/full_test_unit.rb --console")
45
+ assert_equal "\n", output_text[-1..-1], "Doesn't end with a newline, causing problems for command lines"
46
+ end
47
+
48
+ def test_console_width_configurable
49
+ output_text = output_text_for_command("#{@execution_command} -I../bioruby-blessed/lib/ bin/zombie-chaser Bio::Sequence::NA --test ../bioruby-blessed/test/unit/bio/sequence/test_na.rb --console --width 10")
50
+ assert_no_match(/\.\.\.\.\.\.\.\.\.\.\./, output_text, "Doesn't allow console width to be configurable")
51
+ end
52
+
53
+ def test_summary_not_interrupted_by_progress_bar
54
+ output_text = output_text_for_command("#{@execution_command} -I../bioruby-blessed/lib/ bin/zombie-chaser Bio::Sequence::NA --test ../bioruby-blessed/test/unit/bio/sequence/test_na.rb --console")
55
+ assert_match(/Chaser Results:..Passed : +\d+.Failed : +\d+/m, output_text, "Summary interrupted by progress bar")
56
+ end
57
+
58
+ end
data/test/test_chaser.rb CHANGED
@@ -1,144 +1,150 @@
1
- $:.unshift(File.dirname(__FILE__) + '/fixtures')
2
- $:.unshift(File.dirname(__FILE__) + '/../lib')
3
-
4
- require 'test/unit/testcase'
5
- require 'test/unit' if $0 == __FILE__
6
- require 'zombie_test_chaser'
7
- require 'chased'
8
-
9
- class TestChaser < Chaser
10
- def rand(*args)
11
- 5
12
- end
13
-
14
- def rand_string
15
- "l33t h4x0r"
16
- end
17
-
18
- def rand_number(*args)
19
- 5
20
- end
21
-
22
- def rand_symbol
23
- :"l33t h4x0r"
24
- end
25
- end
26
-
27
- class ChaserTestCase < Test::Unit::TestCase
28
- unless defined? Mini then
29
- undef_method :default_test
30
- alias :refute_equal :assert_not_equal
31
- end
32
-
33
- def setup
34
- end
35
-
36
- def teardown
37
- @chaser.unmodify_method if defined?(@chaser) && @chaser
38
- end
39
-
40
- def test_unmodified_behaves_as_expected
41
- chased = Chased.new
42
- assert_equal 5, chased.add(2,3), "Unmodified version should equal 5"
43
- end
44
-
45
- def test_modify_and_unmodify_instance_method
46
- @chaser = TestChaser.new("Chased", "add")
47
- chased = Chased.new
48
- assert_equal 5, chased.add(2,3), "method has been modified before it should have been"
49
- @chaser.modify_method
50
- assert_equal 10, chased.add(2,3), "method hasn't been modified"
51
- @chaser.unmodify_method
52
- assert_equal 5, chased.add(2,3), "method should be back to normal, but it isn't"
53
- end
54
-
55
- def test_modify_and_unmodify_string
56
- @chaser = TestChaser.new("Chased", "say_hello")
57
- chased = Chased.new
58
- assert_equal "G'day!", chased.say_hello, "method has been modified before it should have been"
59
- @chaser.modify_method
60
- assert_equal "l33t h4x0r", chased.say_hello, "method hasn't been modified"
61
- @chaser.unmodify_method
62
- assert_equal "G'day!", chased.say_hello, "method should be back to normal, but it isn't"
63
- end
64
-
65
- def test_modify_and_unmodify_class_method
66
- @chaser = TestChaser.new("Chased", "self.static_method")
67
- assert_equal "Zap!", Chased.static_method, "class method has been modified before it should have been"
68
- @chaser.modify_method
69
- assert_equal "l33t h4x0r", Chased.static_method, "class method hasn't been modified"
70
- @chaser.unmodify_method
71
- assert_equal "Zap!", Chased.static_method, "class method should be back to normal, but it isn't"
72
- end
73
-
74
- def test_pass_blocks_on_in_instance_methods
75
- @chaser = TestChaser.new("Chased", "block_yielding_instance_method")
76
- chased = Chased.new
77
- assert_equal [2,4,6], chased.block_using_instance_method, "block yielding instance method has been modified before it should have been"
78
- @chaser.modify_method
79
- assert_equal [12, 14, 16], chased.block_using_instance_method, "yielded values haven't been modified"
80
- @chaser.unmodify_method
81
- assert_equal [2,4,6], chased.block_using_instance_method, "block yielding instance method has been modified before it should have been"
82
- end
83
-
84
- def test_pass_blocks_on_in_class_methods
85
- @chaser = TestChaser.new("Chased", "self.block_yielding_class_method")
86
- assert_equal [2,4], Chased.block_using_class_method, "block yielding class method has been modified before it should have been"
87
- @chaser.modify_method
88
- assert_equal [12, 14], Chased.block_using_class_method, "yielded values haven't been modified"
89
- @chaser.unmodify_method
90
- assert_equal [2,4], Chased.block_using_class_method, "block yielding class method has been modified before it should have been"
91
- end
92
-
93
- def test_handle_funny_characters_in_instance_method_names
94
- @chaser = TestChaser.new("Chased", "[]")
95
- chased = Chased.new
96
- assert_equal 2, chased[1], "Original doesn't work"
97
- @chaser.modify_method
98
- assert_equal 7, chased[1], "Modified doesn't work"
99
- @chaser.unmodify_method
100
- assert_equal 2, chased[1], "Modified then unmodified doesn't work"
101
- end
102
-
103
- def test_handle_funny_characters_in_class_method_names
104
- @chaser = TestChaser.new("Chased", "self.[]")
105
- assert_equal 2, Chased[1], "Original doesn't work"
106
- @chaser.modify_method
107
- assert_equal 7, Chased[1], "Modified doesn't work"
108
- @chaser.unmodify_method
109
- assert_equal 2, Chased[1], "Modified then unmodified doesn't work"
110
- end
111
-
112
- def test_more_funny_characters
113
- assert_nothing_raised("Can't handle certain characters") do
114
- @chaser = TestChaser.new("Chased", "question?")
115
- chased = Chased.new
116
- chased.question?
117
- @chaser.modify_method
118
- chased.question?
119
- @chaser.unmodify_method
120
- chased.question?
121
- end
122
-
123
- assert_nothing_raised("Can't handle equal signs") do
124
- @chaser = TestChaser.new("Chased", "foo=")
125
- chased = Chased.new
126
- chased.foo= 1
127
- @chaser.modify_method
128
- chased.foo = 2
129
- @chaser.unmodify_method
130
- chased.foo = 3
131
- end
132
- end
133
- end
134
-
135
-
136
- class ZombieTestChaserCase < Test::Unit::TestCase
137
- def test_detects_invalid_glob
138
- incorrect_glob = 'test\test_chaser.rb'
139
- ZombieTestChaser.test_pattern = incorrect_glob
140
- assert_raise(RuntimeError, "Can't detect an incorrect glob") do
141
- ZombieTestChaser.create_world
142
- end
143
- end
144
- end
1
+ require 'test/unit/testcase'
2
+ require 'test/unit' if $0 == __FILE__
3
+ require 'zombie-chaser/zombie_test_chaser'
4
+ require 'fixtures/chased'
5
+
6
+ class TestChaser < Chaser
7
+ def rand(*args)
8
+ 5
9
+ end
10
+
11
+ def rand_string
12
+ "l33t h4x0r"
13
+ end
14
+
15
+ def rand_number(*args)
16
+ 5
17
+ end
18
+
19
+ def rand_symbol
20
+ :"l33t h4x0r"
21
+ end
22
+ end
23
+
24
+ module ChaserTestCaseHelper
25
+ def create_chaser(klass_name, method_name)
26
+ # Fixme the third variable is for a reporter. The fact that it's not being used suggests that we're not using
27
+ # the whole of the TestChaser, and ought to split it up into smaller classes
28
+ TestChaser.new(klass_name, method_name, nil)
29
+ end
30
+ end
31
+
32
+ class ChaserTestCase < Test::Unit::TestCase
33
+ include ChaserTestCaseHelper
34
+
35
+ unless defined? Mini then
36
+ undef_method :default_test
37
+ alias :refute_equal :assert_not_equal
38
+ end
39
+
40
+ def setup
41
+ end
42
+
43
+ def teardown
44
+ @chaser.unmodify_method if defined?(@chaser) && @chaser
45
+ end
46
+
47
+ def test_unmodified_behaves_as_expected
48
+ chased = Chased.new
49
+ assert_equal 5, chased.add(2,3), "Unmodified version should equal 5"
50
+ end
51
+
52
+ def test_modify_and_unmodify_instance_method
53
+ @chaser = create_chaser("Chased", "add")
54
+ chased = Chased.new
55
+ assert_equal 5, chased.add(2,3), "method has been modified before it should have been"
56
+ @chaser.modify_method
57
+ assert_equal 10, chased.add(2,3), "method hasn't been modified"
58
+ @chaser.unmodify_method
59
+ assert_equal 5, chased.add(2,3), "method should be back to normal, but it isn't"
60
+ end
61
+
62
+ def test_modify_and_unmodify_string
63
+ @chaser = create_chaser("Chased", "say_hello")
64
+ chased = Chased.new
65
+ assert_equal "G'day!", chased.say_hello, "method has been modified before it should have been"
66
+ @chaser.modify_method
67
+ assert_equal "l33t h4x0r", chased.say_hello, "method hasn't been modified"
68
+ @chaser.unmodify_method
69
+ assert_equal "G'day!", chased.say_hello, "method should be back to normal, but it isn't"
70
+ end
71
+
72
+ def test_modify_and_unmodify_class_method
73
+ @chaser = create_chaser("Chased", "self.static_method")
74
+ assert_equal "Zap!", Chased.static_method, "class method has been modified before it should have been"
75
+ @chaser.modify_method
76
+ assert_equal "l33t h4x0r", Chased.static_method, "class method hasn't been modified"
77
+ @chaser.unmodify_method
78
+ assert_equal "Zap!", Chased.static_method, "class method should be back to normal, but it isn't"
79
+ end
80
+
81
+ def test_pass_blocks_on_in_instance_methods
82
+ @chaser = create_chaser("Chased", "block_yielding_instance_method")
83
+ chased = Chased.new
84
+ assert_equal [2,4,6], chased.block_using_instance_method, "block yielding instance method has been modified before it should have been"
85
+ @chaser.modify_method
86
+ assert_equal [12, 14, 16], chased.block_using_instance_method, "yielded values haven't been modified"
87
+ @chaser.unmodify_method
88
+ assert_equal [2,4,6], chased.block_using_instance_method, "block yielding instance method has been modified before it should have been"
89
+ end
90
+
91
+ def test_pass_blocks_on_in_class_methods
92
+ @chaser = create_chaser("Chased", "self.block_yielding_class_method")
93
+ assert_equal [2,4], Chased.block_using_class_method, "block yielding class method has been modified before it should have been"
94
+ @chaser.modify_method
95
+ assert_equal [12, 14], Chased.block_using_class_method, "yielded values haven't been modified"
96
+ @chaser.unmodify_method
97
+ assert_equal [2,4], Chased.block_using_class_method, "block yielding class method has been modified before it should have been"
98
+ end
99
+
100
+ def test_handle_funny_characters_in_instance_method_names
101
+ @chaser = create_chaser("Chased", "[]")
102
+ chased = Chased.new
103
+ assert_equal 2, chased[1], "Original doesn't work"
104
+ @chaser.modify_method
105
+ assert_equal 7, chased[1], "Modified doesn't work"
106
+ @chaser.unmodify_method
107
+ assert_equal 2, chased[1], "Modified then unmodified doesn't work"
108
+ end
109
+
110
+ def test_handle_funny_characters_in_class_method_names
111
+ @chaser = create_chaser("Chased", "self.[]")
112
+ assert_equal 2, Chased[1], "Original doesn't work"
113
+ @chaser.modify_method
114
+ assert_equal 7, Chased[1], "Modified doesn't work"
115
+ @chaser.unmodify_method
116
+ assert_equal 2, Chased[1], "Modified then unmodified doesn't work"
117
+ end
118
+
119
+ def test_more_funny_characters
120
+ assert_nothing_raised("Can't handle certain characters") do
121
+ @chaser = create_chaser("Chased", "question?")
122
+ chased = Chased.new
123
+ chased.question?
124
+ @chaser.modify_method
125
+ chased.question?
126
+ @chaser.unmodify_method
127
+ chased.question?
128
+ end
129
+
130
+ assert_nothing_raised("Can't handle equal signs") do
131
+ @chaser = create_chaser("Chased", "foo=")
132
+ chased = Chased.new
133
+ chased.foo= 1
134
+ @chaser.modify_method
135
+ chased.foo = 2
136
+ @chaser.unmodify_method
137
+ chased.foo = 3
138
+ end
139
+ end
140
+ end
141
+
142
+
143
+ class ZombieTestChaserCase < Test::Unit::TestCase
144
+ def test_detects_invalid_glob
145
+ incorrect_glob = 'test\test_chaser.rb'
146
+ assert_raise(RuntimeError, "Can't detect an incorrect glob") do
147
+ TestUnitHandler.new(incorrect_glob)
148
+ end
149
+ end
150
+ end