Example #1
0
        public void TypicallyAfterTest()
        {
            var queryText = @"typically not FrodoLives after Bilbo TakeSword, Bilbo AttackFrodo from BilboLives and FrodoLives and not FrodoHasSword";
            var query     = Parsing.GetQuery(queryText);

            var text = @"initially FrodoLives and BilboLives and not FrodoHasSword and not BilboHasSword
                        when Frodo TakeSword causes FrodoHasSword if not BilboHasSword
                        when Bilbo TakeSword causes BilboHasSword if not FrodoHasSword
                        impossible Frodo AttackFrodo
                        impossible Frodo TakeSword if not FrodoLives
                        impossible Bilbo AttackBilbo
                        impossible Bilbo TakeSword if not BilboLives
                        AttackFrodo typically causes not FrodoLives if BilboHasSword
                        AttackBilbo causes not BilboLives if FrodoHasSword";

            var history = Parsing.GetHistory(text);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, null);

            if (query is AfterQueryStatement afterQuery)
            {
                var queryResult = afterQuery.Execute(graph, history);
                Assert.AreEqual(true, queryResult);
            }
        }
Example #2
0
        public void GraphYaleStoryTest()
        {
            var yaleShootingProblem = @"
            initially not loaded
            initially alive
            load causes loaded
            shoot causes not loaded
            shoot typically causes not alive if loaded";

            var history = Parsing.GetHistory(yaleShootingProblem);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, null);

            var q0 = story.States.First(p => !p.GetVariable("loaded") && p.GetVariable("alive"));
            var q1 = story.States.First(p => p.GetVariable("loaded") && p.GetVariable("alive"));
            var q2 = story.States.First(p => !p.GetVariable("loaded") && !p.GetVariable("alive"));
            var q3 = story.States.First(p => p.GetVariable("loaded") && !p.GetVariable("alive"));

            graph.Vertexes.Count.Should().Be(story.States.Count);
            graph.Edges.Should().Contain(p => p.From.State.Equals(q0) && p.To.State.Equals(q1) && p.Action == "load" && p.IsTypical);
            graph.Edges.Should().Contain(p => p.From.State.Equals(q0) && p.To.State.Equals(q0) && p.Action == "shoot" && p.IsTypical);
            graph.Edges.Should().Contain(p => p.From.State.Equals(q1) && p.To.State.Equals(q0) && p.Action == "shoot" && !p.IsTypical);
            graph.Edges.Should().Contain(p => p.From.State.Equals(q1) && p.To.State.Equals(q1) && p.Action == "load" && p.IsTypical);
            graph.Edges.Should().Contain(p => p.From.State.Equals(q1) && p.To.State.Equals(q2) && p.Action == "shoot" && p.IsTypical);
            graph.Edges.Should().Contain(p => p.From.State.Equals(q2) && p.To.State.Equals(q2) && p.Action == "shoot" && p.IsTypical);
            graph.Edges.Should().Contain(p => p.From.State.Equals(q2) && p.To.State.Equals(q3) && p.Action == "load" && p.IsTypical);
            graph.Edges.Should().Contain(p => p.From.State.Equals(q3) && p.To.State.Equals(q2) && p.Action == "shoot" && p.IsTypical);
            graph.Edges.Should().Contain(p => p.From.State.Equals(q3) && p.To.State.Equals(q3) && p.Action == "load" && p.IsTypical);
        }
        public void NecessaryExecutableTest2()
        {
            var queryText = @"necessary executable Frodo AttackBilbo, Bilbo AttackFrodo";
            var query     = Parsing.GetQuery(queryText);

            var text = @"initially FrodoLives and BilboLives and not FrodoHasSword and not BilboHasSword
                        when Frodo TakeSword causes FrodoHasSword if not BilboHasSword
                        when Bilbo TakeSword causes BilboHasSword if not FrodoHasSword
                        impossible Frodo AttackFrodo
                        impossible Frodo TakeSword if not FrodoLives
                        impossible Bilbo AttackBilbo
                        impossible Bilbo TakeSword if not BilboLives
						impossible AttackFrodo if not BilboLives
						impossible AttackBilbo if not FrodoLives
                        AttackFrodo typically causes not FrodoLives if BilboHasSword
                        AttackBilbo causes not BilboLives if FrodoHasSword
						observable not BilboLives after Frodo AttackBilbo"                        ;

            var history = Parsing.GetHistory(text);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, query);

            if (query is ExecutableQueryStatement executableQuery)
            {
                var queryResult = executableQuery.Execute(graph, history);
                Assert.AreEqual(false, queryResult);
            }
        }
Example #4
0
        public void Test()
        {
            var spaghetti = @"initially not An and not At
initially not Bn and not Bt
initially not Ct and not Cn
initially start
always (start then not An)
always (start then not At)
always (At then not An)
always (An then not At)
always (Bt then not Bn)
always (Bn then not Bt)
always (Ct then not Cn)
always (Cn then not Ct)
impossible A if not start or An or At or Bn or Bt or Cn or Ct
impossible B if start or ( not An and not At)  or Bn or Bt or Cn or Ct
impossible C if start or ( not An and not At) or ( not Bn and not Bt) or Cn or Ct
A causes An and not start
B typically causes Bt if An
C typically causes Ct if An and Bt
C causes Cn if An and Bt

A typically causes At and not start
B causes Bn if At
C typically causes Ct if At and Bn
C causes Cn if At and Bn";

            var history = Parsing.GetHistory(spaghetti);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, null);
        }
Example #5
0
        public void NecessaryAccessibleTest6()
        {
            var queryText = @"necessary accessible not FrodoLives from FrodoHasSword";
            var query     = Parsing.GetQuery(queryText);

            var text = @"initially FrodoLives and BilboLives and FrodoHasSword
                        when Frodo TakeSword causes FrodoHasSword
                        when Bilbo TakeSword causes true
                        when Bilbo TakeSword causes BilboHasSword if not FrodoHasSword
                        not FrodoHasSword  after Bilbo TakeSword
                        impossible Frodo AttackFrodo
                        impossible Frodo TakeSword if not FrodoLives
                        impossible Bilbo AttackBilbo
                        impossible Bilbo TakeSword if not BilboLives
                        AttackFrodo causes not FrodoLives if BilboHasSword
                        AttackBilbo causes not BilboLives if FrodoHasSword";

            var history = Parsing.GetHistory(text);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, null);

            if (query is AccessibleQueryStatement accessibleQuery)
            {
                var queryResult = accessibleQuery.Execute(graph, history);
                Assert.AreEqual(true, queryResult);
            }
        }
Example #6
0
        public void TypicallyEffectTest()
        {
            var spaghetti = @"when Michal ZrobSpaghetti typically causes spaghetti if not spaghetti";

            var history = Parsing.GetHistory(spaghetti);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, null);

            var q0          = story.States.First(p => !p.GetVariable("spaghetti"));
            var qTypical    = story.States.First(p => p.GetVariable("spaghetti"));
            var qNonTypical = q0;

            graph.Edges.Should().Contain(p => p.From.State.Equals(q0) && p.To.State.Equals(qTypical) &&
                                         p.Action == "ZrobSpaghetti" && p.Actor == "Michal" && p.IsTypical);
            graph.Edges.Should().Contain(p => p.From.State.Equals(q0) && p.To.State.Equals(qNonTypical) &&
                                         p.Action == "ZrobSpaghetti" && p.Actor == "Michal" && !p.IsTypical);
        }
Example #7
0
        public void RealseseTest1()
        {
            var queryText = @"possibly accessible not loaded from loaded";
            var query     = Parsing.GetQuery(queryText);

            var text = @"initially loaded
                shoot releases loaded";

            var history = Parsing.GetHistory(text);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, null);

            if (query is AccessibleQueryStatement accessibleQuery)
            {
                var queryResult = accessibleQuery.Execute(graph, history);
                Assert.AreEqual(true, queryResult);
            }
        }
Example #8
0
        public void AgentIsInQueryTest()
        {
            var queryText = this.query;
            var query     = Parsing.GetQuery(queryText);

            var text = this.text;

            var history = Parsing.GetHistory(text);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, query);

            if (query is AgentInQueryStatement accessibleQuery)
            {
                var executor    = new AgentInQueryExecutor();
                var queryResult = executor.Execute(query, graph, history);
                queryResult.Should().Be(answer, queryText + Environment.NewLine + text);
            }
        }
        public void ReleasesTest()
        {
            var queryText = @"possibly executable rel, test";
            var query     = Parsing.GetQuery(queryText);

            var text = @"initially not loaded
                rel releases loaded
                impossible test if not loaded";

            var history = Parsing.GetHistory(text);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, query);

            if (query is ExecutableQueryStatement executableQuery)
            {
                var queryResult = executableQuery.Execute(graph, history);
                Assert.AreEqual(true, queryResult);
            }
        }
        public void NecessaryExecutableTest11()
        {
            var queryText = @"necessary executable rel, test";
            var query     = Parsing.GetQuery(queryText);

            var text = @"initially not loaded
						 loaded after rel
						 impossible test if not loaded"                        ;

            var history = Parsing.GetHistory(text);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, query);

            if (query is ExecutableQueryStatement executableQuery)
            {
                var queryResult = executableQuery.Execute(graph, history);
                Assert.AreEqual(true, queryResult);
            }
        }
Example #11
0
        public void NecessaryAccessibleTestIssue27()
        {
            var queryText = @"necessary accessible open from hasCard";
            var query     = Parsing.GetQuery(queryText);

            var text = @"initially not open
                        insertCard typically causes open
                        impossible insertCard if not hasCard";

            var history = Parsing.GetHistory(text);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, null);

            if (query is AccessibleQueryStatement accessibleQuery)
            {
                var queryResult = accessibleQuery.Execute(graph, history);
                Assert.AreEqual(false, queryResult);
            }
        }
        public StoriesViewModel()
        {
            this.CopyListItem = new AsyncCommand(async() =>
            {
                Copy();
            });
            this.ProcessCommand = new AsyncCommand(
                async() =>
            {
                try
                {
                    this.IsProcessing = true;
                    await Task.Run(() =>
                    {
                        var(storyText, queryText) = this.GetInput();
                        var queryTexts            = queryText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)
                                                    .Select(p => p.Trim());


                        var history  = Parsing.GetHistory(storyText);
                        var story    = new Story(history);
                        var keywords =
                            new (IEnumerable <string>, Color)[]
                        {
                            (story.Agents, Colors.Purple),
                            (story.Actions, Colors.CadetBlue),
                            (story.Fluents.Where(p => p.IsInertial).Select(p => p.Label), Colors.DeepPink),
                            (story.Fluents.Where(p => !p.IsInertial).Select(p => p.Label), Colors.DeepSkyBlue)
                        };

                        this.AddTextHighlighting(keywords);
                        foreach (var qt in queryTexts.Reverse())
                        {
                            var query = Parser.Parsing.GetQuery(qt);

                            var executor = Execute(query);
                            var graph    = Graph.CreateGraph(story, query);
                            var result   = executor.Execute(query, graph, history);
                            SaveOutput((storyText, qt, result));
                            LabelText = result?"TRUE":"FALSE";
                        }
                    });
        public void NecessaryExecutableTest13()
        {
            var queryText = @"necessary executable load, shoot, shoot";
            var query     = Parsing.GetQuery(queryText);

            var text = @"initially alive and not loaded
						 impossible shoot if not loaded
						 loaded after load
						 observable not loaded after load, shoot"                        ;

            var history = Parsing.GetHistory(text);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, query);

            if (query is ExecutableQueryStatement executableQuery)
            {
                var queryResult = executableQuery.Execute(graph, history);
                Assert.AreEqual(false, queryResult);
            }
        }
        public void PossiblyExecutableTest11()
        {
            var queryText = @"possibly executable load, shoot, shoot";
            var query     = Parsing.GetQuery(queryText);

            var text = @"initially alive and not loaded
						 load causes loaded
						 impossible shoot if not loaded
						 not loaded after shoot"                        ;

            var history = Parsing.GetHistory(text);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, query);

            if (query is ExecutableQueryStatement executableQuery)
            {
                var queryResult = executableQuery.Execute(graph, history);
                Assert.AreEqual(true, queryResult);
            }
        }
        public void NecessaryExecutableTest6()
        {
            var queryText = @"necessary executable John load, John shoot, shoot";
            var query     = Parsing.GetQuery(queryText);

            var text = @"initially alive and not loaded
						 load causes loaded
						 impossible shoot if not loaded
						 impossible Bob shoot
					     shoot typically causes not loaded and not alive"                    ;

            var history = Parsing.GetHistory(text);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, query);

            if (query is ExecutableQueryStatement executableQuery)
            {
                var queryResult = executableQuery.Execute(graph, history);
                Assert.AreEqual(false, queryResult);
            }
        }
        public void NecessaryExecutableTest12()
        {
            var queryText = @"necessary executable load, John shoot, shoot";
            var query     = Parsing.GetQuery(queryText);

            var text = @"initially alive and not loaded
						 when Bob load causes loaded
						 impossible shoot if not loaded
						 impossible Eric shoot
						 not loaded after Bob shoot
						 when John shoot releases loaded"                        ;

            var history = Parsing.GetHistory(text);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, query);

            if (query is ExecutableQueryStatement executableQuery)
            {
                var queryResult = executableQuery.Execute(graph, history);
                Assert.AreEqual(false, queryResult);
            }
        }
Example #17
0
        public void NecessaryAfterLight()
        {
            var queryText = @"necessary light after toggle2, toggle1 from not light";
            var query     = Parsing.GetQuery(queryText);

            var text = @"noninertial light
                        initially not light
                        always light iff (switch1 iff switch2)
                        toggle1 causes switch1 if not switch1
                        toggle1 causes not switch1 if switch1
                        toggle2 causes switch2 if not switch2
                        toggle2 causes not switch2 if switch2
                        impossible toggle1 if light";

            var history = Parsing.GetHistory(text);
            var story   = new Story(history);
            var graph   = Graph.Graph.CreateGraph(story, null);

            if (query is AfterQueryStatement afterQuery)
            {
                var queryResult = afterQuery.Execute(graph, history);
                Assert.AreEqual(true, queryResult);
            }
        }
Example #18
0
        public void BilgoTest()
        {
            var text = @"initially FrodoLives and BilboLives and not FrodoHasSword and not BilboHasSword
                        when Frodo TakeSword causes FrodoHasSword if not BilboHasSword
                        when Bilbo TakeSword causes BilboHasSword if not FrodoHasSword
                        impossible Frodo AttackFrodo
                        impossible Frodo TakeSword if not FrodoLives
                        impossible Bilbo AttackBilbo
                        impossible Bilbo TakeSword if not BilboLives
                        AttackFrodo typically causes not FrodoLives if BilboHasSword
                        AttackBilbo causes not BilboLives if FrodoHasSword
                        observable not BilboLives after AttackBilbo ";

            var history = Parsing.GetHistory(text);
            var story   = new Story(history);

            var q0 = story.States.First(
                p => p.GetVariable("FrodoLives") &&
                p.GetVariable("BilboLives") &&
                !p.GetVariable("FrodoHasSword") &&
                !p.GetVariable("BilboHasSword"));
            var q1 = story.States.First(
                p => p.GetVariable("FrodoLives") &&
                p.GetVariable("BilboLives") &&
                p.GetVariable("FrodoHasSword") &&
                !p.GetVariable("BilboHasSword"));
            var q2 = story.States.First(
                p => p.GetVariable("FrodoLives") &&
                p.GetVariable("BilboLives") &&
                !p.GetVariable("FrodoHasSword") &&
                p.GetVariable("BilboHasSword"));
            var q3 = story.States.First(
                p => !p.GetVariable("FrodoLives") &&
                p.GetVariable("BilboLives") &&
                !p.GetVariable("FrodoHasSword") &&
                p.GetVariable("BilboHasSword"));
            var q4 = story.States.First(
                p => p.GetVariable("FrodoLives") &&
                !p.GetVariable("BilboLives") &&
                p.GetVariable("FrodoHasSword") &&
                !p.GetVariable("BilboHasSword"));

            var q5 = story.States.First(
                p => p.GetVariable("FrodoLives") &&
                !p.GetVariable("BilboLives") &&
                !p.GetVariable("FrodoHasSword") &&
                !p.GetVariable("BilboHasSword"));

            var q6 = story.States.First(
                p => p.GetVariable("FrodoLives") &&
                !p.GetVariable("BilboLives") &&
                !p.GetVariable("FrodoHasSword") &&
                p.GetVariable("BilboHasSword"));

            var g = Graph.Graph.CreateGraph(story, null);

            g.Vertexes.First(p => p.State == q0)
            .ShouldHaveEdges("Frodo", q1)    //q5 nie ma bo musi miec miecz
            .ShouldHaveEdges("Bilbo", q2);

            g.Vertexes.First(p => p.State == q1)
            .ShouldHaveEdges("Frodo", "AttackBilbo", q4)
            .ShouldHaveEdges("Frodo", "TakeSword", q1);

            g.Vertexes.First(p => p.State == q2)
            .ShouldHaveEdges("Bilbo", q2, q3);
        }
Example #19
0
        public void SpaghettiAndTortillaTest()
        {
            var spaghettiAndTortilla = @"
                initially not spaghetti and not tortilla
                ZrobTortille causes tortilla if not tortilla
                when Jan ZrobSpaghetti causes spaghetti if not spaghetti
                when Michal ZrobSpaghetti typically causes spaghetti if not spaghetti
                impossible Michal ZjedzSpaghetti
                ZjedzSpaghetti causes not spaghetti if spaghetti
                ZjedzTortille causes not tortilla if tortilla
                ";

            var history = Parsing.GetHistory(spaghettiAndTortilla);
            var story   = new Story(history);

            var q0 = story.States.First(p => !p.GetVariable("spaghetti") && !p.GetVariable("tortilla"));
            var q1 = story.States.First(p => !p.GetVariable("spaghetti") && p.GetVariable("tortilla"));
            var q2 = story.States.First(p => p.GetVariable("spaghetti") && !p.GetVariable("tortilla"));
            var q3 = story.States.First(p => p.GetVariable("spaghetti") && p.GetVariable("tortilla"));

            var g = Graph.Graph.CreateGraph(story, null);
            //agenci
            string jan    = "Jan";
            string michał = "Michal";
            //akcje
            string zjedzSpaghetti = "ZjedzSpaghetti";
            string zjedzTortille  = "ZjedzTortille";
            string zrobSpaghetti  = "ZrobSpaghetti";
            string zrobTortille   = "ZrobTortille";

            g.Vertexes.First(p => p.State == q0)
            .ShouldHaveEdges(jan, zrobTortille, q1)
            .ShouldHaveEdges(michał, zrobTortille, q1)
            .ShouldHaveEdges(jan, zrobSpaghetti, q2)
            .ShouldHaveEdges(michał, zrobSpaghetti, q0, q2)
            .ShouldHaveEdges(jan, zjedzSpaghetti)
            .ShouldHaveEdges(michał, zjedzSpaghetti)
            .ShouldHaveEdges(jan, zjedzTortille)
            .ShouldHaveEdges(michał, zjedzTortille);

            g.Vertexes.First(p => p.State == q1)
            .ShouldHaveEdges(jan, zrobTortille)
            .ShouldHaveEdges(michał, zrobTortille)
            .ShouldHaveEdges(jan, zrobSpaghetti, q3)
            .ShouldHaveEdges(michał, zrobSpaghetti, q1, q3)
            .ShouldHaveEdges(jan, zjedzSpaghetti)
            .ShouldHaveEdges(michał, zjedzSpaghetti)
            .ShouldHaveEdges(jan, zjedzTortille, q0)
            .ShouldHaveEdges(michał, zjedzTortille, q0);

            g.Vertexes.First(p => p.State == q2)
            .ShouldHaveEdges(jan, zrobTortille, q3)
            .ShouldHaveEdges(michał, zrobTortille, q3)
            .ShouldHaveEdges(jan, zrobSpaghetti)
            .ShouldHaveEdges(michał, zrobSpaghetti)
            .ShouldHaveEdges(jan, zjedzSpaghetti, q0)
            .ShouldHaveEdges(michał, zjedzSpaghetti)
            .ShouldHaveEdges(jan, zjedzTortille)
            .ShouldHaveEdges(michał, zjedzTortille);
            ;

            g.Vertexes.First(p => p.State == q3)
            .ShouldHaveEdges(jan, zrobTortille)
            .ShouldHaveEdges(michał, zrobTortille)
            .ShouldHaveEdges(jan, zrobSpaghetti)
            .ShouldHaveEdges(michał, zrobSpaghetti)
            .ShouldHaveEdges(jan, zjedzSpaghetti, q1)
            .ShouldHaveEdges(michał, zjedzSpaghetti)
            .ShouldHaveEdges(jan, zjedzTortille, q2)
            .ShouldHaveEdges(michał, zjedzTortille, q2);
        }
Example #20
0
        public void YaleStoryTest()
        {
            var yaleShootingProblem = @"
            initially not loaded
            initially alive
            load causes loaded
            shoot causes not loaded
            shoot typically causes not alive if loaded";

            var history = Parsing.GetHistory(yaleShootingProblem);
            var story   = new Story(history);

            var q0 = story.States.First(p => !p.GetVariable("loaded") && p.GetVariable("alive"));
            var q1 = story.States.First(p => p.GetVariable("loaded") && p.GetVariable("alive"));
            var q2 = story.States.First(p => !p.GetVariable("loaded") && !p.GetVariable("alive"));
            var q3 = story.States.First(p => p.GetVariable("loaded") && !p.GetVariable("alive"));


            //shoot q0
            story.Res0(null, "shoot", q0).ToArray().Should().BeEquivalentTo(q0, q2);
            story.ResMinus(null, "shoot", q0).ToArray().Should().BeEquivalentTo(q0);
            story.Res0Plus(null, "shoot", q0).ToArray().Should().BeEquivalentTo(q0, q2);
            story.ResN(null, "shoot", q0).ToArray().Should().BeEquivalentTo(q0);
            story.ResAb(null, "shoot", q0).ToArray().Should().BeEmpty();

            //load q0
            story.Res0(null, "load", q0).ToArray().Should().BeEquivalentTo(q1, q3);
            story.ResMinus(null, "load", q0).ToArray().Should().BeEquivalentTo(q1);
            story.Res0Plus(null, "load", q0).ToArray().Should().BeEquivalentTo(q1, q3);
            story.ResN(null, "load", q0).ToArray().Should().BeEquivalentTo(q1);
            story.ResAb(null, "load", q0).ToArray().Should().BeEmpty();

            //shoot q1
            story.Res0(null, "shoot", q1).ToArray().Should().BeEquivalentTo(q0, q2);
            story.ResMinus(null, "shoot", q1).ToArray().Should().BeEquivalentTo(q0);
            story.Res0Plus(null, "shoot", q1).ToArray().Should().BeEquivalentTo(q2);
            story.ResN(null, "shoot", q1).ToArray().Should().BeEquivalentTo(q2);
            story.ResAb(null, "shoot", q1).ToArray().Should().BeEquivalentTo(q0);
            //load q1
            story.Res0(null, "load", q1).ToArray().Should().BeEquivalentTo(q1, q3);
            story.ResMinus(null, "load", q1).ToArray().Should().BeEquivalentTo(q1);
            story.Res0Plus(null, "load", q1).ToArray().Should().BeEquivalentTo(q1, q3);
            story.ResN(null, "load", q1).ToArray().Should().BeEquivalentTo(q1);
            story.ResAb(null, "load", q1).ToArray().Should().BeEmpty();

            ////shoot q2
            story.Res0(null, "shoot", q2).ToArray().Should().BeEquivalentTo(q0, q2);
            story.ResMinus(null, "shoot", q2).ToArray().Should().BeEquivalentTo(q2);
            story.Res0Plus(null, "shoot", q2).ToArray().Should().BeEquivalentTo(q0, q2);
            story.ResN(null, "shoot", q2).ToArray().Should().BeEquivalentTo(q2);
            story.ResAb(null, "shoot", q2).ToArray().Should().BeEmpty();
            //load q2
            story.Res0(null, "load", q2).ToArray().Should().BeEquivalentTo(q1, q3);
            story.ResMinus(null, "load", q2).ToArray().Should().BeEquivalentTo(q3);
            story.Res0Plus(null, "load", q2).ToArray().Should().BeEquivalentTo(q1, q3);
            story.ResN(null, "load", q2).ToArray().Should().BeEquivalentTo(q3);
            story.ResAb(null, "load", q2).ToArray().Should().BeEmpty();

            ////shoot q3
            story.Res0(null, "shoot", q3).ToArray().Should().BeEquivalentTo(q0, q2);
            story.ResMinus(null, "shoot", q3).ToArray().Should().BeEquivalentTo(q2);
            story.Res0Plus(null, "shoot", q3).ToArray().Should().BeEquivalentTo(q2);
            story.ResN(null, "shoot", q3).ToArray().Should().BeEquivalentTo(q2);
            story.ResAb(null, "shoot", q3).ToArray().Should().BeEmpty();
            //load q3
            story.Res0(null, "load", q3).ToArray().Should().BeEquivalentTo(q1, q3);
            story.ResMinus(null, "load", q3).ToArray().Should().BeEquivalentTo(q3);
            story.Res0Plus(null, "load", q3).ToArray().Should().BeEquivalentTo(q1, q3);
            story.ResN(null, "load", q3).ToArray().Should().BeEquivalentTo(q3);
            story.ResAb(null, "load", q3).ToArray().Should().BeEmpty();
        }
 public static HistoryStatement GetHistory(this string[] storyString) =>
 Parsing.GetHistory(string.Join(Environment.NewLine, storyString));
 public static HistoryStatement GetHistory(this string storyString) =>
 Parsing.GetHistory(storyString);