MacSpec 0.3.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 (59) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +20 -0
  5. data/Rakefile +53 -0
  6. data/lib/mac_spec.rb +59 -0
  7. data/lib/mac_spec/matcher_system.rb +19 -0
  8. data/lib/mac_spec/matcher_system/built_in/change_expectations.rb +36 -0
  9. data/lib/mac_spec/matcher_system/built_in/enumerable_expectations.rb +43 -0
  10. data/lib/mac_spec/matcher_system/built_in/error_expectations.rb +68 -0
  11. data/lib/mac_spec/matcher_system/built_in/operator_expectations.rb +45 -0
  12. data/lib/mac_spec/matcher_system/built_in/truth_expectations.rb +148 -0
  13. data/lib/mac_spec/matcher_system/core/def_matcher.rb +14 -0
  14. data/lib/mac_spec/matcher_system/core/exceptions.rb +7 -0
  15. data/lib/mac_spec/matcher_system/core/expectation_builder.rb +11 -0
  16. data/lib/mac_spec/matcher_system/core/matcher_builder.rb +53 -0
  17. data/lib/mac_spec/matcher_system/core/modals.rb +36 -0
  18. data/lib/mac_spec/mocking_framework.rb +13 -0
  19. data/lib/mac_spec/mocking_framework/extensions/kernel_extension.rb +14 -0
  20. data/lib/mac_spec/mocking_framework/extensions/object_extension.rb +74 -0
  21. data/lib/mac_spec/mocking_framework/message_expectation.rb +127 -0
  22. data/lib/mac_spec/mocking_framework/mock.rb +20 -0
  23. data/lib/mac_spec/testing_framework.rb +13 -0
  24. data/lib/mac_spec/testing_framework/core/functions.rb +26 -0
  25. data/lib/mac_spec/testing_framework/core/kernel_extension.rb +27 -0
  26. data/lib/mac_spec/testing_framework/core/test_case_class_methods.rb +90 -0
  27. data/lib/mac_spec/version.rb +3 -0
  28. data/test/all.rb +6 -0
  29. data/test/mac_spec/matcher_system/built_in/change_expectations_test.rb +68 -0
  30. data/test/mac_spec/matcher_system/built_in/enumerable_expectations_test.rb +91 -0
  31. data/test/mac_spec/matcher_system/built_in/error_expectations_test.rb +144 -0
  32. data/test/mac_spec/matcher_system/built_in/operator_expectations_test.rb +136 -0
  33. data/test/mac_spec/matcher_system/built_in/truth_expectations_test.rb +373 -0
  34. data/test/mac_spec/matcher_system/core/def_matcher_test.rb +100 -0
  35. data/test/mac_spec/matcher_system/core/expectation_builder_test.rb +34 -0
  36. data/test/mac_spec/matcher_system/core/matcher_builder_test.rb +72 -0
  37. data/test/mac_spec/matcher_system/core/modals_test.rb +39 -0
  38. data/test/mac_spec/matcher_system/script.rb +29 -0
  39. data/test/mac_spec/matcher_system/test_helper.rb +2 -0
  40. data/test/mac_spec/mocking_framework/extensions/kernel_extension_test.rb +37 -0
  41. data/test/mac_spec/mocking_framework/extensions/object_extension_test.rb +9 -0
  42. data/test/mac_spec/mocking_framework/message_expectation_test.rb +9 -0
  43. data/test/mac_spec/mocking_framework/mock_test.rb +9 -0
  44. data/test/mac_spec/mocking_framework/regression/mocking_class_methods_test.rb +96 -0
  45. data/test/mac_spec/mocking_framework/regression/negative_expectation_test.rb +33 -0
  46. data/test/mac_spec/mocking_framework/regression/stub_test.rb +19 -0
  47. data/test/mac_spec/mocking_framework/test_helper.rb +1 -0
  48. data/test/mac_spec/test_helper.rb +1 -0
  49. data/test/mac_spec/testing_framework/performance/x_test_performance.rb +125 -0
  50. data/test/mac_spec/testing_framework/regression/before_test.rb +32 -0
  51. data/test/mac_spec/testing_framework/regression/deep_nested_example_groups_test.rb +20 -0
  52. data/test/mac_spec/testing_framework/regression/description_string_test.rb +13 -0
  53. data/test/mac_spec/testing_framework/regression/example_name_test.rb +11 -0
  54. data/test/mac_spec/testing_framework/regression/inherit_not_double_test.rb +39 -0
  55. data/test/mac_spec/testing_framework/regression/surrounding_module_scope_test.rb +31 -0
  56. data/test/mac_spec/testing_framework/regression/testing_functions_test.rb +66 -0
  57. data/test/mac_spec/testing_framework/test_helper.rb +1 -0
  58. data/test/test_helper.rb +1 -0
  59. metadata +150 -0
@@ -0,0 +1,90 @@
1
+ module MacSpec
2
+ module TestingFramework
3
+ # The methods defined in this module are available
4
+ # inside the TestCases.
5
+ module TestCaseClassMethods
6
+ attr_accessor :desc, :setup_chained, :teardown_chained
7
+ @desc ||= ""
8
+ def setup_chained # :nodoc:
9
+ @setup_chained || lambda {}
10
+ end
11
+
12
+ def teardown_chained # :nodoc:
13
+ @teardown_chained || lambda {}
14
+ end
15
+
16
+ def testcases
17
+ @@testcases ||= []
18
+ @@testcases
19
+ end
20
+
21
+ def own_tests
22
+ @own_tests ||= []
23
+ end
24
+
25
+ def all_tests
26
+ @@_tests ||= []
27
+ end
28
+
29
+ def macspec_superclass
30
+ @macspec_superclass
31
+ end
32
+
33
+ def macspec_superclass=(sc)
34
+ @macspec_superclass = sc
35
+ end
36
+
37
+ # == Run before each Test.
38
+ # The code in the block attached to this method will be run before each
39
+ # test in all subsequent, eventually nested testcases.
40
+ def setup(&block)
41
+ passed_through_setup = self.setup_chained
42
+ self.setup_chained = lambda { instance_eval(&passed_through_setup);instance_eval(&block) }
43
+ define_method :setup, &self.setup_chained
44
+ end
45
+ alias before setup
46
+
47
+ # == Run after each Test.
48
+ # The code in the block attached to this method will be run after each
49
+ # test in all subsequent, eventually nested testcases.
50
+ def teardown(&block)
51
+ passed_through_teardown = self.teardown_chained
52
+ self.teardown_chained = lambda {instance_eval(&block);instance_eval(&passed_through_teardown) }
53
+ define_method :teardown, &self.teardown_chained
54
+ end
55
+ alias after teardown
56
+
57
+ # == Define a TestCase.
58
+ def describe desc, &block
59
+ cls = Class.new(macspec_superclass)
60
+ mods = self.ancestors.reject {|m| Module === m }
61
+ Object.const_set(self.name + desc.to_s.split(/\W+/).map { |s| s.capitalize }.join, cls)
62
+ cls.setup_chained = self.setup_chained
63
+ cls.teardown_chained = self.teardown_chained
64
+ cls.macspec_superclass = self.macspec_superclass
65
+ cls.desc = self.desc + " " + desc
66
+ cls.tests($1.constantize) if defined?(Rails) &&
67
+ self.name =~ /^(.*(Controller|Helper|Mailer))Test/ &&
68
+ self < ActiveSupport::TestCase
69
+ mods = self.ancestors.select {|m| m.class.to_s == "Module" }
70
+ orig_block = block
71
+ block = lambda {include *mods; instance_eval(&orig_block)}
72
+ cls.class_eval(&block)
73
+ self.testcases << cls
74
+ end
75
+
76
+ # == Define a test.
77
+ def it desc, &block
78
+ self.setup {}
79
+ desc = MacSpec::TestingFramework::Functions.make_constantizeable(desc)
80
+ if block_given?
81
+ test = "test_#{desc.gsub(/\W+/, '_').downcase}"
82
+ define_method(test, &lambda {$current_spec = self; instance_eval(&block)})
83
+ (@@_tests ||= []) << test.to_sym
84
+ (@own_tests ||= []) << test.to_sym
85
+ end
86
+ self.teardown {}
87
+ end
88
+ end # TestCaseClassMethods
89
+ end
90
+ end # MacSpec
@@ -0,0 +1,3 @@
1
+ module MacSpec
2
+ VERSION = "0.3.1"
3
+ end
data/test/all.rb ADDED
@@ -0,0 +1,6 @@
1
+ dir = File.dirname(__FILE__)
2
+ Dir[File.expand_path("#{dir}/**/*.rb")].uniq.each do |file|
3
+ if (file =~ /\/\w+_test\.rb$/)
4
+ require file
5
+ end
6
+ end
@@ -0,0 +1,68 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module MacSpec
4
+ module MatcherSystem
5
+ describe "change matcher" do
6
+ before do
7
+ @var = 1
8
+ end
9
+
10
+ it "passing" do
11
+ lambda {@var += 1}.should change {@var}
12
+ end
13
+
14
+ it "change fails" do
15
+ lambda do
16
+ lambda { }.should change {@var}
17
+ end.should raise_error
18
+ end
19
+
20
+ it "change by" do
21
+ lambda {@var += 1}.should change {@var}.by(1)
22
+ end
23
+
24
+ it "change by fails" do
25
+ lambda do
26
+ lambda {@var += 2}.should change {@var}.by(1)
27
+ end.should raise_error
28
+ end
29
+
30
+ it "change by at least" do
31
+ lambda {@var += 1}.should change {@var}.by_at_least(1)
32
+ end
33
+
34
+ it "change by at least fails" do
35
+ lambda do
36
+ lambda {@var += 0.9}.should change {@var}.by_at_least(1)
37
+ end.should raise_error
38
+ end
39
+
40
+ it "change by at most" do
41
+ lambda {@var += 1}.should change {@var}.by_at_most(1)
42
+ end
43
+
44
+ it "change by at most fails" do
45
+ lambda do
46
+ lambda {@var += 1.1}.should change {@var}.by_at_most(1)
47
+ end.should raise_error
48
+ end
49
+
50
+ it "change from to" do
51
+ lambda {@var += 1}.should change {@var}.from(1).to(2)
52
+ end
53
+
54
+ it "change from to fails" do
55
+ lambda do
56
+ lambda {@var += 1.1}.should change {@var}.from(1).to(2)
57
+ end.should raise_error
58
+ end
59
+
60
+ it "raises unsupported message sent" do
61
+ lambda do
62
+ lambda {@var += 1.1}.should change {@var}.unsupported_message
63
+ end.should raise_error Exceptions::UnsupportedMessageSentToMatcher
64
+ end
65
+ end
66
+
67
+ end
68
+ end
@@ -0,0 +1,91 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ describe "Enumerable Expectations" do
4
+ it "include" do
5
+ [1,2,3,4].should include(4)
6
+ end
7
+
8
+ it "include fail" do
9
+ lambda {
10
+ [1,2,3,4].should include(6)
11
+ }.should raise_error(MacSpec.assertion_failed_error)
12
+ end
13
+
14
+ it "exclude" do
15
+ [1,2,3,4].should exclude(9)
16
+ end
17
+
18
+ it "exclude fail" do
19
+ lambda {
20
+ [1,2,3,4].should exclude(4)
21
+ }.should raise_error(MacSpec.assertion_failed_error)
22
+ end
23
+
24
+ it "multi include" do
25
+ [1,2,3,4].should include(1,2)
26
+ end
27
+
28
+ it "multi include fail" do
29
+ lambda {
30
+ [1,2,3,4].should include(6,7,8)
31
+ }.should raise_error(MacSpec.assertion_failed_error)
32
+ end
33
+
34
+ it "multi exclude" do
35
+ [1,2,3,4].should exclude(13,14)
36
+ end
37
+
38
+ it "multi exclude fail" do
39
+ lambda {
40
+ [1,2,3,4].should exclude(2,3,4)
41
+ }.should raise_error(MacSpec.assertion_failed_error)
42
+ end
43
+
44
+ it "negative include" do
45
+ [1,2,3,4].should_not include(9)
46
+ end
47
+
48
+ it "negative include fail" do
49
+ lambda {
50
+ [1,2,3,4].should_not include(4)
51
+ }.should raise_error(MacSpec.assertion_failed_error)
52
+ end
53
+
54
+ it "negative exclude" do
55
+ [1,2,3,4].should_not exclude(3)
56
+ end
57
+
58
+ it "negative exclude fail" do
59
+ lambda {
60
+ [1,2,3,4].should_not exclude(6,7)
61
+ }.should raise_error(MacSpec.assertion_failed_error)
62
+ end
63
+
64
+ it "include fail message" do
65
+ obj = include(1)
66
+ obj.matches?([4,5,6])
67
+
68
+ obj.failure_message.should be("Expected [4, 5, 6] to include [1].")
69
+ end
70
+
71
+ it "include negative fail message" do
72
+ obj = include(1)
73
+ obj.matches?([4,5,6])
74
+
75
+ obj.negative_failure_message.should be("Expected [4, 5, 6] to not include [1].")
76
+ end
77
+
78
+ it "exclude fail message" do
79
+ obj = exclude(4)
80
+ obj.matches?([4,5,6])
81
+
82
+ obj.failure_message.should be("Expected [4, 5, 6] to exclude [4].")
83
+ end
84
+
85
+ it "exclude negative fail message" do
86
+ obj = exclude(4)
87
+ obj.matches?([4,5,6])
88
+
89
+ obj.negative_failure_message.should be("Expected [4, 5, 6] to not exclude [4].")
90
+ end
91
+ end
@@ -0,0 +1,144 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ describe "Error Expectations" do
4
+ it "raises error" do
5
+ lambda { raise "FAIL" }.should raise_error
6
+ end
7
+
8
+ it "raises error fail" do
9
+ lambda {
10
+ lambda { "WIN" }.should raise_error
11
+ }.should raise_error(MacSpec.assertion_failed_error)
12
+ end
13
+
14
+ it "negative raises error" do
15
+ lambda { "WIN" }.should_not raise_error
16
+ end
17
+
18
+ it "negative raises error fail" do
19
+ lambda {
20
+ lambda { raise "FAIL" }.should_not raise_error
21
+ }.should raise_error(MacSpec.assertion_failed_error)
22
+ end
23
+
24
+ it "raises specific error" do
25
+ lambda { raise TypeError }.should raise_error(TypeError)
26
+ end
27
+
28
+ it "raises specific error fail with no error" do
29
+ lambda {
30
+ lambda { "WIN" }.should raise_error(TypeError)
31
+ }.should raise_error(MacSpec.assertion_failed_error)
32
+ end
33
+
34
+ it "raises specific error fail with different error" do
35
+ lambda {
36
+ lambda { raise StandardError }.should raise_error(TypeError)
37
+ }.should raise_error(MacSpec.assertion_failed_error)
38
+ end
39
+
40
+ it "throws symbol" do
41
+ lambda {
42
+ throw :win
43
+ }.should throw_symbol(:win)
44
+ end
45
+
46
+ it "throws symbol fails with different symbol" do
47
+ lambda {
48
+ lambda {
49
+ throw :fail
50
+ }.should throw_symbol(:win)
51
+ }.should raise_error(MacSpec.assertion_failed_error)
52
+ end
53
+
54
+ it "negative throws symbol" do
55
+ lambda {
56
+ "not this time!"
57
+ }.should_not throw_symbol(:win)
58
+ end
59
+
60
+ it "negative throws symbol fails with different symbol" do
61
+
62
+ lambda{
63
+ lambda {
64
+ throw :fail
65
+ }.should_not throw_symbol(:fail)
66
+ }.should raise_error(MacSpec.assertion_failed_error)
67
+
68
+ end
69
+
70
+ it "error fail message" do
71
+ obj = raise_error(TypeError)
72
+ obj.matches?(lambda { raise NameError })
73
+
74
+ obj.failure_message.should =~ /Expected #<(.*)> to raise TypeError, but NameError was raised instead./
75
+ end
76
+
77
+ it "error fail message when no error" do
78
+ obj = raise_error(TypeError)
79
+ obj.matches?(lambda { "moop" })
80
+
81
+ obj.failure_message.should =~ /Expected #<(.*)> to raise TypeError, but none was raised./
82
+ end
83
+
84
+ it "error negative fail message" do
85
+ obj = raise_error(TypeError)
86
+ obj.matches?(lambda { raise TypeError })
87
+
88
+ obj.negative_failure_message.should =~ /Expected #<(.*)> to not raise TypeError./
89
+ end
90
+
91
+ it "throw fail message" do
92
+ obj = throw_symbol(:fail)
93
+ obj.matches?(lambda { throw :lame })
94
+
95
+ obj.failure_message.should =~ /Expected #<(.*)> to throw :fail, but :lame was thrown instead./
96
+ end
97
+
98
+ it "throw fail message when no symbol" do
99
+ obj = throw_symbol(:fail)
100
+ obj.matches?(lambda { "moop" })
101
+
102
+ obj.failure_message.should =~ /Expected #<(.*)> to throw :fail, but no symbol was thrown./
103
+ end
104
+
105
+ it "throw negative fail message" do
106
+ obj = throw_symbol(:fail)
107
+ obj.matches?(lambda { throw :fail })
108
+
109
+ obj.negative_failure_message.should =~ /Expected #<(.*)> to not throw :fail./
110
+ end
111
+
112
+ it "string argument message" do
113
+ lambda {raise "message"}.should raise_error("message")
114
+ end
115
+
116
+ it "string argument message fails no error" do
117
+ lambda do
118
+ lambda { 1 }.should raise_error("message")
119
+
120
+ end.should raise_error
121
+ end
122
+
123
+ it "string argument message fails wrong message" do
124
+ lambda do
125
+ lambda { raise "other message" }.should raise_error("message")
126
+ end.should raise_error
127
+ end
128
+
129
+ it "regexp argument message" do
130
+ lambda {raise "message"}.should raise_error(/essa/)
131
+ end
132
+
133
+ it "regexp argument message fails no error" do
134
+ lambda do
135
+ lambda { 1 }.should raise_error(/essa/)
136
+ end.should raise_error
137
+ end
138
+
139
+ it "regexp argument message fails wrong message" do
140
+ lambda do
141
+ lambda { raise "other message" }.should raise_error(/abc/)
142
+ end.should raise_error(/matching/)
143
+ end
144
+ end
@@ -0,0 +1,136 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ describe "Operator Expectations" do
4
+
5
+ it "equals (==)" do
6
+ 3.should == 3
7
+ end
8
+
9
+ it "equals fails" do
10
+ lambda {
11
+ 3.should == 5
12
+ }.should raise_error(MacSpec.assertion_failed_error)
13
+ end
14
+
15
+ it "negative equals" do
16
+ 3.should_not == 4
17
+ end
18
+
19
+ it "negative equals fails" do
20
+ lambda {
21
+ 3.should_not == 3
22
+ }.should raise_error(MacSpec.assertion_failed_error)
23
+ end
24
+
25
+ it "less than (<)" do
26
+ 3.should < 5
27
+ end
28
+
29
+ it "less than fails" do
30
+ lambda {
31
+ 4.should < 3
32
+ }.should raise_error(MacSpec.assertion_failed_error)
33
+ end
34
+
35
+ it "less than equals" do
36
+ 3.should_not < 2
37
+ end
38
+
39
+ it "negative less than fails" do
40
+ lambda {
41
+ 4.should_not < 5
42
+ }.should raise_error(MacSpec.assertion_failed_error)
43
+ end
44
+
45
+ # GREATER THAN (>)
46
+ it "greater than" do
47
+ 3.should > 2
48
+ end
49
+
50
+ it "greater than fails" do
51
+ lambda {
52
+ 4.should > 5
53
+ }.should raise_error(MacSpec.assertion_failed_error)
54
+ end
55
+
56
+ it "greater than equals" do
57
+ 3.should_not > 5
58
+ end
59
+
60
+ it "negative greater than fails" do
61
+ lambda {
62
+ 4.should_not > 3
63
+ }.should raise_error(MacSpec.assertion_failed_error)
64
+ end
65
+
66
+ # LESS THAN EQUAL (<=)
67
+ it "less than equal" do
68
+ 3.should <= 5
69
+ end
70
+
71
+ it "less than equal equal" do
72
+ 3.should <= 3
73
+ end
74
+
75
+ it "less than equal fails" do
76
+ lambda {
77
+ 4.should <= 3
78
+ }.should raise_error(MacSpec.assertion_failed_error)
79
+ end
80
+
81
+ it "negative less than equal" do
82
+ 3.should_not <= 2
83
+ end
84
+
85
+ it "negative less than equal fails" do
86
+ lambda {
87
+ 4.should_not <= 5
88
+ }.should raise_error(MacSpec.assertion_failed_error)
89
+ end
90
+
91
+ # GREATER THAN EQUALS (>=)
92
+ it "greater than equal" do
93
+ 3.should >= 2
94
+ end
95
+
96
+ it "greater than equal equals" do
97
+ 3.should >= 3
98
+ end
99
+
100
+ it "greater than equal fails" do
101
+ lambda {
102
+ 4.should >= 5
103
+ }.should raise_error(MacSpec.assertion_failed_error)
104
+ end
105
+
106
+ it "negative greater than equal equals" do
107
+ 3.should_not >= 5
108
+ end
109
+
110
+ it "negative greater than equal fails" do
111
+ lambda {
112
+ 4.should_not >= 3
113
+ }.should raise_error(MacSpec.assertion_failed_error)
114
+ end
115
+
116
+ # MATCHES (=~)
117
+ it "matches" do
118
+ "hey world".should =~ /world/
119
+ end
120
+
121
+ it "matches fails" do
122
+ lambda {
123
+ "d00d ur 1337".should =~ /world/
124
+ }.should raise_error(MacSpec.assertion_failed_error)
125
+ end
126
+
127
+ it "negative matches" do
128
+ "1337@age".should_not =~ /434/
129
+ end
130
+
131
+ it "negative matches fails" do
132
+ lambda {
133
+ "it's a freak out!".should_not =~ /freak/
134
+ }.should raise_error(MacSpec.assertion_failed_error)
135
+ end
136
+ end