# 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 ArrayLikeTest
  def test_push
    DS_Test_Case.method_checked(:push, @test_container)
    for i in [N, 1, 0] do
      a = Array.new
      l = @test_container.new
      i.times do
        x = rand(100)
        a.push(x)
        l.push(x)
        assert_containers_equal(a, l)
      end
    end
  end

  def test_unshift
    DS_Test_Case.method_checked(:shift, @test_container)
    for i in [N, 1, 0] do
      a = Array.new
      l = @test_container.new
      i.times do
        x = rand(100)
        a.unshift(x)
        l.unshift(x)
        assert_containers_equal(a, l)
      end
    end
  end

  def test_pop
    DS_Test_Case.method_checked(:pop, @test_container)
    for i in [N, 1, 0] do
      a = generate_random_container(i, Array).dup
      l = generate_container_from_analgous(a)
      x = generate_random_container(rand(10), Array)
      while a.length > 0 do
        assert a.pop == l.pop
        assert_containers_equal(a, l)
      end
    end
  end

  def test_shift
    DS_Test_Case.method_checked(:unshift, @test_container)
    for i in [N, 1, 0] do
      a = generate_random_container(i, Array).dup
      l = generate_container_from_analgous(a)
      x = generate_random_container(rand(10), Array)
      while a.length > 0 do
        assert a.shift == l.shift
        assert_containers_equal(a, l)
      end
    end
  end

  def test_nitems
    DS_Test_Case.method_checked(:nitems, @test_container)
    for i in 0...N do
      a = generate_random_container(i, Array)
      l = generate_container_from_analgous(a)
      assert a.nitems == l.nitems
    end
  end

  def test_concat
    DS_Test_Case.method_checked(:concat, @test_container)
    for i in 0...N do
      a = generate_random_container(i, Array).dup
      l = generate_container_from_analgous(a)
      x = generate_random_container(rand(10), Array)
      a.concat(x)
      l.concat(x)
      assert_containers_equal(a, l)
    end
  end

  def test_append
    DS_Test_Case.method_checked(:<<, @test_container)
    DS_Test_Case.method_checked(:concat, @test_container)
    a = Array.new
    l = @test_container.new
    for i in 0...N do
      x = rand(10)
      a << x
      l << x
      assert_containers_equal(a, l)
    end
  end

  def test_self_bracket
    DS_Test_Case.class_method_checked(:[], @test_container)
    for i in 0...N do
      a = generate_random_container(i, Array)
      l = @test_container[*a]
      assert_containers_equal(a, l)
    end
  end

  def test_generate_container_from_analgous
    assert N > 0
    a = generate_random_container(N, Array)
    l = generate_container_from_analgous(a)
    assert_containers_equal(a, l)
    assert l.type == @test_container
  end

end
