JezK
Edit File: mash_spec.rb
require 'spec_helper' require 'extlib/mash' class AwesomeHash < Hash end describe Mash do before(:each) do @hash = { "mash" => "indifferent", :hash => "different" } @sub = AwesomeHash.new("mash" => "indifferent", :hash => "different") end describe "#initialize" do it 'converts all keys into strings when param is a Hash' do mash = Mash.new(@hash) mash.keys.any? { |key| key.is_a?(Symbol) }.should be(false) end it 'converts all pure Hash values into Mashes if param is a Hash' do mash = Mash.new :hash => @hash mash["hash"].should be_an_instance_of(Mash) # sanity check mash["hash"]["hash"].should == "different" end it 'doesn not convert Hash subclass values into Mashes' do mash = Mash.new :sub => @sub mash["sub"].should be_an_instance_of(AwesomeHash) end it 'converts all value items if value is an Array' do mash = Mash.new :arry => { :hash => [@hash] } mash["arry"].should be_an_instance_of(Mash) # sanity check mash["arry"]["hash"].first["hash"].should == "different" end it 'delegates to superclass constructor if param is not a Hash' do mash = Mash.new("dash berlin") mash["unexisting key"].should == "dash berlin" end end # describe "#initialize" describe "#update" do it 'converts all keys into strings when param is a Hash' do mash = Mash.new(@hash) mash.update("starry" => "night") mash.keys.any? { |key| key.is_a?(Symbol) }.should be(false) end it 'converts all Hash values into Mashes if param is a Hash' do mash = Mash.new :hash => @hash mash.update(:hash => { :hash => "is buggy in Ruby 1.8.6" }) mash["hash"].should be_an_instance_of(Mash) end end # describe "#update" describe "#[]=" do it 'converts key into string' do mash = Mash.new(@hash) mash[:hash] = { "starry" => "night" } mash.keys.any? { |key| key.is_a?(Symbol) }.should be(false) end it 'converts all Hash value into Mash' do mash = Mash.new :hash => @hash mash[:hash] = { :hash => "is buggy in Ruby 1.8.6" } mash["hash"].should be_an_instance_of(Mash) end end # describe "#[]=" describe "#key?" do before(:each) do @mash = Mash.new(@hash) end it 'converts key before lookup' do @mash.key?("mash").should be(true) @mash.key?(:mash).should be(true) @mash.key?("hash").should be(true) @mash.key?(:hash).should be(true) @mash.key?(:rainclouds).should be(false) @mash.key?("rainclouds").should be(false) end it 'is aliased as include?' do @mash.include?("mash").should be(true) @mash.include?(:mash).should be(true) @mash.include?("hash").should be(true) @mash.include?(:hash).should be(true) @mash.include?(:rainclouds).should be(false) @mash.include?("rainclouds").should be(false) end it 'is aliased as member?' do @mash.member?("mash").should be(true) @mash.member?(:mash).should be(true) @mash.member?("hash").should be(true) @mash.member?(:hash).should be(true) @mash.member?(:rainclouds).should be(false) @mash.member?("rainclouds").should be(false) end end # describe "#key?" describe "#dup" do it 'returns instance of Mash' do Mash.new(@hash).dup.should be_an_instance_of(Mash) end it 'preserves keys' do mash = Mash.new(@hash) dup = mash.dup mash.keys.sort.should == dup.keys.sort end it 'preserves value' do mash = Mash.new(@hash) dup = mash.dup mash.values.sort.should == dup.values.sort end end describe "#to_hash" do it 'returns instance of Mash' do Mash.new(@hash).to_hash.should be_an_instance_of(Hash) end it 'preserves keys' do mash = Mash.new(@hash) converted = mash.to_hash mash.keys.sort.should == converted.keys.sort end it 'preserves value' do mash = Mash.new(@hash) converted = mash.to_hash mash.values.sort.should == converted.values.sort end end describe "#symbolize_keys" do it 'returns instance of Mash' do Mash.new(@hash).symbolize_keys.should be_an_instance_of(Hash) end it 'converts keys to symbols' do mash = Mash.new(@hash) converted = mash.symbolize_keys converted_keys = converted.keys.sort{|k1, k2| k1.to_s <=> k2.to_s} orig_keys = mash.keys.map{|k| k.to_sym}.sort{|i1, i2| i1.to_s <=> i2.to_s} converted_keys.should == orig_keys end it 'preserves value' do mash = Mash.new(@hash) converted = mash.symbolize_keys mash.values.sort.should == converted.values.sort end end describe "#delete" do it 'converts Symbol key into String before deleting' do mash = Mash.new(@hash) mash.delete(:hash) mash.key?("hash").should be(false) end it 'works with String keys as well' do mash = Mash.new(@hash) mash.delete("mash") mash.key?("mash").should be(false) end end describe "#except" do it "converts Symbol key into String before calling super" do mash = Mash.new(@hash) hashless_mash = mash.except(:hash) hashless_mash.key?("hash").should be(false) end it "works with String keys as well" do mash = Mash.new(@hash) mashless_mash = mash.except("mash") mashless_mash.key?("mash").should be(false) end it "works with multiple keys" do mash = Mash.new(@hash) mashless = mash.except("hash", :mash) mashless.key?(:hash).should be(false) mashless.key?("mash").should be(false) end it "should return a mash" do mash = Mash.new(@hash) hashless_mash = mash.except(:hash) hashless_mash.class.should be(Mash) end end describe "#merge" do before(:each) do @mash = Mash.new(@hash).merge(:no => "in between") end it 'returns instance of Mash' do @mash.should be_an_instance_of(Mash) end it 'merges in give Hash' do @mash["no"].should == "in between" end end describe "#fetch" do before(:each) do @mash = Mash.new(@hash).merge(:no => "in between") end it 'converts key before fetching' do @mash.fetch("no").should == "in between" end it 'returns alternative value if key lookup fails' do @mash.fetch("flying", "screwdriver").should == "screwdriver" end end describe "#default" do before(:each) do @mash = Mash.new(:yet_another_technical_revolution) end it 'returns default value unless key exists in mash' do @mash.default("peak oil is now behind, baby").should == :yet_another_technical_revolution end it 'returns existing value if key is Symbol and exists in mash' do @mash.update(:no => "in between") @mash.default(:no).should == "in between" end end describe "#values_at" do before(:each) do @mash = Mash.new(@hash).merge(:no => "in between") end it 'is indifferent to whether keys are strings or symbols' do @mash.values_at("hash", :mash, :no).should == ["different", "indifferent", "in between"] end end describe "#stringify_keys!" do it 'returns the mash itself' do mash = Mash.new(@hash) mash.stringify_keys!.object_id.should == mash.object_id end end end