forked from RomanZhu/FixedPoint-Sharp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFP_Tests.cs
107 lines (89 loc) · 4.48 KB
/
FP_Tests.cs
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using System;
using System.Globalization;
using Deterministic.FixedPoint;
using FluentAssertions;
using NUnit.Framework;
namespace UnitTests
{
public class FP_Tests {
private const string PRECISION_FORMAT = "F4";
private const int ROUNDING = 5;
[Test]
public void ToStringTest()
{
var originalFp = Fixed._1 - Fixed._0_01;
Math.Round(originalFp.AsDouble, ROUNDING).ToString(PRECISION_FORMAT, CultureInfo.InvariantCulture).Should().Be("0.9900");
originalFp = Fixed._1 - Fixed._0_01 *Fixed._0_01;
Math.Round(originalFp.AsDouble, ROUNDING).ToString(PRECISION_FORMAT, CultureInfo.InvariantCulture).Should().Be("0.9999");
originalFp = Fixed._1;
Math.Round(originalFp.AsDouble, ROUNDING).ToString(PRECISION_FORMAT, CultureInfo.InvariantCulture).Should().Be("1.0000");
originalFp = Fixed._1 + Fixed._0_01;
Math.Round(originalFp.AsDouble, ROUNDING).ToString(PRECISION_FORMAT, CultureInfo.InvariantCulture).Should().Be("1.0100");
originalFp = Fixed._1 + Fixed._0_01 * Fixed._0_01;
Math.Round(originalFp.AsDouble, ROUNDING).ToString(PRECISION_FORMAT, CultureInfo.InvariantCulture).Should().Be("1.0001");
originalFp = Fixed._0_01;
Math.Round(originalFp.AsDouble, ROUNDING).ToString(PRECISION_FORMAT, CultureInfo.InvariantCulture).Should().Be("0.0100");
originalFp = Fixed._0_50;
Math.Round(originalFp.AsDouble, ROUNDING).ToString(PRECISION_FORMAT, CultureInfo.InvariantCulture).Should().Be("0.5000");
}
[Test]
public void SlowStringParsingTest() {
Fixed.Parse("5").AsFloatRounded.Should().BeApproximately(5, 0.0001f);
Fixed.Parse("5.").AsFloatRounded.Should().BeApproximately(5, 0.0001f);
Fixed.Parse(".1").AsFloatRounded.Should().BeApproximately(0.1f, 0.0001f);
Fixed.Parse("5.1").AsFloatRounded.Should().BeApproximately(5.1f, 0.0001f);
Fixed.Parse("5.45111111").AsFloatRounded.Should().BeApproximately(5.4511f, 0.0001f);
Fixed.Parse("-5").AsFloatRounded.Should().BeApproximately(-5, 0.0001f);
Fixed.Parse("-5.").AsFloatRounded.Should().BeApproximately(-5, 0.0001f);
Fixed.Parse("-.1").AsFloatRounded.Should().BeApproximately(-0.1f, 0.0001f);
Fixed.Parse("-5.1").AsFloatRounded.Should().BeApproximately(-5.1f, 0.0001f);
}
[Test]
public void SlowFromToStringTest() {
var from = -100.0;
var to = 100.0;
var delta = 0.0001;
for (var v = from; v < to; v += delta) {
var parsedString = Math.Round(v, ROUNDING).ToString(PRECISION_FORMAT, CultureInfo.InvariantCulture);
var parsedFp = Fixed.Parse(parsedString);
var convertedBackFloat = parsedFp.AsDouble;
convertedBackFloat.Should().BeApproximately(v, 0.0001);
}
}
[Test]
public void FromToStringTest() {
var from = -100.0;
var to = 100.0;
var delta = 0.0001;
for (var v = from; v < to; v += delta) {
var parsedString = Math.Round(v, ROUNDING).ToString(PRECISION_FORMAT, CultureInfo.InvariantCulture);
var parsedFp = Fixed.ParseUnsafe(parsedString);
var convertedBackFloat = parsedFp.AsDouble;
convertedBackFloat.Should().BeApproximately(v, 0.0001);
}
}
[Test]
public void FromFloatTest() {
var from = -100.0;
var to = 100.0;
var delta = 0.0001;
for (var v = from; v < to; v += delta) {
var parsedFp = Fixed.ParseUnsafe((float)v);
var convertedBackFloat = parsedFp.AsDouble;
convertedBackFloat.Should().BeApproximately(v, 0.0001);
}
}
[Test]
public void AsIntTest() {
var from = -65000f;
var to = 65000;
var delta = 0.1f;
for (float v = from; v < to; v += delta) {
var originalInt = (int) Math.Floor(v);
var parsedFp = Fixed.ParseUnsafe(v);
var convertedBack = parsedFp.AsInt;
convertedBack.Should().Be(originalInt);
}
}
}
}