Exercise 5 Test Cases

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

namespace Tests
{
    [TestFixture]
    public class Exercise5
    {
        Brain brain;
        IEntity noun;
        IEntity speaker;
        IEntity first_name;

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

            brain.CreateEntity("noun");
            brain.CreateEntity("speaker");
            brain.CreateEntity("first_name");

            noun = brain.Get("noun");
            Assert.IsNotNull(noun);

            speaker = brain.Get("speaker");
            Assert.IsNotNull(speaker);

            first_name = brain.Get("first_name");
            Assert.IsNotNull(first_name);
        }

        /// <summary>
        /// Ensure LiteralToken's ToString() method works properly.
        /// </summary>
        [Test]
        public void LiteralToken_ToString()
        {
            LiteralToken token = new LiteralToken("my");
            Assert.AreEqual("my", token.ToString());
        }

        /// <summary>
        /// Ensure VariableToken's ToString() method works properly.
        /// </summary>
        [Test]
        public void VariableToken_ToString()
        {
            VariableToken token = new VariableToken(1);
            Assert.AreEqual("$1", token.ToString());
        }

        /// <summary>
        /// Ensure EntityToken's ToString() method works properly.
        /// </summary>
        [Test]
        public void EntityToken_ToString()
        {
            EntityToken token = new EntityToken(noun);
            Assert.AreEqual("noun", token.ToString());
        }

        /// <summary>
        /// Ensure EntityTypeToken's ToString() method works properly.
        /// </summary>
        [Test]
        public void EntityTypeToken_ToString()
        {
            EntityTypeToken token = new EntityTypeToken(noun);
            Assert.AreEqual("noun", token.ToString());
        }

        /// <summary>
        /// Ensure PropertyToken's ToString() method works properly.
        /// </summary>
        [Test]
        public void PropertyToken_ToString()
        {
            IList<IPropertyPathToken> path = new List<IPropertyPathToken>();
            path.Add(new EntityToken(speaker));
            path.Add(new VariableToken(1));
            PropertyToken property = new PropertyToken(path);
            Assert.AreEqual("speaker.$1", property.ToString());
        }

        /// <summary>
        /// Ensure EntityTypeToken's ToString() method works properly.
        /// </summary>
        /// <remarks>
        /// Containing a fragment.
        /// </remarks>
        [Test]
        public void PropertyToken_Fragment_ToString()
        {
            LiteralToken token;
            IList<IToken> tokens = new List<IToken>();

            token = new LiteralToken("born");
            tokens.Add(token);
            token = new LiteralToken("in");
            tokens.Add(token);
            token = new LiteralToken("year");
            tokens.Add(token);

            Fragment fragment = new Fragment(tokens);

            IList<IPropertyPathToken> path = new List<IPropertyPathToken>();
            path.Add(new EntityToken(speaker));
            path.Add(new FragmentToken(fragment));
            PropertyToken property = new PropertyToken(path);
            Assert.AreEqual("speaker.((born in year))", property.ToString());
        }

        /// <summary>
        /// Ensure Fragment's ToString() method works properly.
        /// </summary>
        /// <remarks>
        /// Test EntityTypeToken
        /// </remarks>
        [Test]
        public void Fragment_ToString_EntityTypeToken()
        {
            EntityTypeToken token = new EntityTypeToken(noun);
            IList<IToken> tokens = new List<IToken>();

            tokens.Add(token);
            Fragment fragment = new Fragment(tokens);

            Assert.AreEqual("{noun}", fragment.ToString());
        }

        /// <summary>
        /// Ensure Fragment's ToString() method works properly.
        /// </summary>
        /// <remarks>
        /// Test EntityToken
        /// </remarks>
        [Test]
        public void Fragment_ToString_EntityToken()
        {
            EntityToken token = new EntityToken(noun);

            IList<IToken> tokens = new List<IToken>();
            tokens.Add(token);

            Fragment fragment = new Fragment(tokens);

            Assert.AreEqual("[noun]", fragment.ToString());
        }

        /// <summary>
        /// Ensure Fragment's ToString() method works properly.
        /// </summary>
        /// <remarks>
        /// Test PropertyToken
        /// </remarks>
        [Test]
        public void Fragment_ToString_PropertyToken()
        {
            IList<IPropertyPathToken> path = new List<IPropertyPathToken>();
            path.Add(new EntityToken(speaker));
            path.Add(new EntityToken(first_name));
            PropertyToken token = new PropertyToken(path);

            IList<IToken> tokens = new List<IToken>();
            tokens.Add(token);

            Fragment fragment = new Fragment(tokens);

            Assert.AreEqual("[speaker.first_name]", fragment.ToString());
        }

        /// <summary>
        /// Ensure Fragment's ToString() method works properly.
        /// </summary>
        /// <remarks>
        /// Test VariableToken; used in transformation output fragments
        /// that are nested in properties.
        /// ex. {noun} was {noun} {verb} {participle} -> $2.(($3 $4 $1))
        /// </remarks>
        [Test]
        public void Fragment_ToString_VariableToken()
        {
            VariableToken token;
            IList<IToken> tokens = new List<IToken>();

            token = new VariableToken(3);
            tokens.Add(token);
            token = new VariableToken(4);
            tokens.Add(token);
            token = new VariableToken(1);
            tokens.Add(token);

            Fragment fragment = new Fragment(tokens);

            Assert.AreEqual("$3 $4 $1", fragment.ToString());
        }

        /// <summary>
        /// my {noun} -> speaker.$1
        /// </summary>
        [Test]
        public void Transformation1_ToString()
        {
            IList<IInputToken> inputTokens = new List<IInputToken>();
            inputTokens.Add(new LiteralToken("my"));
            inputTokens.Add(new EntityTypeToken(noun));
            TransInput input = new TransInput(inputTokens);

            IList<IPropertyPathToken> path = new List<IPropertyPathToken>();
            path.Add(new EntityToken(speaker));
            path.Add(new VariableToken(1));
            PropertyToken property = new PropertyToken(path);
            TransOutput_Value output = new TransOutput_Value(property);

            Transformation t = new Transformation(input, output);

            Assert.AreEqual(t.ToString(), "my {noun} -> speaker.$1");
        }
    }
}