#! /usr/bin/ruby

require "helper"
#require "test/unit"
require "matrix"
#require 'mageo.rb'
#require "mageo/vector.rb"
#require "mageo/vector3d.rb"

class TC_Vector < Test::Unit::TestCase
  #include Math
  $tolerance = 1.0E-10

  def setup
    @v0 = Vector[ 1.0, 2.0, 3.0 ]
    @v1 = Vector[ 1.0, 1.0 ]
    @v2 = Vector[ 1.0, 2.0, 3.0, 4.0 ]
  end

  def test_equal
    assert_equal(false, @v0 == Vector[1.0, 2.0, 4.0] )
    assert_equal(true,  @v0 == Vector[1.0, 2.0, 3.0] )
  end

  def test_unit_vector
    assert_raise( Vector::ZeroOperationError ){ Vector[0.0, 0.0, 0.0].unit_vector }

    assert_in_delta( 1.0/Math::sqrt(14.0), @v0.unit_vector[0], $tolerance )
    assert_in_delta( 2.0/Math::sqrt(14.0), @v0.unit_vector[1], $tolerance )
    assert_in_delta( 3.0/Math::sqrt(14.0), @v0.unit_vector[2], $tolerance )
    assert_equal( Vector[1.0, 2.0, 3.0], @v0) #非破壊であることを確認。
  end

  def test_floor
    tmp = @v0.floor
    assert_equal(Vector, tmp.class)
    assert_equal(1, tmp[0])
    assert_equal(2, tmp[1])
    assert_equal(3, tmp[2])
    assert_equal(3, tmp.size)

    tmp = @v1.floor
    assert_equal(1, tmp[0])
    assert_equal(1, tmp[1])
    assert_equal(2, tmp.size)
    
    tmp = Vector[ 1.1, 2.2].floor
    assert_equal(1, tmp[0])
    assert_equal(2, tmp[1])
    assert_equal(2, tmp.size)
    
    tmp = Vector[-1.1,-2.2].floor
    assert_equal(-2, tmp[0])
    assert_equal(-3, tmp[1])
    assert_equal(2, tmp.size)

    # positive decimal like
    vec = Vector[-1.1,-2.2]
    tmp = vec - vec.floor
    assert_in_delta(0.9, tmp[0], $tolerance)
    assert_in_delta(0.8, tmp[1], $tolerance)
    assert_equal(2, tmp.size)

    # inherited class
    tmp = Mageo::Vector3D[1.1, 2.2, 3.3].floor
    assert_equal(Mageo::Vector3D, tmp.class)
    assert_equal(1, tmp[0])
    assert_equal(2, tmp[1])
    assert_equal(3, tmp[2])
    assert_equal(3, tmp.size)

  end
end

