require 'edgecase' class AboutHashes < EdgeCase::Koan def test_creating_hashes empty_hash = Hash.new assert_equal Hash, 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_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_and_values hash = { :one => "uno", :two => "dos" } assert_equal __, hash.keys.size assert_equal __, hash.has_key?(:one) # Why not just compare hash.keys to [:one, :two]? # # Clue: What was the name of the previous test again? assert_equal __, hash.values.sort end def test_combining_hashes hash = { "jim" => 53, "amy" => 20, "dan" => 23 } new_hash = hash.merge({ "jim" => 54, "jenny" => 26 }) assert_not_equal hash, new_hash expected = { "jim" => __, "amy" => 20, "dan" => 23, "jenny" => __ } assert_equal expected, new_hash end end