Skip to content

Commit 7c804eb

Browse files
committed
Added unit tests for overflow handling to Arithmetic Add/Subtract operations; added checked to bypass default behavior of arithmetic wrapping
1 parent 460dcaa commit 7c804eb

File tree

2 files changed

+140
-6
lines changed

2 files changed

+140
-6
lines changed

Cql/CoreTests/PrimitiveTests.cs

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Hl7.Cql.Abstractions;
1010
using Hl7.Cql.CodeGeneration.NET.Toolkit;
1111
using Hl7.Cql.Compiler;
12+
using Hl7.Cql.Elm;
1213
using Hl7.Cql.Fhir;
1314
using Hl7.Cql.Iso8601;
1415
using Hl7.Cql.Operators;
@@ -3591,5 +3592,138 @@ public void Subtract_Date_Quantity_To_MinDate()
35913592
var newDateSubtractedMin = fcq.Subtract(inputDateMinValue, quantity);
35923593
Assert.IsNull(newDateSubtractedMin);
35933594
}
3595+
3596+
[TestMethod]
3597+
public void Add_Integers()
3598+
{
3599+
var rc = GetNewContext();
3600+
var fcq = rc.Operators;
3601+
3602+
int expectedResult = 2;
3603+
var addedValue = fcq.Add(1, 1);
3604+
Assert.IsNotNull(addedValue);
3605+
Assert.AreEqual(expectedResult, addedValue);
3606+
}
3607+
3608+
[TestMethod]
3609+
public void Add_Integer_To_MaxInteger()
3610+
{
3611+
var rc = GetNewContext();
3612+
var fcq = rc.Operators;
3613+
3614+
var addedValue = fcq.Add(int.MaxValue, 1);
3615+
Assert.IsNull(addedValue);
3616+
}
3617+
3618+
[TestMethod]
3619+
public void Add_Longs()
3620+
{
3621+
var rc = GetNewContext();
3622+
var fcq = rc.Operators;
3623+
3624+
long expectedResult = 2L;
3625+
var addedValue = fcq.Add(1L, 1L);
3626+
Assert.IsNotNull(addedValue);
3627+
Assert.AreEqual(expectedResult, addedValue);
3628+
}
3629+
3630+
[TestMethod]
3631+
public void Add_Long_To_MaxLong()
3632+
{
3633+
var rc = GetNewContext();
3634+
var fcq = rc.Operators;
3635+
3636+
var addedValue = fcq.Add(long.MaxValue, 1L);
3637+
Assert.IsNull(addedValue);
3638+
}
3639+
3640+
[TestMethod]
3641+
public void Add_Decimals()
3642+
{
3643+
var rc = GetNewContext();
3644+
var fcq = rc.Operators;
3645+
3646+
decimal expectedResult = 2m;
3647+
var addedValue = fcq.Add(1m, 1m);
3648+
Assert.IsNotNull(addedValue);
3649+
Assert.AreEqual(expectedResult, addedValue);
3650+
}
3651+
3652+
[TestMethod]
3653+
public void Add_Decimal_To_MaxDecimal()
3654+
{
3655+
var rc = GetNewContext();
3656+
var fcq = rc.Operators;
3657+
3658+
var addedValue = fcq.Add(decimal.MaxValue, 1m);
3659+
Assert.IsNull(addedValue);
3660+
}
3661+
3662+
[TestMethod]
3663+
public void Subtract_Integers()
3664+
{
3665+
var rc = GetNewContext();
3666+
var fcq = rc.Operators;
3667+
3668+
int expectedResult = 1;
3669+
var subtractedValue = fcq.Subtract(2, 1);
3670+
Assert.IsNotNull(subtractedValue);
3671+
Assert.AreEqual(expectedResult, subtractedValue);
3672+
}
3673+
3674+
[TestMethod]
3675+
public void Subtract_Integer_To_MinInteger()
3676+
{
3677+
var rc = GetNewContext();
3678+
var fcq = rc.Operators;
3679+
3680+
var subtractedValue = fcq.Subtract(int.MinValue, 1);
3681+
Assert.IsNull(subtractedValue);
3682+
}
3683+
3684+
[TestMethod]
3685+
public void Subtract_Longs()
3686+
{
3687+
var rc = GetNewContext();
3688+
var fcq = rc.Operators;
3689+
3690+
long expectedResult = 1L;
3691+
var subtractedValue = fcq.Subtract(2L, 1L);
3692+
Assert.IsNotNull(subtractedValue);
3693+
Assert.AreEqual(expectedResult, subtractedValue);
3694+
}
3695+
3696+
[TestMethod]
3697+
public void Subtract_Long_To_MinLong()
3698+
{
3699+
var rc = GetNewContext();
3700+
var fcq = rc.Operators;
3701+
3702+
var subtractedValue = fcq.Subtract(long.MinValue, 1L);
3703+
Assert.IsNull(subtractedValue);
3704+
}
3705+
3706+
[TestMethod]
3707+
public void Subtract_Decimals()
3708+
{
3709+
var rc = GetNewContext();
3710+
var fcq = rc.Operators;
3711+
3712+
decimal expectedResult = 1m;
3713+
var subtractedValue = fcq.Subtract(2m, 1m);
3714+
Assert.IsNotNull(subtractedValue);
3715+
Assert.AreEqual(expectedResult, subtractedValue);
3716+
}
3717+
3718+
[TestMethod]
3719+
public void Subtract_Decimal_To_MinDecimal()
3720+
{
3721+
var rc = GetNewContext();
3722+
var fcq = rc.Operators;
3723+
3724+
var subtractedValue = fcq.Subtract(decimal.MinValue, 1m);
3725+
Assert.IsNull(subtractedValue);
3726+
}
3727+
35943728
}
35953729
}

Cql/Cql.Runtime/Operators/CqlOperators.ArithmeticOperators.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ internal partial class CqlOperators
5656
if (left == null || right == null) return null;
5757
try
5858
{
59-
return left + right;
59+
return checked(left + right);
6060
}
6161
catch (OverflowException e)
6262
{
@@ -70,7 +70,7 @@ internal partial class CqlOperators
7070
if (left == null || right == null) return null;
7171
try
7272
{
73-
return left + right;
73+
return checked(left + right);
7474
}
7575
catch (OverflowException e)
7676
{
@@ -83,7 +83,7 @@ internal partial class CqlOperators
8383
if (left == null || right == null) return null;
8484
try
8585
{
86-
return left + right;
86+
return checked(left + right);
8787
}
8888
catch (OverflowException e)
8989
{
@@ -700,7 +700,7 @@ internal partial class CqlOperators
700700
if (left == null || right == null) return null;
701701
try
702702
{
703-
return left - right;
703+
return checked(left - right);
704704
}
705705
catch (OverflowException e)
706706
{
@@ -714,7 +714,7 @@ internal partial class CqlOperators
714714
if (left == null || right == null) return null;
715715
try
716716
{
717-
return left - right;
717+
return checked(left - right);
718718
}
719719
catch (OverflowException e)
720720
{
@@ -727,7 +727,7 @@ internal partial class CqlOperators
727727
if (left == null || right == null) return null;
728728
try
729729
{
730-
return left - right;
730+
return checked(left - right);
731731
}
732732
catch (OverflowException e)
733733
{

0 commit comments

Comments
 (0)