public void LightLampTest()
        {
            var domain    = new Domain();
            var tom       = new Actor("Tom");
            var lighted   = new Fluent("lighted");
            var broken    = new Fluent("broken");
            var turnOn    = new Action("TurnOn");
            var turnOff   = new Action("TurnOff");
            var throwDown = new Action("ThrowDown");
            var world     = World.Instance;

            world.SetActions(new List <Action> {
                turnOn, turnOff, throwDown
            });
            world.SetFluents(new List <Fluent> {
                lighted, broken
            });
            world.SetActors(new List <Actor> {
                tom
            });
            domain.AddInitiallyClause(new Initially(new Conjunction(new Negation(broken), lighted)));
            domain.AddTypicallyCausesClause(new TypicallyCauses(throwDown, false, new List <Actor> {
                tom
            }, broken));
            domain.AddCausesClause(new Causes(turnOn, false, new List <Actor> {
                tom
            }, lighted));
            domain.AddCausesClause(new Causes(turnOff, false, new List <Actor> {
                tom
            }, new Negation(lighted)));
            domain.AddAlwaysClause(new Always(new Implication(lighted, new Negation(broken))));
            domain.AddPreservesClause(new Preserves(turnOn, false, new List <Actor> {
                tom
            }, broken, null));
            world.SetDomain(domain);
            world.Build();
            var scenario = new Scenario();

            scenario.AddScenarioStep(new ScenarioStep(throwDown, tom));
            scenario.AddScenarioStep(new ScenarioStep(turnOn, tom));

            var ever       = new AccessibleEverScenarioQuery(new Conjunction(new Negation(broken), lighted), lighted, scenario);
            var resultEver = ever.Evaluate(world);

            var typically       = new AccessibleTypicallyScenarioQuery(new Conjunction(new Negation(broken), lighted), lighted, scenario);
            var resultTypically = typically.Evaluate(world);

            var always       = new AccessibleAlwaysScenarioQuery(new Conjunction(new Negation(broken), lighted), lighted, scenario);
            var resultAlways = always.Evaluate(world);

            Assert.AreEqual(resultEver, true);
            Assert.AreEqual(resultTypically, false);
            Assert.AreEqual(resultAlways, true);
        }
        public void ShootingTurkeyAccessibleAfterScenarioQueries1()
        {
            var world    = CreateITWorld();
            var scenario = new Scenario();

            scenario.AddScenarioStep(new ScenarioStep(load, Bill));
            var q1 = new AccessibleTypicallyScenarioQuery(new True(), new Negation(alive), scenario);
            var q2 = new AccessibleEverScenarioQuery(new True(), new Negation(alive), scenario);
            var q3 = new AccessibleAlwaysScenarioQuery(new True(), new Negation(alive), scenario);

            Assert.AreEqual(true, q1.Evaluate(world));  // there's possibility to kill turkey or start in state when it's not walking
            Assert.AreEqual(true, q2.Evaluate(world));  // killing turkey is typicall scenario
            Assert.AreEqual(false, q3.Evaluate(world)); // not always shooting will kill turkey
        }
        public void ShootingTurkeyAccessibleAfterScenarioQueries2()
        {
            var world    = CreateITWorld();
            var scenario = new Scenario();

            scenario.AddScenarioStep(new ScenarioStep(load, Bill));
            scenario.AddScenarioStep(new ScenarioStep(shoot, Bill));
            scenario.AddScenarioStep(new ScenarioStep(entice, Bill));
            var q1 = new AccessibleTypicallyScenarioQuery(new True(), walking, scenario);
            var q2 = new AccessibleEverScenarioQuery(new True(), walking, scenario);
            var q3 = new AccessibleAlwaysScenarioQuery(new True(), walking, scenario);

            Assert.AreEqual(false, q1.Evaluate(world));
            Assert.AreEqual(true, q2.Evaluate(world));
            Assert.AreEqual(true, q3.Evaluate(world));
        }
        public void AlwaysAccessibleWhenQuery()
        {
            world = CreateITWorld();

            var sc1 = new Scenario();

            sc1.AddScenarioStep(new ScenarioStep(eat, alice));
            var q1 = new AccessibleAlwaysScenarioQuery(new True(), cakeExists, sc1);

            var sc2 = new Scenario();

            sc2.AddScenarioStep(new ScenarioStep(drink, alice));
            var q2 = new AccessibleAlwaysScenarioQuery(new True(), new Negation(elixirExists), sc2);

            var r1 = q1.Evaluate(world);
            var r2 = q2.Evaluate(world);

            Assert.AreEqual(r1, true);
            Assert.AreEqual(r2, false); // po wykonaniu sc2 elixir moze istniec, i nie da sie zawsze zrobic zeby go nie bylo
        }
        public void EverAccessibleWhenQuery()
        {
            world = CreateITWorld();

            var sc1 = new Scenario();

            sc1.AddScenarioStep(new ScenarioStep(eat, alice));
            var q1 = new AccessibleAlwaysScenarioQuery(new True(), cakeExists, sc1);

            var sc3 = new Scenario();

            sc3.AddScenarioStep(new ScenarioStep(eat, alice));
            sc3.AddScenarioStep(new ScenarioStep(eat, alice));
            var q3 = new AccessibleAlwaysScenarioQuery(new True(), new Negation(elixirExists), sc3);

            var r1 = q1.Evaluate(world);
            var r3 = q3.Evaluate(world);

            Assert.AreEqual(r1, true);
            Assert.AreEqual(r3, false); // sc3 jest niewykonalne
        }
        public void NeroAlwaysAccessibleQuery()
        {
            var query = new AccessibleAlwaysScenarioQuery(_accessibleQueryPi, _accessibleQueryGamma, _drinkRestTorchScenario);

            Assert.IsFalse(query.Evaluate(_world));
        }