summaryrefslogtreecommitdiff
path: root/Plugins/MonoGame.Extended/tests/MonoGame.Extended.Tests/AngleTest.cs
blob: 2f2762b19ca8786dd19683cc19f75c4189a974f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using Microsoft.Xna.Framework;
using Xunit;

namespace MonoGame.Extended.Tests
{
    public class AngleTest
    {
        private const float _delta = 0.00001f;
        private readonly WithinDeltaEqualityComparer _withinDeltaEqualityComparer = new(_delta);

        [Fact]
        public void ConstructorTest()
        {
            const float value = 0.5f;

            // ReSharper disable once RedundantArgumentDefaultValue
            var radians = new Angle(value, AngleType.Radian);
            var degrees = new Angle(value, AngleType.Degree);
            var gradians = new Angle(value, AngleType.Gradian);
            var revolutions = new Angle(value, AngleType.Revolution);

            Assert.Equal(0.5f, radians.Radians, _withinDeltaEqualityComparer);
            Assert.Equal(0.5f, degrees.Degrees, _withinDeltaEqualityComparer);
            Assert.Equal(0.5f, gradians.Gradians, _withinDeltaEqualityComparer);
            Assert.Equal(0.5f, revolutions.Revolutions, _withinDeltaEqualityComparer);
        }

        [Fact]
        public void ConversionTest()
        {
            //from radians
            var radians = new Angle(MathHelper.Pi);
            Assert.Equal(180f, radians.Degrees, _withinDeltaEqualityComparer);
            Assert.Equal(200f, radians.Gradians, _withinDeltaEqualityComparer);
            Assert.Equal(0.5f, radians.Revolutions, _withinDeltaEqualityComparer);

            //to radians
            var degrees = new Angle(180f, AngleType.Degree);
            var gradians = new Angle(200f, AngleType.Gradian);
            var revolutions = new Angle(0.5f, AngleType.Revolution);

            Assert.Equal(MathHelper.Pi, degrees.Radians, _withinDeltaEqualityComparer);
            Assert.Equal(MathHelper.Pi, gradians.Radians, _withinDeltaEqualityComparer);
            Assert.Equal(MathHelper.Pi, revolutions.Radians, _withinDeltaEqualityComparer);
        }

        [Fact]
        public void WrapTest()
        {
            for (var f = -10f; f < 10f; f += 0.1f)
            {
                var wrappositive = new Angle(f);
                wrappositive.WrapPositive();

                var wrap = new Angle(f);
                wrap.Wrap();

                Assert.True(wrappositive.Radians >= 0);
                Assert.True(wrappositive.Radians < 2d * MathHelper.Pi);

                Assert.True(wrap.Radians >= -MathHelper.Pi);
                Assert.True(wrap.Radians < MathHelper.Pi);
            }
        }

        [Fact]
        public void VectorTest()
        {
            var angle = Angle.FromVector(Vector2.One);
            Assert.Equal(-MathHelper.Pi / 4f, angle.Radians, _withinDeltaEqualityComparer);
            Assert.Equal(10f, angle.ToVector(10f).Length());

            angle = Angle.FromVector(Vector2.UnitX);
            Assert.Equal(0, angle.Radians, _withinDeltaEqualityComparer);
            Assert.True(Vector2.UnitX.EqualsWithTolerence(angle.ToUnitVector()));

            angle = Angle.FromVector(-Vector2.UnitY);
            Assert.Equal(MathHelper.Pi / 2f, angle.Radians, _withinDeltaEqualityComparer);
            Assert.True((-Vector2.UnitY).EqualsWithTolerence(angle.ToUnitVector()));
        }

        [Fact]
        public void EqualsTest()
        {
            var angle1 = new Angle(0);
            var angle2 = new Angle(MathHelper.Pi * 2f);
            Assert.True(angle1 == angle2);
            angle2.Radians = MathHelper.Pi * 4f;
            Assert.True(angle1.Equals(angle2));
        }
    }
}