Template
303 lines
19 KiB
C#
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;
|
|
});
|
|
}
|
|
}
|
|
}
|