casting 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,40 +0,0 @@
1
- require 'test_helper'
2
-
3
- class Person
4
- include Casting::Client
5
- delegate_missing_methods
6
-
7
- def initialize(name)
8
- @name = name
9
- end
10
- attr_reader :name
11
- end
12
-
13
- class PersonCollection
14
- include Casting::Enum
15
-
16
- def initialize(array)
17
- @array = array
18
- end
19
- attr_reader :array
20
-
21
- def each(*behaviors, &block)
22
- enum(array, *behaviors).each(&block)
23
- end
24
- end
25
-
26
- module Hello
27
- def hello
28
- "Hello, I'm #{name}"
29
- end
30
- end
31
-
32
- describe Casting::Enum, '#enum' do
33
- let(:people){
34
- [Person.new('Jim'), Person.new('TJ'), Person.new('Sandi')]
35
- }
36
- it "iterates and applies behaviors to each item" do
37
- client = PersonCollection.new(people)
38
- assert_equal ["Hello, I'm Jim", "Hello, I'm TJ", "Hello, I'm Sandi"], client.each(Hello).map(&:hello)
39
- end
40
- end
data/test/casting_test.rb DELETED
@@ -1,89 +0,0 @@
1
- require 'test_helper'
2
-
3
- describe Casting, '.delegating' do
4
- it 'delegates missing methods to object delegates' do
5
- client = test_person
6
- client.extend(Casting::Client)
7
- client.delegate_missing_methods
8
-
9
- attendant = test_person
10
- attendant.extend(TestPerson::Greeter)
11
-
12
- assert_raises(NoMethodError){
13
- client.greet
14
- }
15
- Casting.delegating(client => attendant) do
16
- assert_equal 'hello', client.greet
17
- end
18
- assert_raises(NoMethodError){
19
- client.greet
20
- }
21
- end
22
-
23
- it 'delegates missing methods for the objects inside the block' do
24
- client = BlockTestPerson.new('Jim')
25
- verbose_client = BlockTestPerson.new('Amy')
26
-
27
- assert_raises(NoMethodError){
28
- client.greet
29
- }
30
- Casting.delegating(client => TestPerson::Greeter, verbose_client => TestPerson::Verbose) do
31
- assert_equal 'hello', client.greet
32
- assert_equal 'this,that', verbose_client.verbose('this','that')
33
- end
34
- assert_raises(NoMethodError){
35
- client.greet
36
- }
37
- end
38
-
39
- it 'delegates missing methods on altered objects inside the block' do
40
- client = test_person.extend(Casting::Client)
41
- client.delegate_missing_methods
42
-
43
- assert_raises(NoMethodError){
44
- client.greet
45
- }
46
- Casting.delegating(client => TestPerson::Greeter) do
47
- assert_equal 'hello', client.greet
48
- end
49
- assert_raises(NoMethodError){
50
- client.greet
51
- }
52
- end
53
-
54
- it 'responds to added methods inside the block' do
55
- client = test_person.extend(Casting::Client)
56
- client.delegate_missing_methods
57
-
58
- assert !client.respond_to?(:greet)
59
-
60
- Casting.delegating(client => TestPerson::Greeter) do
61
- assert client.respond_to?(:greet)
62
- end
63
-
64
- assert !client.respond_to?(:greet)
65
- end
66
-
67
- it 'raises an error if the given object is not an object that delegates missing methods' do
68
- client = test_person.extend(Casting::Client)
69
-
70
- assert_raises(Casting::InvalidClientError){
71
- Casting.delegating(client => TestPerson::Greeter){ }
72
- }
73
- end
74
-
75
- it 'allows for nested delegating' do
76
- client = test_person.extend(Casting::Client)
77
- client.delegate_missing_methods
78
-
79
- Casting.delegating(client => TestPerson::Greeter) do
80
- assert client.respond_to?(:greet)
81
- Casting.delegating(client => TestPerson::Verbose) do
82
- assert client.respond_to?(:greet)
83
- assert client.respond_to?(:verbose)
84
- end
85
- assert !client.respond_to?(:verbose)
86
- end
87
- assert !client.respond_to?(:greet)
88
- end
89
- end
@@ -1,119 +0,0 @@
1
- require 'test_helper'
2
-
3
- ClassDelegatingPerson = Struct.new(:name)
4
- ClassDelegatingPerson.send(:include, Casting::Client)
5
- ClassDelegatingPerson.delegate_missing_methods :class
6
-
7
- InstanceDelegatingPerson = Struct.new(:name)
8
- InstanceDelegatingPerson.send(:include, Casting::Client)
9
- InstanceDelegatingPerson.delegate_missing_methods :instance
10
-
11
- ClassThenInstanceDelegatingPerson = Struct.new(:name)
12
- ClassThenInstanceDelegatingPerson.send(:include, Casting::Client)
13
- ClassThenInstanceDelegatingPerson.delegate_missing_methods :class, :instance
14
-
15
- InstanceThenClassDelegatingPerson = Struct.new(:name)
16
- InstanceThenClassDelegatingPerson.send(:include, Casting::Client)
17
- InstanceThenClassDelegatingPerson.delegate_missing_methods :instance, :class
18
-
19
- module ClassGreeter
20
- def greet
21
- 'hello from the class delegate'
22
- end
23
-
24
- def class_greeting
25
- 'Hi!'
26
- end
27
- end
28
-
29
- module InstanceGreeter
30
- def greet
31
- 'hello from the instance delegate'
32
- end
33
-
34
- def instance_greeting
35
- 'hi!'
36
- end
37
- end
38
-
39
- describe Casting, '.delegating' do
40
- it 'delegates methods for all instances to a class delegate inside a block' do
41
- jim = ClassDelegatingPerson.new('Jim')
42
- amy = ClassDelegatingPerson.new('Amy')
43
-
44
- assert_raises(NoMethodError){
45
- jim.greet
46
- }
47
- Casting.delegating(ClassDelegatingPerson => TestPerson::Greeter) do
48
- assert_equal 'hello', jim.greet
49
- assert_equal 'hello', amy.greet
50
- end
51
- assert_raises(NoMethodError){
52
- jim.greet
53
- }
54
- end
55
-
56
- it 'delegates methods for given instances to an instance delegate inside a block' do
57
- jim = InstanceDelegatingPerson.new('Jim')
58
- amy = InstanceDelegatingPerson.new('Amy')
59
-
60
- assert_raises(NoMethodError){
61
- jim.greet
62
- }
63
- Casting.delegating(jim => TestPerson::Greeter) do
64
- assert_equal 'hello', jim.greet
65
- assert_raises(NoMethodError){ amy.greet }
66
- end
67
- assert_raises(NoMethodError){
68
- jim.greet
69
- }
70
- end
71
-
72
- it 'delegates first to class delegates, then to instance delegates inside a block' do
73
- jim = ClassThenInstanceDelegatingPerson.new('Jim')
74
- amy = ClassThenInstanceDelegatingPerson.new('Amy')
75
-
76
- assert_raises(NoMethodError){
77
- jim.greet
78
- }
79
- Casting.delegating(ClassThenInstanceDelegatingPerson => ClassGreeter, jim => InstanceGreeter) do
80
- assert_equal 'hello from the class delegate', jim.greet
81
- assert_equal 'hi!', jim.instance_greeting
82
- assert_equal 'hello from the class delegate', amy.greet
83
- assert(NoMethodError){ amy.instance_greeting }
84
- end
85
- assert_raises(NoMethodError){
86
- jim.greet
87
- }
88
- end
89
-
90
- it 'delegates first to instance delegates, then to class delegates inside a block' do
91
- jim = InstanceThenClassDelegatingPerson.new('Jim')
92
- amy = InstanceThenClassDelegatingPerson.new('Amy')
93
-
94
- assert_raises(NoMethodError){
95
- jim.greet
96
- }
97
- Casting.delegating(InstanceThenClassDelegatingPerson => ClassGreeter, jim => InstanceGreeter) do
98
- assert_equal 'hello from the instance delegate', jim.greet
99
- assert_equal 'hi!', jim.instance_greeting
100
- assert_equal 'hello from the class delegate', amy.greet
101
- assert(NoMethodError){ amy.instance_greeting }
102
- end
103
- assert_raises(NoMethodError){
104
- jim.greet
105
- }
106
- end
107
-
108
- it 'sets instances to respond_to? class delegate methods' do
109
- jim = ClassDelegatingPerson.new('Jim')
110
-
111
- refute jim.respond_to?(:greet)
112
-
113
- Casting.delegating(ClassDelegatingPerson => ClassGreeter) do
114
- assert jim.respond_to?(:greet)
115
- end
116
-
117
- refute jim.respond_to?(:greet)
118
- end
119
- end
data/test/client_test.rb DELETED
@@ -1,81 +0,0 @@
1
- require 'test_helper'
2
-
3
- describe Casting::Client do
4
- it 'will not override an existing `delegate` method' do
5
- client = TestPerson.new
6
- def client.delegate
7
- 'existing delegate method'
8
- end
9
- client.extend(Casting::Client)
10
-
11
- attendant = TestPerson::Greeter
12
-
13
- assert_equal 'existing delegate method', client.delegate
14
-
15
- assert_equal 'hello', client.cast('greet', attendant)
16
- end
17
-
18
- it 'adds a delegate method to call a method on an attendant' do
19
- client = TestPerson.new
20
- client.extend(Casting::Client)
21
- attendant = TestPerson::Greeter
22
-
23
- assert_equal 'hello', client.delegate('greet', attendant)
24
- end
25
-
26
- it 'passes additional parameters to the attendant' do
27
- client = TestPerson.new
28
- client.extend(Casting::Client)
29
- attendant = TestPerson::Verbose
30
-
31
- assert_equal 'hello,goodbye', client.delegate('verbose', attendant, 'hello', 'goodbye')
32
- end
33
-
34
- it 'executes delegated methods with a block' do
35
- client = TestPerson.new
36
- client.extend(Casting::Client)
37
- mod = Module.new
38
- mod.module_eval do
39
- def blocky(arg, &block)
40
- block.call(arg, self)
41
- end
42
- end
43
-
44
- output = client.delegate('blocky', mod, 'argument') do |arg, me|
45
- %{#{arg} from #{me.name}}
46
- end
47
-
48
- assert_equal 'argument from name from TestPerson', output
49
- end
50
-
51
- it 'passes the object as the client for delegation' do
52
- client = Object.new
53
- client.extend(Casting::Client)
54
-
55
- delegation = client.delegation('id')
56
-
57
- assert_equal client, delegation.client
58
- end
59
-
60
- it 'refuses to delegate to itself' do
61
- client = TestPerson.new
62
- client.extend(Casting::Client)
63
-
64
- assert_raises(Casting::InvalidAttendant){
65
- client.delegate('to_s', client)
66
- }
67
- end
68
-
69
- it 'does not delegate singleton methods' do
70
- client = test_person.extend(Casting::Client)
71
- client.delegate_missing_methods
72
- attendant = test_person
73
-
74
- def attendant.hello
75
- 'hello'
76
- end
77
- assert_raises(TypeError){
78
- client.delegate('hello', attendant)
79
- }
80
- end
81
- end
data/test/context_test.rb DELETED
@@ -1,80 +0,0 @@
1
- require 'test_helper'
2
-
3
- class TestContext
4
- using Casting::Context
5
- extend Casting::Context
6
-
7
- initialize :admin, :user
8
-
9
- def approve
10
- tell :admin, :say, 'I approve'
11
- end
12
-
13
- def approve_with_keyword
14
- tell :admin, :keyword_say, what: 'I approve'
15
- end
16
-
17
- def user_approve
18
- tell :user, :approve
19
- end
20
-
21
- module Admin
22
- def say(what)
23
- what
24
- end
25
-
26
- def keyword_say(what:)
27
- what
28
- end
29
- end
30
-
31
- module User
32
- def approve
33
- 'Yay!'
34
- end
35
- end
36
- end
37
-
38
- class MissingModuleContext
39
- using Casting::Context
40
- extend Casting::Context
41
-
42
- initialize :admin, :user
43
-
44
- def run
45
- tell :admin, :go
46
- end
47
- end
48
-
49
- describe Casting::Context do
50
- it 'applies module methods to Casting::Client objects' do
51
- admin = casting_person
52
- user = casting_person
53
-
54
- context = TestContext.new admin: admin, user: user
55
-
56
- expect(context.approve).must_equal ('I approve')
57
- expect(context.approve_with_keyword).must_equal ('I approve')
58
- expect(context.user_approve).must_equal ('Yay!')
59
- end
60
-
61
- it 'applies module methods to any object' do
62
- admin = Object.new
63
- user = 1
64
-
65
- context = TestContext.new admin: admin, user: user
66
-
67
- expect(context.approve).must_equal ('I approve')
68
- expect(context.user_approve).must_equal ('Yay!')
69
- end
70
-
71
- it 'handles missing modules and raises missing method error' do
72
- admin = TestPerson.new
73
- user = TestPerson.new
74
-
75
- context = MissingModuleContext.new admin: admin, user: user
76
-
77
- err = expect{ context.run }.must_raise(NoMethodError)
78
- expect(err.message).must_match(/unknown method 'go'/)
79
- end
80
- end
@@ -1,198 +0,0 @@
1
- require 'test_helper'
2
-
3
- describe Casting::Delegation do
4
-
5
- it 'initializes with method name and object' do
6
- assert Casting::Delegation.prepare('some_method', Object.new)
7
- end
8
-
9
- it 'raises an error when calling without an attendant object' do
10
- delegation = Casting::Delegation.prepare('some_method', Object.new)
11
- begin
12
- delegation.call
13
- rescue StandardError => e
14
- end
15
- assert_kind_of Casting::MissingAttendant, e
16
- assert_equal "You must set your attendant object using `to'.", e.message
17
- end
18
-
19
- it 'raises an error when setting an invalid attendant type' do
20
- delegation = Casting::Delegation.prepare('some_method', TestPerson.new)
21
- assert_raises(Casting::InvalidAttendant){
22
- delegation.to(Unrelated.new)
23
- }
24
- end
25
-
26
- it 'raises an error when setting a class as the attendant' do
27
- delegation = Casting::Delegation.prepare('some_method', TestPerson)
28
- assert_raises(Casting::InvalidAttendant){
29
- delegation.to(Unrelated.new)
30
- }
31
- end
32
-
33
- it 'sets an attendant to an object of an ancestor class of the object class' do
34
- attendant = test_person
35
- client = SubTestPerson.new
36
-
37
- delegation = Casting::Delegation.prepare('name', client)
38
- assert delegation.to(attendant)
39
- end
40
-
41
- it 'delegates when given a module' do
42
- client = test_person
43
- delegation = Casting::Delegation.prepare('greet', client).to(TestPerson::Greeter)
44
- assert_equal 'hello', delegation.call
45
- end
46
-
47
- it 'does not delegate when given a class' do
48
- client = test_person
49
- err = expect{
50
- Casting::Delegation.prepare('class_defined', client).to(Unrelated)
51
- }.must_raise(TypeError)
52
- expect(err.message).must_match(/ argument must be a module or an object with/)
53
- end
54
-
55
- it 'finds the module defining a method and uses it to delegate' do
56
- client = test_person
57
- attendant = Unrelated.new
58
- delegation = Casting::Delegation.prepare('unrelated', client).to(attendant)
59
- assert_equal attendant.unrelated, delegation.call
60
- end
61
-
62
- it 'does not delegate to methods defined in classes' do
63
- client = test_person
64
- attendant = Unrelated.new
65
- assert_raises(TypeError){
66
- Casting::Delegation.prepare('class_defined', client).to(attendant)
67
- }
68
- end
69
-
70
- it 'assigns arguments to the delegated method using with' do
71
- client = test_person
72
- attendant = TestPerson::Verbose
73
-
74
- delegation = Casting::Delegation.prepare('verbose', client).to(attendant)
75
-
76
- assert_equal 'hello,goodbye', delegation.with('hello', 'goodbye').call
77
- end
78
-
79
- it 'assigns keyword arguments to the delegated method using with' do
80
- client = test_person
81
- attendant = TestPerson::Verbose
82
-
83
- delegation = Casting::Delegation.prepare('verbose_keywords', client).to(attendant)
84
-
85
- assert_equal 'hello,goodbye', delegation.with(key: 'hello', word: 'goodbye').call
86
- end
87
-
88
- it 'assigns regular and keyword arguments to the delegated method using with' do
89
- client = test_person
90
- attendant = TestPerson::Verbose
91
-
92
- delegation = Casting::Delegation.prepare('verbose_multi_args', client).to(attendant)
93
-
94
- assert_equal('hello,goodbye,keys,words,block!', delegation.with('hello', 'goodbye', key: 'keys', word: 'words') do
95
- "block!"
96
- end.call)
97
- end
98
-
99
- it 'handles flexible arguments to the delegated method using with' do
100
- client = test_person
101
- attendant = TestPerson::Verbose
102
-
103
- delegation = Casting::Delegation.prepare('verbose_flex', client).to(attendant)
104
-
105
- assert_equal('hello,key:keys,word:words,block!', delegation.with('hello', key: 'keys', word: 'words') do
106
- "block!"
107
- end.call)
108
- end
109
-
110
- it 'prefers `call` arguments over `with`' do
111
- client = test_person
112
- attendant = TestPerson::Verbose
113
-
114
- delegation = Casting::Delegation.prepare('verbose', client).to(attendant)
115
-
116
- assert_equal 'call,args', delegation.with('hello', 'goodbye').call('call','args')
117
- end
118
-
119
- it 'prefers "call" keyword arguments over "with"' do
120
- client = test_person
121
- attendant = TestPerson::Verbose
122
-
123
- delegation = Casting::Delegation.prepare('verbose_keywords', client).to(attendant)
124
-
125
- assert_equal 'call,args', delegation.with(key: 'hello', word: 'goodbye').call(key: 'call', word: 'args')
126
- end
127
-
128
- it 'prefers "call" regular and keyword arguments over "with"' do
129
- client = test_person
130
- attendant = TestPerson::Verbose
131
-
132
- delegation = Casting::Delegation.prepare('verbose_multi_args', client).to(attendant)
133
-
134
- assert_equal 'hello,goodbye,call,args', delegation.with('this', 'that', key: 'something', word: 'else').call('hello', 'goodbye', key: 'call', word: 'args')
135
- end
136
-
137
- it 'prefers "call" block arguments over "with"' do
138
- client = test_person
139
- attendant = TestPerson::Verbose
140
-
141
- delegation = Casting::Delegation.prepare('verbose_multi_args', client).to(attendant)
142
-
143
- prepared = delegation.with('this', 'that', key: 'something', word: 'else') { "prepared block!" }
144
-
145
- assert_equal('this,that,something,else,call block!', prepared.call{ "call block!" })
146
- end
147
-
148
- it 'prefers "call" keyword arguments and block over "with"' do
149
- client = test_person
150
- attendant = TestPerson::Verbose
151
-
152
- delegation = Casting::Delegation.prepare('verbose_flex', client).to(attendant)
153
-
154
- prepared = delegation.with(key: 'something', word: 'else') { "prepared block!" }
155
-
156
- assert_equal('key:call_key,word:call_word,call block!', prepared.call(key: 'call_key', word: 'call_word'){ "call block!" })
157
- end
158
-
159
- it 'prefers "call" and block over "with"' do
160
- client = test_person
161
- attendant = TestPerson::Verbose
162
-
163
- delegation = Casting::Delegation.prepare('verbose_flex', client).to(attendant)
164
-
165
- prepared = delegation.with { "prepared block!" }
166
-
167
- assert_equal('call block!', prepared.call { "call block!" })
168
- end
169
-
170
- it 'calls a method defined on another object of the same type' do
171
- client = test_person
172
- attendant = test_person
173
- attendant.extend(TestPerson::Greeter)
174
- delegation = Casting::Delegation.prepare('greet', client).to(attendant)
175
- assert_equal 'hello', delegation.call
176
- end
177
-
178
- it 'passes arguments to a delegated method' do
179
- client = test_person
180
- attendant = test_person
181
- attendant.extend(TestPerson::Verbose)
182
- delegation = Casting::Delegation.prepare('verbose', client).to(attendant).with('arg1','arg2')
183
- assert_equal 'arg1,arg2', delegation.call
184
- end
185
-
186
- it 'delegates when given a module' do
187
- client = test_person
188
- delegation = Casting::Delegation.prepare('greet', client).to(TestPerson::Greeter)
189
- assert_equal 'hello', delegation.call
190
- end
191
-
192
- it 'does not delegate when given a class' do
193
- client = test_person
194
- assert_raises(TypeError){
195
- Casting::Delegation.prepare('class_defined', client).to(Unrelated)
196
- }
197
- end
198
- end
@@ -1,14 +0,0 @@
1
- require 'test_helper'
2
-
3
- describe Casting::Client do
4
- it 'will not attempt to alter a frozen client' do
5
- client = TestPerson.new
6
- client.extend(Casting::Client)
7
- client.delegate_missing_methods
8
-
9
- client.freeze
10
-
11
- err = expect{ client.greet }.must_raise(NoMethodError)
12
- expect(err.message).must_match(/undefined method \`greet'/)
13
- end
14
- end
@@ -1,81 +0,0 @@
1
- require 'test_helper'
2
-
3
- describe Casting::MethodConsolidator, '#methods' do
4
- let(:client){
5
- object = test_person.extend(Casting::Client, Casting::MissingMethodClient, Casting::MethodConsolidator)
6
- object.cast_as(TestPerson::Greeter)
7
- object
8
- }
9
-
10
- it "returns all instance methods including private from the object and it's delegates" do
11
- assert_includes(client.methods(true), :psst)
12
- end
13
-
14
- it "returns all public instance methods from the object and it's delegates" do
15
- refute_includes(client.methods(false), :psst)
16
- end
17
-
18
- it "returns all protected instance methods from the object and it's delegates" do
19
- assert_includes(client.methods(true), :hey)
20
- end
21
- end
22
-
23
- describe Casting::MethodConsolidator, '#public_methods' do
24
- let(:client){
25
- object = test_person.extend(Casting::Client, Casting::MissingMethodClient, Casting::MethodConsolidator)
26
- object.cast_as(TestPerson::Greeter)
27
- object
28
- }
29
-
30
- it "returns all public_methods and those from it's delegates" do
31
- assert_includes(client.public_methods, :greet)
32
- end
33
-
34
- it "excludes all protected_methods and those from it's delegates" do
35
- refute_includes(client.public_methods, :hey)
36
- end
37
-
38
- it "excludes all private_methods from the object and it's delegates" do
39
- refute_includes(client.public_methods, :psst)
40
- end
41
- end
42
-
43
- describe Casting::MethodConsolidator, '#protected_methods' do
44
- let(:client){
45
- object = test_person.extend(Casting::Client, Casting::MissingMethodClient, Casting::MethodConsolidator)
46
- object.cast_as(TestPerson::Greeter)
47
- object
48
- }
49
-
50
- it "excludes all public_methods and those from it's delegates" do
51
- refute_includes(client.protected_methods, :greet)
52
- end
53
-
54
- it "returns all protected_methods and those from it's delegates" do
55
- assert_includes(client.protected_methods, :hey)
56
- end
57
-
58
- it "excludes all private_methods from the object and it's delegates" do
59
- refute_includes(client.protected_methods, :psst)
60
- end
61
- end
62
-
63
- describe Casting::MethodConsolidator, '#private_methods' do
64
- let(:client){
65
- object = test_person.extend(Casting::Client, Casting::MissingMethodClient, Casting::MethodConsolidator)
66
- object.cast_as(TestPerson::Greeter)
67
- object
68
- }
69
-
70
- it "excludes all public_methods and those from it's delegates" do
71
- refute_includes(client.private_methods, :greet)
72
- end
73
-
74
- it "excludes all protected_methods and those from it's delegates" do
75
- refute_includes(client.private_methods, :hey)
76
- end
77
-
78
- it "excludes all private_methods from the object and it's delegates" do
79
- assert_includes(client.private_methods, :psst)
80
- end
81
- end