summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorDaniel Doubrovkine (dB.) @dblockdotorg <dblock@dblock.org>2019-08-18 08:59:17 -0400
committerGitHub <noreply@github.com>2019-08-18 08:59:17 -0400
commit04cd30af1362574a1adea53aae0008e5732ea994 (patch)
tree9cd7b61174cde9f72b3b5b1ba4a132d8d95cbef2 /spec
parent1de19bff87e1f75192af2788e8ee47cda593ade2 (diff)
parent9b3209c8d9be7aff172327564f6c42427fa0f92d (diff)
downloadhashie-04cd30af1362574a1adea53aae0008e5732ea994.tar.gz
Merge pull request #481 from BobbyMcWho/480-implement-non-destructive-methods
Implement non-destructive standard Hash methods
Diffstat (limited to 'spec')
-rw-r--r--spec/hashie/mash_spec.rb162
1 files changed, 162 insertions, 0 deletions
diff --git a/spec/hashie/mash_spec.rb b/spec/hashie/mash_spec.rb
index 3bcb478..e2a178c 100644
--- a/spec/hashie/mash_spec.rb
+++ b/spec/hashie/mash_spec.rb
@@ -878,6 +878,90 @@ describe Hashie::Mash do
end
end
+ describe '#compact' do
+ subject(:mash) { described_class.new(a: 1, b: nil) }
+
+ it 'returns a Hashie::Mash' do
+ expect(mash.compact).to be_kind_of(described_class)
+ end
+
+ it 'removes keys with nil values' do
+ expect(mash.compact).to eq('a' => 1)
+ end
+
+ context 'when using with subclass' do
+ let(:subclass) { Class.new(Hashie::Mash) }
+ subject(:sub_mash) { subclass.new(a: 1, b: nil) }
+
+ it 'creates an instance of subclass' do
+ expect(sub_mash.compact).to be_kind_of(subclass)
+ end
+ end
+ end
+
+ describe '#invert' do
+ subject(:mash) { described_class.new(a: 'apple', b: 4) }
+
+ it 'returns a Hashie::Mash' do
+ expect(mash.invert).to be_kind_of(described_class)
+ end
+
+ it 'returns a mash with the keys and values inverted' do
+ expect(mash.invert).to eq('apple' => 'a', '4' => 'b')
+ end
+
+ context 'when using with subclass' do
+ let(:subclass) { Class.new(Hashie::Mash) }
+ subject(:sub_mash) { subclass.new(a: 1, b: nil) }
+
+ it 'creates an instance of subclass' do
+ expect(sub_mash.invert).to be_kind_of(subclass)
+ end
+ end
+ end
+
+ describe '#reject' do
+ subject(:mash) { described_class.new(a: 1, b: nil) }
+
+ it 'returns a Hashie::Mash' do
+ expect(mash.reject { |_k, v| v.nil? }).to be_kind_of(described_class)
+ end
+
+ it 'rejects keys for which the block returns true' do
+ expect(mash.reject { |_k, v| v.nil? }).to eq('a' => 1)
+ end
+
+ context 'when using with subclass' do
+ let(:subclass) { Class.new(Hashie::Mash) }
+ subject(:sub_mash) { subclass.new(a: 1, b: nil) }
+
+ it 'creates an instance of subclass' do
+ expect(sub_mash.reject { |_k, v| v.nil? }).to be_kind_of(subclass)
+ end
+ end
+ end
+
+ describe '#select' do
+ subject(:mash) { described_class.new(a: 'apple', b: 4) }
+
+ it 'returns a Hashie::Mash' do
+ expect(mash.select { |_k, v| v.is_a? String }).to be_kind_of(described_class)
+ end
+
+ it 'selects keys for which the block returns true' do
+ expect(mash.select { |_k, v| v.is_a? String }).to eq('a' => 'apple')
+ end
+
+ context 'when using with subclass' do
+ let(:subclass) { Class.new(Hashie::Mash) }
+ subject(:sub_mash) { subclass.new(a: 1, b: nil) }
+
+ it 'creates an instance of subclass' do
+ expect(sub_mash.select { |_k, v| v.is_a? String }).to be_kind_of(subclass)
+ end
+ end
+ end
+
with_minimum_ruby('2.3.0') do
describe '#dig' do
subject { described_class.new(a: { b: 1 }) }
@@ -895,4 +979,82 @@ describe Hashie::Mash do
end
end
end
+
+ with_minimum_ruby('2.4.0') do
+ describe '#transform_values' do
+ subject(:mash) { described_class.new(a: 1) }
+
+ it 'returns a Hashie::Mash' do
+ expect(mash.transform_values(&:to_s)).to be_kind_of(described_class)
+ end
+
+ it 'transforms the value' do
+ expect(mash.transform_values(&:to_s).a).to eql('1')
+ end
+
+ context 'when using with subclass' do
+ let(:subclass) { Class.new(Hashie::Mash) }
+ subject(:sub_mash) { subclass.new(a: 1).transform_values { |a| a + 2 } }
+
+ it 'creates an instance of subclass' do
+ expect(sub_mash).to be_kind_of(subclass)
+ end
+ end
+ end
+ end
+
+ with_minimum_ruby('2.5.0') do
+ describe '#slice' do
+ subject(:mash) { described_class.new(a: 1, b: 2) }
+
+ it 'returns a Hashie::Mash' do
+ expect(mash.slice(:a)).to be_kind_of(described_class)
+ end
+
+ it 'returns a Mash with only the keys passed' do
+ expect(mash.slice(:a).to_hash).to eq('a' => 1)
+ end
+
+ context 'when using with subclass' do
+ let(:subclass) { Class.new(Hashie::Mash) }
+ subject(:sub_mash) { subclass.new(a: 1, b: 2) }
+
+ it 'creates an instance of subclass' do
+ expect(sub_mash.slice(:a)).to be_kind_of(subclass)
+ end
+ end
+ end
+
+ describe '#transform_keys' do
+ subject(:mash) { described_class.new(a: 1, b: 2) }
+
+ it 'returns a Hashie::Mash' do
+ expect(mash.transform_keys { |k| k + k }).to be_kind_of(described_class)
+ end
+
+ it 'returns a Mash with transformed keys' do
+ expect(mash.transform_keys { |k| k + k }).to eq('aa' => 1, 'bb' => 2)
+ end
+
+ context 'when using with subclass' do
+ let(:subclass) { Class.new(Hashie::Mash) }
+ subject(:sub_mash) { subclass.new(a: 1, b: 2) }
+
+ it 'creates an instance of subclass' do
+ expect(sub_mash.transform_keys { |k| k + k }).to be_kind_of(subclass)
+ end
+ end
+ end
+ end
+
+ with_minimum_ruby('2.6.0') do
+ context 'ruby 2.6 merging' do
+ subject(:mash) { Hashie::Mash.new(model: 'Honda') }
+ it 'merges multiple hashes and mashes passeed to #merge' do
+ first_hash = { model: 'Ford' }
+ second_hash = { model: 'DeLorean' }
+ expect(mash.merge(first_hash, second_hash)).to eq('model' => 'DeLorean')
+ end
+ end
+ end
end