diff options
author | Lin Jen-Shin (godfat) <godfat@godfat.org> | 2017-11-13 15:27:30 +0000 |
---|---|---|
committer | Rémy Coutable <remy@rymai.me> | 2017-11-13 15:27:30 +0000 |
commit | 258bf3e187538bd326491e5d1b25a0511fbd96a1 (patch) | |
tree | 366d7dfbd59ce1e64ec46eb98ea36c83317d02df /spec/lib/gitlab/utils | |
parent | 4a1e8188f96744103e51263c9bdc071c8e088690 (diff) | |
download | gitlab-ce-258bf3e187538bd326491e5d1b25a0511fbd96a1.tar.gz |
Add Gitlab::Utils::StrongMemoize
Diffstat (limited to 'spec/lib/gitlab/utils')
-rw-r--r-- | spec/lib/gitlab/utils/strong_memoize_spec.rb | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/spec/lib/gitlab/utils/strong_memoize_spec.rb b/spec/lib/gitlab/utils/strong_memoize_spec.rb new file mode 100644 index 00000000000..4a104ab6d97 --- /dev/null +++ b/spec/lib/gitlab/utils/strong_memoize_spec.rb @@ -0,0 +1,52 @@ +require 'spec_helper' + +describe Gitlab::Utils::StrongMemoize do + let(:klass) do + struct = Struct.new(:value) do + def method_name + strong_memoize(:method_name) do + trace << value + value + end + end + + def trace + @trace ||= [] + end + end + + struct.include(described_class) + struct + end + + subject(:object) { klass.new(value) } + + shared_examples 'caching the value' do + it 'only calls the block once' do + value0 = object.method_name + value1 = object.method_name + + expect(value0).to eq(value) + expect(value1).to eq(value) + expect(object.trace).to contain_exactly(value) + end + + it 'returns and defines the instance variable for the exact value' do + returned_value = object.method_name + memoized_value = object.instance_variable_get(:@method_name) + + expect(returned_value).to eql(value) + expect(memoized_value).to eql(value) + end + end + + describe '#strong_memoize' do + [nil, false, true, 'value', 0, [0]].each do |value| + context "with value #{value}" do + let(:value) { value } + + it_behaves_like 'caching the value' + end + end + end +end |