require_relative "helper"

module Parfait
  class TestFactory < ParfaitTest

    def setup
      super
      @factory = Factory.new Parfait.object_space.get_type_by_class_name(:Integer)
    end
    def test_ok
      assert @factory
    end
    def test_name_ok
      assert @factory.attribute_name.to_s.start_with?("next")
    end
    def test_get_next
      assert_nil @factory.get_next_for( Integer.new(1))
    end
    def test_no_next
      assert_nil @factory.next_object
      assert_nil @factory.reserve
    end
    def test_get_next_object
      assert_equal Parfait::Integer ,  @factory.get_next_object.class
    end
    def test_default_test_page
      assert_equal 20 , Factory.page_size
    end
    def test_default_reserve
      assert_equal 10 , Factory.reserve_size
    end
    def test_set_page
      assert_equal 10 , Factory.page_size = 10
      Factory.page_size = 1024
    end
    def test_first_is_reserve
      @factory.get_next_object
      assert_equal Parfait::Integer , @factory.reserve.class
    end
    def test_reserve_length
      count = 0
      start = @factory.get_next_object
      start = @factory.reserve
      while( start )
        start = start.next_integer
        count += 1
      end
      assert_equal 11 , count
    end
    class BigFactoryTest < BigParfaitTest
      def setup
        super
        @factory = Factory.new Parfait.object_space.get_type_by_class_name(:Integer)
      end
      def test_chain_length
        count = 0
        start = @factory.get_next_object
        while( start )
          start = start.next_integer
          count += 1
        end
        assert_equal 1024 - 10 , count
      end
      def test_default_page
        assert_equal 1024 , Factory.page_size
      end
    end
  end
end