Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions src/EPPlus/FormulaParsing/Excel/Functions/DateAndTime/Weekday.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,24 @@ private int CalculateDayOfWeek(DateTime dateTime, int returnType)
return _oneBasedStartOnMonday[dayIx];
case 3:
return _zeroBasedStartOnSunday[dayIx];
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
var dayIxForArr0 = returnType - 11;

//Calculate distance/index from expected 0
var idx = dayIx - dayIxForArr0;

//If index is negative count backwards from end of array
if (idx < 0)
{
idx = _oneBasedStartOnMonday.Count + idx;
}

return _oneBasedStartOnMonday[idx];
default:
throw new ExcelErrorValueException(eErrorType.Num);
}
Expand Down
160 changes: 150 additions & 10 deletions src/EPPlusTest/FormulaParsing/Excel/Functions/DateTimeFunctionsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,21 @@ Date Author Change
*******************************************************************************
01/27/2020 EPPlus Software AB Initial release EPPlus 5
*******************************************************************************/
using System;
using System.Text;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using EPPlusTest.FormulaParsing.TestHelpers;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Threading;
using OfficeOpenXml;
using OfficeOpenXml.FormulaParsing;
using OfficeOpenXml.FormulaParsing.Excel.Functions;
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateAndTime;
using EPPlusTest.FormulaParsing.TestHelpers;
using OfficeOpenXml;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Finance;
using OfficeOpenXml.FormulaParsing.FormulaExpressions;
using OfficeOpenXml.FormulaParsing.Excel.Functions;
using OfficeOpenXml.FormulaParsing.Ranges;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;

namespace EPPlusTest.Excel.Functions
{
Expand Down Expand Up @@ -188,7 +189,7 @@ public void TimeShouldReturnACorrectSerialNumber()
var expectedResult = GetTime(10, 11, 12);
var func = new Time();
var result = func.Execute(FunctionsHelper.CreateArgs(10, 11, 12), _parsingContext);
Assert.AreEqual(expectedResult, result.Result);
Assert.AreEqual(expectedResult, result.Result);
}

[TestMethod]
Expand Down Expand Up @@ -302,6 +303,145 @@ public void WeekdayShouldReturnCorrectResultForASundayWhenReturnTypeIs3()
Assert.AreEqual(6, result.Result);
}

static readonly Dictionary<string, double> MondayToSundayOADict = new Dictionary<string, double>()
{
{"Monday", new DateTime(2026, 3, 9).ToOADate()},
{"Tuesday", new DateTime(2026, 3, 10).ToOADate()},
{"Wednesday", new DateTime(2026, 3, 11).ToOADate()},
{"Thursday", new DateTime(2026, 3, 12).ToOADate()},
{"Friday", new DateTime(2026, 3, 13).ToOADate()},
{"Saturday", new DateTime(2026, 3, 14).ToOADate()},
{"Sunday", new DateTime(2026, 3, 15).ToOADate()}

};

[TestMethod]
[DataRow("Monday", 1)]
[DataRow("Tuesday", 2)]
[DataRow("Wednesday", 3)]
[DataRow("Thursday", 4)]
[DataRow("Friday", 5)]
[DataRow("Saturday", 6)]
[DataRow("Sunday", 7)]
public void WeekdayWhenTypeIs11ForAllDays(string day, int expectedResult)
{
var func = new Weekday();

var oaDate = MondayToSundayOADict[day];
var result = func.Execute(FunctionsHelper.CreateArgs(oaDate, 11), _parsingContext);

Assert.AreEqual(expectedResult, result.Result);
}

[TestMethod]
[DataRow("Monday", 7)]
[DataRow("Tuesday", 1)]
[DataRow("Wednesday", 2)]
[DataRow("Thursday", 3)]
[DataRow("Friday", 4)]
[DataRow("Saturday", 5)]
[DataRow("Sunday", 6)]
public void WeekdayWhenTypeIs12ForAllDays(string day, int expectedResult)
{
var func = new Weekday();

var oaDate = MondayToSundayOADict[day];
var result = func.Execute(FunctionsHelper.CreateArgs(oaDate, 12), _parsingContext);

Assert.AreEqual(expectedResult, result.Result);
}

[TestMethod]
[DataRow("Monday", 6)]
[DataRow("Tuesday", 7)]
[DataRow("Wednesday", 1)]
[DataRow("Thursday", 2)]
[DataRow("Friday", 3)]
[DataRow("Saturday", 4)]
[DataRow("Sunday", 5)]
public void WeekdayWhenTypeIs13ForAllDays(string day, int expectedResult)
{
var func = new Weekday();

var oaDate = MondayToSundayOADict[day];
var result = func.Execute(FunctionsHelper.CreateArgs(oaDate, 13), _parsingContext);

Assert.AreEqual(expectedResult, result.Result);
}

[TestMethod]
[DataRow("Monday", 5)]
[DataRow("Tuesday", 6)]
[DataRow("Wednesday", 7)]
[DataRow("Thursday", 1)]
[DataRow("Friday", 2)]
[DataRow("Saturday", 3)]
[DataRow("Sunday", 4)]
public void WeekdayWhenTypeIs14ForAllDays(string day, int expectedResult)
{
var func = new Weekday();

var oaDate = MondayToSundayOADict[day];
var result = func.Execute(FunctionsHelper.CreateArgs(oaDate, 14), _parsingContext);

Assert.AreEqual(expectedResult, result.Result);
}


[TestMethod]
[DataRow("Monday", 4)]
[DataRow("Tuesday", 5)]
[DataRow("Wednesday", 6)]
[DataRow("Thursday", 7)]
[DataRow("Friday", 1)]
[DataRow("Saturday", 2)]
[DataRow("Sunday", 3)]
public void WeekdayWhenTypeIs15ForAllDays(string day, int expectedResult)
{
var func = new Weekday();

var oaDate = MondayToSundayOADict[day];
var result = func.Execute(FunctionsHelper.CreateArgs(oaDate, 15), _parsingContext);

Assert.AreEqual(expectedResult, result.Result);
}

[TestMethod]
[DataRow("Monday", 3)]
[DataRow("Tuesday", 4)]
[DataRow("Wednesday", 5)]
[DataRow("Thursday", 6)]
[DataRow("Friday", 7)]
[DataRow("Saturday", 1)]
[DataRow("Sunday", 2)]
public void WeekdayWhenTypeIs16ForAllDays(string day, int expectedResult)
{
var func = new Weekday();

var oaDate = MondayToSundayOADict[day];
var result = func.Execute(FunctionsHelper.CreateArgs(oaDate, 16), _parsingContext);

Assert.AreEqual(expectedResult, result.Result);
}

[TestMethod]
[DataRow("Monday", 2)]
[DataRow("Tuesday", 3)]
[DataRow("Wednesday", 4)]
[DataRow("Thursday", 5)]
[DataRow("Friday", 6)]
[DataRow("Saturday", 7)]
[DataRow("Sunday", 1)]
public void WeekdayWhenTypeIs17ForAllDays(string day, int expectedResult)
{
var func = new Weekday();

var oaDate = MondayToSundayOADict[day];
var result = func.Execute(FunctionsHelper.CreateArgs(oaDate, 17), _parsingContext);

Assert.AreEqual(expectedResult, result.Result);
}

[TestMethod]
public void WeekNumShouldReturnCorrectResult()
{
Expand Down