/
memoize_spec.rb
134 lines (104 loc) · 3.24 KB
/
memoize_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# encoding: utf-8
require 'spec_helper'
require File.expand_path('../../fixtures/classes', __FILE__)
shared_examples_for 'memoizes method' do
it 'memoizes the instance method' do
subject
instance = object.new
instance.send(method).should equal(instance.send(method))
end
it 'creates a method that returns a same value' do
subject
instance = object.new
instance.send(method).should be(instance.send(method))
end
context 'when the initializer calls the memoized method' do
before do
method = self.method
object.send(:define_method, :initialize) { send(method) }
end
it 'allows the memoized method to be called within the initializer' do
subject
expect { object.new }.to_not raise_error(NoMethodError)
end
it 'memoizes the methdod inside the initializer' do
subject
object.new.memoized(method).should_not be_nil
end
end
end
describe Adamantium::ModuleMethods, '#memoize' do
subject { object.memoize(method, options) }
let(:options) { {} }
let(:object) do
Class.new(AdamantiumSpecs::Object) do
def some_state
Object.new
end
end
end
context 'on method with arguments' do
let(:method) { :argumented }
it 'should raise error' do
expect { subject }.to raise_error(ArgumentError, 'Cannot memoize method with nonzero arity')
end
end
context 'with :noop freezer option' do
let(:method) { :some_state }
let(:options) { { :freezer => :noop } }
it_should_behave_like 'a command method'
it_should_behave_like 'memoizes method'
it 'is still a public method' do
should be_public_method_defined(method)
end
it 'creates a method that returns a non frozen value' do
subject
object.new.send(method).should_not be_frozen
end
end
context 'memoized method that returns generated values' do
let(:method) { :some_state }
it_should_behave_like 'a command method'
it_should_behave_like 'memoizes method'
it 'creates a method that returns a frozen value' do
subject
object.new.send(method).should be_frozen
end
end
context 'public method' do
let(:method) { :public_method }
it_should_behave_like 'a command method'
it_should_behave_like 'memoizes method'
it 'is still a public method' do
should be_public_method_defined(method)
end
it 'creates a method that returns a frozen value' do
subject
object.new.send(method).should be_frozen
end
end
context 'protected method' do
let(:method) { :protected_method }
it_should_behave_like 'a command method'
it_should_behave_like 'memoizes method'
it 'is still a protected method' do
should be_protected_method_defined(method)
end
it 'creates a method that returns a frozen value' do
subject
object.new.send(method).should be_frozen
end
end
context 'private method' do
let(:method) { :private_method }
it_should_behave_like 'a command method'
it_should_behave_like 'memoizes method'
it 'is still a private method' do
should be_private_method_defined(method)
end
it 'creates a method that returns a frozen value' do
subject
object.new.send(method).should be_frozen
end
end
end