-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
AM-339 - Added dateAdd() and dateTimeAsEpoch()
Upgraded unit tests to .NET 8
- Loading branch information
1 parent
d96c1fb
commit 1214712
Showing
11 changed files
with
281 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
namespace PanoramicData.NCalcExtensions.Test; | ||
|
||
public class DateAddTests : NCalcTest | ||
{ | ||
[Theory] | ||
[InlineData("2023-12-05T05:00:01Z", 250, "milliseconds", "2023-12-05T05:00:01.250Z")] | ||
[InlineData("2023-12-05T05:00:01Z", 250, "Milliseconds", "2023-12-05T05:00:01.250Z")] | ||
[InlineData("2023-12-05T05:00:01Z", 1, "seconds", "2023-12-05T05:00:02Z")] | ||
[InlineData("2023-12-05T05:00:01Z", 1, "SECONDS", "2023-12-05T05:00:02Z")] | ||
[InlineData("2023-12-05T05:00:01Z", 1, "minutes", "2023-12-05T05:01:01Z")] | ||
[InlineData("2023-12-05T05:00:01Z", 1, "mInUtEs", "2023-12-05T05:01:01Z")] | ||
[InlineData("2023-12-05T05:00:01Z", 1, "hours", "2023-12-05T06:00:01Z")] | ||
[InlineData("2023-12-05T05:00:01Z", 1, "days", "2023-12-06T05:00:01Z")] | ||
[InlineData("2023-12-05T05:00:01Z", 1, "months", "2024-01-05T05:00:01Z")] | ||
[InlineData("2023-12-05T05:00:01Z", 1, "years", "2024-12-05T05:00:01Z")] | ||
public void DateAdd_ParameterisedInput_GivesExpectedOutput(string initialDateAndTime, int quantity, string units, string expectedDateAndTime) | ||
{ | ||
var recognised = DateTime.TryParse(initialDateAndTime, out var initialDateTime); | ||
recognised.Should().BeTrue(); | ||
|
||
recognised = DateTime.TryParse(expectedDateAndTime, out var expectedDateTime); | ||
recognised.Should().BeTrue(); | ||
|
||
var expression = new ExtendedExpression("dateAdd(initialDateTime, quantity, units)"); | ||
expression.Parameters.Add("units", units); | ||
expression.Parameters.Add("quantity", quantity); | ||
expression.Parameters.Add("initialDateTime", initialDateTime); | ||
|
||
var result = expression.Evaluate(); | ||
result.Should().BeOfType<DateTime>(); | ||
result.Should().Be(expectedDateTime); | ||
} | ||
|
||
[Theory] | ||
[InlineData("2023-12-05T05:00:01Z", 250, "aa")] | ||
[InlineData("2023-12-05T05:00:01Z", 1, "nanoseconds")] | ||
[InlineData("2023-12-05T05:00:01Z", 1, "weeks")] | ||
public void DateAdd_Unknownunits_ThrowsFormatException(string initialDateAndTime, int quantity, string units) | ||
{ | ||
var recognised = DateTime.TryParse(initialDateAndTime, out var initialDateTime); | ||
recognised.Should().BeTrue(); | ||
|
||
var expression = new ExtendedExpression("dateAdd(initialDateTime, quantity, units)"); | ||
expression.Parameters.Add("units", units); | ||
expression.Parameters.Add("quantity", quantity); | ||
expression.Parameters.Add("initialDateTime", initialDateTime); | ||
|
||
var action = expression.Evaluate; | ||
action.Should().Throw<FormatException>(); | ||
} | ||
|
||
[Fact] | ||
public void DateAdd_SubtractionBeyondMinDateTime_ThrowsArgumentOutOfRangeException() | ||
{ | ||
var units = "Years"; | ||
var quantity = -1000000; | ||
var initialDateTime = new DateTime(2023, 12, 05, 05, 00, 01); | ||
|
||
var expression = new ExtendedExpression("dateAdd(initialDateTime, quantity, units)"); | ||
expression.Parameters.Add("units", units); | ||
expression.Parameters.Add("quantity", quantity); | ||
expression.Parameters.Add("initialDateTime", initialDateTime); | ||
|
||
var action = expression.Evaluate; | ||
action.Should().Throw<ArgumentOutOfRangeException>(); | ||
} | ||
|
||
[Fact] | ||
public void DateAdd_IncorrectunitsDataType_ThrowsFormatException() | ||
{ | ||
var units = 1; | ||
var quantity = 1; | ||
var initialDateTime = new DateTime(2023, 12, 05, 05, 00, 01); | ||
|
||
var expression = new ExtendedExpression("dateAdd(initialDateTime, quantity, units)"); | ||
expression.Parameters.Add("units", units); | ||
expression.Parameters.Add("quantity", quantity); | ||
expression.Parameters.Add("initialDateTime", initialDateTime); | ||
|
||
var action = expression.Evaluate; | ||
action.Should().Throw<FormatException>(); | ||
} | ||
|
||
[Fact] | ||
public void DateAdd_IncorrectquantityDataType_ThrowsFormatException() | ||
{ | ||
var units = "Hours"; | ||
var quantity = "Hours"; | ||
var initialDateTime = new DateTime(2023, 12, 05, 05, 00, 01); | ||
|
||
var expression = new ExtendedExpression("dateAdd(initialDateTime, quantity, units)"); | ||
expression.Parameters.Add("units", units); | ||
expression.Parameters.Add("quantity", quantity); | ||
expression.Parameters.Add("initialDateTime", initialDateTime); | ||
|
||
var action = expression.Evaluate; | ||
action.Should().Throw<FormatException>(); | ||
} | ||
|
||
[Fact] | ||
public void DateAdd_IncorrectDateTimeDataType_ThrowsFormatException() | ||
{ | ||
var units = "Hours"; | ||
var quantity = 1; | ||
var initialDateTime = new DateTime(2023, 12, 05, 05, 00, 01).ToString(CultureInfo.InvariantCulture); | ||
|
||
var expression = new ExtendedExpression("dateAdd(initialDateTime, quantity, units)"); | ||
expression.Parameters.Add("units", units); | ||
expression.Parameters.Add("quantity", quantity); | ||
expression.Parameters.Add("initialDateTime", initialDateTime); | ||
|
||
var action = expression.Evaluate; | ||
action.Should().Throw<FormatException>(); | ||
} | ||
} |
21 changes: 21 additions & 0 deletions
21
PanoramicData.NCalcExtensions.Test/DateTimeAsEpochTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
namespace PanoramicData.NCalcExtensions.Test; | ||
|
||
public class DateTimeAsEpochTests : NCalcTest | ||
{ | ||
[Fact] | ||
public void DateTimeAsEpoch_ValidParameters_CalculatesCorrectValue() | ||
{ | ||
var result = Test("dateTimeAsEpoch('20190702T000000', 'yyyyMMddTHHmmssK')"); | ||
const long expectedDateTimeEpoch = 1562025600; | ||
Assert.Equal(expectedDateTimeEpoch, result); | ||
} | ||
|
||
[Fact] | ||
public void DateTimeAsEpoch_ExpressionWithSquareBrackets_SuccessfullyInsertsParameter() | ||
{ | ||
var expression = new ExtendedExpression("1 > dateTimeAsEpoch([connectMagic.systemItem.sys_updated_on], 'yyyy-MM-dd HH:mm:ss')"); | ||
expression.Parameters.Add("connectMagic.systemItem.sys_updated_on", "2018-01-01 01:01:01"); | ||
var result = expression.Evaluate(); | ||
Assert.Equal(false, result); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
namespace PanoramicData.NCalcExtensions; | ||
|
||
public enum DateTimeUnit | ||
{ | ||
Milliseconds, | ||
Seconds, | ||
Minutes, | ||
Hours, | ||
Days, | ||
Months, | ||
Years, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
namespace PanoramicData.NCalcExtensions.Extensions; | ||
|
||
/// <summary> | ||
/// Methods for dates and time maths | ||
/// </summary> | ||
internal static class DateAddMethods | ||
{ | ||
internal static void Evaluate(FunctionArgs functionArgs) | ||
{ | ||
if (functionArgs.Parameters.Length < 3) | ||
{ | ||
throw new FormatException($"{ExtensionFunction.DateTime} function - you must pass 3 parameters."); | ||
} | ||
|
||
// The date and time | ||
if (functionArgs.Parameters[0].Evaluate() is not DateTime initialDateTime) | ||
{ | ||
throw new FormatException($"{ExtensionFunction.DateAdd} function - The first argument should be a DateTime"); | ||
} | ||
|
||
// The quantity | ||
if (functionArgs.Parameters[1].Evaluate() is not int quantity) | ||
{ | ||
throw new FormatException($"{ExtensionFunction.DateAdd} function - The second argument should be an integer"); | ||
} | ||
|
||
// The units | ||
if (functionArgs.Parameters[2].Evaluate() is not string unitsString) | ||
{ | ||
throw new FormatException($"{ExtensionFunction.DateAdd} function - The third argument should be a string, e.g. 'days'"); | ||
} | ||
if (!Enum.TryParse(unitsString, true, out DateTimeUnit units)) | ||
{ | ||
throw new FormatException($"{ExtensionFunction.DateAdd} function - The third argument is not a recognised unit, e.g. 'days'"); | ||
} | ||
|
||
functionArgs.Result = Add(initialDateTime, quantity, units); | ||
} | ||
|
||
/// <summary> | ||
/// Perform the addition, returning the sum of the DateTime and the period | ||
/// </summary> | ||
/// <param name="initialDateTime">The date and time that acts as the basis for the sum</param> | ||
/// <param name="quantity">The quantity of the units to be added</param> | ||
/// <param name="units">The units used to define the period to be added</param> | ||
/// <returns>The original DateTime plus the duration specified</returns> | ||
/// <exception cref="FormatException">The requested interval was not recognised</exception> | ||
private static DateTime Add(DateTime initialDateTime, int quantity, DateTimeUnit units) | ||
=> units switch | ||
{ | ||
DateTimeUnit.Milliseconds => initialDateTime.AddMilliseconds(quantity), | ||
DateTimeUnit.Seconds => initialDateTime.AddSeconds(quantity), | ||
DateTimeUnit.Minutes => initialDateTime.AddMinutes(quantity), | ||
DateTimeUnit.Hours => initialDateTime.AddHours(quantity), | ||
DateTimeUnit.Days => initialDateTime.AddDays(quantity), | ||
DateTimeUnit.Months => initialDateTime.AddMonths(quantity), | ||
DateTimeUnit.Years => initialDateTime.AddYears(quantity), | ||
_ => throw new FormatException($"{ExtensionFunction.DateAdd} function - The requested units were not recognised") | ||
}; | ||
} |
14 changes: 14 additions & 0 deletions
14
PanoramicData.NCalcExtensions/Extensions/DateTimeAsEpoch.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
namespace PanoramicData.NCalcExtensions.Extensions; | ||
|
||
internal static class DateTimeAsEpoch | ||
{ | ||
internal static void Evaluate(FunctionArgs functionArgs) | ||
{ | ||
var dateTimeOffset = DateTimeOffset.ParseExact( | ||
functionArgs.Parameters[0].Evaluate() as string, // Input date as string | ||
functionArgs.Parameters[1].Evaluate() as string, | ||
CultureInfo.InvariantCulture.DateTimeFormat, | ||
DateTimeStyles.AssumeUniversal); | ||
functionArgs.Result = dateTimeOffset.ToUnixTimeSeconds(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
{ | ||
"sdk": { | ||
"version": "7.0.307", | ||
"version": "8.0.100", | ||
"rollForward": "latestFeature" | ||
} | ||
} |