require_relative "helper"

module Ruby
  module LastBar
    include RubyTests
    def test_last_class
      assert_equal Vool::SendStatement , @lst.last.class
    end
    def test_last_name
      assert_equal :last , @lst.last.name
    end
    def test_last_arg
      assert_equal Vool::LocalVariable , @lst.last.arguments.first.class
    end
    def test_lst_class
      assert_equal Vool::Statements , @lst.class
    end
    def test_lst_no_statements
      @lst.statements.each{|st| assert( ! st.is_a?(Vool::Statements) , st.class)}
    end
  end
  class TestSendSendArgVool < MiniTest::Test
    include LastBar
    def setup
      @lst = compile( "last(foo(1))").to_vool
    end
    def test_classes
      assert_equal Vool::Statements , @lst.class
      assert_equal Vool::LocalAssignment , @lst.first.class
      assert_equal Vool::SendStatement , @lst.last.class
    end
    def test_foo1
      assert_equal Vool::SendStatement , @lst.first.value.class
      assert_equal :foo ,  @lst.first.value.name
      assert_equal Vool::IntegerConstant , @lst.first.value.arguments.first.class
    end
  end
  class Test3SendVool < MiniTest::Test
    include LastBar
    def setup
      @lst = compile( "last(foo(more(1)))").to_vool
    end
    def test_classes
      assert_equal Vool::Statements , @lst.class
      assert_equal Vool::LocalAssignment , @lst.first.class
      assert_equal Vool::SendStatement , @lst.last.class
    end
    def test_foo
      assert_equal Vool::SendStatement , @lst.first.value.class
      assert_equal :more ,  @lst.first.value.name
      assert_equal Vool::IntegerConstant , @lst.first.value.arguments.first.class
    end
  end
  class Test5SendVool < MiniTest::Test
    include LastBar
    def setup
      @lst = compile( "last(foo(more(even_more(1),and_more(with_more))))").to_vool
    end
    def test_classes
      assert_equal Vool::Statements , @lst.class
      assert_equal Vool::LocalAssignment , @lst.first.class
      assert_equal Vool::SendStatement , @lst.last.class
    end
    def test_foo
      assert_equal Vool::SendStatement , @lst.first.value.class
      assert_equal :even_more ,  @lst.first.value.name
      assert_equal Vool::IntegerConstant , @lst.first.value.arguments.first.class
    end
  end
end