caricature 0.7.5 → 0.7.6

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 (74) hide show
  1. data/README.rdoc +97 -97
  2. data/Rakefile +309 -310
  3. data/caricature.gemspec +123 -110
  4. data/lib/caricature/bacon/integration.rb +75 -75
  5. data/lib/caricature/bacon.rb +2 -2
  6. data/lib/caricature/clr/descriptor.rb +159 -159
  7. data/lib/caricature/clr/event_verification.rb +56 -56
  8. data/lib/caricature/clr/expectation.rb +100 -100
  9. data/lib/caricature/clr/isolation.rb +78 -78
  10. data/lib/caricature/clr/isolator.rb +252 -252
  11. data/lib/caricature/clr/messenger.rb +51 -49
  12. data/lib/caricature/clr/method_call_recorder.rb +96 -96
  13. data/lib/caricature/expectation.rb +1 -1
  14. data/lib/caricature/method_call_recorder.rb +3 -3
  15. data/lib/caricature/rspec/integration.rb +118 -118
  16. data/lib/caricature/version.rb +5 -5
  17. data/lib/caricature.rb +25 -25
  18. data/spec/bacon/integration/callback_spec.rb +156 -156
  19. data/spec/bacon/integration/clr_to_clr_spec.rb +325 -253
  20. data/spec/bacon/integration/event_spec.rb +97 -97
  21. data/spec/bacon/integration/indexer_spec.rb +27 -27
  22. data/spec/bacon/spec_helper.rb +4 -4
  23. data/spec/bacon/unit/descriptor_spec.rb +212 -212
  24. data/spec/bacon/unit/sword_spec.rb +39 -39
  25. data/spec/bacon/unit/verification_spec.rb +103 -103
  26. data/spec/bin/ClrModels.dll +0 -0
  27. data/spec/bin/ClrModels.dll.mdb +0 -0
  28. data/spec/fixtures/ExplodingCar.cs +56 -0
  29. data/spec/fixtures/ExposedChangedSubscriber.cs +26 -0
  30. data/spec/fixtures/ExposingWarrior.cs +58 -0
  31. data/spec/fixtures/IExplodingWarrior.cs +10 -0
  32. data/spec/fixtures/IExposing.cs +9 -0
  33. data/spec/fixtures/IExposingBridge.cs +9 -0
  34. data/spec/fixtures/IExposingWarrior.cs +8 -0
  35. data/spec/fixtures/IHaveAnIndexer.cs +8 -0
  36. data/spec/fixtures/IWarrior.cs +13 -0
  37. data/spec/fixtures/IWeapon.cs +9 -0
  38. data/spec/fixtures/IndexerCaller.cs +17 -0
  39. data/spec/fixtures/IndexerContained.cs +20 -0
  40. data/spec/fixtures/MyClassWithAStatic.cs +16 -0
  41. data/spec/fixtures/Ninja.cs +34 -0
  42. data/spec/fixtures/Samurai.cs +29 -0
  43. data/spec/fixtures/StaticCaller.cs +12 -0
  44. data/spec/fixtures/Sword.cs +16 -0
  45. data/spec/fixtures/SwordWithStatics.cs +19 -0
  46. data/spec/fixtures/clr_interaction.rb +61 -0
  47. data/spec/fixtures/dagger.rb +11 -0
  48. data/spec/fixtures/dagger_with_class_members.rb +11 -0
  49. data/spec/fixtures/sheath.rb +19 -0
  50. data/spec/fixtures/soldier.rb +29 -0
  51. data/spec/fixtures/soldier_with_class_members.rb +7 -0
  52. data/spec/fixtures/swift_cleanup_crew.rb +21 -0
  53. data/spec/fixtures/with_class_methods.rb +11 -0
  54. data/spec/{models → models.notused}/ClrModels.cs +241 -241
  55. data/spec/{models → models.notused}/ruby_models.rb +150 -150
  56. data/spec/rspec/integration/callback_spec.rb +156 -156
  57. data/spec/rspec/integration/clr_to_clr_spec.rb +254 -254
  58. data/spec/rspec/integration/clr_to_ruby_spec.rb +227 -227
  59. data/spec/rspec/integration/indexer_spec.rb +27 -27
  60. data/spec/rspec/integration/ruby_to_ruby_spec.rb +271 -271
  61. data/spec/rspec/spec_helper.rb +12 -12
  62. data/spec/rspec/unit/core_ext_spec.rb +87 -87
  63. data/spec/rspec/unit/descriptor_spec.rb +210 -210
  64. data/spec/rspec/unit/event_spec.rb +16 -16
  65. data/spec/rspec/unit/expectation_spec.rb +300 -300
  66. data/spec/rspec/unit/interop_spec.rb +29 -29
  67. data/spec/rspec/unit/isolation_spec.rb +86 -86
  68. data/spec/rspec/unit/isolator_spec.rb +219 -219
  69. data/spec/rspec/unit/messaging_spec.rb +310 -310
  70. data/spec/rspec/unit/method_call_spec.rb +342 -342
  71. data/spec/rspec/unit/sword_spec.rb +39 -39
  72. data/spec/rspec/unit/verification_spec.rb +103 -103
  73. data/spec/spec_helper.rb +16 -15
  74. metadata +42 -11
@@ -1,87 +1,87 @@
1
- require File.dirname(__FILE__) + "/../spec_helper"
2
-
3
- describe "Caricature::Isolation" do
4
-
5
- describe "when creating an isolation for ruby objects" do
6
-
7
- it "should not raise" do
8
- lambda { Caricature::Isolation.for(Soldier) }.should_not raise_error
9
- end
10
-
11
- end
12
-
13
- describe "after creation of the isolation for a ruby object" do
14
-
15
- before do
16
- @isolator = Caricature::Isolation.for(Soldier)
17
- end
18
-
19
- it "should create a proxy" do
20
- @isolator.should_not be_nil
21
- end
22
-
23
- describe "when asked to stub a method" do
24
-
25
- it "should create an expectation with a block" do
26
- nm = "What's in a name"
27
- expectation = @isolator.when_receiving(:name) do |cl|
28
- cl.return(nm)
29
- end
30
- expectation.method_name.should == :name
31
- expectation.should be_has_return_value
32
- expectation.return_value.should == nm
33
- end
34
-
35
- it "should create an expectation without a block" do
36
- nm = "What's in a name"
37
- expectation = @isolator.when_receiving(:name).return(nm)
38
- expectation.method_name.should == :name
39
- expectation.should be_has_return_value
40
- expectation.return_value.should == nm
41
- end
42
- end
43
-
44
- end
45
-
46
- describe "when creating an isolation for CLR objects" do
47
-
48
- it "should not raise" do
49
- lambda { Caricature::Isolation.for(ClrModels::Ninja) }.should_not raise_error
50
- end
51
-
52
- end
53
-
54
- describe "after creation of the isolation for a CLR object" do
55
-
56
- before do
57
- @isolator = Caricature::Isolation.for(ClrModels::Ninja)
58
- end
59
-
60
- it "should create a proxy" do
61
- @isolator.should_not be_nil
62
- end
63
-
64
- describe "when asked to stub a method" do
65
-
66
- it "should create an expectation with a block" do
67
- nm = "What's in a name"
68
- expectation = @isolator.when_receiving(:name) do |cl|
69
- cl.return(nm)
70
- end
71
- expectation.method_name.should == :name
72
- expectation.should be_has_return_value
73
- expectation.return_value.should == nm
74
- end
75
-
76
- it "should create an expectation without a block" do
77
- nm = "What's in a name"
78
- expectation = @isolator.when_receiving(:name).return(nm)
79
- expectation.method_name.should == :name
80
- expectation.should be_has_return_value
81
- expectation.return_value.should == nm
82
- end
83
- end
84
-
85
- end
86
-
1
+ require File.dirname(__FILE__) + "/../spec_helper"
2
+
3
+ describe "Caricature::Isolation" do
4
+
5
+ describe "when creating an isolation for ruby objects" do
6
+
7
+ it "should not raise" do
8
+ lambda { Caricature::Isolation.for(Soldier) }.should_not raise_error
9
+ end
10
+
11
+ end
12
+
13
+ describe "after creation of the isolation for a ruby object" do
14
+
15
+ before do
16
+ @isolator = Caricature::Isolation.for(Soldier)
17
+ end
18
+
19
+ it "should create a proxy" do
20
+ @isolator.should_not be_nil
21
+ end
22
+
23
+ describe "when asked to stub a method" do
24
+
25
+ it "should create an expectation with a block" do
26
+ nm = "What's in a name"
27
+ expectation = @isolator.when_receiving(:name) do |cl|
28
+ cl.return(nm)
29
+ end
30
+ expectation.method_name.should == :name
31
+ expectation.should be_has_return_value
32
+ expectation.return_value.should == nm
33
+ end
34
+
35
+ it "should create an expectation without a block" do
36
+ nm = "What's in a name"
37
+ expectation = @isolator.when_receiving(:name).return(nm)
38
+ expectation.method_name.should == :name
39
+ expectation.should be_has_return_value
40
+ expectation.return_value.should == nm
41
+ end
42
+ end
43
+
44
+ end
45
+
46
+ describe "when creating an isolation for CLR objects" do
47
+
48
+ it "should not raise" do
49
+ lambda { Caricature::Isolation.for(ClrModels::Ninja) }.should_not raise_error
50
+ end
51
+
52
+ end
53
+
54
+ describe "after creation of the isolation for a CLR object" do
55
+
56
+ before do
57
+ @isolator = Caricature::Isolation.for(ClrModels::Ninja)
58
+ end
59
+
60
+ it "should create a proxy" do
61
+ @isolator.should_not be_nil
62
+ end
63
+
64
+ describe "when asked to stub a method" do
65
+
66
+ it "should create an expectation with a block" do
67
+ nm = "What's in a name"
68
+ expectation = @isolator.when_receiving(:name) do |cl|
69
+ cl.return(nm)
70
+ end
71
+ expectation.method_name.should == :name
72
+ expectation.should be_has_return_value
73
+ expectation.return_value.should == nm
74
+ end
75
+
76
+ it "should create an expectation without a block" do
77
+ nm = "What's in a name"
78
+ expectation = @isolator.when_receiving(:name).return(nm)
79
+ expectation.method_name.should == :name
80
+ expectation.should be_has_return_value
81
+ expectation.return_value.should == nm
82
+ end
83
+ end
84
+
85
+ end
86
+
87
87
  end
@@ -1,220 +1,220 @@
1
- require File.dirname(__FILE__) + "/../spec_helper"
2
-
3
- class TestIsolation
4
- attr_accessor :instance, :expectations
5
- def initialize(instance, expectations)
6
- @instance, @expectations = instance, expectations
7
- end
8
- def send_message(method_name, return_type, *args, &b)
9
- internal_send method_name, :internal, return_type, *args, &b
10
- end
11
- def send_class_message(method_name, return_type, *args, &b)
12
- internal_send method_name, :class, return_type, *args, &b
13
- end
14
- def internal_send(method_name, mode, return_type, *args, &b)
15
- exp = expectations.find(method_name, mode, *args)
16
- if exp
17
- res = instance.__send__(method_name, *args, &b) if exp.super_before?
18
- res = exp.execute(*args)
19
- res = instance.__send__(method_name, *args, &b) if !exp.super_before? and exp.call_super?
20
- res
21
- else
22
- rt = nil
23
- is_value_type = return_type && return_type != System::Void.to_clr_type && return_type.is_value_type
24
- rt = System::Activator.create_instance(return_type) if is_value_type
25
- rt
26
- end
27
- end
28
- end
29
-
30
- describe "Caricature::RubyIsolator" do
31
-
32
- before do
33
- @subj = Soldier.new
34
- res = Caricature::RubyIsolator.for Caricature::IsolatorContext.new(@subj)
35
- iso = TestIsolation.new res.subject, Caricature::Expectations.new
36
- @proxy = res.isolation
37
- @proxy.class.instance_variable_set("@___context___", iso)
38
- end
39
-
40
-
41
- describe "when invoking a method" do
42
-
43
- before do
44
- @proxy.name
45
- end
46
-
47
- it "should return nil" do
48
- @proxy.name.should be_nil
49
- end
50
-
51
- end
52
-
53
- describe "when isolating a class with class members" do
54
-
55
- before do
56
- res = Caricature::RubyIsolator.for Caricature::IsolatorContext.new(DaggerWithClassMembers)
57
- iso = TestIsolation.new res.subject, Caricature::Expectations.new
58
- @proxy = res.isolation
59
- @proxy.class.instance_variable_set("@___context___", iso)
60
- end
61
-
62
- it "should return nil for the class method" do
63
-
64
- @proxy.class.class_name.should be_nil
65
-
66
- end
67
-
68
- end
69
- end
70
-
71
- describe "Caricature::RecordingClrProxy" do
72
-
73
- describe "for an instance of a CLR class" do
74
-
75
- before do
76
- @ninja = ClrModels::Ninja.new
77
- @ninja.name = "Nakiro"
78
- context = Caricature::IsolatorContext.new(@ninja)
79
- res = Caricature::ClrIsolator.for context
80
- iso = TestIsolation.new res.subject, Caricature::Expectations.new
81
- @proxy = res.isolation
82
- @proxy.class.instance_variable_set("@___context___", iso)
83
- end
84
-
85
- it "should create a proxy" do
86
-
87
- @proxy.___super___.name.should == @ninja.name
88
- @proxy.___super___.id.should == 1
89
- end
90
-
91
- describe "when invoking a method" do
92
-
93
- before do
94
- @proxy.name
95
- end
96
-
97
- it "should return nil" do
98
- @proxy.name.should be_nil
99
- end
100
-
101
- end
102
-
103
- describe "when isolating a class with class members" do
104
-
105
- before do
106
- res = Caricature::ClrIsolator.for Caricature::IsolatorContext.new(ClrModels::SwordWithStatics)
107
- iso = TestIsolation.new res.subject, Caricature::Expectations.new
108
- @proxy = res.isolation
109
- @proxy.class.instance_variable_set("@___context___", iso)
110
- end
111
-
112
- it "should return nil for the class method" do
113
-
114
- @proxy.class.class_naming.should be_nil
115
-
116
- end
117
-
118
- end
119
-
120
- end
121
-
122
- describe "for a CLR class" do
123
-
124
- before do
125
- @recorder = Caricature::MethodCallRecorder.new
126
- context = Caricature::IsolatorContext.new(ClrModels::Ninja, @recorder)
127
- res = Caricature::ClrIsolator.for context
128
- iso = TestIsolation.new res.subject, Caricature::Expectations.new
129
- @proxy = res.isolation
130
- @proxy.class.instance_variable_set("@___context___", iso)
131
- end
132
-
133
- it "should create a proxy" do
134
-
135
- @proxy.class.superclass.should == ClrModels::Ninja
136
-
137
- end
138
-
139
-
140
- end
141
-
142
- describe "for a CLR interface" do
143
-
144
- before do
145
- res = Caricature::ClrInterfaceIsolator.for Caricature::IsolatorContext.new(ClrModels::IWarrior)
146
- @proxy = res.isolation
147
- end
148
-
149
- it "should create a proxy" do
150
- @proxy.class.to_s.should match(/^IWarrior/)
151
- end
152
-
153
- it "should create a method on the proxy" do
154
- @proxy.should respond_to(:is_killed_by)
155
- end
156
-
157
- it "should create a getter for a property on the proxy" do
158
- @proxy.should respond_to(:id)
159
- end
160
-
161
- it "should create a setter for a writable property on the proxy" do
162
- @proxy.should respond_to(:name=)
163
- end
164
-
165
- end
166
-
167
- describe "for a CLR Interface with an event" do
168
-
169
- before do
170
- res = Caricature::ClrInterfaceIsolator.for Caricature::IsolatorContext.new(ClrModels::IExposing)
171
- @proxy = res.isolation
172
- end
173
-
174
- it "should create an add method for the event" do
175
- @proxy.should respond_to(:add_is_exposed_changed)
176
- end
177
-
178
- it "should create a remove method for the event" do
179
- @proxy.should respond_to(:remove_is_exposed_changed)
180
- end
181
-
182
- end
183
-
184
- describe "for CLR interface recursion" do
185
-
186
- before do
187
- res = Caricature::ClrInterfaceIsolator.for Caricature::IsolatorContext.new(ClrModels::IExposingWarrior)
188
- @proxy = res.isolation
189
- end
190
-
191
- it "should create a method defined on the CLR interface" do
192
- @proxy.should respond_to(:own_method)
193
- end
194
-
195
- it "should create a method defined on one of the composing interfaces" do
196
- @proxy.should respond_to(:some_method)
197
- end
198
-
199
- it "should create a method defined on one of the topmost composing interfaces" do
200
- @proxy.should respond_to(:is_killed_by)
201
- end
202
-
203
- it "should create an add method for an event defined on a composing interface" do
204
- @proxy.should respond_to(:add_is_exposed_changed)
205
- end
206
-
207
- it "should create a remove method for an event defined on a composing interface" do
208
- @proxy.should respond_to(:remove_is_exposed_changed)
209
- end
210
-
211
- it "should create a getter for a property on the proxy" do
212
- @proxy.should respond_to(:id)
213
- end
214
-
215
- it "should create a setter for a writable property on the proxy" do
216
- @proxy.should respond_to(:name=)
217
- end
218
- end
219
-
1
+ require File.dirname(__FILE__) + "/../spec_helper"
2
+
3
+ class TestIsolation
4
+ attr_accessor :instance, :expectations
5
+ def initialize(instance, expectations)
6
+ @instance, @expectations = instance, expectations
7
+ end
8
+ def send_message(method_name, return_type, *args, &b)
9
+ internal_send method_name, :internal, return_type, *args, &b
10
+ end
11
+ def send_class_message(method_name, return_type, *args, &b)
12
+ internal_send method_name, :class, return_type, *args, &b
13
+ end
14
+ def internal_send(method_name, mode, return_type, *args, &b)
15
+ exp = expectations.find(method_name, mode, *args)
16
+ if exp
17
+ res = instance.__send__(method_name, *args, &b) if exp.super_before?
18
+ res = exp.execute(*args)
19
+ res = instance.__send__(method_name, *args, &b) if !exp.super_before? and exp.call_super?
20
+ res
21
+ else
22
+ rt = nil
23
+ is_value_type = return_type && return_type != System::Void.to_clr_type && return_type.is_value_type
24
+ rt = System::Activator.create_instance(return_type) if is_value_type
25
+ rt
26
+ end
27
+ end
28
+ end
29
+
30
+ describe "Caricature::RubyIsolator" do
31
+
32
+ before do
33
+ @subj = Soldier.new
34
+ res = Caricature::RubyIsolator.for Caricature::IsolatorContext.new(@subj)
35
+ iso = TestIsolation.new res.subject, Caricature::Expectations.new
36
+ @proxy = res.isolation
37
+ @proxy.class.instance_variable_set("@___context___", iso)
38
+ end
39
+
40
+
41
+ describe "when invoking a method" do
42
+
43
+ before do
44
+ @proxy.name
45
+ end
46
+
47
+ it "should return nil" do
48
+ @proxy.name.should be_nil
49
+ end
50
+
51
+ end
52
+
53
+ describe "when isolating a class with class members" do
54
+
55
+ before do
56
+ res = Caricature::RubyIsolator.for Caricature::IsolatorContext.new(DaggerWithClassMembers)
57
+ iso = TestIsolation.new res.subject, Caricature::Expectations.new
58
+ @proxy = res.isolation
59
+ @proxy.class.instance_variable_set("@___context___", iso)
60
+ end
61
+
62
+ it "should return nil for the class method" do
63
+
64
+ @proxy.class.class_name.should be_nil
65
+
66
+ end
67
+
68
+ end
69
+ end
70
+
71
+ describe "Caricature::RecordingClrProxy" do
72
+
73
+ describe "for an instance of a CLR class" do
74
+
75
+ before do
76
+ @ninja = ClrModels::Ninja.new
77
+ @ninja.name = "Nakiro"
78
+ context = Caricature::IsolatorContext.new(@ninja)
79
+ res = Caricature::ClrIsolator.for context
80
+ iso = TestIsolation.new res.subject, Caricature::Expectations.new
81
+ @proxy = res.isolation
82
+ @proxy.class.instance_variable_set("@___context___", iso)
83
+ end
84
+
85
+ it "should create a proxy" do
86
+
87
+ @proxy.___super___.name.should == @ninja.name
88
+ @proxy.___super___.id.should == 1
89
+ end
90
+
91
+ describe "when invoking a method" do
92
+
93
+ before do
94
+ @proxy.name
95
+ end
96
+
97
+ it "should return nil" do
98
+ @proxy.name.should be_nil
99
+ end
100
+
101
+ end
102
+
103
+ describe "when isolating a class with class members" do
104
+
105
+ before do
106
+ res = Caricature::ClrIsolator.for Caricature::IsolatorContext.new(ClrModels::SwordWithStatics)
107
+ iso = TestIsolation.new res.subject, Caricature::Expectations.new
108
+ @proxy = res.isolation
109
+ @proxy.class.instance_variable_set("@___context___", iso)
110
+ end
111
+
112
+ it "should return nil for the class method" do
113
+
114
+ @proxy.class.class_naming.should be_nil
115
+
116
+ end
117
+
118
+ end
119
+
120
+ end
121
+
122
+ describe "for a CLR class" do
123
+
124
+ before do
125
+ @recorder = Caricature::MethodCallRecorder.new
126
+ context = Caricature::IsolatorContext.new(ClrModels::Ninja, @recorder)
127
+ res = Caricature::ClrIsolator.for context
128
+ iso = TestIsolation.new res.subject, Caricature::Expectations.new
129
+ @proxy = res.isolation
130
+ @proxy.class.instance_variable_set("@___context___", iso)
131
+ end
132
+
133
+ it "should create a proxy" do
134
+
135
+ @proxy.class.superclass.should == ClrModels::Ninja
136
+
137
+ end
138
+
139
+
140
+ end
141
+
142
+ describe "for a CLR interface" do
143
+
144
+ before do
145
+ res = Caricature::ClrInterfaceIsolator.for Caricature::IsolatorContext.new(ClrModels::IWarrior)
146
+ @proxy = res.isolation
147
+ end
148
+
149
+ it "should create a proxy" do
150
+ @proxy.class.to_s.should match(/^IWarrior/)
151
+ end
152
+
153
+ it "should create a method on the proxy" do
154
+ @proxy.should respond_to(:is_killed_by)
155
+ end
156
+
157
+ it "should create a getter for a property on the proxy" do
158
+ @proxy.should respond_to(:id)
159
+ end
160
+
161
+ it "should create a setter for a writable property on the proxy" do
162
+ @proxy.should respond_to(:name=)
163
+ end
164
+
165
+ end
166
+
167
+ describe "for a CLR Interface with an event" do
168
+
169
+ before do
170
+ res = Caricature::ClrInterfaceIsolator.for Caricature::IsolatorContext.new(ClrModels::IExposing)
171
+ @proxy = res.isolation
172
+ end
173
+
174
+ it "should create an add method for the event" do
175
+ @proxy.should respond_to(:add_is_exposed_changed)
176
+ end
177
+
178
+ it "should create a remove method for the event" do
179
+ @proxy.should respond_to(:remove_is_exposed_changed)
180
+ end
181
+
182
+ end
183
+
184
+ describe "for CLR interface recursion" do
185
+
186
+ before do
187
+ res = Caricature::ClrInterfaceIsolator.for Caricature::IsolatorContext.new(ClrModels::IExposingWarrior)
188
+ @proxy = res.isolation
189
+ end
190
+
191
+ it "should create a method defined on the CLR interface" do
192
+ @proxy.should respond_to(:own_method)
193
+ end
194
+
195
+ it "should create a method defined on one of the composing interfaces" do
196
+ @proxy.should respond_to(:some_method)
197
+ end
198
+
199
+ it "should create a method defined on one of the topmost composing interfaces" do
200
+ @proxy.should respond_to(:is_killed_by)
201
+ end
202
+
203
+ it "should create an add method for an event defined on a composing interface" do
204
+ @proxy.should respond_to(:add_is_exposed_changed)
205
+ end
206
+
207
+ it "should create a remove method for an event defined on a composing interface" do
208
+ @proxy.should respond_to(:remove_is_exposed_changed)
209
+ end
210
+
211
+ it "should create a getter for a property on the proxy" do
212
+ @proxy.should respond_to(:id)
213
+ end
214
+
215
+ it "should create a setter for a writable property on the proxy" do
216
+ @proxy.should respond_to(:name=)
217
+ end
218
+ end
219
+
220
220
  end