Exercise 7: Test cases

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Plato.Core;
using Plato.Language;
using Plato.Language.Parser;

namespace Tests
{
    [TestFixture]
    public class Exercise7
    {
        Brain brain;
        WordMappingParser parser;

        [SetUp]
        public void SetUp()
        {
            brain = new Brain();
            parser = new WordMappingParser(brain);
        }

        /// <summary>
        /// Basic test.
        /// </summary>
        [Test]
        public void BasicTest()
        {
            parser.Parse("'I' -> speaker");

            Assert.IsNotNull(brain.Get("'I'"));
            Assert.IsNotNull(brain.Get("speaker"));
            Assert.IsTrue(brain.Get("'I'").IsA(brain.Get("speaker")));
        }

        /// <summary>
        /// Ensure word type specifiers are applied properly.
        /// </summary>
        [Test]
        public void SpecifyWordType()
        {
            parser.Parse("'I' -> speaker: noun");

            Assert.IsNotNull(brain.Get("'I'"));
            Assert.IsNotNull(brain.Get("speaker"));
            Assert.IsNotNull(brain.Get("noun"));
            Assert.IsTrue(brain.Get("'I'").IsA(brain.Get("speaker")));
            Assert.IsTrue(brain.Get("speaker").IsA(brain.Get("noun")));
        }

        /// <summary>
        /// Ensure multiple word type specifiers are applied properly.
        /// </summary>
        [Test]
        public void SpecifyMultipleWordTypes()
        {
            parser.Parse("'x' -> x: a, b");

            Assert.IsNotNull(brain.Get("'x'"));
            Assert.IsNotNull(brain.Get("x"));
            Assert.IsNotNull(brain.Get("a"));
            Assert.IsNotNull(brain.Get("b"));
            Assert.IsTrue(brain.Get("'x'").IsA(brain.Get("x")));
            Assert.IsTrue(brain.Get("x").IsA(brain.Get("a")));
            Assert.IsTrue(brain.Get("x").IsA(brain.Get("b")));
        }

        /// <summary>
        /// Ensure multi-line input is parsed properly.
        /// </summary>
        [Test]
        public void MutliLineInput()
        {
            parser.Parse("'Daniel' -> Daniel: noun\n'run' -> run: verb");

            Assert.IsNotNull(brain.Get("'Daniel'"));
            Assert.IsNotNull(brain.Get("Daniel"));
            Assert.IsTrue(brain.Get("'Daniel'").IsA(brain.Get("Daniel")));
            Assert.IsTrue(brain.Get("Daniel").IsA(brain.Get("noun")));

            Assert.IsNotNull(brain.Get("'run'"));
            Assert.IsNotNull(brain.Get("run"));
            Assert.IsTrue(brain.Get("'run'").IsA(brain.Get("run")));
            Assert.IsTrue(brain.Get("run").IsA(brain.Get("verb")));
        }

        [Test]
        public void IsATree()
        {
            parser.Parse("'I' -> speaker: noun");

            EntityTree tree = brain.Get("'I'").GetIsATree();

            Assert.AreEqual("'I'", tree.Root.Entity.Id);
            Assert.AreEqual("speaker", tree.Root.Children[0].Entity.Id);
            Assert.AreEqual("noun", tree.Root.Children[0].Children[0].Entity.Id);
        }

        [Test]
        public void IsATree_Circular()
        {
            IEntity a = brain.CreateEntity("a");
            IEntity b = brain.CreateEntity("b");
            IEntity is_a = brain.Get("is_a");
            brain.CreateRelationship(a, is_a, b);
            brain.CreateRelationship(b, is_a, a);

            EntityTree tree = brain.Get("a").GetIsATree();

            Assert.AreEqual("a", tree.Root.Entity.Id);
            Assert.AreEqual("b", tree.Root.Children[0].Entity.Id);
            Assert.AreEqual(0, tree.Root.Children[0].Children.Count);
            Assert.AreEqual(2, tree.GetList().Count);
        }
    }
}