using System;
using System.Collections.Generic;
using System.Text;
using UnitTestSharp;
using DNAModule.Sunweaver.DataPrototypes;
using DNAModule.Sunweaver.Commands.Abstracts;

namespace DNAModule.Sunweaver.UnitTests
{
    class CoduleInsertionMutationTests : TestFixture
    {
        public override void TestSetup()
        {
            int length = 10;
            c = new Codule();
            d = new Codule();
            for (int i = 0; i < length; i++)
            {
                BasePair bp = DNASystem.CommandListClass.randomBasePair(1, 1, 1, 1);
                c.BasePairs.Add(bp);
                d.BasePairs.Add(bp);
            }
            m = new CoduleInsertionMutation();
        }

        Codule c, d;
        CoduleMutation m;

        public void testMutatesBasicProper()
        {
            CheckEqual(c, d);
            m.mutate(c, 1, 8);
            CheckFalse(c.Equals(d));
            m.mutate(d, 1, 8);
            CheckFalse(c.Equals(d));
        }

        public void testMutatesBadIndex()
        {
            CheckEqual(c, d);
            m.mutate(c, -1, 8);
            CheckFalse(c.Equals(d));
            m.mutate(d, -1, 8);
            CheckFalse(c.Equals(d));
        }

        public void testMutatesBadIndex2()
        {
            CheckEqual(c, d);
            m.mutate(c, 1000000, 8);
            CheckFalse(c.Equals(d));
            m.mutate(d, 1000000, 8);
            CheckFalse(c.Equals(d));
        }

        public void testMutatesBadLength()
        {
            CheckEqual(c, d);
            m.mutate(c, 1, -80);
            CheckFalse(c.Equals(d));
            m.mutate(d, 1, -80);
            CheckFalse(c.Equals(d));
        }

        public void testMutatesBadLengthAndBadIndex()
        {
            CheckEqual(c, d);
            m.mutate(c, -10, -80);
            CheckFalse(c.Equals(d));
            m.mutate(d, -10, -80);
            CheckFalse(c.Equals(d));
        }
        public void testMutatesBadLengthAndBadIndex2()
        {
            CheckEqual(c, d);
            m.mutate(c, 100000, -80);
            CheckFalse(c.Equals(d));
            m.mutate(d, 100000, -80);
            CheckFalse(c.Equals(d));
        }
    }
}