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" }) 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 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; } function Assert(testName, assertion) { const output = (assertion == true) ? "Pass" : "Fail"; console.log("Test "+ testName + "\t"+ output); return output; } const expected1 = {}; const ShouldApplyCap = true; const GeneralCapIsEnabled = true; const RowCapIsEnabled = true; // generalCapIsEnabled , generalCap , capPresidence , applyPresidenceTo , oversightAction , rowCapIsEnabled , rowCap , tieBid , myBid const results1 = getBidCapReason( GeneralCapIsEnabled , 300 , Presidence.General , AppliesTo.All , Oversight.Win , !RowCapIsEnabled , null , 500 , 300 ); const results2 = getBidCapReason( GeneralCapIsEnabled , 300 , Presidence.General , AppliesTo.All , Oversight.Win , RowCapIsEnabled , 450 , 500 , 300 ); const results3 = getBidCapReason( GeneralCapIsEnabled , 300 , Presidence.General , AppliesTo.All , Oversight.Tie , !RowCapIsEnabled , null , 500 , 300 ); console.log(JSON.stringify(results1)); Assert(1,(results1.shouldApplyCap == true && results1.reason == 1 && results1.trueCap == 200 && results1.capSource == Capsource.General && mybid == 300));