Best Coyote code snippet using Microsoft.Coyote.Actors.Timers.Mocks.MockStateMachineTimer.Dispose
ActorExecutionContext.cs
Source:ActorExecutionContext.cs  
...667        public void RemoveLog(IActorRuntimeLog log) => this.LogWriter.RemoveLog(log);668        /// <inheritdoc/>669        public void Stop() => this.Scheduler.ForceStop();670        /// <summary>671        /// Disposes runtime resources.672        /// </summary>673        protected virtual void Dispose(bool disposing)674        {675            if (disposing)676            {677                this.ActorMap.Clear();678            }679        }680        /// <inheritdoc/>681        public void Dispose()682        {683            this.Dispose(true);684            GC.SuppressFinalize(this);685        }686        /// <summary>687        /// The mocked execution context of an actor program.688        /// </summary>689        internal sealed class Mock : ActorExecutionContext690        {691            /// <summary>692            /// Map that stores all unique names and their corresponding actor ids.693            /// </summary>694            private readonly ConcurrentDictionary<string, ActorId> NameValueToActorId;695            /// <summary>696            /// Map of program counters used for state-caching to distinguish697            /// scheduling from non-deterministic choices.698            /// </summary>699            private readonly ConcurrentDictionary<ActorId, int> ProgramCounterMap;700            /// <summary>701            /// If true, the actor execution is controlled, else false.702            /// </summary>703            internal override bool IsExecutionControlled => true;704            /// <summary>705            /// Initializes a new instance of the <see cref="Mock"/> class.706            /// </summary>707            internal Mock(Configuration configuration, CoyoteRuntime runtime, OperationScheduler scheduler,708                SpecificationEngine specificationEngine, IRandomValueGenerator valueGenerator, LogWriter logWriter)709                : base(configuration, runtime, scheduler, specificationEngine, valueGenerator, logWriter)710            {711                this.NameValueToActorId = new ConcurrentDictionary<string, ActorId>();712                this.ProgramCounterMap = new ConcurrentDictionary<ActorId, int>();713            }714            /// <inheritdoc/>715            public override ActorId CreateActorIdFromName(Type type, string name)716            {717                // It is important that all actor ids use the monotonically incrementing718                // value as the id during testing, and not the unique name.719                return this.NameValueToActorId.GetOrAdd(name, key => this.CreateActorId(type, key));720            }721            /// <inheritdoc/>722            public override ActorId CreateActor(Type type, Event initialEvent = null, EventGroup eventGroup = null) =>723                this.CreateActor(null, type, null, initialEvent, eventGroup);724            /// <inheritdoc/>725            public override ActorId CreateActor(Type type, string name, Event initialEvent = null, EventGroup eventGroup = null) =>726                this.CreateActor(null, type, name, initialEvent, eventGroup);727            /// <inheritdoc/>728            public override ActorId CreateActor(ActorId id, Type type, Event initialEvent = null, EventGroup eventGroup = null)729            {730                this.Assert(id != null, "Cannot create an actor using a null actor id.");731                return this.CreateActor(id, type, null, initialEvent, eventGroup);732            }733            /// <inheritdoc/>734            public override Task<ActorId> CreateActorAndExecuteAsync(Type type, Event initialEvent = null, EventGroup eventGroup = null) =>735                this.CreateActorAndExecuteAsync(null, type, null, initialEvent, eventGroup);736            /// <inheritdoc/>737            public override Task<ActorId> CreateActorAndExecuteAsync(Type type, string name, Event initialEvent = null, EventGroup eventGroup = null) =>738                this.CreateActorAndExecuteAsync(null, type, name, initialEvent, eventGroup);739            /// <inheritdoc/>740            public override Task<ActorId> CreateActorAndExecuteAsync(ActorId id, Type type, Event initialEvent = null, EventGroup eventGroup = null)741            {742                this.Assert(id != null, "Cannot create an actor using a null actor id.");743                return this.CreateActorAndExecuteAsync(id, type, null, initialEvent, eventGroup);744            }745            /// <summary>746            /// Creates a new actor of the specified <see cref="Type"/> and name, using the specified747            /// unbound actor id, and passes the specified optional <see cref="Event"/>. This event748            /// can only be used to access its payload, and cannot be handled.749            /// </summary>750            internal ActorId CreateActor(ActorId id, Type type, string name, Event initialEvent = null, EventGroup eventGroup = null)751            {752                var creatorOp = this.Scheduler.GetExecutingOperation<ActorOperation>();753                return this.CreateActor(id, type, name, initialEvent, creatorOp?.Actor, eventGroup);754            }755            /// <summary>756            /// Creates a new <see cref="Actor"/> of the specified <see cref="Type"/>.757            /// </summary>758            internal override ActorId CreateActor(ActorId id, Type type, string name, Event initialEvent, Actor creator, EventGroup eventGroup)759            {760                this.AssertExpectedCallerActor(creator, "CreateActor");761                Actor actor = this.CreateActor(id, type, name, creator, eventGroup);762                this.RunActorEventHandler(actor, initialEvent, true, null);763                return actor.Id;764            }765            /// <summary>766            /// Creates a new actor of the specified <see cref="Type"/> and name, using the specified767            /// unbound actor id, and passes the specified optional <see cref="Event"/>. This event768            /// can only be used to access its payload, and cannot be handled. The method returns only769            /// when the actor is initialized and the <see cref="Event"/> (if any) is handled.770            /// </summary>771            internal Task<ActorId> CreateActorAndExecuteAsync(ActorId id, Type type, string name, Event initialEvent = null,772                EventGroup eventGroup = null)773            {774                var creatorOp = this.Scheduler.GetExecutingOperation<ActorOperation>();775                return this.CreateActorAndExecuteAsync(id, type, name, initialEvent, creatorOp?.Actor, eventGroup);776            }777            /// <summary>778            /// Creates a new <see cref="Actor"/> of the specified <see cref="Type"/>. The method779            /// returns only when the actor is initialized and the <see cref="Event"/> (if any)780            /// is handled.781            /// </summary>782            internal override async Task<ActorId> CreateActorAndExecuteAsync(ActorId id, Type type, string name, Event initialEvent,783                Actor creator, EventGroup eventGroup)784            {785                this.AssertExpectedCallerActor(creator, "CreateActorAndExecuteAsync");786                this.Assert(creator != null, "Only an actor can call 'CreateActorAndExecuteAsync': avoid calling " +787                    "it directly from the test method; instead call it through a test driver actor.");788                Actor actor = this.CreateActor(id, type, name, creator, eventGroup);789                this.RunActorEventHandler(actor, initialEvent, true, creator);790                // Wait until the actor reaches quiescence.791                await creator.ReceiveEventAsync(typeof(QuiescentEvent), rev => (rev as QuiescentEvent).ActorId == actor.Id);792                return await Task.FromResult(actor.Id);793            }794            /// <summary>795            /// Creates a new <see cref="Actor"/> of the specified <see cref="Type"/>.796            /// </summary>797            internal override Actor CreateActor(ActorId id, Type type, string name, Actor creator, EventGroup eventGroup)798            {799                this.Assert(type.IsSubclassOf(typeof(Actor)), "Type '{0}' is not an actor.", type.FullName);800                // Using ulong.MaxValue because a Create operation cannot specify801                // the id of its target, because the id does not exist yet.802                this.Scheduler.ScheduleNextOperation(AsyncOperationType.Create);803                this.ResetProgramCounter(creator);804                if (id is null)805                {806                    id = this.CreateActorId(type, name);807                }808                else809                {810                    this.Assert(id.Runtime is null || id.Runtime == this, "Unbound actor id '{0}' was created by another runtime.", id.Value);811                    this.Assert(id.Type == type.FullName, "Cannot bind actor id '{0}' of type '{1}' to an actor of type '{2}'.",812                        id.Value, id.Type, type.FullName);813                    id.Bind(this);814                }815                // If a group was not provided, inherit the current event group from the creator (if any).816                if (eventGroup is null && creator != null)817                {818                    eventGroup = creator.EventGroup;819                }820                Actor actor = ActorFactory.Create(type);821                ActorOperation op = new ActorOperation(id.Value, id.Name, actor, this.Scheduler);822                IEventQueue eventQueue = new MockEventQueue(actor);823                actor.Configure(this, id, op, eventQueue, eventGroup);824                actor.SetupEventHandlers();825                if (this.Configuration.ReportActivityCoverage)826                {827                    actor.ReportActivityCoverage(this.CoverageInfo);828                }829                bool result = this.Scheduler.RegisterOperation(op);830                this.Assert(result, "Actor id '{0}' is used by an existing or previously halted actor.", id.Value);831                if (actor is StateMachine)832                {833                    this.LogWriter.LogCreateStateMachine(id, creator?.Id.Name, creator?.Id.Type);834                }835                else836                {837                    this.LogWriter.LogCreateActor(id, creator?.Id.Name, creator?.Id.Type);838                }839                return actor;840            }841            /// <inheritdoc/>842            public override void SendEvent(ActorId targetId, Event initialEvent, EventGroup eventGroup = default, SendOptions options = null)843            {844                var senderOp = this.Scheduler.GetExecutingOperation<ActorOperation>();845                this.SendEvent(targetId, initialEvent, senderOp?.Actor, eventGroup, options);846            }847            /// <inheritdoc/>848            public override Task<bool> SendEventAndExecuteAsync(ActorId targetId, Event initialEvent,849                EventGroup eventGroup = null, SendOptions options = null)850            {851                var senderOp = this.Scheduler.GetExecutingOperation<ActorOperation>();852                return this.SendEventAndExecuteAsync(targetId, initialEvent, senderOp?.Actor, eventGroup, options);853            }854            /// <summary>855            /// Sends an asynchronous <see cref="Event"/> to an actor.856            /// </summary>857            internal override void SendEvent(ActorId targetId, Event e, Actor sender, EventGroup eventGroup, SendOptions options)858            {859                if (e is null)860                {861                    string message = sender != null ?862                        string.Format("{0} is sending a null event.", sender.Id.ToString()) :863                        "Cannot send a null event.";864                    this.Assert(false, message);865                }866                if (sender != null)867                {868                    this.Assert(targetId != null, "{0} is sending event {1} to a null actor.", sender.Id, e);869                }870                else871                {872                    this.Assert(targetId != null, "Cannot send event {1} to a null actor.", e);873                }874                this.AssertExpectedCallerActor(sender, "SendEvent");875                EnqueueStatus enqueueStatus = this.EnqueueEvent(targetId, e, sender, eventGroup, options, out Actor target);876                if (enqueueStatus is EnqueueStatus.EventHandlerNotRunning)877                {878                    this.RunActorEventHandler(target, null, false, null);879                }880            }881            /// <summary>882            /// Sends an asynchronous <see cref="Event"/> to an actor. Returns immediately if the target was883            /// already running. Otherwise blocks until the target handles the event and reaches quiescense.884            /// </summary>885            internal override async Task<bool> SendEventAndExecuteAsync(ActorId targetId, Event e, Actor sender,886                EventGroup eventGroup, SendOptions options)887            {888                this.Assert(sender is StateMachine, "Only an actor can call 'SendEventAndExecuteAsync': avoid " +889                    "calling it directly from the test method; instead call it through a test driver actor.");890                this.Assert(e != null, "{0} is sending a null event.", sender.Id);891                this.Assert(targetId != null, "{0} is sending event {1} to a null actor.", sender.Id, e);892                this.AssertExpectedCallerActor(sender, "SendEventAndExecuteAsync");893                EnqueueStatus enqueueStatus = this.EnqueueEvent(targetId, e, sender, eventGroup, options, out Actor target);894                if (enqueueStatus is EnqueueStatus.EventHandlerNotRunning)895                {896                    this.RunActorEventHandler(target, null, false, sender as StateMachine);897                    // Wait until the actor reaches quiescence.898                    await (sender as StateMachine).ReceiveEventAsync(typeof(QuiescentEvent), rev => (rev as QuiescentEvent).ActorId == targetId);899                    return true;900                }901                // EnqueueStatus.EventHandlerNotRunning is not returned by EnqueueEvent902                // (even when the actor was previously inactive) when the event e requires903                // no action by the actor (i.e., it implicitly handles the event).904                return enqueueStatus is EnqueueStatus.Dropped || enqueueStatus is EnqueueStatus.NextEventUnavailable;905            }906            /// <summary>907            /// Enqueues an event to the actor with the specified id.908            /// </summary>909            private EnqueueStatus EnqueueEvent(ActorId targetId, Event e, Actor sender, EventGroup eventGroup,910                SendOptions options, out Actor target)911            {912                target = this.Scheduler.GetOperationWithId<ActorOperation>(targetId.Value)?.Actor;913                this.Assert(target != null,914                    "Cannot send event '{0}' to actor id '{1}' that is not bound to an actor instance.",915                    e.GetType().FullName, targetId.Value);916                this.Scheduler.ScheduleNextOperation(AsyncOperationType.Send);917                this.ResetProgramCounter(sender as StateMachine);918                // If no group is provided we default to passing along the group from the sender.919                if (eventGroup is null && sender != null)920                {921                    eventGroup = sender.EventGroup;922                }923                if (target.IsHalted)924                {925                    Guid groupId = eventGroup is null ? Guid.Empty : eventGroup.Id;926                    this.LogWriter.LogSendEvent(targetId, sender?.Id.Name, sender?.Id.Type,927                        (sender as StateMachine)?.CurrentStateName ?? default, e, groupId, isTargetHalted: true);928                    this.Assert(options is null || !options.MustHandle,929                        "A must-handle event '{0}' was sent to {1} which has halted.", e.GetType().FullName, targetId);930                    this.HandleDroppedEvent(e, targetId);931                    return EnqueueStatus.Dropped;932                }933                EnqueueStatus enqueueStatus = this.EnqueueEvent(target, e, sender, eventGroup, options);934                if (enqueueStatus == EnqueueStatus.Dropped)935                {936                    this.HandleDroppedEvent(e, targetId);937                }938                return enqueueStatus;939            }940            /// <summary>941            /// Enqueues an event to the actor with the specified id.942            /// </summary>943            private EnqueueStatus EnqueueEvent(Actor actor, Event e, Actor sender, EventGroup eventGroup, SendOptions options)944            {945                EventOriginInfo originInfo;946                string stateName = null;947                if (sender is StateMachine senderStateMachine)948                {949                    originInfo = new EventOriginInfo(sender.Id, senderStateMachine.GetType().FullName,950                        NameResolver.GetStateNameForLogging(senderStateMachine.CurrentState));951                    stateName = senderStateMachine.CurrentStateName;952                }953                else if (sender is Actor senderActor)954                {955                    originInfo = new EventOriginInfo(sender.Id, senderActor.GetType().FullName, string.Empty);956                }957                else958                {959                    // Message comes from the environment.960                    originInfo = new EventOriginInfo(null, "Env", "Env");961                }962                EventInfo eventInfo = new EventInfo(e, originInfo)963                {964                    MustHandle = options?.MustHandle ?? false,965                    Assert = options?.Assert ?? -1966                };967                Guid opId = eventGroup is null ? Guid.Empty : eventGroup.Id;968                this.LogWriter.LogSendEvent(actor.Id, sender?.Id.Name, sender?.Id.Type, stateName,969                    e, opId, isTargetHalted: false);970                return actor.Enqueue(e, eventGroup, eventInfo);971            }972            /// <summary>973            /// Runs a new asynchronous event handler for the specified actor.974            /// This is a fire and forget invocation.975            /// </summary>976            /// <param name="actor">The actor that executes this event handler.</param>977            /// <param name="initialEvent">Optional event for initializing the actor.</param>978            /// <param name="isFresh">If true, then this is a new actor.</param>979            /// <param name="syncCaller">Caller actor that is blocked for quiscence.</param>980            private void RunActorEventHandler(Actor actor, Event initialEvent, bool isFresh, Actor syncCaller)981            {982                var op = actor.Operation;983                Task task = new Task(async () =>984                {985                    try986                    {987                        // Update the current asynchronous control flow with this runtime instance,988                        // allowing future retrieval in the same asynchronous call stack.989                        CoyoteRuntime.AssignAsyncControlFlowRuntime(this.Runtime);990                        this.Scheduler.StartOperation(op);991                        if (isFresh)992                        {993                            await actor.InitializeAsync(initialEvent);994                        }995                        await actor.RunEventHandlerAsync();996                        if (syncCaller != null)997                        {998                            this.EnqueueEvent(syncCaller, new QuiescentEvent(actor.Id), actor, actor.CurrentEventGroup, null);999                        }1000                        if (!actor.IsHalted)1001                        {1002                            this.ResetProgramCounter(actor);1003                        }1004                        IODebug.WriteLine("<ScheduleDebug> Completed operation {0} on task '{1}'.", actor.Id, Task.CurrentId);1005                        op.OnCompleted();1006                        // The actor is inactive or halted, schedule the next enabled operation.1007                        this.Scheduler.ScheduleNextOperation(AsyncOperationType.Stop);1008                    }1009                    catch (Exception ex)1010                    {1011                        this.ProcessUnhandledExceptionInOperation(op, ex);1012                    }1013                });1014                task.Start();1015                this.Scheduler.WaitOperationStart(op);1016            }1017            /// <summary>1018            /// Creates a new timer that sends a <see cref="TimerElapsedEvent"/> to its owner actor.1019            /// </summary>1020            internal override IActorTimer CreateActorTimer(TimerInfo info, Actor owner)1021            {1022                var id = this.CreateActorId(typeof(MockStateMachineTimer));1023                this.CreateActor(id, typeof(MockStateMachineTimer), new TimerSetupEvent(info, owner, this.Configuration.TimeoutDelay));1024                return this.Scheduler.GetOperationWithId<ActorOperation>(id.Value).Actor as MockStateMachineTimer;1025            }1026            /// <inheritdoc/>1027            public override EventGroup GetCurrentEventGroup(ActorId currentActorId)1028            {1029                var callerOp = this.Scheduler.GetExecutingOperation<ActorOperation>();1030                this.Assert(callerOp != null && currentActorId == callerOp.Actor.Id,1031                    "Trying to access the event group id of {0}, which is not the currently executing actor.",1032                    currentActorId);1033                return callerOp.Actor.CurrentEventGroup;1034            }1035            /// <summary>1036            /// Returns a controlled nondeterministic boolean choice.1037            /// </summary>1038            internal override bool GetNondeterministicBooleanChoice(int maxValue, string callerName, string callerType)1039            {1040                var caller = this.Scheduler.GetExecutingOperation<ActorOperation>()?.Actor;1041                if (caller is Actor callerActor)1042                {1043                    this.IncrementActorProgramCounter(callerActor.Id);1044                }1045                var choice = this.Scheduler.GetNextNondeterministicBooleanChoice(maxValue);1046                this.LogWriter.LogRandom(choice, callerName ?? caller?.Id.Name, callerType ?? caller?.Id.Type);1047                return choice;1048            }1049            /// <summary>1050            /// Returns a controlled nondeterministic integer choice.1051            /// </summary>1052            internal override int GetNondeterministicIntegerChoice(int maxValue, string callerName, string callerType)1053            {1054                var caller = this.Scheduler.GetExecutingOperation<ActorOperation>()?.Actor;1055                if (caller is Actor callerActor)1056                {1057                    this.IncrementActorProgramCounter(callerActor.Id);1058                }1059                var choice = this.Scheduler.GetNextNondeterministicIntegerChoice(maxValue);1060                this.LogWriter.LogRandom(choice, callerName ?? caller?.Id.Name, callerType ?? caller?.Id.Type);1061                return choice;1062            }1063            /// <inheritdoc/>1064            internal override void LogInvokedAction(Actor actor, MethodInfo action, string handlingStateName, string currentStateName) =>1065                this.LogWriter.LogExecuteAction(actor.Id, handlingStateName, currentStateName, action.Name);1066            /// <inheritdoc/>1067            [MethodImpl(MethodImplOptions.AggressiveInlining)]1068            internal override void LogEnqueuedEvent(Actor actor, Event e, EventGroup eventGroup, EventInfo eventInfo) =>1069                this.LogWriter.LogEnqueueEvent(actor.Id, e);1070            /// <inheritdoc/>1071            internal override void LogDequeuedEvent(Actor actor, Event e, EventInfo eventInfo, bool isFreshDequeue)1072            {1073                if (!isFreshDequeue)1074                {1075                    // Skip the scheduling point, as this is the first dequeue of the event handler,1076                    // to avoid unecessery context switches.1077                    this.Scheduler.ScheduleNextOperation(AsyncOperationType.Receive);1078                    this.ResetProgramCounter(actor);1079                }1080                string stateName = actor is StateMachine stateMachine ? stateMachine.CurrentStateName : null;1081                this.LogWriter.LogDequeueEvent(actor.Id, stateName, e);1082            }1083            /// <inheritdoc/>1084            internal override void LogDefaultEventDequeued(Actor actor)1085            {1086                this.Scheduler.ScheduleNextOperation(AsyncOperationType.Receive);1087                this.ResetProgramCounter(actor);1088            }1089            /// <inheritdoc/>1090            [MethodImpl(MethodImplOptions.AggressiveInlining)]1091            internal override void LogDefaultEventHandlerCheck(Actor actor) => this.Scheduler.ScheduleNextOperation();1092            /// <inheritdoc/>1093            internal override void LogRaisedEvent(Actor actor, Event e, EventGroup eventGroup, EventInfo eventInfo)1094            {1095                string stateName = actor is StateMachine stateMachine ? stateMachine.CurrentStateName : null;1096                this.LogWriter.LogRaiseEvent(actor.Id, stateName, e);1097            }1098            /// <inheritdoc/>1099            internal override void LogHandleRaisedEvent(Actor actor, Event e)1100            {1101                string stateName = actor is StateMachine stateMachine ? stateMachine.CurrentStateName : null;1102                this.LogWriter.LogHandleRaisedEvent(actor.Id, stateName, e);1103            }1104            /// <inheritdoc/>1105            [MethodImpl(MethodImplOptions.AggressiveInlining)]1106            internal override void LogReceiveCalled(Actor actor) => this.AssertExpectedCallerActor(actor, "ReceiveEventAsync");1107            /// <inheritdoc/>1108            internal override void LogReceivedEvent(Actor actor, Event e, EventInfo eventInfo)1109            {1110                string stateName = actor is StateMachine stateMachine ? stateMachine.CurrentStateName : null;1111                this.LogWriter.LogReceiveEvent(actor.Id, stateName, e, wasBlocked: true);1112            }1113            /// <inheritdoc/>1114            internal override void LogReceivedEventWithoutWaiting(Actor actor, Event e, EventInfo eventInfo)1115            {1116                string stateName = actor is StateMachine stateMachine ? stateMachine.CurrentStateName : null;1117                this.LogWriter.LogReceiveEvent(actor.Id, stateName, e, wasBlocked: false);1118                this.Scheduler.ScheduleNextOperation(AsyncOperationType.Receive);1119                this.ResetProgramCounter(actor);1120            }1121            /// <inheritdoc/>1122            internal override void LogWaitEvent(Actor actor, IEnumerable<Type> eventTypes)1123            {1124                string stateName = actor is StateMachine stateMachine ? stateMachine.CurrentStateName : null;1125                var eventWaitTypesArray = eventTypes.ToArray();1126                if (eventWaitTypesArray.Length is 1)1127                {1128                    this.LogWriter.LogWaitEvent(actor.Id, stateName, eventWaitTypesArray[0]);1129                }1130                else1131                {1132                    this.LogWriter.LogWaitEvent(actor.Id, stateName, eventWaitTypesArray);1133                }1134                this.Scheduler.ScheduleNextOperation(AsyncOperationType.Join);1135                this.ResetProgramCounter(actor);1136            }1137            /// <inheritdoc/>1138            internal override void LogEnteredState(StateMachine stateMachine)1139            {1140                string stateName = stateMachine.CurrentStateName;1141                this.LogWriter.LogStateTransition(stateMachine.Id, stateName, isEntry: true);1142            }1143            /// <inheritdoc/>1144            internal override void LogExitedState(StateMachine stateMachine)1145            {1146                this.LogWriter.LogStateTransition(stateMachine.Id, stateMachine.CurrentStateName, isEntry: false);1147            }1148            /// <inheritdoc/>1149            internal override void LogPopState(StateMachine stateMachine)1150            {1151                this.AssertExpectedCallerActor(stateMachine, "Pop");1152                this.LogWriter.LogPopState(stateMachine.Id, default, stateMachine.CurrentStateName);1153            }1154            /// <inheritdoc/>1155            internal override void LogInvokedOnEntryAction(StateMachine stateMachine, MethodInfo action)1156            {1157                string stateName = stateMachine.CurrentStateName;1158                this.LogWriter.LogExecuteAction(stateMachine.Id, stateName, stateName, action.Name);1159            }1160            /// <inheritdoc/>1161            internal override void LogInvokedOnExitAction(StateMachine stateMachine, MethodInfo action)1162            {1163                string stateName = stateMachine.CurrentStateName;1164                this.LogWriter.LogExecuteAction(stateMachine.Id, stateName, stateName, action.Name);1165            }1166            /// <summary>1167            /// Returns the current hashed state of the actors.1168            /// </summary>1169            /// <remarks>1170            /// The hash is updated in each execution step.1171            /// </remarks>1172            internal override int GetHashedActorState()1173            {1174                unchecked1175                {1176                    int hash = 19;1177                    foreach (var operation in this.Scheduler.GetRegisteredOperations().OrderBy(op => op.Id))1178                    {1179                        if (operation is ActorOperation actorOperation)1180                        {1181                            hash *= 31 + actorOperation.Actor.GetHashedState();1182                        }1183                    }1184                    return hash;1185                }1186            }1187            /// <inheritdoc/>1188            [MethodImpl(MethodImplOptions.AggressiveInlining)]1189            internal override int GetActorProgramCounter(ActorId actorId) =>1190                this.ProgramCounterMap.GetOrAdd(actorId, 0);1191            /// <summary>1192            /// Increments the program counter of the specified actor.1193            /// </summary>1194            [MethodImpl(MethodImplOptions.AggressiveInlining)]1195            private void IncrementActorProgramCounter(ActorId actorId) =>1196                this.ProgramCounterMap.AddOrUpdate(actorId, 1, (id, value) => value + 1);1197            /// <summary>1198            /// Resets the program counter of the specified actor.1199            /// </summary>1200            private void ResetProgramCounter(Actor actor)1201            {1202                if (actor != null)1203                {1204                    this.ProgramCounterMap.AddOrUpdate(actor.Id, 0, (id, value) => 0);1205                }1206            }1207            /// <inheritdoc/>1208#if !DEBUG1209            [DebuggerHidden]1210#endif1211            internal override void AssertExpectedCallerActor(Actor caller, string calledAPI)1212            {1213                if (caller is null)1214                {1215                    return;1216                }1217                var op = this.Scheduler.GetExecutingOperation<ActorOperation>();1218                if (op is null)1219                {1220                    return;1221                }1222                this.Assert(op.Actor.Equals(caller), "{0} invoked {1} on behalf of {2}.",1223                    op.Actor.Id, calledAPI, caller.Id);1224            }1225            /// <summary>1226            /// Processes an unhandled exception in the specified asynchronous operation.1227            /// </summary>1228            private void ProcessUnhandledExceptionInOperation(AsyncOperation op, Exception ex)1229            {1230                string message = null;1231                Exception exception = UnwrapException(ex);1232                if (exception is ExecutionCanceledException || exception is TaskSchedulerException)1233                {1234                    IODebug.WriteLine("<Exception> {0} was thrown from operation '{1}'.",1235                        exception.GetType().Name, op.Name);1236                }1237                else if (exception is ObjectDisposedException)1238                {1239                    IODebug.WriteLine("<Exception> {0} was thrown from operation '{1}' with reason '{2}'.",1240                        exception.GetType().Name, op.Name, ex.Message);1241                }1242                else if (op is ActorOperation actorOp)1243                {1244                    message = string.Format(CultureInfo.InvariantCulture,1245                        $"Unhandled exception. {exception.GetType()} was thrown in actor {actorOp.Name}, " +1246                        $"'{exception.Source}':\n" +1247                        $"   {exception.Message}\n" +1248                        $"The stack trace is:\n{exception.StackTrace}");1249                }1250                else1251                {1252                    message = string.Format(CultureInfo.InvariantCulture, $"Unhandled exception. {exception}");1253                }1254                if (message != null)1255                {1256                    // Report the unhandled exception.1257                    this.Scheduler.NotifyUnhandledException(exception, message);1258                }1259            }1260            /// <summary>1261            /// Unwraps the specified exception.1262            /// </summary>1263            private static Exception UnwrapException(Exception ex)1264            {1265                Exception exception = ex;1266                while (exception is TargetInvocationException)1267                {1268                    exception = exception.InnerException;1269                }1270                if (exception is AggregateException)1271                {1272                    exception = exception.InnerException;1273                }1274                return exception;1275            }1276            /// <inheritdoc/>1277            protected override void Dispose(bool disposing)1278            {1279                if (disposing)1280                {1281                    this.NameValueToActorId.Clear();1282                    this.ProgramCounterMap.Clear();1283                }1284                base.Dispose(disposing);1285            }1286        }1287    }1288}...MockStateMachineTimer.cs
Source:MockStateMachineTimer.cs  
...97        /// <param name="other">An object to compare with this object.</param>98        /// <returns>True if the current object is equal to the other parameter; otherwise, false.</returns>99        public bool Equals(ActorTimer other) => this.Equals((object)other);100        /// <summary>101        /// Disposes the resources held by this timer.102        /// </summary>103        public void Dispose() => this.Context.SendEvent(this.Id, HaltEvent.Instance);104    }105}...Dispose
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;6using Microsoft.Coyote.Actors;7using Microsoft.Coyote.Actors.Timers;8using Microsoft.Coyote.Actors.Timers.Mocks;9using Microsoft.Coyote.Specifications;10using Microsoft.Coyote.Tasks;11using Microsoft.Coyote.Tests.Common.Actors;12using Microsoft.Coyote.Tests.Common.Runtime;13using Microsoft.Coyote.Tests.Common.Timers;14using Microsoft.Coyote.Tests.Common.Timers.Mocks;15using Xunit;16using Xunit.Abstractions;17{18    {19        public TimerTests(ITestOutputHelper output)20            : base(output)21        {22        }23        {24            public ActorId Id;25            public E(ActorId id)26            {27                this.Id = id;28            }29        }30        {31            public ActorId Id;32            public Config(ActorId id)33            {34                this.Id = id;35            }36        }37        {38        }39        {40            private ActorId Id;41            [OnEntry(nameof(InitOnEntry))]42            [OnEventDoAction(typeof(Done), nameof(HandleDone))]43            {44            }45            private void InitOnEntry()46            {47                this.Id = (this.ReceivedEvent as Config).Id;48                this.RaiseGotoStateEvent<Waiting>();49            }50            [OnEntry(nameof(WaitingOnEntry))]51            [OnEventDoAction(typeof(Done), nameof(HandleDone))]52            {53            }54            private void WaitingOnEntry()55            {56                this.CreateTimer(this.Id, TimeSpan.FromSeconds(1), new Done());57            }58            private void HandleDone()59            {60                this.RaiseGotoStateEvent<Waiting>();61            }62        }63        [Fact(Timeout = 5000)]64        public void TestTimer()65        {66            this.Test(r =>67            {68                r.RegisterMonitor<MockTimerMonitor>();69                r.RegisterMonitor<MockStateMachineTimerMonitor>();70                r.CreateActor(typeof(M), new Config(this.Id));71            },72            configuration: GetConfiguration().WithTestingIterations(100),73            replay: true);Dispose
Using AI Code Generation
1using System;2using System.Threading.Tasks;3using Microsoft.Coyote.Actors;4using Microsoft.Coyote.Actors.Timers;5using Microsoft.Coyote.Actors.Timers.Mocks;6using Microsoft.Coyote.Specifications;7using Microsoft.Coyote.SystematicTesting;8using Microsoft.Coyote.SystematicTesting.Mocks;9using Microsoft.Coyote.SystematicTesting.Timers;10using Microsoft.Coyote.SystematicTesting.Timers.Mocks;11{12    {13        public static void Main(string[] args)14        {15            var config = Configuration.Create();16            config.TestingIterations = 100;17            config.SchedulingIterations = 100;18            config.Verbose = 1;19            config.MaxSchedulingSteps = 100;20            config.MaxFairSchedulingSteps = 100;21            config.MaxUnfairSchedulingSteps = 100;22            config.EnableCycleDetection = true;23            config.EnableDataRaceDetection = true;24            config.EnableDeadlockDetection = true;25            config.EnableLivenessChecking = true;26            config.EnablePCT = true;27            config.EnableBCT = true;28            config.EnableACT = true;29            config.EnableCoverage = true;30            config.EnableStateGraphTesting = true;31            config.EnableStateGraphCoverage = true;32            config.EnableActorStateGraphTesting = true;33            config.EnableActorStateGraphCoverage = true;34            config.EnableActorTaskGraphTesting = true;35            config.EnableActorTaskGraphCoverage = true;36            config.EnableTaskStackTesting = true;37            config.EnableTaskStackCoverage = true;38            config.EnableOperationInterleavingsTesting = true;39            config.EnableOperationInterleavingsCoverage = true;40            config.EnableRandomExecution = true;41            config.RandomExecutionProbability = 0.5;42            config.EnableFairRandomExecution = true;43            config.FairRandomExecutionProbability = 0.5;44            config.EnableUnfairRandomExecution = true;45            config.UnfairRandomExecutionProbability = 0.5;46            config.EnableRandomScheduling = true;47            config.RandomSchedulingProbability = 0.5;48            config.EnableFairRandomScheduling = true;49            config.FairRandomSchedulingProbability = 0.5;50            config.EnableUnfairRandomScheduling = true;51            config.UnfairRandomSchedulingProbability = 0.5;52            config.EnableRandomValueChoice = true;53            config.RandomValueChoiceProbability = 0.5;Dispose
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Text;4using System.Threading.Tasks;5using Microsoft.Coyote.Actors;6using Microsoft.Coyote.Actors.Timers;7using Microsoft.Coyote.Actors.Timers.Mocks;8using Microsoft.Coyote.Actors.Timers.Mocks.Mocks;9using Microsoft.Coyote.SystematicTesting;10using Microsoft.Coyote.SystematicTesting.Mocks;11using Microsoft.Coyote.SystematicTesting.Mocks.Mocks;12using Microsoft.Coyote.SystematicTesting.Threading;13using Microsoft.Coyote.SystematicTesting.Threading.Mocks;14using Microsoft.Coyote.SystematicTesting.Threading.Mocks.Mocks;15using Microsoft.Coyote.SystematicTesting.Timers;16using Microsoft.Coyote.SystematicTesting.Timers.Mocks;17using Microsoft.Coyote.SystematicTesting.Timers.Mocks.Mocks;18using Microsoft.Coyote.Tests.Common;19using Microsoft.Coyote.Tests.Common.Actors.Mocks;20using Microsoft.Coyote.Tests.Common.Actors.Mocks.Mocks;21using Microsoft.Coyote.Tests.Common.SystematicTesting.Mocks;22using Microsoft.Coyote.Tests.Common.SystematicTesting.Mocks.Mocks;23using Microsoft.Coyote.Tests.Common.SystematicTesting.Threading.Mocks;24using Microsoft.Coyote.Tests.Common.SystematicTesting.Threading.Mocks.Mocks;25using Microsoft.Coyote.Tests.Common.SystematicTesting.Timers.Mocks;26using Microsoft.Coyote.Tests.Common.SystematicTesting.Timers.Mocks.Mocks;27using Microsoft.Coyote.Tests.Common.Threading.Mocks;28using Microsoft.Coyote.Tests.Common.Threading.Mocks.Mocks;29using Microsoft.Coyote.Tests.Common.Timers.Mocks;30using Microsoft.Coyote.Tests.Common.Timers.Mocks.Mocks;31using Microsoft.Coyote.Tests.SystematicTesting;32using Microsoft.Coyote.Tests.SystematicTesting.Mocks;33using Microsoft.Coyote.Tests.SystematicTesting.Mocks.Mocks;34using Microsoft.Coyote.Tests.SystematicTesting.Threading.Mocks;35using Microsoft.Coyote.Tests.SystematicTesting.Threading.Mocks.Mocks;36using Microsoft.Coyote.Tests.SystematicTesting.Timers.Mocks;37using Microsoft.Coyote.Tests.SystematicTesting.Timers.Mocks.Mocks;38using Microsoft.Coyote.Tests.SystematicTesting.Timers.Mocks.Mocks.Mocks;39using Microsoft.Coyote.Tests.SystematicTesting.Timers.Mocks.Mocks.Mocks.Mocks;40using Microsoft.Coyote.Tests.SystematicTesting.Timers.Mocks.Mocks.Mocks.Mocks.Mocks;Dispose
Using AI Code Generation
1using System;2using System.Threading.Tasks;3using Microsoft.Coyote;4using Microsoft.Coyote.Actors;5using Microsoft.Coyote.Actors.Timers;6using Microsoft.Coyote.Specifications;7{8    {9        public static void Main()10        {11            var runtime = RuntimeFactory.Create();12            runtime.CreateActor(typeof(A));13            runtime.Run();14        }15    }16    {17        private IActorTimer Timer;18        [OnEntry(nameof(InitOnEntry))]19        [OnEventDoAction(typeof(TimerElapsedEvent), nameof(TimerElapsed))]20        [OnEventDoAction(typeof(TimerCanceledEvent), nameof(TimerCanceled))]21        {22        }23        private void InitOnEntry(Event e)24        {25            this.Timer = this.RegisterTimer("Timer", TimeSpan.FromSeconds(1), true);26            this.SendEvent(this.Id, new TimerElapsedEvent(this.Timer));27        }28        private void TimerElapsed(Event e)29        {30            this.Assert((e as TimerElapsedEvent).Timer == this.Timer);31            this.Assert(this.Timer.IsRunning);32            this.SendEvent(this.Id, new TimerElapsedEvent(this.Timer));33        }34        private void TimerCanceled(Event e)35        {36            this.Assert((e as TimerCanceledEvent).Timer == this.Timer);37            this.Assert(!this.Timer.IsRunning);38            this.Timer.Dispose();39        }40    }41}42using System;43using System.Threading.Tasks;44using Microsoft.Coyote;45using Microsoft.Coyote.Actors;46using Microsoft.Coyote.Actors.Timers;47using Microsoft.Coyote.Specifications;48{49    {50        public static void Main()51        {52            var runtime = RuntimeFactory.Create();53            runtime.CreateActor(typeof(A));54            runtime.Run();55        }56    }57    {58        private IActorTimer Timer;59        [OnEntry(nameof(InitOnEntry))]60        [OnEventDoAction(typeof(TimerElapsedEvent), nameof(TimerElapsed))]61        [OnEventDoAction(typeof(TimerCanceledEvent), nameof(TimerCanceledDispose
Using AI Code Generation
1using Microsoft.Coyote.Actors;2using Microsoft.Coyote.Actors.Timers.Mocks;3using Microsoft.Coyote.SystematicTesting;4using Microsoft.Coyote.SystematicTesting.Timers.Mocks;5using System;6using System.Threading.Tasks;7{8    {9        public static void Main(string[] args)10        {11            var configuration = Configuration.Create();12            configuration.TestingIterations = 100;13            configuration.SchedulingIterations = 100;14            configuration.SchedulingStrategy = SchedulingStrategy.PCT;15            configuration.MaxFairSchedulingSteps = 100;16            configuration.EnableCycleDetection = true;17            configuration.EnableDataRaceDetection = true;18            configuration.EnableActorGarbageCollection = true;19            configuration.EnableHotStateDetection = true;20            configuration.EnableBuggyWaitOperationsDetection = true;21            configuration.EnablePhaseParallelism = true;22            configuration.EnableRandomExecution = true;23            configuration.EnableRandomScheduling = true;24            configuration.EnableTestingLog = true;25            configuration.EnableVerboseTestingLog = true;26            var test = new SystematicTestEngine(configuration);27            test.RegisterMonitor(typeof(Monitor1));28            test.RegisterMonitor(typeof(Monitor2));29            test.RegisterMonitor(typeof(Monitor3));30            test.RegisterMonitor(typeof(Monitor4));31            test.RegisterMonitor(typeof(Monitor5));32            test.RegisterMonitor(typeof(Monitor6));33            test.RegisterMonitor(typeof(Monitor7));34            test.RegisterMonitor(typeof(Monitor8));35            test.RegisterMonitor(typeof(Monitor9));36            test.RegisterMonitor(typeof(Monitor10));37            test.RegisterMonitor(typeof(Monitor11));38            test.RegisterMonitor(typeof(Monitor12));39            test.RegisterMonitor(typeof(Monitor13));40            test.RegisterMonitor(typeof(Monitor14));41            test.RegisterMonitor(typeof(Monitor15));42            test.RegisterMonitor(typeof(Monitor16));43            test.RegisterMonitor(typeof(Monitor17));44            test.RegisterMonitor(typeof(Monitor18));45            test.RegisterMonitor(typeof(Monitor19));46            test.RegisterMonitor(typeof(Monitor20));47            test.RegisterMonitor(typeof(Monitor21));48            test.RegisterMonitor(typeof(Monitor22));49            test.RegisterMonitor(typeof(Monitor23));50            test.RegisterMonitor(typeof(Monitor24));51            test.RegisterMonitor(typeof(Monitor25));52            test.RegisterMonitor(typeof(Monitor26));53            test.RegisterMonitor(typeof(Monitor27));54            test.RegisterMonitor(typeof(Monitor28));55            test.RegisterMonitor(typeof(Monitor29));56            test.RegisterMonitor(typeof(Monitor30));57            test.RegisterMonitor(typeofDispose
Using AI Code Generation
1using Microsoft.Coyote.Actors;2using Microsoft.Coyote.Actors.Timers;3using Microsoft.Coyote.Actors.Timers.Mocks;4using System;5using System.Threading.Tasks;6{7    {8        public static void Main()9        {10            var runtime = RuntimeFactory.Create();11            runtime.CreateActor(typeof(Actor1));12            runtime.Dispose();13        }14    }15    {16        private TimerInfo timer;17        [OnEventDoAction(typeof(ConfigureTimer), nameof(ConfigureTimerAction))]18        [OnEventDoAction(typeof(StartTimer), nameof(StartTimerAction))]19        [OnEventDoAction(typeof(StopTimer), nameof(StopTimerAction))]20        [OnEventDoAction(typeof(ResetTimer), nameof(ResetTimerAction))]21        [OnEventDoAction(typeof(DisposeTimer), nameof(DisposeTimerAction))]22        [OnEventDoAction(typeof(CheckTimer), nameof(CheckTimerAction))]23        {24        }25        private void ConfigureTimerAction()26        {27            this.timer = this.ConfigureTimer(TimeSpan.FromSeconds(1));28        }29        private void StartTimerAction()30        {31            this.StartTimer(this.timer);32        }33        private void StopTimerAction()34        {35            this.StopTimer(this.timer);36        }37        private void ResetTimerAction()38        {39            this.ResetTimer(this.timer);40        }41        private void DisposeTimerAction()42        {43            this.DisposeTimer(this.timer);44        }45        private void CheckTimerAction()46        {47            this.Assert(this.IsTimerActive(this.timer));48        }49    }50    {51    }52    {53    }54    {55    }56    {57    }58    {59    }60    {61    }62}63using Microsoft.Coyote.Actors;64using Microsoft.Coyote.Actors.Timers;65using Microsoft.Coyote.Actors.Timers.Mocks;66using System;67using System.Threading.Tasks;68{69    {70        public static void Main()Dispose
Using AI Code Generation
1using Microsoft.Coyote.Actors;2using Microsoft.Coyote.Actors.Timers;3using Microsoft.Coyote.Actors.Timers.Mocks;4using System;5using System.Collections.Generic;6using System.Text;7using System.Threading.Tasks;8{9    {10        static void Main(string[] args)11        {12            var runtime = RuntimeFactory.Create();13            runtime.CreateActor(typeof(Test));14            runtime.Run();15        }16    }17    {18        private MockStateMachineTimer timer;19        [OnEntry(nameof(InitOnEntry))]20        [OnEventDoAction(typeof(UnitEvent), nameof(HandleTimer))]21        class Init : State { }22        private void InitOnEntry()23        {24            this.timer = new MockStateMachineTimer(this, new UnitEvent(), 1000);25            this.timer.Start();26        }27        private void HandleTimer()28        {29            this.timer.Dispose();30        }31    }32}33using Microsoft.Coyote.Actors;34using Microsoft.Coyote.Actors.Timers;35using Microsoft.Coyote.Actors.Timers.Mocks;36using System;37using System.Collections.Generic;38using System.Text;39using System.Threading.Tasks;40{41    {42        static void Main(string[] args)43        {44            var runtime = RuntimeFactory.Create();45            runtime.CreateActor(typeof(Test));46            runtime.Run();47        }48    }Dispose
Using AI Code Generation
1using Microsoft.Coyote.Actors.Timers.Mocks;2using System;3using System.Threading.Tasks;4{5    {6        static void Main(string[] args)7        {8            using (var mockTimer = new MockStateMachineTimer())9            {10                mockTimer.StartTimer(TimeSpan.FromSeconds(1));11                mockTimer.WaitTimer();12            }13        }14    }15}16using Microsoft.Coyote.Actors.Timers.Mocks;17using System;18using System.Threading.Tasks;19{20    {21        static void Main(string[] args)22        {23            using (var mockTimer = new MockActorTimer())24            {25                mockTimer.StartTimer(TimeSpan.FromSeconds(1));26                mockTimer.WaitTimer();27            }28        }29    }30}31using Microsoft.Coyote.Actors.Timers.Mocks;32using System;33using System.Threading.Tasks;34{35    {36        static void Main(string[] args)37        {38            using (var mockTimer = new MockActorTimer())39            {40                mockTimer.StartTimer(TimeSpan.FromSeconds(1));41                mockTimer.WaitTimer();42            }43        }44    }45}46using Microsoft.Coyote.Actors.Timers.Mocks;47using System;48using System.Threading.Tasks;49{50    {51        static void Main(string[] args)52        {53            using (var mockTimer = new MockActorTimer())54            {55                mockTimer.StartTimer(TimeSpan.FromSeconds(1));56                mockTimer.WaitTimer();57            }58        }59    }60}61using Microsoft.Coyote.Actors.Timers.Mocks;62using System;63using System.Threading.Tasks;64{65    {66        static void Main(string[] args)67        {68            using (var mockTimer = new MockActorTimer())69            {70                mockTimer.StartTimer(TimeSpan.FromSeconds(1));Dispose
Using AI Code Generation
1{2    public static void Main()3    {4        var config = Configuration.Create();5        config.MaxSchedulingSteps = 1;6        using var runtime = RuntimeFactory.Create(config);7        runtime.CreateActor(typeof(A));8        runtime.RunAsync().Wait();9    }10}11using Microsoft.Coyote.Actors;12using System;13using System.Threading.Tasks;14{15    {16        private TimerInfo timerInfo;17        private ActorId b;18        private int i = 0;19        protected override async Task OnInitializeAsync(Event initialEvent)20        {21            b = this.CreateActor(typeof(B));22            this.SendEvent(b, new E());23        }24        protected override async Task OnEventAsync(Event e)25        {26            switch (e)27            {28                    timerInfo = this.RegisterTimer(new T(), 100, 100);29                    break;30                    this.SendEvent(b, new E());31                    i++;32                    if (i == 10)33                    {34                        this.UnregisterTimer(timerInfo);35                    }36                    break;37            }38        }39    }40}41using Microsoft.Coyote.Actors;42using System;43using System.Threading.Tasks;44{45    {46        protected override async Task OnEventAsync(Event e)47        {48            switch (e)49            {50                    break;51            }52        }53    }54}55using Microsoft.Coyote.Actors;56using System;57using System.Threading.Tasks;58{59    {60    }61}62using Microsoft.Coyote.Actors;63using System;64using System.Threading.Tasks;65{66    {67    }68}Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
