141 lines
3.3 KiB
Crystal
141 lines
3.3 KiB
Crystal
require "spec"
|
|
require "../../src/engine/vector"
|
|
|
|
describe Vector do
|
|
it "allocate vectors" do
|
|
Vector[1i64, 2i64, 3i64, 4i64]
|
|
Vector[1i32, 2i64, 3i64, 4i64]
|
|
Vector[4i64]
|
|
Vector[1, 2.0, 3u64, 4.1f64]
|
|
v = Vector(Int32, 4).new { |i| i + 1 }
|
|
v[0].should eq(1)
|
|
v[1].should eq(2)
|
|
v[2].should eq(3)
|
|
v[3].should eq(4)
|
|
v06 = Vector(Float64, 6).zero
|
|
v06[0].should eq(0.0)
|
|
v06.size.should eq(6)
|
|
v06.tuple_type.should eq(Float64)
|
|
end
|
|
|
|
it "has a size" do
|
|
Vector[1].size.should eq(1)
|
|
Vector[1, 2].size.should eq(2)
|
|
Vector[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10.0].size.should eq(11)
|
|
end
|
|
|
|
it "has a tuple_type" do
|
|
Vector[1].tuple_type.should eq(Int32)
|
|
Vector[1, 2].tuple_type.should eq(Int32)
|
|
Vector[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10.0].tuple_type.should eq(Int32 | Float64)
|
|
end
|
|
|
|
it "equality test" do
|
|
(Vector[1, 2] == Vector[1, 2]).should be_true
|
|
(Vector[1, 2] != Vector[2, 2]).should be_true
|
|
(Vector[1, 2, 3] != Vector[1, 2]).should be_true
|
|
(Vector[1, 2] != Vector[1, 2, 3]).should be_true
|
|
(Vector[1, 2] != Vector[1, 2, 0]).should be_true
|
|
end
|
|
|
|
it "clones vectors" do
|
|
v1 = Vector[1, 2, 3]
|
|
v2 = v1.clone
|
|
v1.to_unsafe[0] = 0
|
|
v1[0].should_not eq(v2[0])
|
|
v1[1].should eq(v2[1])
|
|
end
|
|
|
|
it "mutates adds vectors" do
|
|
v1 = Vector[1, 2]
|
|
v2 = Vector[0, 1]
|
|
v3 = v1.add!(v2)
|
|
v1.object_id.should eq(v3.object_id)
|
|
v1[0].should eq(1)
|
|
v1[1].should eq(3)
|
|
v2[0].should eq(0)
|
|
v2[1].should eq(1)
|
|
end
|
|
|
|
it "adds vectors" do
|
|
v1 = Vector[1, 2]
|
|
v2 = Vector[0, 1]
|
|
v3 = v1 + v2
|
|
v1[0].should eq(1)
|
|
v2[0].should eq(0)
|
|
v3[0].should eq(1)
|
|
v1[1].should eq(2)
|
|
v2[1].should eq(1)
|
|
v3[1].should eq(3)
|
|
end
|
|
|
|
it "negates a vector" do
|
|
v1 = Vector[1, 2]
|
|
v2 = -v1
|
|
v1[0].should eq(1)
|
|
v1[1].should eq(2)
|
|
v2[0].should eq(-1)
|
|
v2[1].should eq(-2)
|
|
end
|
|
|
|
it "substract vectors" do
|
|
v1 = Vector[1, 2]
|
|
v2 = Vector[2, 1]
|
|
v3 = v1 - v2
|
|
v1[0].should eq(1)
|
|
v2[0].should eq(2)
|
|
v3[0].should eq(-1)
|
|
v1[1].should eq(2)
|
|
v2[1].should eq(1)
|
|
v3[1].should eq(1)
|
|
end
|
|
|
|
it "mutate multiply vector" do
|
|
v1 = Vector[1, 2]
|
|
v2 = v1.mult!(2)
|
|
v2.object_id.should eq(v1.object_id)
|
|
v1[0].should eq(2)
|
|
v1[1].should eq(4)
|
|
end
|
|
|
|
it "multiply vector" do
|
|
v1 = Vector[1, 2]
|
|
v2 = v1 * 2
|
|
v1[0].should eq(1)
|
|
v1[1].should eq(2)
|
|
v2[0].should eq(2)
|
|
v2[1].should eq(4)
|
|
end
|
|
|
|
# it "mutate divide vector" do
|
|
# v1 = Vector[5.0, 21]
|
|
# v2 = v1.div!(2)
|
|
# v2.object_id.should eq(v1.object_id)
|
|
# v1[0].should eq(2.5)
|
|
# v1[1].should eq(10)
|
|
# end
|
|
|
|
it "divide vector" do
|
|
v1 = Vector[5.0, 21]
|
|
v2 = v1 / 2
|
|
v1[0].should eq(5.0)
|
|
v1[1].should eq(21)
|
|
v2[0].should eq(2.5)
|
|
v2[1].should eq(10)
|
|
end
|
|
|
|
it "magnitude of vector" do
|
|
Vector[1, 1].magnitude.should eq(Math.sqrt(2))
|
|
Vector[1, 2].magnitude.should eq(Math.sqrt(1**2 + 2**2))
|
|
Vector[2, 2].magnitude.should eq(Math.sqrt(2**2 + 2**2))
|
|
Vector[2, 2, 2].magnitude.should eq((2**2 + 2**2 + 2**2)**(1.0/3.0))
|
|
end
|
|
|
|
it "normalized vector" do
|
|
Vector[1].normalize == Vector[1]
|
|
Vector[2].normalize == Vector[1]
|
|
Vector[2.3].normalize == Vector[1.0]
|
|
(Vector[1, 2].normalize == Vector[1 / Math.sqrt(5), 2 / Math.sqrt(5)])
|
|
end
|
|
end
|