mocha 0.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 (43) hide show
  1. data/COPYING +3 -0
  2. data/README +148 -0
  3. data/lib/auto_mocha.rb +1 -0
  4. data/lib/auto_mocha/auto_mock.rb +54 -0
  5. data/lib/auto_mocha/mock_class.rb +38 -0
  6. data/lib/mocha.rb +1 -0
  7. data/lib/mocha/expectation.rb +116 -0
  8. data/lib/mocha/infinite_range.rb +27 -0
  9. data/lib/mocha/inspect.rb +37 -0
  10. data/lib/mocha/metaclass.rb +7 -0
  11. data/lib/mocha/mock.rb +30 -0
  12. data/lib/mocha/mock_methods.rb +55 -0
  13. data/lib/mocha/pretty_parameters.rb +28 -0
  14. data/lib/stubba.rb +2 -0
  15. data/lib/stubba/any_instance_method.rb +31 -0
  16. data/lib/stubba/class_method.rb +61 -0
  17. data/lib/stubba/instance_method.rb +22 -0
  18. data/lib/stubba/object.rb +77 -0
  19. data/lib/stubba/stubba.rb +27 -0
  20. data/lib/stubba/test_case.rb +65 -0
  21. data/test/all_tests.rb +100 -0
  22. data/test/auto_mocha/auto_mock_test.rb +85 -0
  23. data/test/auto_mocha/mock_class_test.rb +179 -0
  24. data/test/auto_mock_acceptance_test.rb +36 -0
  25. data/test/method_definer.rb +18 -0
  26. data/test/mocha/expectation_test.rb +216 -0
  27. data/test/mocha/infinite_range_test.rb +50 -0
  28. data/test/mocha/inspect_test.rb +79 -0
  29. data/test/mocha/mock_methods_test.rb +141 -0
  30. data/test/mocha/mock_test.rb +64 -0
  31. data/test/mocha/pretty_parameters_test.rb +32 -0
  32. data/test/mocha_acceptance_test.rb +112 -0
  33. data/test/stubba/any_instance_method_test.rb +113 -0
  34. data/test/stubba/class_method_test.rb +149 -0
  35. data/test/stubba/instance_method_test.rb +97 -0
  36. data/test/stubba/object_test.rb +147 -0
  37. data/test/stubba/stubba_test.rb +62 -0
  38. data/test/stubba/test_case_test.rb +41 -0
  39. data/test/stubba_acceptance_test.rb +107 -0
  40. data/test/stubba_integration_test.rb +59 -0
  41. data/test/stubba_replacer.rb +13 -0
  42. data/test/test_helper.rb +4 -0
  43. metadata +91 -0
@@ -0,0 +1,55 @@
1
+ require 'mocha/expectation'
2
+
3
+ module Mocha
4
+ module MockMethods
5
+
6
+ def expectations
7
+ @expectations ||= []
8
+ end
9
+
10
+ def expects(symbol)
11
+ expectations << Expectation.new(symbol)
12
+ expectations.last
13
+ end
14
+
15
+ def stubs(symbol)
16
+ expectations << Stub.new(symbol)
17
+ expectations.last
18
+ end
19
+
20
+ def method_missing(symbol, *arguments, &block)
21
+ matching_expectation = matching_expectation(symbol, *arguments)
22
+ if matching_expectation then
23
+ matching_expectation.invoke
24
+ else
25
+ begin
26
+ super_method_missing(symbol, *arguments, &block)
27
+ rescue NoMethodError
28
+ unexpected_method_called(symbol, *arguments)
29
+ end
30
+ end
31
+ end
32
+
33
+ def super_method_missing(symbol, *arguments, &block)
34
+ raise NoMethodError
35
+ end
36
+
37
+ def unexpected_method_called(symbol, *arguments)
38
+ MissingExpectation.new(symbol, expectations).with(*arguments).verify
39
+ end
40
+
41
+ def matching_expectation(symbol, *arguments)
42
+ expectations.detect { |expectation| expectation.match?(symbol, *arguments) }
43
+ end
44
+
45
+ def expectations_matching(method_names)
46
+ expectations.select { |expectation| method_names.include?(expectation.method_name) }
47
+ end
48
+
49
+ def verify(*method_names)
50
+ for_verification = method_names.empty? ? expectations : expectations_matching(method_names)
51
+ for_verification.each { |expectation| expectation.verify }
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,28 @@
1
+ require 'mocha/inspect'
2
+
3
+ module Mocha
4
+
5
+ class PrettyParameters
6
+
7
+ def initialize(params)
8
+ @params = params
9
+ @params_string = params.mocha_inspect
10
+ end
11
+
12
+ def pretty
13
+ remove_outer_array_braces!
14
+ remove_outer_hash_braces!
15
+ @params_string
16
+ end
17
+
18
+ def remove_outer_array_braces!
19
+ @params_string = @params_string.gsub(/^\[|\]$/, '')
20
+ end
21
+
22
+ def remove_outer_hash_braces!
23
+ @params_string = @params_string.gsub(/^\{|\}$/, '') if @params.size == 1
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,2 @@
1
+ require 'stubba/test_case'
2
+ require 'stubba/object'
@@ -0,0 +1,31 @@
1
+ require 'stubba/class_method'
2
+
3
+ module Stubba
4
+
5
+ class AnyInstanceMethod < ClassMethod
6
+
7
+ def unstub
8
+ remove_new_method
9
+ restore_original_method
10
+ object.any_instance.reset_mocha
11
+ end
12
+
13
+ def hide_original_method
14
+ object.class_eval "alias_method :#{hidden_method}, :#{method}" if object.method_defined?(method)
15
+ end
16
+
17
+ def define_new_method
18
+ object.class_eval "def #{method}(*args, &block); self.class.any_instance.mocha.method_missing(:#{method}, *args, &block); end"
19
+ end
20
+
21
+ def remove_new_method
22
+ object.class_eval "remove_method :#{method}"
23
+ end
24
+
25
+ def restore_original_method
26
+ object.class_eval "alias_method :#{method}, :#{hidden_method}; remove_method :#{hidden_method}" if object.method_defined?(hidden_method)
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,61 @@
1
+ require 'mocha/metaclass'
2
+
3
+ module Stubba
4
+
5
+ class ClassMethod
6
+
7
+ attr_reader :object, :method
8
+
9
+ def initialize(object, method)
10
+ @object, @method = object, method
11
+ end
12
+
13
+ def stub
14
+ hide_original_method
15
+ define_new_method
16
+ end
17
+
18
+ def unstub
19
+ remove_new_method
20
+ restore_original_method
21
+ object.reset_mocha
22
+ end
23
+
24
+ def hide_original_method
25
+ object.metaclass.class_eval "alias_method :#{hidden_method}, :#{method}" if object.metaclass.method_defined?(method)
26
+ end
27
+
28
+ def define_new_method
29
+ object.metaclass.class_eval "def #{method}(*args, &block); mocha.method_missing(:#{method}, *args, &block); end"
30
+ end
31
+
32
+ def remove_new_method
33
+ object.metaclass.class_eval "remove_method :#{method}"
34
+ end
35
+
36
+ def restore_original_method
37
+ object.metaclass.class_eval "alias_method :#{method}, :#{hidden_method}; remove_method :#{hidden_method}" if object.metaclass.method_defined?(hidden_method)
38
+ end
39
+
40
+ def hidden_method
41
+ "__stubba__#{method.to_s.sub('!', '_exclamation_mark').sub('?', '_question_mark')}__stubba__"
42
+ end
43
+
44
+ def cannot_replace_method_error
45
+ Test::Unit::AssertionFailedError.new("Cannot replace #{method} because it is not defined in #{object}.")
46
+ end
47
+
48
+ def eql?(other)
49
+ return false unless (other.class == self.class)
50
+ (object == other.object) and (method == other.method)
51
+ end
52
+
53
+ alias_method :==, :eql?
54
+
55
+ def to_s
56
+ "#{object}.#{method}"
57
+ end
58
+
59
+ end
60
+
61
+ end
@@ -0,0 +1,22 @@
1
+ require 'stubba/class_method'
2
+
3
+ module Stubba
4
+
5
+ class InstanceMethod < ClassMethod
6
+
7
+ def stub
8
+ raise cannot_replace_method_error unless exists?
9
+ define_new_method
10
+ end
11
+
12
+ def unstub
13
+ # intentionally empty
14
+ end
15
+
16
+ def exists?
17
+ object.respond_to?(method)
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,77 @@
1
+ require 'mocha/mock'
2
+ require 'stubba/instance_method'
3
+ require 'stubba/class_method'
4
+ require 'stubba/any_instance_method'
5
+
6
+ class Object
7
+
8
+ def mocha
9
+ @mocha ||= Mocha::Mock.new
10
+ end
11
+
12
+ def reset_mocha
13
+ @mocha = nil
14
+ end
15
+
16
+ def stubba_method
17
+ Stubba::InstanceMethod
18
+ end
19
+
20
+ def stubba_object
21
+ self
22
+ end
23
+
24
+ def expects(symbol)
25
+ method = stubba_method.new(stubba_object, symbol)
26
+ $stubba.stub(method)
27
+ mocha.expects(symbol)
28
+ end
29
+
30
+ def stubs(symbol)
31
+ method = stubba_method.new(stubba_object, symbol)
32
+ $stubba.stub(method)
33
+ mocha.stubs(symbol)
34
+ end
35
+
36
+ def verify(*method_names)
37
+ mocha.verify(*method_names)
38
+ end
39
+
40
+ end
41
+
42
+ class Module
43
+
44
+ def stubba_method
45
+ Stubba::ClassMethod
46
+ end
47
+
48
+ end
49
+
50
+ class Class
51
+
52
+ def stubba_method
53
+ Stubba::ClassMethod
54
+ end
55
+
56
+ class AnyInstance
57
+
58
+ def initialize(klass)
59
+ @stubba_object = klass
60
+ end
61
+
62
+ def stubba_method
63
+ Stubba::AnyInstanceMethod
64
+ end
65
+
66
+ def stubba_object
67
+ @stubba_object
68
+ end
69
+
70
+ end
71
+
72
+ def any_instance
73
+ @any_instance ||= AnyInstance.new(self)
74
+ end
75
+
76
+ end
77
+
@@ -0,0 +1,27 @@
1
+ module Stubba
2
+
3
+ class Stubba
4
+
5
+ attr_accessor :stubba_methods
6
+
7
+ def initialize
8
+ self.stubba_methods = []
9
+ end
10
+
11
+ def stub(method)
12
+ unless stubba_methods.include?(method)
13
+ method.stub
14
+ stubba_methods.push method
15
+ end
16
+ end
17
+
18
+ def unstub_all
19
+ while stubba_methods.size > 0
20
+ method = stubba_methods.pop
21
+ method.unstub
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,65 @@
1
+ require 'stubba/stubba'
2
+
3
+ class Test::Unit::TestCase
4
+
5
+ def self.method_added(method)
6
+ # disable until we finish messing about
7
+ end
8
+
9
+ def setup_with_stubba
10
+ $stubba = Stubba::Stubba.new
11
+ end
12
+
13
+ def teardown_with_stubba
14
+ $stubba.unstub_all
15
+ $stubba = nil
16
+ end
17
+
18
+ if method_defined?(:setup) then
19
+ alias_method :setup_pre_stubba, :setup
20
+ define_method(:setup_post_stubba) do
21
+ setup_pre_stubba
22
+ setup_with_stubba
23
+ end
24
+ else
25
+ define_method(:setup_post_stubba) do
26
+ setup_with_stubba
27
+ end
28
+ end
29
+ alias_method :setup, :setup_post_stubba
30
+
31
+ if method_defined?(:teardown) then
32
+ alias_method :teardown_pre_stubba, :teardown
33
+ define_method(:teardown_post_stubba) do
34
+ teardown_with_stubba
35
+ teardown_pre_stubba
36
+ end
37
+ else
38
+ define_method(:teardown_post_stubba) do
39
+ teardown_with_stubba
40
+ end
41
+ end
42
+ alias_method :teardown, :teardown_post_stubba
43
+
44
+ def self.method_added(method)
45
+ case method
46
+ when :setup
47
+ unless method_defined?(:setup_without_stubba)
48
+ alias_method :setup_without_stubba, :setup
49
+ define_method(:setup) do
50
+ setup_post_stubba
51
+ setup_without_stubba
52
+ end
53
+ end
54
+ when :teardown
55
+ unless method_defined?(:teardown_without_stubba)
56
+ alias_method :teardown_without_stubba, :teardown
57
+ define_method(:teardown) do
58
+ teardown_without_stubba
59
+ teardown_post_stubba
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ end
@@ -0,0 +1,100 @@
1
+ require 'test_helper'
2
+ require 'stubba/test_case' # only works if loaded before any derived test cases
3
+
4
+ require 'test/unit/ui/console/testrunner'
5
+
6
+ require 'mocha/inspect_test'
7
+ require 'mocha/pretty_parameters_test'
8
+ require 'mocha/expectation_test'
9
+ require 'mocha/infinite_range_test'
10
+ require 'mocha/mock_methods_test'
11
+ require 'mocha/mock_test'
12
+
13
+ class MochaUnitTests
14
+
15
+ def self.suite
16
+ suite = Test::Unit::TestSuite.new('MochaUnitTests')
17
+ suite << InspectTest.suite
18
+ suite << PrettyParametersTest.suite
19
+ suite << ExpectationTest.suite
20
+ suite << InfiniteRangeTest.suite
21
+ suite << MockMethodsTest.suite
22
+ suite << MockTest.suite
23
+ suite
24
+ end
25
+
26
+ end
27
+
28
+ Test::Unit::UI::Console::TestRunner.run(MochaUnitTests)
29
+
30
+ require 'auto_mocha/mock_class_test'
31
+ require 'auto_mocha/auto_mock_test'
32
+
33
+ class AutoMochaUnitTests
34
+
35
+ def self.suite
36
+ suite = Test::Unit::TestSuite.new('AutoMochaUnitTests')
37
+ suite << AutoMockTest.suite
38
+ suite << MockClassTest.suite
39
+ end
40
+
41
+ end
42
+
43
+ Test::Unit::UI::Console::TestRunner.run(AutoMochaUnitTests)
44
+
45
+ require 'stubba/stubba_test'
46
+ require 'stubba/class_method_test'
47
+ require 'stubba/instance_method_test'
48
+ require 'stubba/any_instance_method_test'
49
+ require 'stubba/test_case_test'
50
+
51
+ class StubbaUnitTests
52
+
53
+ def self.suite
54
+ suite = Test::Unit::TestSuite.new('StubbaUnitTests')
55
+ suite << StubbaTest.suite
56
+ suite << ClassMethodTest.suite
57
+ suite << InstanceMethodTest.suite
58
+ suite << AnyInstanceMethodTest.suite
59
+ suite << TestCaseTest.suite
60
+ suite
61
+ end
62
+
63
+ end
64
+
65
+ Test::Unit::UI::Console::TestRunner.run(StubbaUnitTests)
66
+
67
+ require 'stubba/object_test'
68
+
69
+ class IsolatedStubbaUnitTests # avoid loading stubba_object until now which breaks other stubba unit tests
70
+
71
+ def self.suite
72
+ suite = Test::Unit::TestSuite.new('IsolatedStubbaUnitTests')
73
+ suite << ObjectTest.suite
74
+ suite
75
+ end
76
+
77
+ end
78
+
79
+ Test::Unit::UI::Console::TestRunner.run(IsolatedStubbaUnitTests)
80
+
81
+ require 'stubba_integration_test'
82
+ Test::Unit::UI::Console::TestRunner.run(StubbaIntegrationTest)
83
+
84
+ require 'mocha_acceptance_test'
85
+ require 'stubba_acceptance_test'
86
+ require 'auto_mock_acceptance_test'
87
+
88
+ class AcceptanceTests
89
+
90
+ def self.suite
91
+ suite = Test::Unit::TestSuite.new('AcceptanceTests')
92
+ suite << MochaAcceptanceTest.suite
93
+ suite << StubbaAcceptanceTest.suite
94
+ suite << AutoMockAcceptanceTest.suite
95
+ suite
96
+ end
97
+
98
+ end
99
+
100
+ Test::Unit::UI::Console::TestRunner.run(AcceptanceTests)