You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
301 lines
12 KiB
301 lines
12 KiB
//Setup some enum's
|
|
const Presidence = Object.freeze({
|
|
General: "general",
|
|
Row: "row",
|
|
Highest: "highest",
|
|
Lowest: "lowest"
|
|
})
|
|
|
|
const AppliesTo = Object.freeze({
|
|
All: "all",
|
|
None: "none",
|
|
Capped: "capped",
|
|
Uncapped: "uncapped"
|
|
})
|
|
|
|
const Oversight = Object.freeze({
|
|
Win: "win",
|
|
Tie: "tie",
|
|
Watch: "watch",
|
|
Ignore: "ignore"
|
|
})
|
|
|
|
const Capsource = Object.freeze({
|
|
Row: "row",
|
|
General: "general"
|
|
})
|
|
|
|
const TestResult = Object.freeze({
|
|
Pass: "Pass",
|
|
Fail: "Fail"
|
|
})
|
|
|
|
//Declare some readability constants
|
|
const ShouldApplyCap = true;
|
|
const GeneralCapIsEnabled = true;
|
|
const RowCapIsEnabled = true;
|
|
|
|
|
|
function newResult(shouldApplyCap, reasonNum, trueCap, capSource, myBidNum) {
|
|
let result = {};
|
|
result.shouldApplyCap = shouldApplyCap;
|
|
result.reason = reasonNum;
|
|
result.trueCap = trueCap;
|
|
result.capSource = capSource;
|
|
result.myBid = myBidNum;
|
|
return result;
|
|
}
|
|
|
|
function getBidCapReasonForScenario(scenario) {
|
|
return getBidCapReason(scenario[0], scenario[1], scenario[2], scenario[3], scenario[4], scenario[5], scenario[6], scenario[7], scenario[8]);
|
|
}
|
|
|
|
//The function from our main codebase
|
|
function getBidCapReason(generalCapIsEnabled, generalCap, capPresidence, applyPresidenceTo, oversightAction, rowCapIsEnabled, rowCap, tieBid, myBid) {
|
|
let tieBidNum = Number(tieBid);
|
|
let winBidNum = Number(tieBid) + 25;
|
|
let generalCapNum = Number(generalCap);
|
|
let rowCapNum = Number(rowCap);
|
|
let myBidNum = Number(myBid);
|
|
|
|
//Build our response object
|
|
let results = newResult(false, 0, null, null, myBidNum);
|
|
|
|
//WIP - LOTS of rules here - these are just the beginning.
|
|
if(generalCapIsEnabled) {
|
|
if(capPresidence == Presidence.General) {
|
|
if(applyPresidenceTo == AppliesTo.All) {
|
|
|
|
switch(oversightAction) {
|
|
case Oversight.Win:
|
|
if(winBidNum > generalCapNum) {
|
|
results = newResult(true, 1, generalCapNum, Capsource.General, generalCapNum);
|
|
return results;
|
|
}
|
|
//winBidNum <= generalCapNum
|
|
results = newResult(false, 2, generalCapNum, Capsource.General, myBidNum);
|
|
break;
|
|
|
|
case Oversight.Tie:
|
|
if(tieBidNum > generalCapNum) {
|
|
results = newResult(true, 3, generalCapNum, Capsource.General, generalCapNum);
|
|
return results;
|
|
}
|
|
//tieBidNum <= generalCapNum
|
|
results = newResult(false, 4, generalCapNum, Capsource.General, myBidNum);
|
|
break;
|
|
|
|
case Oversight.Watch:
|
|
results = newResult(false, 5, generalCapNum, Capsource.General, myBidNum);
|
|
break;
|
|
|
|
case Oversight.Ignore:
|
|
results = newResult(false, 6, generalCapNum, Capsource.General, myBidNum);
|
|
break;
|
|
|
|
default:
|
|
//We should never get here because all oversight actions have been covered.
|
|
}
|
|
return results;
|
|
}
|
|
else if(applyPresidenceTo == AppliesTo.None){
|
|
|
|
}
|
|
else if(applyPresidenceTo == AppliesTo.Capped){
|
|
|
|
}
|
|
else if(applyPresidenceTo == AppliesTo.Uncapped){
|
|
|
|
}
|
|
return results;
|
|
}
|
|
else if(capPresidence == Presidence.Row) {
|
|
return results;
|
|
}
|
|
else if(capPresidence == Presidence.Highest){
|
|
return results;
|
|
}
|
|
else if(capPresidence == Presidence.Lowest){
|
|
return results;
|
|
}
|
|
}
|
|
|
|
//If we made it here, generalCapIsEnabled is FALSE so no conflicts should exist
|
|
//This means rowCaps are the winners if they are enabled.
|
|
if(rowCapIsEnabled) {
|
|
switch(oversightAction) {
|
|
case Oversight.Win:
|
|
if(winBidNum > rowCapNum) {
|
|
results = newResult(true, 101, rowCapNum, Capsource.Row, rowCapNum);
|
|
return results;
|
|
}
|
|
//winBidNum <= rowCapNum
|
|
results = newResult(false, 102, rowCapNum, Capsource.Row, myBidNum);
|
|
break;
|
|
|
|
case Oversight.Tie:
|
|
if(tieBidNum > rowCapNum) {
|
|
results = newResult(true, 103, rowCapNum, Capsource.Row, rowCapNum);
|
|
return results;
|
|
}
|
|
//tieBidNum <= generalCapNum
|
|
results = newResult(false, 104, rowCapNum, Capsource.Row, myBidNum);
|
|
break;
|
|
|
|
case Oversight.Watch:
|
|
results = newResult(false, 105, null, Capsource.Row, myBidNum);
|
|
break;
|
|
|
|
case Oversight.Ignore:
|
|
results = newResult(false, 106, null, Capsource.Row, myBidNum);
|
|
break;
|
|
default:
|
|
//We should never get here because all oversight actions have been covered.
|
|
}
|
|
return results;
|
|
}
|
|
//Caps are not enabled for this row.
|
|
|
|
return results;
|
|
}
|
|
|
|
//Stuff to Testing the actual functionality
|
|
function Assert(testName, thingsToCheck) {
|
|
let allChecksPassed = true;
|
|
let testCount = thingsToCheck.length;
|
|
let testResults = [];
|
|
for(let i = 0; i < testCount; i++ ){
|
|
let result = (thingsToCheck[i] == true);
|
|
testResults.push(result);
|
|
if(!result) {
|
|
allChecksPassed = false;
|
|
}
|
|
}
|
|
let output = {};
|
|
output.testName = testName;
|
|
output.result = (allChecksPassed == true) ? TestResult.Pass: TestResult.Fail;
|
|
output.individualResults = testResults;
|
|
return output;
|
|
}
|
|
|
|
function executeTests(scenarios, expectations, verboseLevel) {
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//Run thru the scenarios
|
|
const scenariosCount = scenarios.length;
|
|
console.log("VerboseLevel: "+ verboseLevel);
|
|
console.log("Generating Scenarios... \t[generalCapIsEnabled, generalCap, capPresidence, applyPresidenceTo, oversightAction, rowCapIsEnabled, rowCap, tieBid, myBid]");
|
|
console.log("Generating ExpectedValues...\t[shouldApplyCap, reason, trueCap, capSource, myBid]");
|
|
if(verboseLevel >= 2) { console.log("Test \tScenarioValues -> ExpectedValues"); }
|
|
console.log("--------------------------------------------------------");
|
|
let scenarioReasons = [];
|
|
for(let i = 0; i < scenariosCount; i++ ){
|
|
if(verboseLevel >= 2) { console.log(i+"\t["+ scenarios[i]+"] -> "+ "["+expectations[i]+"]");}
|
|
let reason = getBidCapReasonForScenario(scenarios[i]);
|
|
scenarioReasons.push(reason);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//Do the actual assertions/tests to confirm we got the results we were expecting
|
|
const reasonsCount = scenarioReasons.length;
|
|
console.log("");
|
|
console.log("Running tests on each scenario...");
|
|
if(verboseLevel >= 1){
|
|
console.log("Test\tOutome\t||apply\t|reason\t|truCap\t|capSrc\t|myBid\t|| ScenarioValues -> ExpectedValues");
|
|
} else {
|
|
console.log("Test\tOutome\t|| ScenarioValues -> ExpectedValues");
|
|
}
|
|
console.log("-----------------------------------------------------------------");
|
|
let allTestsPassed = true;
|
|
let failCount = 0;
|
|
for(let i = 0; i < reasonsCount; i++ ){
|
|
//console.log(JSON.stringify(scenarioReasons[i]));
|
|
let assertions = [
|
|
(scenarioReasons[i].shouldApplyCap == expectations[i][0]),
|
|
(scenarioReasons[i].reason == expectations[i][1]),
|
|
(scenarioReasons[i].trueCap == expectations[i][2]),
|
|
(scenarioReasons[i].capSource == expectations[i][3]),
|
|
(scenarioReasons[i].myBid == expectations[i][4])
|
|
];
|
|
let testResult = Assert(i, assertions);
|
|
if(verboseLevel >= 1){
|
|
let individualResults = testResult.individualResults.toString().replaceAll(",","\t| ");
|
|
console.log(testResult.testName + "\t"+ testResult.result + "\t||"+ individualResults +"\t|| ["+scenarios[i]+"]\t-> ["+ expectations[i] +"]");
|
|
} else {
|
|
console.log(testResult.testName + "\t"+ testResult.result + "\t|| ["+scenarios[i]+"]\t-> ["+ expectations[i] +"]");
|
|
}
|
|
|
|
if(verboseLevel >= 2) {
|
|
const ePad =" \t |";
|
|
const TestResult_ShouldApplyCap = (assertions[0] == true)? TestResult.Pass : TestResult.Fail;
|
|
const TestResult_Reason = (assertions[1] == true)? TestResult.Pass : TestResult.Fail;
|
|
const TestResult_TrueCap = (assertions[2] == true)? TestResult.Pass : TestResult.Fail;
|
|
const TestResult_CapSource = (assertions[3] == true)? TestResult.Pass : TestResult.Fail;
|
|
const TestResult_MyBid = (assertions[4] == true)? TestResult.Pass : TestResult.Fail;
|
|
console.log(" +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
|
|
console.log(ePad +" ITEM RESULT \t| ACTUAL \t| EXPECTED");
|
|
console.log(" +---------------------------------------------------");
|
|
console.log(ePad +"shouldApplyCap: "+ TestResult_ShouldApplyCap +" \t| "+ scenarioReasons[i].shouldApplyCap +" \t| "+ expectations[i][0]);
|
|
console.log(ePad +"reason: "+ TestResult_Reason +"\t| "+ scenarioReasons[i].reason +" \t| "+ expectations[i][1]);
|
|
console.log(ePad +"trueCap: "+ TestResult_TrueCap +"\t| "+ scenarioReasons[i].trueCap +" \t| "+ expectations[i][2]);
|
|
console.log(ePad +"capSource: "+ TestResult_CapSource+"\t| "+ scenarioReasons[i].capSource +"\t| "+ expectations[i][3]);
|
|
console.log(ePad +"myBid: "+ TestResult_MyBid +"\t| "+ scenarioReasons[i].myBid +" \t| "+ expectations[i][4]);
|
|
console.log(" +---------------------------------------------------");
|
|
console.log("---------------------------------------------------------------------");
|
|
}
|
|
|
|
if(testResult.result != TestResult.Pass){
|
|
allTestsPassed = false;
|
|
failCount++;
|
|
}
|
|
}
|
|
console.log("=====================================================================");
|
|
if(allTestsPassed){
|
|
console.log("All "+reasonsCount +" tests passed");
|
|
} else {
|
|
console.log(failCount+"/"+reasonsCount+" tests failed");
|
|
}
|
|
console.log("");
|
|
return allTestsPassed;
|
|
}
|
|
|
|
|
|
function getTest(testId) {
|
|
//TODO: THIS CODE IS AN IDEA AND IS NOT USED YET
|
|
let test = {};
|
|
test.id = testId;
|
|
test.given = getUseCases()[testId];
|
|
test.expect = getExpectedOutcomes()[testId];
|
|
return test;
|
|
}
|
|
|
|
//All the scenarios we could run into
|
|
function getUseCases(){
|
|
let useCases = []; //[generalCapIsEnabled, generalCap, capPresidence, applyPresidenceTo, oversightAction, rowCapIsEnabled, rowCap, tieBid, myBid];
|
|
useCases[0] = [GeneralCapIsEnabled, 300, Presidence.General, AppliesTo.All, Oversight.Win, !RowCapIsEnabled, null, 500, 350];
|
|
useCases[1] = [GeneralCapIsEnabled, 300, Presidence.General, AppliesTo.All, Oversight.Win, RowCapIsEnabled, 450 , 500, 350];
|
|
useCases[2] = [GeneralCapIsEnabled, 300, Presidence.General, AppliesTo.All, Oversight.Tie, !RowCapIsEnabled, null, 500, 350];
|
|
useCases[3] = [GeneralCapIsEnabled, 300, Presidence.General, AppliesTo.All, Oversight.Tie, RowCapIsEnabled, 450 , 500, 350];
|
|
return useCases;
|
|
}
|
|
|
|
//And what we expect from each scenario
|
|
function getExpectedOutcomes(){
|
|
let expectedOutcomes = []; //[shouldApplyCap, reason, trueCap, capSource, myBid]);
|
|
expectedOutcomes[0] = [GeneralCapIsEnabled, 1, 300, Capsource.General, 300];
|
|
expectedOutcomes[1] = [GeneralCapIsEnabled, 1, 300, Capsource.General, 300];
|
|
expectedOutcomes[2] = [GeneralCapIsEnabled, 3, 300, Capsource.General, 300];
|
|
expectedOutcomes[3] = [GeneralCapIsEnabled, 4, 300, Capsource.General, 300];
|
|
return expectedOutcomes;
|
|
}
|
|
|
|
|
|
//Setup our scenarios and expected values
|
|
const useCases = getUseCases();
|
|
const expectedOutcomes = getExpectedOutcomes();
|
|
const verboseLevel = 1;
|
|
|
|
const testResults = executeTests(useCases, expectedOutcomes, verboseLevel);
|
|
|
|
|
|
|
|
|
|
|