-
Notifications
You must be signed in to change notification settings - Fork 0
/
parse_test.go
119 lines (104 loc) · 2.97 KB
/
parse_test.go
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
108
109
110
111
112
113
114
115
116
117
118
119
package units
import (
"github.com/openlyinc/pointy"
"github.com/stretchr/testify/require"
"testing"
)
func TestParse_Empty(t *testing.T) {
u, err := Parse("")
require.NoError(t, err)
require.Equal(t, Scalar(1), u)
}
func TestParse_Unit(t *testing.T) {
u, err := Parse("u")
require.NoError(t, err)
require.Equal(t, NewUnit("u", 1), u)
}
func TestParse_UnitsMultiplied(t *testing.T) {
u, err := Parse("u1 * u2")
require.NoError(t, err)
require.Equal(t, NewUnit("u1", 1).Multiply(NewUnit("u2", 1)), u)
}
func TestParse_UnitsExponentsAdded(t *testing.T) {
u, err := Parse("u * u^1 * u^2 * u^3")
require.NoError(t, err)
require.Equal(t, NewUnit("u", 7), u)
}
func TestParse_UnitsExponentsSubtracted(t *testing.T) {
u, err := Parse("u * u^1 * u^2 * u^-3")
require.NoError(t, err)
require.Equal(t, NewUnit("u", 1), u)
}
func TestParse_DivideByInverse(t *testing.T) {
u, err := Parse("u / u^-1")
require.NoError(t, err)
require.Equal(t, NewUnit("u", 2), u)
}
func TestParse_CompoundUnit(t *testing.T) {
u, err := Parse("u1^1 * u2^-1 * u1^-2 * u2^2")
require.NoError(t, err)
require.Equal(t, NewUnit("u1", -1).Multiply(NewUnit("u2", 1)), u)
}
func TestParse_CompoundUnitCancelsToScalar(t *testing.T) {
u, err := Parse("u1^1 * u2^-1 * u1^-1 * u2^1")
require.NoError(t, err)
require.Equal(t, Scalar(1), u)
}
func TestParse_EvalUnitExpression_BlankIsScalar(t *testing.T) {
ue := Expression{}
u, err := ue.Unit()
require.NoError(t, err)
require.Equal(t, Scalar(1), u)
}
func TestParse_EvalUnitExpression_SingleTerm(t *testing.T) {
ue := Expression{
Lhs: Term{
UnitTerm: &UnitTerm{Name: "u", Exponent: pointy.Int(2)}},
}
u, err := ue.Unit()
require.NoError(t, err)
require.Equal(t, NewUnit("u", 2), u)
}
func TestParse_EvalUnitExpression_TwoTerms(t *testing.T) {
ue := Expression{
Lhs: Term{
UnitTerm: &UnitTerm{Name: "u1", Exponent: pointy.Int(1)}},
Operator: pointy.String("/"),
Rhs: &Expression{
Lhs: Term{
UnitTerm: &UnitTerm{Name: "u2", Exponent: pointy.Int(2)}},
},
}
u, err := ue.Unit()
require.NoError(t, err)
require.Equal(t, NewUnit("u1", 1).Divide(NewUnit("u2", 2)), u)
}
func TestParse_EvalUnitExpression_ThreeTerms(t *testing.T) {
ue := Expression{
Lhs: Term{
UnitTerm: &UnitTerm{Name: "u1", Exponent: pointy.Int(3)}},
Operator: pointy.String("/"),
Rhs: &Expression{
Lhs: Term{
UnitTerm: &UnitTerm{Name: "u2", Exponent: pointy.Int(2)}},
Operator: pointy.String("/"),
Rhs: &Expression{
Lhs: Term{
UnitTerm: &UnitTerm{Name: "u3", Exponent: pointy.Int(1)}},
},
},
}
u, err := ue.Unit()
require.NoError(t, err)
require.Equal(t, NewUnit("u1", 3).Divide(NewUnit("u2", 2)).Divide(NewUnit("u3", 1)), u)
}
func TestParse_Scalar(t *testing.T) {
u, err := Parse("1.23")
require.NoError(t, err)
require.Equal(t, Scalar(1.23), u)
}
func TestParse_ScalarAndUnits(t *testing.T) {
u, err := Parse("1.23e2 * u1^2 / u2^3")
require.NoError(t, err)
require.Equal(t, Scalar(123).Multiply(NewUnit("u1", 2)).Divide(NewUnit("u2", 3)), u)
}