Skip to content

Commit 4100b31

Browse files
committed
#491 - Add simplification rules for mass.
1 parent 920cce5 commit 4100b31

File tree

5 files changed

+129
-0
lines changed

5 files changed

+129
-0
lines changed

xFunc.Maths/Analyzers/Simplifier.cs

+21
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,13 @@ public override IExpression Analyze(Add exp)
200200
(Temperature left, Temperature right)
201201
=> (left.Value + right.Value).AsExpression(),
202202

203+
(Number left, Mass right)
204+
=> (left.Value + right.Value).AsExpression(),
205+
(Mass left, Number right)
206+
=> (left.Value + right.Value).AsExpression(),
207+
(Mass left, Mass right)
208+
=> (left.Value + right.Value).AsExpression(),
209+
203210
// x + x
204211
(Variable left, Variable right) when left.Name == right.Name
205212
=> new Mul(Number.Two, left),
@@ -314,6 +321,8 @@ public override IExpression Analyze(Div exp)
314321
=> (left.Value / right.Value).AsExpression(),
315322
(Temperature left, Number right)
316323
=> (left.Value / right.Value).AsExpression(),
324+
(Mass left, Number right)
325+
=> (left.Value / right.Value).AsExpression(),
317326

318327
// x / x
319328
(Variable left, Variable right) when left.Equals(right)
@@ -506,6 +515,11 @@ public override IExpression Analyze(Mul exp)
506515
(Temperature left, Number right)
507516
=> (left.Value * right.Value).AsExpression(),
508517

518+
(Number left, Mass right)
519+
=> (left.Value * right.Value).AsExpression(),
520+
(Mass left, Number right)
521+
=> (left.Value * right.Value).AsExpression(),
522+
509523
// x * -y
510524
(var left, UnaryMinus minus)
511525
=> new UnaryMinus(new Mul(left, minus.Argument)),
@@ -747,6 +761,13 @@ public override IExpression Analyze(Sub exp)
747761
(Temperature left, Temperature right)
748762
=> (left.Value - right.Value).AsExpression(),
749763

764+
(Number left, Mass right)
765+
=> (left.Value - right.Value).AsExpression(),
766+
(Mass left, Number right)
767+
=> (left.Value - right.Value).AsExpression(),
768+
(Mass left, Mass right)
769+
=> (left.Value - right.Value).AsExpression(),
770+
750771
// x + x
751772
(Variable left, Variable right) when left.Name == right.Name
752773
=> Number.Zero,

xFunc.Tests/Analyzers/SimplifierTests/AddSimplifierTest.cs

+36
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,42 @@ public void AddTwoTemperatures()
149149
SimplifyTest(add, expected);
150150
}
151151

152+
[Fact(DisplayName = "10 + 10 g")]
153+
public void AddNumberAndMass()
154+
{
155+
var add = new Add(
156+
new Number(10),
157+
MassValue.Gram(10).AsExpression()
158+
);
159+
var expected = MassValue.Gram(20).AsExpression();
160+
161+
SimplifyTest(add, expected);
162+
}
163+
164+
[Fact(DisplayName = "10 g + 10")]
165+
public void AddMassAndNumber()
166+
{
167+
var add = new Add(
168+
MassValue.Gram(10).AsExpression(),
169+
new Number(10)
170+
);
171+
var expected = MassValue.Gram(20).AsExpression();
172+
173+
SimplifyTest(add, expected);
174+
}
175+
176+
[Fact(DisplayName = "10 g + 10 kg")]
177+
public void AddTwoMasses()
178+
{
179+
var add = new Add(
180+
MassValue.Kilogram(10).AsExpression(),
181+
MassValue.Gram(10).AsExpression()
182+
);
183+
var expected = MassValue.Gram(10010).AsExpression();
184+
185+
SimplifyTest(add, expected);
186+
}
187+
152188
[Fact(DisplayName = "-x + 2")]
153189
public void AddFirstUnaryMinus()
154190
{

xFunc.Tests/Analyzers/SimplifierTests/DivSimplifierTest.cs

+12
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,18 @@ public void DivTemperatureByNumber()
8585
SimplifyTest(div, expected);
8686
}
8787

88+
[Fact(DisplayName = "90 g / 2")]
89+
public void DivMassByNumber()
90+
{
91+
var div = new Div(
92+
MassValue.Gram(90).AsExpression(),
93+
new Number(2)
94+
);
95+
var expected = MassValue.Gram(45).AsExpression();
96+
97+
SimplifyTest(div, expected);
98+
}
99+
88100
[Fact(DisplayName = "(2 * x) / 4")]
89101
public void DivDiff_NumMulVar_DivNum()
90102
{

xFunc.Tests/Analyzers/SimplifierTests/MulSimplifierTest.cs

+24
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,30 @@ public void MulTemperatureByNumber()
149149
SimplifyTest(mul, expected);
150150
}
151151

152+
[Fact(DisplayName = "10 * 2 g")]
153+
public void MulNumberByMass()
154+
{
155+
var mul = new Mul(
156+
new Number(10),
157+
MassValue.Gram(2).AsExpression()
158+
);
159+
var expected = MassValue.Gram(20).AsExpression();
160+
161+
SimplifyTest(mul, expected);
162+
}
163+
164+
[Fact(DisplayName = "2 g * 10")]
165+
public void MulMassByNumber()
166+
{
167+
var mul = new Mul(
168+
MassValue.Gram(2).AsExpression(),
169+
new Number(10)
170+
);
171+
var expected = MassValue.Gram(20).AsExpression();
172+
173+
SimplifyTest(mul, expected);
174+
}
175+
152176
[Fact(DisplayName = "2 * (2 * x)")]
153177
public void MulDiffNumMul_NumMulVar_()
154178
{

xFunc.Tests/Analyzers/SimplifierTests/SubSimplifierTest.cs

+36
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,42 @@ public void SubTemperatureFromTemperature()
140140
SimplifyTest(sub, expected);
141141
}
142142

143+
[Fact(DisplayName = "20 - 10 g")]
144+
public void SubMassFromNumber()
145+
{
146+
var sub = new Sub(
147+
new Number(20),
148+
MassValue.Gram(10).AsExpression()
149+
);
150+
var expected = MassValue.Gram(10).AsExpression();
151+
152+
SimplifyTest(sub, expected);
153+
}
154+
155+
[Fact(DisplayName = "20 g - 10")]
156+
public void SubNumberFromMass()
157+
{
158+
var sub = new Sub(
159+
MassValue.Gram(20).AsExpression(),
160+
new Number(10)
161+
);
162+
var expected = MassValue.Gram(10).AsExpression();
163+
164+
SimplifyTest(sub, expected);
165+
}
166+
167+
[Fact(DisplayName = "20 kg - 10 g")]
168+
public void SubMassFromMass()
169+
{
170+
var sub = new Sub(
171+
MassValue.Kilogram(20).AsExpression(),
172+
MassValue.Gram(10).AsExpression()
173+
);
174+
var expected = MassValue.Kilogram(19.990).AsExpression();
175+
176+
SimplifyTest(sub, expected);
177+
}
178+
143179
[Fact(DisplayName = "2 - -x")]
144180
public void SubSecondUnaryMinus()
145181
{

0 commit comments

Comments
 (0)