# Ruby Treasures 0.1
# Copyright (C) 2001 Paul Brannan <paul@atdesk.com>
# 
# You may distribute this software under the same terms as Ruby (see the file
# COPYING that was distributed with this library).
# 
module HashLikeTest
  def test_store
    DS_Test_Case.method_checked(:store, @test_container)
    [0, 1, 2, 3, 5, N-1, N].each do |i|
      a = generate_random_container(i, @analgous_container)
      l = @test_container.new
      a.each do |key, value|
        l.store(key, value)
      end
      assert_containers_equal(a, l)
    end
  end
  
  def test_fetch
    DS_Test_Case.method_checked(:fetch, @test_container)
    [0, 1, 2, 3, 5, N-1, N].each do |i|
      a = generate_random_container(i, @analgous_container)
      l = generate_container_from_analgous(a)
      a.each do |key, value|
        key_a = key_l = nil
        fetch_a = a.fetch(key.succ) { |k| key_a = k }
        fetch_l = l.fetch(key.succ) { |k| key_l = k }
        assert_equal fetch_a, fetch_l
        assert_equal key_a, key_l
        x = rand()
        fetch_a = a.fetch(key.succ, x)
        fetch_l = l.fetch(key.succ, x)
        assert_equal fetch_a, fetch_l
      end
      assert_containers_equal(a, l)
    end
  end

  def test_default
    DS_Test_Case.method_checked(:default, @test_container)
    DS_Test_Case.method_checked(:default=, @test_container)
    for i in 0...N do
      a = generate_random_container(i, @analgous_container)
      l = generate_container_from_analgous(a)
      a.each do |key, value|
        x = rand(100)
        l.default = x
        next if key.nil?
        if a.has_key?(key.succ) then
          assert l.has_key?(key.succ)
        else
          assert_equal x, l[key.succ]
        end
        assert_equal x, l.default
      end
    end
  end

  def test_self_bracket
    DS_Test_Case.class_method_checked(:[], @test_container)
    [0, 1, 2, 3, 5, N-1, N].each do |i|
      a = generate_random_container(i, @analgous_container)
      l = @test_container[a]
      assert_containers_equal(a, l)
    end
  end
end
