Skip to content

Commit

Permalink
#553 - Add more cases to type analyzer (exception handling).
Browse files Browse the repository at this point in the history
  • Loading branch information
sys27 committed May 13, 2022
1 parent dfd4999 commit 7c44243
Show file tree
Hide file tree
Showing 7 changed files with 476 additions and 85 deletions.
40 changes: 1 addition & 39 deletions xFunc.Maths/Analyzers/TypeAnalyzers/ResultTypes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public enum ResultTypes
/// <summary>
/// The expression returns undefined result.
/// </summary>
Undefined = 1,
Undefined = 1 << 0,

/// <summary>
/// The expression returns a number.
Expand Down Expand Up @@ -95,42 +95,4 @@ public enum ResultTypes
/// The expression returns a volume number.
/// </summary>
VolumeNumber = 1 << 15,

/// <summary>
/// The expression returns a number or a complex number.
/// </summary>
NumberOrComplex = Number | ComplexNumber,

/// <summary>
/// The expression returns a number or a angle number.
/// </summary>
NumberOrAngle = Number | AngleNumber,

/// <summary>
/// The expression returns a number or a angle number or a complex number.
/// </summary>
NumberOrAngleOrComplex = NumberOrAngle | ComplexNumber,

/// <summary>
/// The expression returns a number or a vector or a matrix.
/// </summary>
NumberOrVectorOrMatrix = Number | Vector | Matrix,

/// <summary>
/// The expression returns any type of number.
/// </summary>
Numbers = Number |
AngleNumber |
PowerNumber |
TemperatureNumber |
MassNumber |
LengthNumber |
TimeNumber |
AreaNumber |
VolumeNumber,

/// <summary>
/// The expression returns a number or a angle number or a complex number or a vector.
/// </summary>
NumbersOrComplexOrVector = Numbers | ComplexNumber | Vector,
}
242 changes: 196 additions & 46 deletions xFunc.Maths/Analyzers/TypeAnalyzers/TypeAnalyzer.cs

Large diffs are not rendered by default.

36 changes: 36 additions & 0 deletions xFunc.Tests/Analyzers/TypeAnalyzerTests/AddTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -555,4 +555,40 @@ public void TestAddNumberToString()

Test(exp, ResultTypes.String);
}

public static IEnumerable<object[]> GetDataForTestAddAngleAndBoolTest()
{
yield return new object[] { AngleValue.Degree(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, AngleValue.Degree(90).AsExpression() };

yield return new object[] { PowerValue.Watt(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, PowerValue.Watt(90).AsExpression() };

yield return new object[] { TemperatureValue.Celsius(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, TemperatureValue.Celsius(90).AsExpression() };

yield return new object[] { MassValue.Gram(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, MassValue.Gram(90).AsExpression() };

yield return new object[] { LengthValue.Meter(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, LengthValue.Meter(90).AsExpression() };

yield return new object[] { TimeValue.Second(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, TimeValue.Second(90).AsExpression() };

yield return new object[] { AreaValue.Meter(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, AreaValue.Meter(90).AsExpression() };

yield return new object[] { VolumeValue.Meter(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, VolumeValue.Meter(90).AsExpression() };
}

[Theory]
[MemberData(nameof(GetDataForTestAddAngleAndBoolTest))]
public void TestAddAngleAndBoolTest(IExpression left, IExpression right)
{
var exp = new Add(left, right);

TestBinaryException(exp);
}
}
21 changes: 21 additions & 0 deletions xFunc.Tests/Analyzers/TypeAnalyzerTests/DivTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -196,4 +196,25 @@ public void TestDivVolumeNumber()

Test(exp, ResultTypes.VolumeNumber);
}

public static IEnumerable<object[]> GetDataForTestDivAngleAndBoolTest()
{
yield return new object[] { AngleValue.Degree(90).AsExpression() };
yield return new object[] { PowerValue.Watt(90).AsExpression() };
yield return new object[] { TemperatureValue.Celsius(90).AsExpression() };
yield return new object[] { MassValue.Gram(90).AsExpression() };
yield return new object[] { LengthValue.Meter(90).AsExpression() };
yield return new object[] { TimeValue.Second(90).AsExpression() };
yield return new object[] { AreaValue.Meter(90).AsExpression() };
yield return new object[] { VolumeValue.Meter(90).AsExpression() };
}

[Theory]
[MemberData(nameof(GetDataForTestDivAngleAndBoolTest))]
public void TestDivAngleAndBoolTest(IExpression left)
{
var exp = new Div(left, Bool.False);

TestBinaryException(exp);
}
}
36 changes: 36 additions & 0 deletions xFunc.Tests/Analyzers/TypeAnalyzerTests/MulTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -427,4 +427,40 @@ public void TestMulVolumeAndNumber()

Test(exp, ResultTypes.VolumeNumber);
}

public static IEnumerable<object[]> GetDataForTestMulAngleAndBoolTest()
{
yield return new object[] { AngleValue.Degree(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, AngleValue.Degree(90).AsExpression() };

yield return new object[] { PowerValue.Watt(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, PowerValue.Watt(90).AsExpression() };

yield return new object[] { TemperatureValue.Celsius(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, TemperatureValue.Celsius(90).AsExpression() };

yield return new object[] { MassValue.Gram(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, MassValue.Gram(90).AsExpression() };

yield return new object[] { LengthValue.Meter(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, LengthValue.Meter(90).AsExpression() };

yield return new object[] { TimeValue.Second(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, TimeValue.Second(90).AsExpression() };

yield return new object[] { AreaValue.Meter(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, AreaValue.Meter(90).AsExpression() };

yield return new object[] { VolumeValue.Meter(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, VolumeValue.Meter(90).AsExpression() };
}

[Theory]
[MemberData(nameof(GetDataForTestMulAngleAndBoolTest))]
public void TestMulAngleAndBoolTest(IExpression left, IExpression right)
{
var exp = new Mul(left, right);

TestBinaryException(exp);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,156 @@ public void TestTemperatureBool(Type type)
TestBinaryException(exp);
}

[Theory]
[InlineData(typeof(GreaterThan))]
[InlineData(typeof(GreaterOrEqual))]
[InlineData(typeof(LessThan))]
[InlineData(typeof(LessOrEqual))]
public void TestBoolMass(Type type)
{
var exp = CreateBinary(type,
Bool.True,
MassValue.Gram(12).AsExpression()
);

TestBinaryException(exp);
}

[Theory]
[InlineData(typeof(GreaterThan))]
[InlineData(typeof(GreaterOrEqual))]
[InlineData(typeof(LessThan))]
[InlineData(typeof(LessOrEqual))]
public void TestMassBool(Type type)
{
var exp = CreateBinary(type,
MassValue.Gram(12).AsExpression(),
Bool.True
);

TestBinaryException(exp);
}

[Theory]
[InlineData(typeof(GreaterThan))]
[InlineData(typeof(GreaterOrEqual))]
[InlineData(typeof(LessThan))]
[InlineData(typeof(LessOrEqual))]
public void TestBoolLength(Type type)
{
var exp = CreateBinary(type,
Bool.True,
LengthValue.Meter(12).AsExpression()
);

TestBinaryException(exp);
}

[Theory]
[InlineData(typeof(GreaterThan))]
[InlineData(typeof(GreaterOrEqual))]
[InlineData(typeof(LessThan))]
[InlineData(typeof(LessOrEqual))]
public void TestLengthBool(Type type)
{
var exp = CreateBinary(type,
LengthValue.Meter(12).AsExpression(),
Bool.True
);

TestBinaryException(exp);
}

[Theory]
[InlineData(typeof(GreaterThan))]
[InlineData(typeof(GreaterOrEqual))]
[InlineData(typeof(LessThan))]
[InlineData(typeof(LessOrEqual))]
public void TestBoolTime(Type type)
{
var exp = CreateBinary(type,
Bool.True,
TimeValue.Second(12).AsExpression()
);

TestBinaryException(exp);
}

[Theory]
[InlineData(typeof(GreaterThan))]
[InlineData(typeof(GreaterOrEqual))]
[InlineData(typeof(LessThan))]
[InlineData(typeof(LessOrEqual))]
public void TestTimeBool(Type type)
{
var exp = CreateBinary(type,
TimeValue.Second(12).AsExpression(),
Bool.True
);

TestBinaryException(exp);
}

[Theory]
[InlineData(typeof(GreaterThan))]
[InlineData(typeof(GreaterOrEqual))]
[InlineData(typeof(LessThan))]
[InlineData(typeof(LessOrEqual))]
public void TestBoolArea(Type type)
{
var exp = CreateBinary(type,
Bool.True,
AreaValue.Meter(12).AsExpression()
);

TestBinaryException(exp);
}

[Theory]
[InlineData(typeof(GreaterThan))]
[InlineData(typeof(GreaterOrEqual))]
[InlineData(typeof(LessThan))]
[InlineData(typeof(LessOrEqual))]
public void TestAreaBool(Type type)
{
var exp = CreateBinary(type,
AreaValue.Meter(12).AsExpression(),
Bool.True
);

TestBinaryException(exp);
}

[Theory]
[InlineData(typeof(GreaterThan))]
[InlineData(typeof(GreaterOrEqual))]
[InlineData(typeof(LessThan))]
[InlineData(typeof(LessOrEqual))]
public void TestBoolVolume(Type type)
{
var exp = CreateBinary(type,
Bool.True,
VolumeValue.Meter(12).AsExpression()
);

TestBinaryException(exp);
}

[Theory]
[InlineData(typeof(GreaterThan))]
[InlineData(typeof(GreaterOrEqual))]
[InlineData(typeof(LessThan))]
[InlineData(typeof(LessOrEqual))]
public void TestVolumeBool(Type type)
{
var exp = CreateBinary(type,
VolumeValue.Meter(12).AsExpression(),
Bool.True
);

TestBinaryException(exp);
}

[Theory]
[InlineData(typeof(GreaterThan))]
[InlineData(typeof(GreaterOrEqual))]
Expand Down
36 changes: 36 additions & 0 deletions xFunc.Tests/Analyzers/TypeAnalyzerTests/SubTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -545,4 +545,40 @@ public void TestSubVolumeAndVolume()

Test(exp, ResultTypes.VolumeNumber);
}

public static IEnumerable<object[]> GetDataForTestSubAngleAndBoolTest()
{
yield return new object[] { AngleValue.Degree(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, AngleValue.Degree(90).AsExpression() };

yield return new object[] { PowerValue.Watt(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, PowerValue.Watt(90).AsExpression() };

yield return new object[] { TemperatureValue.Celsius(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, TemperatureValue.Celsius(90).AsExpression() };

yield return new object[] { MassValue.Gram(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, MassValue.Gram(90).AsExpression() };

yield return new object[] { LengthValue.Meter(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, LengthValue.Meter(90).AsExpression() };

yield return new object[] { TimeValue.Second(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, TimeValue.Second(90).AsExpression() };

yield return new object[] { AreaValue.Meter(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, AreaValue.Meter(90).AsExpression() };

yield return new object[] { VolumeValue.Meter(90).AsExpression(), Bool.False };
yield return new object[] { Bool.False, VolumeValue.Meter(90).AsExpression() };
}

[Theory]
[MemberData(nameof(GetDataForTestSubAngleAndBoolTest))]
public void TestSubAngleAndBoolTest(IExpression left, IExpression right)
{
var exp = new Sub(left, right);

TestBinaryException(exp);
}
}

0 comments on commit 7c44243

Please sign in to comment.