require_relative "helper"

module Parfait
  class TestMethod < ParfaitTest

    def setup
      super
      make_method
    end

    def test_method_name
      assert_equal :meth , @method.name
    end

    def test_class_for
      assert_equal :Object , @method.self_type.object_class.name
    end

    def test_arg1
      assert_equal 3 , @method.arguments_type.get_length , @method.arguments_type.inspect
      assert_equal Symbol , @method.arguments_type.names.first.class
      assert_equal :bar , @method.arguments_type.name_at(1)
    end

    def test_has_argument
      assert_equal 1 , @method.arguments_type.variable_index(:bar)
      assert_equal 2 , @method.arguments_type.variable_index(:foo)
    end

    def test_add_arg
      @method.arguments_type.send( :private_add_instance_variable, :foo2 , :Object)
      assert_equal 4 , @method.arguments_type.get_length
      assert_equal :foo2 , @method.arguments_type.name_at(3)
      assert_equal :Object , @method.arguments_type.type_at(3)
    end

    def test_get_arg_name1
      index = @method.arguments_type.variable_index(:bar)
      assert_equal 1 , index
      assert_equal :bar , @method.arguments_type.name_at(index)
    end
    def test_get_arg_type1
      index = @method.arguments_type.variable_index(:bar)
      assert_equal :Integer , @method.arguments_type.type_at(index)
    end
    def test_get_arg_name2
      index = @method.arguments_type.variable_index(:foo)
      assert_equal 2 , index
      assert_equal :foo , @method.arguments_type.name_at(index)
    end
    def test_get_arg_type2
      index = @method.arguments_type.variable_index(:foo)
      assert_equal :Type , @method.arguments_type.type_at(index)
    end

    def test_local1
      assert_equal 3 , @method.frame_type.get_length , @method.frame_type.inspect
      assert_equal Symbol , @method.frame_type.names.first.class
      assert_equal :local_bar , @method.frame_type.name_at(1)
    end

    def test_has_local
      assert_equal 1 , @method.has_local(:local_bar)
      assert_equal 2 , @method.has_local(:local_foo)
    end

    def test_add_local
      @method.add_local(:foo2 , :Object)
      assert_equal 4 , @method.frame_type.get_length
      assert_equal :foo2 , @method.frame_type.name_at(3)
      assert_equal :Object , @method.frame_type.type_at(3)
    end

    def test_get_locals_name1
      index = @method.has_local(:local_bar)
      assert_equal 1 , index
      assert_equal :local_bar , @method.frame_type.name_at(index)
    end
    def test_get_frame_type1
      index = @method.has_local(:local_bar)
      assert_equal :Integer , @method.frame_type.type_at(index)
    end
    def test_get_locals_name2
      index = @method.has_local(:local_foo)
      assert_equal 2 , index
      assert_equal :local_foo , @method.frame_type.name_at(index)
    end
    def test_get_frame_type2
      index = @method.has_local(:local_bar)
      assert_equal :Integer , @method.frame_type.type_at(index)
    end
    def test_created_with_binary
      assert @method.binary
    end
    def test_equal
      assert_equal @method , @method
    end
    def test_not_equal
      method = Parfait::CallableMethod.new( :other , @obj , @args , @frame)
      assert @method != method
    end
    def test_create_block
      @block = @method.create_block(@args , @frame)
      assert_equal Block , @block.class
    end
    def test_has_block
      assert_equal 7 , @method.get_type.variable_index( :blocks )
    end
    def test_has_name
      assert_equal 6 , @method.get_type.variable_index( :name )
    end
  end
end