caricature 0.7.2 → 0.7.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/README.rdoc +97 -97
  2. data/Rakefile +310 -310
  3. data/caricature.gemspec +110 -106
  4. data/lib/caricature.rb +3 -1
  5. data/lib/caricature/bacon.rb +2 -2
  6. data/lib/caricature/bacon/integration.rb +75 -55
  7. data/lib/caricature/clr.rb +4 -3
  8. data/lib/caricature/clr/aspnet_mvc.rb +3 -3
  9. data/lib/caricature/clr/descriptor.rb +106 -39
  10. data/lib/caricature/clr/event_verification.rb +57 -0
  11. data/lib/caricature/clr/expectation.rb +101 -0
  12. data/lib/caricature/clr/isolation.rb +49 -13
  13. data/lib/caricature/clr/isolator.rb +141 -5
  14. data/lib/caricature/clr/messenger.rb +6 -0
  15. data/lib/caricature/clr/method_call_recorder.rb +97 -0
  16. data/lib/caricature/core_ext.rb +11 -0
  17. data/lib/{core_ext → caricature/core_ext}/array.rb +0 -0
  18. data/lib/{core_ext → caricature/core_ext}/class.rb +0 -0
  19. data/lib/{core_ext → caricature/core_ext}/hash.rb +0 -0
  20. data/lib/{core_ext → caricature/core_ext}/module.rb +0 -0
  21. data/lib/{core_ext → caricature/core_ext}/object.rb +0 -0
  22. data/lib/{core_ext → caricature/core_ext}/string.rb +0 -0
  23. data/lib/{core_ext → caricature/core_ext}/system/string.rb +0 -0
  24. data/lib/{core_ext → caricature/core_ext}/system/type.rb +6 -0
  25. data/lib/caricature/expectation.rb +108 -66
  26. data/lib/caricature/isolator.rb +3 -3
  27. data/lib/caricature/method_call_recorder.rb +32 -4
  28. data/lib/caricature/rspec/integration.rb +118 -77
  29. data/lib/caricature/version.rb +5 -5
  30. data/spec/bacon/integration/callback_spec.rb +156 -156
  31. data/spec/bacon/integration/clr_to_clr_spec.rb +1 -2
  32. data/spec/bacon/integration/event_spec.rb +98 -0
  33. data/spec/bacon/integration/indexer_spec.rb +1 -1
  34. data/spec/bacon/spec_helper.rb +4 -4
  35. data/spec/bacon/unit/descriptor_spec.rb +95 -42
  36. data/spec/bacon/unit/expectation_spec.rb +2 -2
  37. data/spec/bacon/unit/interop_spec.rb +1 -14
  38. data/spec/bacon/unit/isolation_spec.rb +1 -1
  39. data/spec/bacon/unit/isolator_spec.rb +5 -5
  40. data/spec/bin/ClrModels.dll +0 -0
  41. data/spec/models/ClrModels.cs +32 -8
  42. data/spec/models/ruby_models.rb +150 -150
  43. data/spec/rspec/integration/callback_spec.rb +156 -156
  44. data/spec/rspec/integration/indexer_spec.rb +1 -1
  45. data/spec/rspec/spec_helper.rb +12 -6
  46. data/spec/rspec/unit/descriptor_spec.rb +93 -42
  47. data/spec/rspec/unit/event_spec.rb +17 -0
  48. data/spec/rspec/unit/interop_spec.rb +0 -13
  49. data/spec/spec_helper.rb +14 -14
  50. metadata +20 -22
  51. data/lib/core_ext/core_ext.rb +0 -8
  52. data/spec/bin/ClrModels.dll.mdb +0 -0
@@ -1,107 +1,111 @@
1
- # WARNING : RAKE AUTO-GENERATED FILE. DO NOT MANUALLY EDIT!
2
- # RUN : 'rake gem:update_gemspec'
3
-
4
- Gem::Specification.new do |s|
5
- s.authors = ["Ivan Porto Carrero"]
6
- s.bindir = "bin"
7
- s.add_dependency "uuidtools", ">= 2.0.0, runtime"
8
- s.description = "Caricature brings simple mocking to Ruby, DLR and CLR."
9
- s.email = "ivan@flanders.co.nz"
10
- s.extra_rdoc_files = ["README.rdoc"]
11
- s.files = ["README.rdoc",
12
- "Rakefile",
13
- "caricature.gemspec",
14
- "lib/caricature",
15
- "lib/caricature.rb",
16
- "lib/caricature/bacon",
17
- "lib/caricature/bacon.rb",
18
- "lib/caricature/bacon/integration.rb",
19
- "lib/caricature/clr",
20
- "lib/caricature/clr.rb",
21
- "lib/caricature/clr/aspnet_mvc.rb",
22
- "lib/caricature/clr/descriptor.rb",
23
- "lib/caricature/clr/isolation.rb",
24
- "lib/caricature/clr/isolator.rb",
25
- "lib/caricature/clr/messenger.rb",
26
- "lib/caricature/descriptor.rb",
27
- "lib/caricature/expectation.rb",
28
- "lib/caricature/isolation.rb",
29
- "lib/caricature/isolator.rb",
30
- "lib/caricature/messenger.rb",
31
- "lib/caricature/method_call_recorder.rb",
32
- "lib/caricature/rspec",
33
- "lib/caricature/rspec.rb",
34
- "lib/caricature/rspec/integration.rb",
35
- "lib/caricature/verification.rb",
36
- "lib/caricature/version.rb",
37
- "lib/core_ext",
38
- "lib/core_ext/array.rb",
39
- "lib/core_ext/class.rb",
40
- "lib/core_ext/core_ext.rb",
41
- "lib/core_ext/hash.rb",
42
- "lib/core_ext/module.rb",
43
- "lib/core_ext/object.rb",
44
- "lib/core_ext/string.rb",
45
- "lib/core_ext/system",
46
- "lib/core_ext/system/string.rb",
47
- "lib/core_ext/system/type.rb",
48
- "spec/bacon",
49
- "spec/bacon/integration",
50
- "spec/bacon/integration/callback_spec.rb",
51
- "spec/bacon/integration/clr_to_clr_spec.rb",
52
- "spec/bacon/integration/clr_to_ruby_spec.rb",
53
- "spec/bacon/integration/indexer_spec.rb",
54
- "spec/bacon/integration/ruby_to_ruby_spec.rb",
55
- "spec/bacon/spec_helper.rb",
56
- "spec/bacon/unit",
57
- "spec/bacon/unit/core_ext_spec.rb",
58
- "spec/bacon/unit/descriptor_spec.rb",
59
- "spec/bacon/unit/expectation_spec.rb",
60
- "spec/bacon/unit/interop_spec.rb",
61
- "spec/bacon/unit/isolation_spec.rb",
62
- "spec/bacon/unit/isolator_spec.rb",
63
- "spec/bacon/unit/messaging_spec.rb",
64
- "spec/bacon/unit/method_call_spec.rb",
65
- "spec/bacon/unit/sword_spec.rb",
66
- "spec/bacon/unit/verification_spec.rb",
67
- "spec/bin",
68
- "spec/bin/ClrModels.dll",
69
- "spec/bin/ClrModels.dll.mdb",
70
- "spec/models",
71
- "spec/models/ClrModels.cs",
72
- "spec/models/ruby_models.rb",
73
- "spec/rspec",
74
- "spec/rspec/integration",
75
- "spec/rspec/integration/callback_spec.rb",
76
- "spec/rspec/integration/clr_to_clr_spec.rb",
77
- "spec/rspec/integration/clr_to_ruby_spec.rb",
78
- "spec/rspec/integration/indexer_spec.rb",
79
- "spec/rspec/integration/ruby_to_ruby_spec.rb",
80
- "spec/rspec/spec_helper.rb",
81
- "spec/rspec/unit",
82
- "spec/rspec/unit/core_ext_spec.rb",
83
- "spec/rspec/unit/descriptor_spec.rb",
84
- "spec/rspec/unit/expectation_spec.rb",
85
- "spec/rspec/unit/interop_spec.rb",
86
- "spec/rspec/unit/isolation_spec.rb",
87
- "spec/rspec/unit/isolator_spec.rb",
88
- "spec/rspec/unit/messaging_spec.rb",
89
- "spec/rspec/unit/method_call_spec.rb",
90
- "spec/rspec/unit/sword_spec.rb",
91
- "spec/rspec/unit/verification_spec.rb",
92
- "spec/spec_helper.rb"]
93
- s.has_rdoc = true
94
- s.homepage = "http://casualjim.github.com/caricature"
95
- s.loaded = false
96
- s.name = "caricature"
97
- s.platform = "ruby"
98
- s.rdoc_options = ["--quiet", "--title", "Caricature brings simple mocking to Ruby, DLR and CLR.", "--main", "README.rdoc", "--line-numbers", "--format", "darkfish"]
99
- s.require_paths = ["lib"]
100
- s.required_ruby_version = ">= 1.8.4"
101
- s.required_rubygems_version = ">= 0"
102
- s.rubyforge_project = "caricature"
103
- s.rubygems_version = "1.3.5"
104
- s.specification_version = 3
105
- s.summary = "Caricature brings simple mocking to Ruby, DLR and CLR."
106
- s.version = "0.7.2"
1
+ # WARNING : RAKE AUTO-GENERATED FILE. DO NOT MANUALLY EDIT!
2
+ # RUN : 'rake gem:update_gemspec'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.authors = ["Ivan Porto Carrero"]
6
+ s.bindir = "bin"
7
+ s.add_dependency "uuidtools", ">= 2.0.0, runtime"
8
+ s.description = "Caricature brings simple mocking to Ruby, DLR and CLR."
9
+ s.email = "ivan@flanders.co.nz"
10
+ s.extra_rdoc_files = ["README.rdoc"]
11
+ s.files = ["README.rdoc",
12
+ "Rakefile",
13
+ "caricature.gemspec",
14
+ "lib/caricature",
15
+ "lib/caricature.rb",
16
+ "lib/caricature/bacon",
17
+ "lib/caricature/bacon.rb",
18
+ "lib/caricature/bacon/integration.rb",
19
+ "lib/caricature/clr",
20
+ "lib/caricature/clr.rb",
21
+ "lib/caricature/clr/aspnet_mvc.rb",
22
+ "lib/caricature/clr/descriptor.rb",
23
+ "lib/caricature/clr/event_verification.rb",
24
+ "lib/caricature/clr/expectation.rb",
25
+ "lib/caricature/clr/isolation.rb",
26
+ "lib/caricature/clr/isolator.rb",
27
+ "lib/caricature/clr/messenger.rb",
28
+ "lib/caricature/clr/method_call_recorder.rb",
29
+ "lib/caricature/core_ext",
30
+ "lib/caricature/core_ext.rb",
31
+ "lib/caricature/core_ext/array.rb",
32
+ "lib/caricature/core_ext/class.rb",
33
+ "lib/caricature/core_ext/hash.rb",
34
+ "lib/caricature/core_ext/module.rb",
35
+ "lib/caricature/core_ext/object.rb",
36
+ "lib/caricature/core_ext/string.rb",
37
+ "lib/caricature/core_ext/system",
38
+ "lib/caricature/core_ext/system/string.rb",
39
+ "lib/caricature/core_ext/system/type.rb",
40
+ "lib/caricature/descriptor.rb",
41
+ "lib/caricature/expectation.rb",
42
+ "lib/caricature/isolation.rb",
43
+ "lib/caricature/isolator.rb",
44
+ "lib/caricature/messenger.rb",
45
+ "lib/caricature/method_call_recorder.rb",
46
+ "lib/caricature/rspec",
47
+ "lib/caricature/rspec.rb",
48
+ "lib/caricature/rspec/integration.rb",
49
+ "lib/caricature/verification.rb",
50
+ "lib/caricature/version.rb",
51
+ "spec/bacon",
52
+ "spec/bacon/integration",
53
+ "spec/bacon/integration/callback_spec.rb",
54
+ "spec/bacon/integration/clr_to_clr_spec.rb",
55
+ "spec/bacon/integration/clr_to_ruby_spec.rb",
56
+ "spec/bacon/integration/event_spec.rb",
57
+ "spec/bacon/integration/indexer_spec.rb",
58
+ "spec/bacon/integration/ruby_to_ruby_spec.rb",
59
+ "spec/bacon/spec_helper.rb",
60
+ "spec/bacon/unit",
61
+ "spec/bacon/unit/core_ext_spec.rb",
62
+ "spec/bacon/unit/descriptor_spec.rb",
63
+ "spec/bacon/unit/expectation_spec.rb",
64
+ "spec/bacon/unit/interop_spec.rb",
65
+ "spec/bacon/unit/isolation_spec.rb",
66
+ "spec/bacon/unit/isolator_spec.rb",
67
+ "spec/bacon/unit/messaging_spec.rb",
68
+ "spec/bacon/unit/method_call_spec.rb",
69
+ "spec/bacon/unit/sword_spec.rb",
70
+ "spec/bacon/unit/verification_spec.rb",
71
+ "spec/bin",
72
+ "spec/bin/ClrModels.dll",
73
+ "spec/models",
74
+ "spec/models/ClrModels.cs",
75
+ "spec/models/ruby_models.rb",
76
+ "spec/rspec",
77
+ "spec/rspec/integration",
78
+ "spec/rspec/integration/callback_spec.rb",
79
+ "spec/rspec/integration/clr_to_clr_spec.rb",
80
+ "spec/rspec/integration/clr_to_ruby_spec.rb",
81
+ "spec/rspec/integration/indexer_spec.rb",
82
+ "spec/rspec/integration/ruby_to_ruby_spec.rb",
83
+ "spec/rspec/spec_helper.rb",
84
+ "spec/rspec/unit",
85
+ "spec/rspec/unit/core_ext_spec.rb",
86
+ "spec/rspec/unit/descriptor_spec.rb",
87
+ "spec/rspec/unit/event_spec.rb",
88
+ "spec/rspec/unit/expectation_spec.rb",
89
+ "spec/rspec/unit/interop_spec.rb",
90
+ "spec/rspec/unit/isolation_spec.rb",
91
+ "spec/rspec/unit/isolator_spec.rb",
92
+ "spec/rspec/unit/messaging_spec.rb",
93
+ "spec/rspec/unit/method_call_spec.rb",
94
+ "spec/rspec/unit/sword_spec.rb",
95
+ "spec/rspec/unit/verification_spec.rb",
96
+ "spec/spec_helper.rb"]
97
+ s.has_rdoc = true
98
+ s.homepage = "http://casualjim.github.com/caricature"
99
+ s.loaded = false
100
+ s.name = "caricature"
101
+ s.platform = "ruby"
102
+ s.rdoc_options = ["--quiet", "--title", "Caricature brings simple mocking to Ruby, DLR and CLR.", "--main", "README.rdoc", "--line-numbers", "--format", "darkfish"]
103
+ s.require_paths = ["lib"]
104
+ s.required_ruby_version = ">= 1.8.4"
105
+ s.required_rubygems_version = ">= 0"
106
+ s.rubyforge_project = "caricature"
107
+ s.rubygems_version = "1.3.5"
108
+ s.specification_version = 3
109
+ s.summary = "Caricature brings simple mocking to Ruby, DLR and CLR."
110
+ s.version = "0.7.5"
107
111
  end
@@ -1,4 +1,6 @@
1
+ require 'rubygems' unless defined?(Gem)
1
2
  $:.unshift File.dirname(__FILE__)
3
+ require 'uuidtools'
2
4
 
3
5
  module Caricature
4
6
  #
@@ -8,7 +10,7 @@ module Caricature
8
10
  #
9
11
  end
10
12
 
11
- require 'core_ext/core_ext'
13
+ require 'caricature/core_ext'
12
14
  require 'caricature/version'
13
15
  require 'caricature/isolation'
14
16
  require 'caricature/clr' if defined? IRONRUBY_VERSION
@@ -1,2 +1,2 @@
1
- require 'caricature/bacon/integration' if defined? Bacon
2
-
1
+ require 'caricature/bacon/integration' if defined? Bacon
2
+
@@ -1,55 +1,75 @@
1
- class Should
2
-
3
- def have_received?(name, &b)
4
- lambda { |obj, *args| obj.did_receive?(name, &b).successful? }
5
- end
6
-
7
- def satisfy(*args, &block)
8
- if args.size == 1 && String === args.first
9
- description = args.shift
10
- else
11
- description = ""
12
- end
13
-
14
- r=nil
15
- err = nil
16
- begin
17
- r = yield(@object, *args)
18
- rescue Caricature::ArgumentMatchError => e
19
- err =e
20
- end
21
- if Bacon::Counter[:depth] > 0
22
- Bacon::Counter[:requirements] += 1
23
- raise (err.is_a?(Caricature::ArgumentMatchError) ? err : Bacon::Error.new(:failed, description)) unless @negated ^ r
24
- r
25
- else
26
- @negated ? !r : !!r
27
- end
28
- end
29
-
30
- end
31
-
32
- module Caricature
33
-
34
- # Describes a verification of a method call.
35
- # This corresponds kind of to an assertion
36
- class Verification
37
-
38
-
39
- # indicate that this method verification is successful
40
- def successful?
41
- a = any_args? ? [:any] : @args
42
- res = @recorder.was_called?(@method_name, @block_args, @mode, *a)
43
- raise Caricature::ArgumentMatchError.new(:failed, self.error) unless res
44
- res
45
- end
46
-
47
-
48
- end
49
-
50
- class ArgumentMatchError < Bacon::Error;
51
-
52
- end
53
-
54
- end
55
-
1
+ class Should
2
+
3
+ def have_received?(name, &b)
4
+ be(name) { |obj, *args| obj.did_receive?(name, &b).successful? }
5
+ end
6
+
7
+ def have_raised_event?(name, &b)
8
+ be(name) { |obj, *args| obj.did_raise_event?(name, &b).successful? }
9
+ end if defined?(IRONRUBY_VERSION)
10
+
11
+ def satisfy(*args, &block)
12
+ if args.size == 1 && String === args.first
13
+ description = args.shift
14
+ else
15
+ description = ""
16
+ end
17
+ r=nil
18
+ err = nil
19
+ begin
20
+ r = block.call(@object, *args)
21
+ rescue Caricature::ArgumentMatchError => e
22
+ err =e
23
+ end
24
+ if Bacon::Counter[:depth] > 0
25
+ Bacon::Counter[:requirements] += 1
26
+ raise (err.is_a?(Caricature::ArgumentMatchError) ? err : Bacon::Error.new(:failed, description)) unless @negated ^ r
27
+ r
28
+ else
29
+ @negated ? !r : !!r
30
+ end
31
+ end
32
+
33
+ end
34
+
35
+ module Caricature
36
+
37
+ # Describes a verification of a method call.
38
+ # This corresponds kind of to an assertion
39
+ class Verification
40
+
41
+
42
+ # indicate that this method verification is successful
43
+ def successful?
44
+ a = any_args? ? [:any] : @args
45
+ res = @recorder.was_called?(@method_name, @block_args, @mode, *a)
46
+ raise Caricature::ArgumentMatchError.new(:failed, self.error) unless res
47
+ res
48
+ end
49
+
50
+
51
+ end
52
+ if defined?(IRONRUBY_VERSION)
53
+ class EventVerification
54
+
55
+ # indicate that this event verification is successful
56
+ def successful?
57
+ a = any_args? ? [:any] : @args
58
+ res = @recorder.event_raised?(@event_name, @mode, *a)
59
+ raise Caricature::ArgumentMatchError.new(:failed, self.error) unless res
60
+ res
61
+ end
62
+
63
+ end
64
+
65
+ # class ClrInterfaceIsolator
66
+ # def
67
+ # end
68
+ end
69
+
70
+ class ArgumentMatchError < Bacon::Error;
71
+
72
+ end
73
+
74
+ end
75
+
@@ -1,6 +1,7 @@
1
- #IronRuby.load_assembly 'Workarounds, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
2
-
3
1
  require File.dirname(__FILE__) + "/clr/descriptor"
4
2
  require File.dirname(__FILE__) + "/clr/messenger"
5
3
  require File.dirname(__FILE__) + "/clr/isolator"
6
- require File.dirname(__FILE__) + "/clr/isolation"
4
+ require File.dirname(__FILE__) + "/clr/expectation"
5
+ require File.dirname(__FILE__) + "/clr/isolation"
6
+ require File.dirname(__FILE__) + "/clr/event_verification"
7
+ require File.dirname(__FILE__) + "/clr/method_call_recorder"
@@ -1,6 +1,6 @@
1
- load_assembly 'System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
2
- load_assembly 'System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
3
- load_assembly 'System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
1
+ load_assembly 'System.Web.Routing'
2
+ load_assembly 'System.Web.Mvc'
3
+ load_assembly 'System.Web.Abstractions'
4
4
 
5
5
  include System::Web
6
6
  include System::Web::Routing
@@ -3,41 +3,102 @@ module Caricature
3
3
  # Contains the logic to collect members from a CLR type
4
4
  module ClrMemberCollector
5
5
 
6
+ attr_reader :class_events, :events
7
+
6
8
  private
7
- # collects the instance members for a CLR type.
8
- # makes sure it can handle indexers for properties etc.
9
- def collect_members_from(meths, properties, instance_member=true)
10
-
11
- mem = []
12
- mem += meths.collect do |mi|
13
- MemberDescriptor.new(mi.name.underscore, mi.return_type, instance_member)
14
- end
15
- properties.each do |pi|
16
- prop_name = property_name_from(pi)
17
- mem << MemberDescriptor.new(prop_name, pi.property_type, instance_member)
18
- mem << MemberDescriptor.new("__setitem__", nil, instance_member) if prop_name == "__getitem__"
19
- mem << MemberDescriptor.new("#{prop_name}=", nil, instance_member) if pi.can_write and prop_name != "__getitem__"
20
- end
21
- mem
9
+ # collects the instance members for a CLR type.
10
+ # makes sure it can handle indexers for properties etc.
11
+ def build_member_collections(context={}, instance_member=true)
12
+
13
+ build_event_collection(context, instance_member)
14
+
15
+ mem = []
16
+ mem += build_method_collection(context, instance_member)
17
+ mem += build_property_collection(context, instance_member)
18
+ mem
19
+ end
20
+
21
+ def build_property_collection(context, instance_member)
22
+ context[:properties].inject([]) do |res, pi|
23
+ prop_name = property_name_from(pi)
24
+ res << MemberDescriptor.new(prop_name, pi.property_type, instance_member)
25
+ res << MemberDescriptor.new("set_Item", nil, instance_member) if prop_name == "get_Item"
26
+ res << MemberDescriptor.new("#{prop_name}=", nil, instance_member) if pi.can_write and prop_name != "get_Item"
27
+ res
22
28
  end
29
+ end
23
30
 
24
- # gets the property name from the +PropertyInfo+
25
- # when the property is an indexer it will return +[]+
26
- def property_name_from(property_info)
27
- return property_info.name.underscore if property_info.get_index_parameters.empty?
28
- "__getitem__"
29
- end
30
-
31
- # the binding flags for instance members of a CLR type
32
- def instance_flags
33
- System::Reflection::BindingFlags.public | System::Reflection::BindingFlags.instance
34
- end
35
-
36
- # the binding flags for class members of a CLR type
37
- def class_flags
38
- System::Reflection::BindingFlags.public | System::Reflection::BindingFlags.static
31
+ def build_method_collection(context, instance_member)
32
+ context[:methods].inject([]) do |meths, mi|
33
+ meths << MemberDescriptor.new(mi.name.underscore, mi.return_type, instance_member) unless event?(mi.name, instance_member)
34
+ meths
39
35
  end
36
+ end
37
+
38
+ def build_event_collection(context, instance_member)
39
+ context[:events].inject(evts=[]) { |evc, ei| evc << ClrEventDescriptor.new(ei.name, instance_member) }
40
+ (instance_member ? @events = evts : @class_events = evts)
41
+ end
42
+
43
+ # indicates if this member is an event
44
+ def event?(name, instance_member)
45
+ ((instance_member ? @events : @class_events)||[]).any? { |en| /^(add|remove)_#{en.event_name}/i =~ name }
46
+ end
47
+
48
+ # gets the property name from the +PropertyInfo+
49
+ # when the property is an indexer it will return +[]+
50
+ def property_name_from(property_info)
51
+ return property_info.name.underscore if property_info.get_index_parameters.empty?
52
+ "get_Item"
53
+ end
54
+
55
+ # the binding flags for instance members of a CLR type
56
+ def instance_flags
57
+ System::Reflection::BindingFlags.public | System::Reflection::BindingFlags.instance
58
+ end
59
+
60
+ # the binding flags for class members of a CLR type
61
+ def class_flags
62
+ System::Reflection::BindingFlags.public | System::Reflection::BindingFlags.static
63
+ end
64
+
65
+ def event_flags
66
+ non_public_flag | instance_flags
67
+ end
68
+
69
+ def class_event_flags
70
+ non_public_flag | class_flags
71
+ end
72
+
73
+ def non_public_flag
74
+ System::Reflection::BindingFlags.non_public
75
+ end
76
+
77
+ end
78
+
79
+ class ClrEventDescriptor
80
+
81
+ attr_reader :event_name
40
82
 
83
+ def initialize(event_name, instance_member=true)
84
+ @event_name, @instance_member = event_name, instance_member
85
+ end
86
+
87
+ def instance_member?
88
+ @instance_member
89
+ end
90
+
91
+ def add_method_name
92
+ "add_#{event_name}"
93
+ end
94
+
95
+ def remove_method_name
96
+ "remove_#{event_name}"
97
+ end
98
+
99
+ def to_s
100
+ "<#{self.class}:#{object_id} @event_name=\"#{event_name}\">"
101
+ end
41
102
  end
42
103
 
43
104
  # describes clr interfaces.
@@ -51,10 +112,12 @@ module Caricature
51
112
  def initialize_instance_members_for(klass)
52
113
  clr_type = klass.to_clr_type
53
114
 
54
- properties = clr_type.collect_interface_properties
55
- methods = clr_type.collect_interface_methods
115
+ context = {}
116
+ context[:properties] = clr_type.collect_interface_properties
117
+ context[:methods] = clr_type.collect_interface_methods
118
+ context[:events] = clr_type.collect_interface_events
56
119
 
57
- @instance_members = collect_members_from methods, properties
120
+ @instance_members = build_member_collections context
58
121
  end
59
122
 
60
123
  # this method is empty because an interface can't have static members
@@ -72,20 +135,24 @@ module Caricature
72
135
  def initialize_instance_members_for(klass)
73
136
  clr_type = klass.to_clr_type
74
137
 
75
- methods = clr_type.get_methods(instance_flags)
76
- properties = clr_type.get_properties(instance_flags)
138
+ context = {}
139
+ context[:methods] = clr_type.get_methods(instance_flags)
140
+ context[:properties] = clr_type.get_properties(instance_flags)
141
+ context[:events] = clr_type.get_events(event_flags)
77
142
 
78
- @instance_members = collect_members_from methods, properties
143
+ @instance_members = build_member_collections context
79
144
  end
80
145
 
81
146
  # collects all the static members of the provided CLR class type
82
147
  def initialize_class_members_for(klass)
83
148
  clr_type = klass.to_clr_type
84
149
 
85
- methods = clr_type.get_methods(class_flags)
86
- properties = clr_type.get_properties(class_flags)
150
+ context = {}
151
+ context[:methods] = clr_type.get_methods(class_flags)
152
+ context[:properties] = clr_type.get_properties(class_flags)
153
+ context[:events] = clr_type.get_events(class_event_flags)
87
154
 
88
- @class_members = collect_members_from methods, properties, false
155
+ @class_members = build_member_collections context, false
89
156
  end
90
157
 
91
158
  end