require File.expand_path(File.dirname(__FILE__) + '/edgecase') class AboutHashes < EdgeCase::Koan def test_creating_hashes empty_hash = Hash.new assert_equal __, empty_hash.class assert_equal({}, empty_hash) assert_equal __, empty_hash.size end def test_hash_literals hash = { :one => "uno", :two => "dos" } assert_equal __, hash.size end def test_accessing_hashes hash = { :one => "uno", :two => "dos" } assert_equal __, hash[:one] assert_equal __, hash[:two] assert_equal __, hash[:doesnt_exist] end def test_accessing_hashes_with_fetch hash = { :one => "uno" } assert_equal "uno", hash.fetch(:one) assert_raise(___) do hash.fetch(:doesnt_exist) end # THINK ABOUT IT: # # Why might you want to use #fetch instead of #[] when accessing hash keys? end def test_changing_hashes hash = { :one => "uno", :two => "dos" } hash[:one] = "eins" expected = { :one => __, :two => "dos" } assert_equal __, expected == hash # Bonus Question: Why was "expected" broken out into a variable # rather than used as a literal? end def test_hash_is_unordered hash1 = { :one => "uno", :two => "dos" } hash2 = { :two => "dos", :one => "uno" } assert_equal __, hash1 == hash2 end def test_hash_keys hash = { :one => "uno", :two => "dos" } assert_equal __, hash.keys.size assert_equal __, hash.keys.include?(:one) assert_equal __, hash.keys.include?(:two) assert_equal __, hash.keys.class end def test_hash_values hash = { :one => "uno", :two => "dos" } assert_equal __, hash.values.size assert_equal __, hash.values.include?("uno") assert_equal __, hash.values.include?("dos") assert_equal __, hash.values.class end def test_combining_hashes hash = { "jim" => 53, "amy" => 20, "dan" => 23 } new_hash = hash.merge({ "jim" => 54, "jenny" => 26 }) assert_equal __, hash != new_hash expected = { "jim" => __, "amy" => 20, "dan" => 23, "jenny" => __ } assert_equal __, expected == new_hash end def test_default_value hash1 = Hash.new hash1[:one] = 1 assert_equal __, hash1[:one] assert_equal __, hash1[:two] hash2 = Hash.new("dos") hash2[:one] = 1 assert_equal __, hash2[:one] assert_equal __, hash2[:two] end def test_default_value_is_the_same_object hash = Hash.new([]) hash[:one] << "uno" hash[:two] << "dos" assert_equal __, hash[:one] assert_equal __, hash[:two] assert_equal __, hash[:three] assert_equal __, hash[:one].object_id == hash[:two].object_id end def test_default_value_with_block hash = Hash.new {|hash, key| hash[key] = [] } hash[:one] << "uno" hash[:two] << "dos" assert_equal __, hash[:one] assert_equal __, hash[:two] assert_equal __, hash[:three] end end