public EngineDifferException(string message, Check check) : base(message) { Check = check; }
private void CompareEngines(Check check) { engineSbOne = engineOne as IStepBackEngine; engineSbTwo = engineTwo as IStepBackEngine; engineOne.BeginMatch(project); engineTwo.BeginMatch(project); try { CheckWarriors(project.Rules, engineOne.Warriors, engineTwo.Warriors); ExpensiveCheck(false); while (Step(check)) { } ExpensiveCheck(false); } finally { matchOne = engineOne.EndMatch(null); matchTwo = engineTwo.EndMatch(null); } if (matchOne != matchTwo) { throw new EngineDifferException("Score", Check.Optimistic); } }
private bool Step(Check check) { bool stop = (check.Step == 1) && (engineOne.Round == check.Round) && (check.ToCycle <= engineOne.Cycle + 1); if (stop) { // set debuger breakpoint here, this will stop before error ocurs ExpensiveCheck(true); } StepResult resOne = engineOne.NextStep(); StepResult resTwo = engineTwo.NextStep(); bool range = (engineOne.Cycle >= check.FromCycle && engineOne.Cycle <= check.ToCycle && engineOne.Round == check.Round); bool step = (check.Step != 1) && (engineOne.Cycle % check.Step == 0) && (engineOne.Round >= check.Round); CheapCheck(resOne, resTwo, check, range); if (stop || step || range || resOne == StepResult.NextRound) { ExpensiveCheck(range); if (engineSbOne != null) { if (engineSbOne.CanStepBack) { engineSbOne.PrevStep(); engineOne.NextStep(); CheapCheck(resOne, resTwo, check, range); } } if (engineSbTwo != null) { if (engineSbTwo.CanStepBack) { engineSbTwo.PrevStep(); engineTwo.NextStep(); CheapCheck(resOne, resTwo, check, range); } } ExpensiveCheck(range); } if (resOne == StepResult.Finished) { return false; } return true; }
private void CheapCheck(StepResult resOne, StepResult resTwo, Check origCheck, bool precise) { if (resOne != resTwo) { throw new EngineDifferException("StepRes", new Check(0, origCheck.FromCycle, origCheck.ToCycle, origCheck.Step / 2)); } if (engineOne.Cycle != engineTwo.Cycle) { throw new EngineDifferException("Cycle", new Check(engineOne.Round, engineOne.Cycle, precise)); } if (engineOne.Round != engineTwo.Round) { throw new EngineDifferException("Round", new Check(engineOne.Round, engineOne.Cycle, precise)); } if (engineOne.LiveWarriorsCount != engineTwo.LiveWarriorsCount) { throw new EngineDifferException("Died", new Check(engineOne.Round, engineOne.Cycle, precise)); } if (engineOne.CyclesLeft != engineTwo.CyclesLeft) { throw new EngineDifferException("CyclesLeft", new Check(engineOne.Round, engineOne.Cycle, precise)); } if (engineOne.NextWarriorIndex != engineTwo.NextWarriorIndex) { throw new EngineDifferException("Cheating", new Check(engineOne.Round, engineOne.Cycle, precise)); } }