/// <summary>
        /// Replays the content of the EventLog on the given PetriNet
        /// </summary>
        /// <param name="petriNet"></param>
        /// <param name="eventLog"></param>
        /// <returns></returns>
        /// <author>Jannik Arndt</author>
        public static TokenReplayResult Replay(PetriNet petriNet, EventLog eventLog)
        {
            var result = new TokenReplayResult { NumberOfCases = eventLog.Cases.Count };

            foreach (var Case in eventLog.Cases)
            {
                var exceptionThrown = false;
                petriNet.ResetTokens();
                foreach (var Event in Case.EventList)
                {
                    try
                    {
                        petriNet.FireTransition(Event.Name);
                    }
                    catch (NullReferenceException)
                    {
                        result.FailedCasesTransitionNotFound.Add(Case);
                        exceptionThrown = true;
                        break;
                    }
                    catch (TransitionNotEnabledException)
                    {
                        result.FailedCasesTransitionNotEnabled.Add(Case);
                        exceptionThrown = true;
                        break;
                    }
                }
                if (!exceptionThrown)
                    result.SuccessfulReplays++;
            }
            return result;
        }
        public void GetTransitionsNotFoundAsDictionaryTest()
        {
            var case1 = new Case("case1") { EventList = new List<Event> { new Event("A"), new Event("B") } };
            var case2 = new Case("case2") { EventList = new List<Event> { new Event("C"), new Event("D") } };
            var result = new TokenReplayResult
            {
                FailedCasesTransitionNotFound = new List<Case> { case1, case1, case2 },
            };

            var dict = (Dictionary<string, int>)result.GetTransitionsNotFoundAsDictionary();
            Assert.AreEqual(2, dict["A, B"]);
            Assert.AreEqual(1, dict["C, D"]);
        }
        public void ToDictionaryTest()
        {
            var result = new TokenReplayResult
            {
                FailedCasesTransitionNotEnabled = new List<Case> { new Case(), new Case() },
                FailedCasesTransitionNotFound = new List<Case> { new Case() },
                NumberOfCases = 5,
                SuccessfulReplays = 2
            };

            var dict = (Dictionary<string, string>)result.ToDictionary();
            Assert.AreEqual("2", dict["Successful Replays"]);
            Assert.AreEqual("40%", dict["Success Rate"]);
            Assert.AreEqual("2", dict["Transitions not enabled"]);
            Assert.AreEqual("1", dict["Transitions not found"]);
        }
        /// <summary>
        /// Replays the content of the EventLog on the given PetriNet
        /// </summary>
        /// <param name="petriNet"></param>
        /// <param name="eventLog"></param>
        /// <returns></returns>
        /// <author>Jannik Arndt</author>
        public static TokenReplayResult Replay(PetriNet petriNet, EventLog eventLog)
        {
            var result = new TokenReplayResult {
                NumberOfCases = eventLog.Cases.Count
            };

            foreach (var Case in eventLog.Cases)
            {
                var exceptionThrown = false;
                petriNet.ResetTokens();
                foreach (var Event in Case.EventList)
                {
                    try
                    {
                        petriNet.FireTransition(Event.Name);
                    }
                    catch (NullReferenceException)
                    {
                        result.FailedCasesTransitionNotFound.Add(Case);
                        exceptionThrown = true;
                        break;
                    }
                    catch (TransitionNotEnabledException)
                    {
                        result.FailedCasesTransitionNotEnabled.Add(Case);
                        exceptionThrown = true;
                        break;
                    }
                }
                if (!exceptionThrown)
                {
                    result.SuccessfulReplays++;
                }
            }
            return(result);
        }