From 890d96798a9bc46e4c62f835892f1df571032133 Mon Sep 17 00:00:00 2001 From: Jarl Gullberg Date: Wed, 31 May 2017 16:14:04 +0200 Subject: [PATCH] Added more tests for the Vector2 class. --- tests/OpenTK.Tests/Vector2Tests.fs | 169 +++++++++++++++++++++++++++++++++++-- 1 file changed, 161 insertions(+), 8 deletions(-) diff --git a/tests/OpenTK.Tests/Vector2Tests.fs b/tests/OpenTK.Tests/Vector2Tests.fs index ac70d1c..fa79fab 100644 --- a/tests/OpenTK.Tests/Vector2Tests.fs +++ b/tests/OpenTK.Tests/Vector2Tests.fs @@ -22,13 +22,7 @@ module Vector2 = Assert.Equal(x,v.X) Assert.Equal(y,v.Y) - [] - let ``Index operators work for the correct components`` (x,y) = - let v = Vector2(x,y) - Assert.Equal(v.[0],v.X) - Assert.Equal(v.[1],v.Y) - -// [] + //[] // disabled - behaviour needs discussion let ``Clamping works for each component`` (a : Vector2,b : Vector2,c : Vector2) = let inline clamp (value : float32) minV maxV = MathHelper.Clamp(value,minV,maxV) @@ -40,7 +34,34 @@ module Vector2 = let ``Length is always >= 0`` (a : Vector2) = // Assert.True(a.Length >= 0.0f) - + + [ |])>] + module Indexing = + // + [] + let ``Index operators work for the correct components`` (x,y) = + let v = Vector2(x,y) + Assert.Equal(v.[0],v.X) + Assert.Equal(v.[1],v.Y) + + [] + let ``Vector indexing throws index out of range exception correctly`` (x, y) = + let mutable v = Vector2(x, y) + let invalidIndexingAccess = fun() -> v.[2] |> ignore + Assert.Throws(invalidIndexingAccess) |> ignore + + let invalidIndexingAssignment = (fun() -> v.[2] <- x) + Assert.Throws(invalidIndexingAssignment) |> ignore + + [] + let ``Component assignment by indexing works`` (x, y) = + let mutable v = Vector2() + v.[0] <- x + v.[1] <- y + Assert.Equal(x, v.X) + Assert.Equal(y, v.Y) + + [ |])>] module ``Simple Properties`` = // @@ -95,6 +116,11 @@ module Vector2 = let r = a * f Assert.Equal(a.X * f,r.X) Assert.Equal(a.Y * f,r.Y) + + // Inverse direction + let r = f * a + Assert.Equal(a.X * f,r.X) + Assert.Equal(a.Y * f,r.Y) [ |])>] module Subtraction = @@ -114,3 +140,130 @@ module Vector2 = let r = a / f Assert.ApproximatelyEqual(a.X / f,r.X) Assert.ApproximatelyEqual(a.Y / f,r.Y) + + [ |])>] + module Negation = + // + [] + let ``Vector negation operator works`` (x, y) = + let v = Vector2(x, y) + let vNeg = -v + Assert.Equal(-x, vNeg.X) + Assert.Equal(-y, vNeg.Y) + + [ |])>] + module Equality = + // + [] + let ``Vector equality operator works`` (x, y) = + let v1 = Vector2(x, y) + let v2 = Vector2(x, y) + let equality = v1 = v2 + Assert.True(equality) + + [] + let ``Vector inequality operator works`` (x, y) = + let v1 = Vector2(x, y) + let v2 = Vector2(y, x) + let inequality = v1 <> v2 + Assert.True(inequality) + + [] + let ``Vector equality method works`` (x, y) = + let v1 = Vector2(x, y) + let v2 = Vector2(x, y) + let notVector = Matrix2() + + let equality = v1.Equals(v2) + let inequalityByOtherType = v1.Equals(notVector) + + Assert.True(equality) + Assert.False(inequalityByOtherType) + + [ |])>] + module Swizzling = + // + [] + let ``Vector swizzling works`` (x, y) = + let v1 = Vector2(x, y) + let v2 = Vector2(y, x) + + let v1yx = v1.Yx; + Assert.Equal(v2, v1yx); + + [ |])>] + module Interpolation = + // + [] + let ``Linear interpolation works`` (a : Vector2, b : Vector2, q) = + + let blend = q + + let rX = blend * (b.X - a.X) + a.X + let rY = blend * (b.Y - a.Y) + a.Y + let vExp = Vector2(rX, rY) + + Assert.Equal(vExp, Vector2.Lerp(a, b, q)) + + let mutable vRes = Vector2() + Vector2.Lerp(ref a, ref b, q, &vRes) + Assert.Equal(vExp, vRes) + + [] + let ``Barycentric interpolation works`` (a : Vector2, b : Vector2, c : Vector2, u, v) = + + let r = a + u * (b - a) + v * (c - a) + + Assert.Equal(r, Vector2.BaryCentric(a, b, c, u, v)) + + let mutable vRes = Vector2() + Vector2.BaryCentric(ref a, ref b, ref c, u, v, &vRes) + Assert.Equal(r, vRes) + + [ |])>] + module ``Vector products`` = + // + [] + let ``Dot product works`` (a : Vector2, b : Vector2) = + let dot = a.X * b.X + a.Y * b.Y + + Assert.Equal(dot, Vector2.Dot(a, b)); + + let mutable vRes = (float32)0 + Vector2.Dot(ref a, ref b, &vRes) + Assert.Equal(dot, vRes) + + [] + let ``Perpendicular dot product works`` (a : Vector2, b : Vector2) = + let dot = a.X * b.Y + a.Y * b.X + + Assert.Equal(dot, Vector2.PerpDot(a, b)); + + let mutable vRes = (float32)0 + Vector2.PerpDot(ref a, ref b, &vRes) + Assert.Equal(dot, vRes) + + [ |])>] + module Normalization = + // + [] + let ``Normalization works`` (a : Vector2) = + let scale = 1.0f / a.Length + let norm = Vector2(a.X * scale, a.Y * scale) + + Assert.Equal(norm, Vector2.Normalize(a)); + + let mutable vRes = Vector2() + Vector2.Normalize(ref a, &vRes) + Assert.Equal(norm, vRes) + + [] + let ``Fast approximate normalization works`` (a : Vector2, b : Vector2) = + let scale = MathHelper.InverseSqrtFast(a.X * a.X + a.Y * a.Y) + let norm = Vector2(a.X * scale, a.Y * scale) + + Assert.Equal(norm, Vector2.Normalize(a)); + + let mutable vRes = Vector2() + Vector2.Normalize(ref a, &vRes) + Assert.Equal(norm, vRes) \ No newline at end of file -- 2.7.4