public static IStateScheduler GetScheduler(CmdLineOpts options) { IStateScheduler scheduler = null; switch (options.scheduler) { case CmdLineOpts.Scheduler.DFS: scheduler = new DFSStateScheduler(); break; case CmdLineOpts.Scheduler.BFS: scheduler = new BFSStateScheduler(); break; case CmdLineOpts.Scheduler.UntilEndBFS: scheduler = new UntilTerminationBFSStateScheduler(); break; case CmdLineOpts.Scheduler.AltBFS: scheduler = new AlternativeBFSStateScheduler(); break; default: throw new ArgumentException("Unsupported scheduler"); } if (options.PreferLoopEscapingPaths > 0) { scheduler = new LoopEscapingScheduler(scheduler); } if (options.MaxLoopDepth > 0) { scheduler = new LimitLoopBoundScheduler(scheduler, options.MaxLoopDepth); } return(scheduler); }
public void ExploreOrderLoopEscapingScheduler() { var scheduler = new LoopEscapingScheduler(new DFSStateScheduler()); p = LoadProgramFrom("programs/TestLoopEscaping.bpl"); // Get the blocks we need to refer to var main = GetMain(p); var loopBodyBlock = main.Blocks.Where(b => b.Label == "anon2_LoopBody").First(); var loopDoneBlock = main.Blocks.Where(b => b.Label == "anon2_LoopDone").First(); e = GetExecutor(p, scheduler, GetSolver(), /*useConstantFolding=*/ true); var tc = new TerminationCounter(); tc.Connect(e); int changed = 0; e.ContextChanged += delegate(object sender, Executor.ContextChangeEventArgs eventArgs) { switch (changed) { case 0: Assert.AreSame(loopBodyBlock, eventArgs.Previous.GetCurrentBlock()); Assert.IsFalse(eventArgs.Previous.Finished()); Assert.AreSame(loopDoneBlock, eventArgs.Next.GetCurrentBlock()); Assert.AreEqual(0, GetLoopCounter(eventArgs.Next)); Assert.IsFalse(eventArgs.Next.Finished()); break; case 1: Assert.AreSame(loopDoneBlock, eventArgs.Previous.GetCurrentBlock()); Assert.AreEqual(0, GetLoopCounter(eventArgs.Previous)); Assert.IsTrue(eventArgs.Previous.Finished()); Assert.IsInstanceOf <TerminatedWithoutError>(eventArgs.Previous.TerminationType); Assert.AreSame(loopBodyBlock, eventArgs.Next.GetCurrentBlock()); Assert.AreEqual(0, GetLoopCounter(eventArgs.Next)); Assert.IsFalse(eventArgs.Next.Finished()); break; case 2: Assert.AreSame(loopBodyBlock, eventArgs.Previous.GetCurrentBlock()); Assert.AreEqual(1, GetLoopCounter(eventArgs.Next)); Assert.IsFalse(eventArgs.Next.Finished()); Assert.AreSame(loopDoneBlock, eventArgs.Next.GetCurrentBlock()); Assert.AreEqual(1, GetLoopCounter(eventArgs.Next)); Assert.IsFalse(eventArgs.Next.Finished()); break; case 3: Assert.AreSame(loopDoneBlock, eventArgs.Previous.GetCurrentBlock()); Assert.AreEqual(1, GetLoopCounter(eventArgs.Previous)); Assert.IsTrue(eventArgs.Previous.Finished()); Assert.IsInstanceOf <TerminatedWithoutError>(eventArgs.Previous.TerminationType); // About to execute last possible execution of loop body Assert.AreSame(loopBodyBlock, eventArgs.Next.GetCurrentBlock()); Assert.AreEqual(1, GetLoopCounter(eventArgs.Next)); Assert.IsFalse(eventArgs.Next.Finished()); break; default: Assert.Fail("Too many context changes"); break; } ++changed; }; e.Run(main); Assert.AreEqual(3, tc.NumberOfTerminatedStates); Assert.AreEqual(3, tc.Sucesses); Assert.AreEqual(4, changed); }