main
1# frozen_string_literal: true
2
3require "test_helper"
4
5class Item
6 include ::Straw::Memoizable
7
8 attr_reader :calls
9
10 def initialize
11 @calls = Hash.new { |h, k| h[k] = 0 }
12 end
13
14 def value(item)
15 memoize(:value) do
16 @calls[:value] += 1
17 item
18 end
19 end
20end
21
22describe ::Straw::Memoizable do
23 def setup
24 @subject = Item.new
25 end
26
27 describe "#memoize" do
28 describe "when the result has not been memoized" do
29 it "computes the result only once" do
30 instance = Object.new
31 2.times { _(@subject.value(instance)).must_equal instance }
32
33 _(@subject.calls[:value]).must_equal 1
34 end
35
36 it "caches a nil value to prevent duplicate calls" do
37 2.times { assert_nil(@subject.value(nil)) }
38
39 _(@subject.calls[:value]).must_equal 1
40 end
41
42 it "caches a false value to prevent duplicate calls" do
43 2.times { _(@subject.value(false)).must_equal false }
44
45 _(@subject.calls[:value]).must_equal 1
46 end
47 end
48 end
49end