Skip to content

Commit dee0de9

Browse files
committed
Add some Hash methods to BCDD::Context
1 parent 3cc8575 commit dee0de9

File tree

2 files changed

+113
-0
lines changed

2 files changed

+113
-0
lines changed

lib/bcdd/context.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,30 @@ def and_then!(source, **injected_value)
3737
super(source, injected_value, _call: _call)
3838
end
3939

40+
def [](key)
41+
value[key]
42+
end
43+
44+
def dig(...)
45+
value.dig(...)
46+
end
47+
48+
def fetch(...)
49+
value.fetch(...)
50+
end
51+
52+
def slice(...)
53+
value.slice(...)
54+
end
55+
56+
def values_at(...)
57+
value.values_at(...)
58+
end
59+
60+
def fetch_values(...)
61+
value.fetch_values(...)
62+
end
63+
4064
protected
4165

4266
attr_reader :memo

test/bcdd/context/success_test.rb

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,94 @@ class ContextSuccessTest < Minitest::Test
2020
result.inspect
2121
)
2222
end
23+
24+
test '#[]' do
25+
result1 = Context::Success(:ok)
26+
result2 = Context::Success(:ok, a: 1, b: 2)
27+
28+
assert_nil result1[:a]
29+
assert_nil result1[:b]
30+
31+
assert_equal 1, result2[:a]
32+
assert_equal 2, result2[:b]
33+
end
34+
35+
# rubocop:disable Style/SingleArgumentDig
36+
test '#dig' do
37+
result1 = Context::Success(:ok)
38+
result2 = Context::Success(:ok, a: { b: 1 })
39+
40+
assert_nil result1.dig(:a, :b)
41+
assert_nil result2.dig(:a, :c)
42+
43+
assert_equal({ b: 1 }, result2.dig(:a))
44+
assert_equal 1, result2.dig(:a, :b)
45+
end
46+
# rubocop:enable Style/SingleArgumentDig
47+
48+
test '#fetch' do
49+
result1 = Context::Success(:ok)
50+
result2 = Context::Success(:ok, a: 1, b: 2)
51+
52+
assert_raises(KeyError) { result1.fetch(:a) }
53+
assert_raises(KeyError) { result1.fetch(:b) }
54+
55+
assert_equal 1, result2.fetch(:a)
56+
assert_equal 2, result2.fetch(:b)
57+
58+
# ---
59+
60+
assert_equal 3, result1.fetch(:a, 3)
61+
assert_equal 4, result1.fetch(:b, 4)
62+
63+
assert_equal 1, result2.fetch(:a, 3)
64+
assert_equal 2, result2.fetch(:b, 4)
65+
66+
# ---
67+
68+
# rubocop:disable Style/RedundantFetchBlock
69+
assert_equal(5, result1.fetch(:a) { 5 })
70+
assert_equal(6, result1.fetch(:b) { 6 })
71+
72+
assert_equal(1, result2.fetch(:a) { 7 })
73+
assert_equal(2, result2.fetch(:b) { 8 })
74+
# rubocop:enable Style/RedundantFetchBlock
75+
end
76+
77+
test '#slice' do
78+
result1 = Context::Success(:ok)
79+
result2 = Context::Success(:ok, a: 1, b: 2)
80+
81+
assert_equal({}, result1.slice(:a, :b))
82+
assert_equal({ a: 1, b: 2 }, result2.slice(:a, :b))
83+
end
84+
85+
test '#values_at' do
86+
result1 = Context::Success(:ok)
87+
result2 = Context::Success(:ok, a: 1, b: 2)
88+
89+
assert_equal [nil, nil], result1.values_at(:a, :b)
90+
assert_equal [1, 2], result2.values_at(:a, :b)
91+
end
92+
93+
test '#fetch_values' do
94+
result1 = Context::Success(:ok)
95+
result2 = Context::Success(:ok, a: 1, b: 2)
96+
97+
assert_raises(KeyError) do
98+
result1.fetch_values(:a, :b)
99+
end
100+
101+
assert_equal [1, 2], result2.fetch_values(:a, :b)
102+
103+
# ---
104+
105+
values1 = result1.fetch_values(:a, :b, :c, :d) { |key| key.to_s.upcase }
106+
values2 = result2.fetch_values(:a, :b, :c, :d) { |key| key.to_s.upcase }
107+
108+
assert_equal %w[A B C D], values1
109+
110+
assert_equal [1, 2, 'C', 'D'], values2
111+
end
23112
end
24113
end

0 commit comments

Comments
 (0)