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