Files
continuousimprovement/tests/Strata.ContinuousImprovement.Biz.Test.Unit/PerformanceEngine/PerformanceEngineTests.cs
T

303 lines
19 KiB
C#

using NUnit.Framework;
using Strata.ContinuousImprovement.Biz.FiscalMonths;
using Strata.ContinuousImprovement.Biz.PerformanceEngine;
using Strata.ContinuousImprovement.Biz.Shared;
using Strata.ContinuousImprovement.Biz.Test.Unit.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using VerifyNUnit;
using VerifyTests;
namespace Strata.ContinuousImprovement.Biz.Test.Unit.PerformanceEngine
{
[TestFixture, Category("Unit"), Category("CCI")]
public class PerformanceEngineTests
{
private VerifySettings _verifySettings;
[OneTimeSetUp]
public void FixtureSetup()
{
_verifySettings = TestExtensions.TestSettings();
#pragma warning disable S3878 // Arrays should not be created for params parameters
_verifySettings
.ScrubMembers(["FiscalYear", "FiscalYearID", "CalendarYear"]);
#pragma warning restore S3878 // Arrays should not be created for params parameters
}
[Test]
public async Task TestCalculateUVSavings()
{
//ORG 0222 | Demo 1 | ADLT Total Knee Replacement W/O - Supplies - 10 - Northern Valley Medical Center - FY2017 | Hetzer Adriane (no seasonality)
var currentYear = DateTime.Now.Year;
MonthlyRampUp[] rampUps =
{
new MonthlyRampUp(1, currentYear, 100), new MonthlyRampUp(2, currentYear, 100), new MonthlyRampUp(3, currentYear, 100), new MonthlyRampUp(4, currentYear, 100),
new MonthlyRampUp(5, currentYear, 100),new MonthlyRampUp(6, currentYear, 100),new MonthlyRampUp(7, currentYear, 100),new MonthlyRampUp(8, currentYear, 100),
new MonthlyRampUp(9, currentYear, 100),new MonthlyRampUp(10, currentYear, 100),new MonthlyRampUp(11, currentYear, 100),new MonthlyRampUp(12, currentYear, 100)
};
const bool isInverse = true;
const bool isSeasonal = false;
double[] goalUnits = { 13221, 17628, 22035, 22035, 8814, 26442, 8814, 13221, 22035, 17628, 30849, 44070 };
double[] baselineUnits = { 12231, 16788, 21605, 21305, 8430, 24648, 8172, 11847, 24535, 16704, 26159, 45000 };
double[] baselineStats = { 3, 4, 5, 5, 2, 6, 2, 3, 5, 4, 7, 10 };
double[] trackingUnits = { 54314, 8798, 31680, 21415, 25895, 0, 0, 0, 0, 0, 0, 0 };
double[] trackingStats = { 13, 2, 8, 5, 5, 0, 0, 0, 0, 0, 0, 0 };
var trackingYearMonths = GetTrackingYearMonths(currentYear).ToList();
var performanceBaselineData = PerformanceComparisonData.SetupBaselineDataList(baselineUnits, baselineStats, currentYear - 1);
var performanceTrackingData = PerformanceComparisonData.SetupTrackingDataList(goalUnits, trackingUnits, trackingStats, currentYear);
var group = new PerformanceGroup(1, "testItem");
var options = new PerformanceOptions(isSeasonal, isInverse, true);
var testGroup = new PerformanceTrackingItem(group, rampUps, options, performanceBaselineData, performanceTrackingData, trackingYearMonths);
await Verifier.Verify(testGroup.MonthlyTrackingData, _verifySettings)
.UseFileName(TestContext.CurrentContext.TestName());
}
[Test(Description = "Dev Major PerformanceAGain - FY2019 (test for seasonality)")]
public async Task TestSavingsFreeForm()
{
var currentYear = DateTime.Now.Year;
MonthlyRampUp[] rampUps =
{
new MonthlyRampUp(1, currentYear, 100), new MonthlyRampUp(2, currentYear, 100), new MonthlyRampUp(3, currentYear, 100), new MonthlyRampUp(4, currentYear, 100),
new MonthlyRampUp(5, currentYear, 100),new MonthlyRampUp(6, currentYear, 100),new MonthlyRampUp(7, currentYear, 100),new MonthlyRampUp(8, currentYear, 100),
new MonthlyRampUp(9, currentYear, 100),new MonthlyRampUp(10, currentYear, 100),new MonthlyRampUp(11, currentYear, 100),new MonthlyRampUp(12, currentYear, 100)
};
const bool isInverse = true;
const bool isSeasonal = true;
double[] goalUnits = { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };
double[] baselineUnits = { 200, 150, 100, 150, 200, 100, 100, 100, 150, 200, 500, 320 };
double[] baselineStats = { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 };
double[] trackingUnits = { 100, 100, 100, 100, 200, 0, 0, 0, 0, 0, 0, 0 };
double[] trackingStats = { 10, 10, 10, 10, 5, 0, 0, 0, 0, 0, 0, 0 };
var trackingYearMonths = GetTrackingYearMonths(currentYear).ToList();
var performanceBaselineData = PerformanceComparisonData.SetupBaselineDataList(baselineUnits, baselineStats, currentYear - 1);
var performanceTrackingData = PerformanceComparisonData.SetupTrackingDataList(goalUnits, trackingUnits, trackingStats, currentYear);
var group = new PerformanceGroup(1, "testItem");
var options = new PerformanceOptions(isSeasonal, isInverse, true);
var testGroup = new PerformanceTrackingItem(group, rampUps, options, performanceBaselineData, performanceTrackingData, trackingYearMonths);
await Verifier.Verify(testGroup.MonthlyTrackingData, _verifySettings)
.UseFileName(TestContext.CurrentContext.TestName());
}
[Test(Description = "Dev Major TestNotInverse - FY2019 (test for seasonality, NotInverse)")]
public async Task TestSavingsFreeFormRevenue()
{
var currentYear = DateTime.Now.Year;
MonthlyRampUp[] rampUps =
{
new MonthlyRampUp(1, currentYear, 100), new MonthlyRampUp(2, currentYear, 100), new MonthlyRampUp(3, currentYear, 100), new MonthlyRampUp(4, currentYear, 100),
new MonthlyRampUp(5, currentYear, 100),new MonthlyRampUp(6, currentYear, 100),new MonthlyRampUp(7, currentYear, 100),new MonthlyRampUp(8, currentYear, 100),
new MonthlyRampUp(9, currentYear, 100),new MonthlyRampUp(10, currentYear, 100),new MonthlyRampUp(11, currentYear, 100),new MonthlyRampUp(12, currentYear, 100)
};
const bool isInverse = false;
const bool isSeasonal = true;
double[] goalUnits = { 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000 };
double[] baselineUnits = { 200, 150, 100, 150, 200, 100, 100, 100, 150, 200, 500, 320 };
double[] baselineStats = { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 };
double[] trackingUnits = { 100, 100, 100, 100, 200, 0, 0, 0, 0, 0, 0, 0 };
double[] trackingStats = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
var trackingYearMonths = GetTrackingYearMonths(currentYear).ToList();
var performanceBaselineData = PerformanceComparisonData.SetupBaselineDataList(baselineUnits, baselineStats, currentYear - 1);
var performanceTrackingData = PerformanceComparisonData.SetupTrackingDataList(goalUnits, trackingUnits, trackingStats, currentYear);
var group = new PerformanceGroup(1, "testItem");
var options = new PerformanceOptions(isSeasonal, isInverse, true);
var testGroup = new PerformanceTrackingItem(group, rampUps, options, performanceBaselineData, performanceTrackingData, trackingYearMonths);
await Verifier.Verify(testGroup.MonthlyTrackingData, _verifySettings)
.UseFileName(TestContext.CurrentContext.TestName());
}
[Test(Description = "ORG 0222 | Demo 1 | Respiratory Failure - Respiratory Failure - Cardiac Surgery - FY2017 | Entity 20")]
[Ignore("Test database needs to be rolled over to the new year")]
public async Task TestSavingsQV()
{
var currentYear = DateTime.Now.Year;
MonthlyRampUp[] rampUps =
{
new MonthlyRampUp(1, currentYear, 100), new MonthlyRampUp(2, currentYear, 100), new MonthlyRampUp(3, currentYear, 100), new MonthlyRampUp(4, currentYear, 100),
new MonthlyRampUp(5, currentYear, 100),new MonthlyRampUp(6, currentYear, 100),new MonthlyRampUp(7, currentYear, 100),new MonthlyRampUp(8, currentYear, 100),
new MonthlyRampUp(9, currentYear, 100),new MonthlyRampUp(10, currentYear, 100),new MonthlyRampUp(11, currentYear, 100),new MonthlyRampUp(12, currentYear, 100)
};
const bool isInverse = true;
const bool isSeasonal = false;
double[] goalUnits = { 1.249525, 1.249525, 1.249525, 1.249525, 1.249525, 1.249525, 1.249525, 1.249525, 1.249525, 1.249525, 1.249525, 1.249525 };
double[] baselineUnits = { 5, 3, 3, 2, 2, 0, 2, 3, 2, 3, 2, 3 };
double[] baselineStats = { 9, 14, 12, 11, 8, 13, 12, 17, 13, 10, 14, 18 };
double[] trackingUnits = { 2, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0 };
double[] trackingStats = { 13, 13, 15, 16, 11, 0, 0, 0, 0, 0, 0, 0 };
var trackingYearMonths = GetTrackingYearMonths(currentYear).ToList();
var performanceBaselineData = PerformanceComparisonData.SetupBaselineDataList(baselineUnits, baselineStats, currentYear - 1);
var performanceTrackingData = PerformanceComparisonData.SetupTrackingDataList(goalUnits, trackingUnits, trackingStats, currentYear);
var group = new PerformanceGroup(1, "testItem");
var options = new PerformanceOptions(isSeasonal, isInverse, true);
var testGroup = new PerformanceTrackingItem(group, rampUps, options, performanceBaselineData, performanceTrackingData, trackingYearMonths);
await Verifier.Verify(testGroup.MonthlyTrackingData, _verifySettings)
.UseFileName(TestContext.CurrentContext.TestName());
}
[Test(Description = "ORG 0222 | Demo 1 | Purchased Services Reduction - FY2017")]
[Ignore("Test database needs to be rolled over to the new year")]
public async Task TestSavingsGL()
{
var currentYear = DateTime.Now.Year;
MonthlyRampUp[] rampUps =
{
new MonthlyRampUp(1, currentYear, 100), new MonthlyRampUp(2, currentYear, 100), new MonthlyRampUp(3, currentYear, 100), new MonthlyRampUp(4, currentYear, 100),
new MonthlyRampUp(5, currentYear, 100),new MonthlyRampUp(6, currentYear, 100),new MonthlyRampUp(7, currentYear, 100),new MonthlyRampUp(8, currentYear, 100),
new MonthlyRampUp(9, currentYear, 100),new MonthlyRampUp(10, currentYear, 100),new MonthlyRampUp(11, currentYear, 100),new MonthlyRampUp(12, currentYear, 100)
};
const bool isInverse = true;
const bool isSeasonal = true;
double[] goalUnits = { 244588.94, 308260.21, 522852.42, 242258.14, 429804.75, 298079.59, 291399.34, 303184.35, 423257, 296446.05, 267084.76, 338172.85 };
double[] baselineUnits = { 305736.17, 385325.27, 653565.52, 302822.67, 537255.94, 372599.49, 364249.17, 378980.44, 529071.25, 370557.56, 333855.95, 422716.06 };
double[] baselineStats = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
double[] trackingUnits = { 308148.44, 263286.57, 300898.51, 283803.3, 496369.18, 0, 0, 0, 0, 0, 0, 0 };
double[] trackingStats = { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
var trackingYearMonths = GetTrackingYearMonths(currentYear).ToList();
var performanceBaselineData = PerformanceComparisonData.SetupBaselineDataList(baselineUnits, baselineStats, currentYear - 1);
var performanceTrackingData = PerformanceComparisonData.SetupTrackingDataList(goalUnits, trackingUnits, trackingStats, currentYear);
var group = new PerformanceGroup(1, "testItem");
var options = new PerformanceOptions(isSeasonal, isInverse, true);
var testGroup = new PerformanceTrackingItem(group, rampUps, options, performanceBaselineData, performanceTrackingData, trackingYearMonths);
await Verifier.Verify(testGroup.MonthlyTrackingData, _verifySettings)
.UseFileName(TestContext.CurrentContext.TestName());
}
[Test(Description = "Dev Major | TestStartDate - FY2019")]
[Ignore("Test database needs to be rolled over to the new year")]
public async Task TestSavingsLateStartDate()
{
var currentYear = DateTime.Now.Year;
MonthlyRampUp[] rampUps =
{
new MonthlyRampUp(1, currentYear, 0), new MonthlyRampUp(2, currentYear, 0), new MonthlyRampUp(3, currentYear, 0), new MonthlyRampUp(4, currentYear, 100),
new MonthlyRampUp(5, currentYear, 100),new MonthlyRampUp(6, currentYear, 100),new MonthlyRampUp(7, currentYear, 100),new MonthlyRampUp(8, currentYear, 100),
new MonthlyRampUp(9, currentYear, 100),new MonthlyRampUp(10, currentYear, 100),new MonthlyRampUp(11, currentYear, 100),new MonthlyRampUp(12, currentYear, 100)
};
const bool isInverse = true;
const bool isSeasonal = true;
double[] goalUnits = { 460.165, 368.132, 607.4178, 312.9122, 276.099, 239.2858, 294.5056, 257.6924, 184.066, 18.4066, 1601.3742, 404.9452 };
double[] baselineUnits = { 500, 500, 500, 500, 400, 500, 500, 600, 500, 500, 700, 1000 };
double[] baselineStats = { 25, 20, 33, 17, 15, 13, 16, 14, 10, 1, 87, 22 };
double[] trackingUnits = { 0, 0, 0, 200, 350, 400, 800, 700, 650, 9000, 130, 500 };
double[] trackingStats = { 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20 };
var trackingYearMonths = GetTrackingYearMonths(currentYear).ToList();
var performanceBaselineData = PerformanceComparisonData.SetupBaselineDataList(baselineUnits, baselineStats, currentYear - 1);
var performanceTrackingData = PerformanceComparisonData.SetupTrackingDataList(goalUnits, trackingUnits, trackingStats, currentYear);
var group = new PerformanceGroup(1, "testItem");
var options = new PerformanceOptions(isSeasonal, isInverse, true);
var testGroup = new PerformanceTrackingItem(group, rampUps, options, performanceBaselineData, performanceTrackingData, trackingYearMonths);
await Verifier.Verify(testGroup.MonthlyTrackingData, _verifySettings)
.UseFileName(TestContext.CurrentContext.TestName());
}
[Test(Description = "Dave Mulka 10% reduction non-seasonal")]
public async Task TestMisalignedTrackingPeriodsReduction()
{
var currentYear = DateTime.Now.Year;
MonthlyRampUp[] rampUps =
{
new MonthlyRampUp(1, currentYear, 50), new MonthlyRampUp(2, currentYear, 75), new MonthlyRampUp(3, currentYear, 100),
new MonthlyRampUp(4, currentYear, 100), new MonthlyRampUp(5, currentYear, 100),new MonthlyRampUp(6, currentYear, 100)
};
const bool isInverse = true;
const bool isSeasonal = false;
double[] baselineUnits = { 16, 21, 15, 22, 18, 29, 16, 26, 9 };
double[] baselineStats = { 9, 14, 10, 12, 11, 17, 10, 14, 7 };
double[] trackingUnits = { 7, 6, 8, 12, 7, 11 };
//seasonality = false, so we spread the goal across the tracking months
var baselineUnitAverageGoal = baselineUnits.Average() * 0.9;
double[] goalUnits = { baselineUnitAverageGoal, baselineUnitAverageGoal, baselineUnitAverageGoal, baselineUnitAverageGoal, baselineUnitAverageGoal, baselineUnitAverageGoal };
double[] trackingStats = { 4, 3, 5, 6, 4, 7 };
var trackingYearMonths = GetTrackingYearMonths(currentYear, 6).ToList();
var performanceBaselineData = PerformanceComparisonData.SetupBaselineDataList(baselineUnits, baselineStats, currentYear - 1, 4);
var performanceTrackingData = PerformanceComparisonData.SetupTrackingDataList(goalUnits, trackingUnits, trackingStats, currentYear);
var group = new PerformanceGroup(1, "testItem");
var options = new PerformanceOptions(isSeasonal, isInverse, true);
var testGroup = new PerformanceTrackingItem(group, rampUps, options, performanceBaselineData, performanceTrackingData, trackingYearMonths);
await Verifier.Verify(testGroup.MonthlyTrackingData, _verifySettings)
.UseFileName(TestContext.CurrentContext.TestName());
}
[Test(Description = "Dave Mulka 10% reduction seasonal")]
public async Task TestMisalignedTrackingPeriodsReductionSeasonal()
{
var currentYear = DateTime.Now.Year;
MonthlyRampUp[] rampUps =
{
new MonthlyRampUp(1, currentYear, 50), new MonthlyRampUp(2, currentYear, 75), new MonthlyRampUp(3, currentYear, 100),
new MonthlyRampUp(4, currentYear, 100), new MonthlyRampUp(5, currentYear, 100),new MonthlyRampUp(6, currentYear, 100)
};
const bool isInverse = true;
const bool isSeasonal = true;
double[] baselineUnits = { 16, 21, 15, 22, 18, 29, 16, 26, 9 };
double[] baselineStats = { 9, 14, 10, 12, 11, 17, 10, 14, 7 };
double[] trackingUnits = { 7, 6, 8, 12, 7, 11 };
//no month match for the first three months, so we use the baseline average to calculate our monthly goal
var baselineUnitAverageGoal = baselineUnits.Average() * 0.9;
double[] goalUnits = { baselineUnitAverageGoal, baselineUnitAverageGoal, baselineUnitAverageGoal, 14.4, 18.9, 13.5 };
double[] trackingStats = { 4, 3, 5, 6, 4, 7 };
var trackingYearMonths = GetTrackingYearMonths(currentYear, 6).ToList();
var performanceBaselineData = PerformanceComparisonData.SetupBaselineDataList(baselineUnits, baselineStats, currentYear - 1, 4);
var performanceTrackingData = PerformanceComparisonData.SetupTrackingDataList(goalUnits, trackingUnits, trackingStats, currentYear);
var group = new PerformanceGroup(1, "testItem");
var options = new PerformanceOptions(isSeasonal, isInverse, true);
var testGroup = new PerformanceTrackingItem(group, rampUps, options, performanceBaselineData, performanceTrackingData, trackingYearMonths);
await Verifier.Verify(testGroup.MonthlyTrackingData, _verifySettings)
.UseFileName(TestContext.CurrentContext.TestName());
}
internal static IEnumerable<TrackingYearMonth> GetTrackingYearMonths(int year, int count = 12)
{
return Enumerable.Range(1, count).ToList()
.ConvertAll(i =>
{
var ym = new TrackingYearMonth(year, year,
new FiscalMonth(Guid.NewGuid(), (byte)i, (byte)i, $"{i}", "", "", 0, 0, $"Month{i:00}", 0, 0), true, true, true);
return ym;
});
}
}
}