Skip to content

Commit

Permalink
Close #338 - Simplify AngleValue same as Number
Browse files Browse the repository at this point in the history
  • Loading branch information
sys27 committed Sep 26, 2020
1 parent 176b356 commit 964dc2f
Show file tree
Hide file tree
Showing 5 changed files with 173 additions and 0 deletions.
24 changes: 24 additions & 0 deletions xFunc.Maths/Analyzers/Simplifier.cs
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,12 @@ public override IExpression Analyze(Add exp)
// const + const
(Number left, Number right)
=> new Number(left + right),
(Number left, Angle right)
=> (left.Value + right.Value).AsExpression(),
(Angle left, Number right)
=> (left.Value + right.Value).AsExpression(),
(Angle left, Angle right)
=> (left.Value + right.Value).AsExpression(),

// x + x
(Variable left, Variable right) when left.Name == right.Name
Expand Down Expand Up @@ -370,6 +376,12 @@ when MathExtensions.Equals(left, 0) && MathExtensions.Equals(right, 0)
// const / const
(Number left, Number right)
=> new Number(left.Value / right.Value),
(Number left, Angle right)
=> (left.Value / right.Value).AsExpression(),
(Angle left, Number right)
=> (left.Value / right.Value).AsExpression(),
(Angle left, Angle right)
=> (left.Value / right.Value).AsExpression(),

// x / x
(Variable left, Variable right) when left.Equals(right)
Expand Down Expand Up @@ -615,6 +627,12 @@ public override IExpression Analyze(Mul exp)
// const * const
(Number left, Number right)
=> new Number(left.Value * right.Value),
(Number left, Angle right)
=> (left.Value * right.Value).AsExpression(),
(Angle left, Number right)
=> (left.Value * right.Value).AsExpression(),
(Angle left, Angle right)
=> (left.Value * right.Value).AsExpression(),

// x * -y
(var left, UnaryMinus minus)
Expand Down Expand Up @@ -907,6 +925,12 @@ public override IExpression Analyze(Sub exp)
// const - const
(Number left, Number right)
=> new Number(left - right),
(Number left, Angle right)
=> (left.Value - right.Value).AsExpression(),
(Angle left, Number right)
=> (left.Value - right.Value).AsExpression(),
(Angle left, Angle right)
=> (left.Value - right.Value).AsExpression(),

// x + x
(Variable left, Variable right) when left.Name == right.Name
Expand Down
38 changes: 38 additions & 0 deletions xFunc.Tests/Analyzers/SimplifierTests/AddSimplifierTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.

using System;
using xFunc.Maths.Expressions;
using xFunc.Maths.Expressions.Angles;
using Xunit;

namespace xFunc.Tests.Analyzers.SimplifierTests
Expand Down Expand Up @@ -47,6 +49,42 @@ public void AddTwoNumbers()
SimplifyTest(add, expected);
}

[Fact(DisplayName = "90 + 2 rad")]
public void AddNumberAngle()
{
var add = new Add(
new Number(90),
AngleValue.Degree(2).AsExpression()
);
var expected = AngleValue.Degree(92).AsExpression();

SimplifyTest(add, expected);
}

[Fact(DisplayName = "90 deg + 2")]
public void AddAngleNumber()
{
var add = new Add(
AngleValue.Degree(90).AsExpression(),
new Number(2)
);
var expected = AngleValue.Degree(92).AsExpression();

SimplifyTest(add, expected);
}

[Fact(DisplayName = "90 deg + 2 rad")]
public void AddTwoAngles()
{
var add = new Add(
AngleValue.Degree(90).AsExpression(),
AngleValue.Radian(2).AsExpression()
);
var expected = AngleValue.Degree(90 + 114.59155902616465).AsExpression();

SimplifyTest(add, expected);
}

[Fact(DisplayName = "-x + 2")]
public void AddFirstUnaryMinus()
{
Expand Down
37 changes: 37 additions & 0 deletions xFunc.Tests/Analyzers/SimplifierTests/DivSimplifierTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

using System;
using xFunc.Maths.Expressions;
using xFunc.Maths.Expressions.Angles;
using Xunit;

namespace xFunc.Tests.Analyzers.SimplifierTests
Expand Down Expand Up @@ -65,6 +66,42 @@ public void DivTwoNumbers()
SimplifyTest(div, expected);
}

[Fact(DisplayName = "90 / 2 deg")]
public void DivNumberAngle()
{
var div = new Div(
new Number(90),
AngleValue.Degree(2).AsExpression()
);
var expected = AngleValue.Degree(45).AsExpression();

SimplifyTest(div, expected);
}

[Fact(DisplayName = "90 deg / 2")]
public void DivAngleNumber()
{
var div = new Div(
AngleValue.Degree(90).AsExpression(),
new Number(2)
);
var expected = AngleValue.Degree(45).AsExpression();

SimplifyTest(div, expected);
}

[Fact(DisplayName = "2 rad / 90 deg")]
public void DivTwoAngles()
{
var div = new Div(
AngleValue.Radian(2).AsExpression(),
AngleValue.Degree(90).AsExpression()
);
var expected = AngleValue.Degree(114.59155902616465 / 90).AsExpression();

SimplifyTest(div, expected);
}

[Fact(DisplayName = "(2 * x) / 4")]
public void DivDiff_NumMulVar_DivNum()
{
Expand Down
37 changes: 37 additions & 0 deletions xFunc.Tests/Analyzers/SimplifierTests/MulSimplifierTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
// limitations under the License.

using xFunc.Maths.Expressions;
using xFunc.Maths.Expressions.Angles;
using xFunc.Maths.Expressions.Trigonometric;
using Xunit;

Expand Down Expand Up @@ -84,6 +85,42 @@ public void MulTwoNumbers()
SimplifyTest(mul, expected);
}

[Fact(DisplayName = "90 * 2 deg")]
public void MulNumberAngle()
{
var mul = new Mul(
new Number(90),
AngleValue.Degree(2).AsExpression()
);
var expected = AngleValue.Degree(180).AsExpression();

SimplifyTest(mul, expected);
}

[Fact(DisplayName = "90 deg * 2")]
public void MulAngleNumber()
{
var mul = new Mul(
AngleValue.Degree(90).AsExpression(),
new Number(2)
);
var expected = AngleValue.Degree(180).AsExpression();

SimplifyTest(mul, expected);
}

[Fact(DisplayName = "2 rad * 90 deg")]
public void MulTwoAngles()
{
var mul = new Mul(
AngleValue.Radian(2).AsExpression(),
AngleValue.Degree(90).AsExpression()
);
var expected = AngleValue.Degree(114.59155902616465 * 90).AsExpression();

SimplifyTest(mul, expected);
}

[Fact(DisplayName = "2 * (2 * x)")]
public void MulDiffNumMul_NumMulVar_()
{
Expand Down
37 changes: 37 additions & 0 deletions xFunc.Tests/Analyzers/SimplifierTests/SubSimplifierTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
// limitations under the License.

using xFunc.Maths.Expressions;
using xFunc.Maths.Expressions.Angles;
using Xunit;

namespace xFunc.Tests.Analyzers.SimplifierTests
Expand Down Expand Up @@ -47,6 +48,42 @@ public void SubTwoNumbers()
SimplifyTest(sub, expected);
}

[Fact(DisplayName = "90 - 2 deg")]
public void SubNumberAngle()
{
var sub = new Sub(
new Number(90),
AngleValue.Degree(2).AsExpression()
);
var expected = AngleValue.Degree(88).AsExpression();

SimplifyTest(sub, expected);
}

[Fact(DisplayName = "90 deg - 2")]
public void SubAngleNumber()
{
var sub = new Sub(
AngleValue.Degree(90).AsExpression(),
new Number(2)
);
var expected = AngleValue.Degree(88).AsExpression();

SimplifyTest(sub, expected);
}

[Fact(DisplayName = "2 rad - 90 deg")]
public void SubTwoAngles()
{
var sub = new Sub(
AngleValue.Radian(2).AsExpression(),
AngleValue.Degree(90).AsExpression()
);
var expected = AngleValue.Degree(114.59155902616465 - 90).AsExpression();

SimplifyTest(sub, expected);
}

[Fact(DisplayName = "2 - -x")]
public void SubSecondUnaryMinus()
{
Expand Down

0 comments on commit 964dc2f

Please sign in to comment.