using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Sunweaver.Parsing; using Sunweaver.Mutations; using Sunweaver.Commands; namespace Sunweaver.UnitTesting.MutationTests { public class MutatorTests : UnitTestSharp.TestFixture { public class PointMutationTests : UnitTestSharp.TestFixture { public void Basic() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.PointMutation(ref codule, new Constant(777), 2); var expected = Codule.Parse("2 3 777 4 mul 5 store"); CheckEqual(expected, codule); } public void ZeroIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.PointMutation(ref codule, new Constant(777), 0); var expected = Codule.Parse("777 3 add 4 mul 5 store"); CheckEqual(expected, codule); } public void NegativeIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); CheckThrow(); Mutator.PointMutation(ref codule, new Constant(777), -1); } public void LastIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.PointMutation(ref codule, new Constant(777), 6); var expected = Codule.Parse("2 3 add 4 mul 5 777"); CheckEqual(expected, codule); } public void EndIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); CheckThrow(); Mutator.PointMutation(ref codule, new Constant(777), 7); } public void Empty() { var codule = Codule.Parse(""); CheckThrow(); Mutator.PointMutation(ref codule, new Constant(777), 0); } } public class InsertionMutationTests : UnitTestSharp.TestFixture { public void Basic() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); var insertion = Codule.Parse("7 11 ref mul 10 store"); Mutator.InsertionMutation(ref codule, insertion.BasePairs, 2); var expected = Codule.Parse("2 3 7 11 ref mul 10 store add 4 mul 5 store"); CheckEqual(expected, codule); } public void NegativeIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); var insertion = Codule.Parse("7 11 ref mul 10 store"); CheckThrow(); Mutator.InsertionMutation(ref codule, insertion.BasePairs, -1); } public void ZeroIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); var insertion = Codule.Parse("7 11 ref mul 10 store"); Mutator.InsertionMutation(ref codule, insertion.BasePairs, 0); var expected = Codule.Parse("7 11 ref mul 10 store 2 3 add 4 mul 5 store"); CheckEqual(expected, codule); } public void LastIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); var insertion = Codule.Parse("7 11 ref mul 10 store"); Mutator.InsertionMutation(ref codule, insertion.BasePairs, 7); var expected = Codule.Parse("2 3 add 4 mul 5 store 7 11 ref mul 10 store"); CheckEqual(expected, codule); } public void EndIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); var insertion = Codule.Parse("7 11 ref mul 10 store"); CheckThrow(); Mutator.InsertionMutation(ref codule, insertion.BasePairs, 8); } public void EmptyTarget() { var codule = Codule.Parse(""); var insertion = Codule.Parse("7 11 ref mul 10 store"); Mutator.InsertionMutation(ref codule, insertion.BasePairs, 0); var expected = Codule.Parse("7 11 ref mul 10 store"); CheckEqual(expected, codule); } public void EmptySource() { var codule = Codule.Parse("7 11 ref mul 10 store"); var insertion = Codule.Parse(""); Mutator.InsertionMutation(ref codule, insertion.BasePairs, 0); var expected = Codule.Parse("7 11 ref mul 10 store"); CheckEqual(expected, codule); } } public class DeletionTests : UnitTestSharp.TestFixture { public void Basic() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.DeletionMutation(ref codule, 2, 3); var expected = Codule.Parse("2 3 5 store"); CheckEqual(expected, codule); } public void NegativeIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); CheckThrow(); Mutator.DeletionMutation(ref codule, -1, 3); } public void ZeroIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.DeletionMutation(ref codule, 0, 3); var expected = Codule.Parse("4 mul 5 store"); CheckEqual(expected, codule); } public void LastValidIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.DeletionMutation(ref codule, 4, 3); var expected = Codule.Parse("2 3 add 4"); CheckEqual(expected, codule); } public void TooFar() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); CheckThrow(); Mutator.DeletionMutation(ref codule, 5, 3); } public void NegativeLength() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); CheckThrow(); Mutator.DeletionMutation(ref codule, 2, -1); } public void ZeroLength() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.DeletionMutation(ref codule, 2, 0); var expected = Codule.Parse("2 3 add 4 mul 5 store"); CheckEqual(expected, codule); } } public class ReversalTests : UnitTestSharp.TestFixture { public void Basic() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.ReversalMutation(ref codule, 2, 3); var expected = Codule.Parse("2 3 mul 4 add 5 store"); CheckEqual(expected, codule); } public void NegativeIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); CheckThrow(); Mutator.ReversalMutation(ref codule, -1, 2); } public void ZeroIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.ReversalMutation(ref codule, 0, 2); var expected = Codule.Parse("3 2 add 4 mul 5 store"); CheckEqual(expected, codule); } public void LastIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.ReversalMutation(ref codule, 5, 2); var expected = Codule.Parse("2 3 add 4 mul store 5"); CheckEqual(expected, codule); } public void EndIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); CheckThrow(); Mutator.ReversalMutation(ref codule, 6, 2); } public void ZeroLength() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.ReversalMutation(ref codule, 5, 0); var expected = Codule.Parse("2 3 add 4 mul 5 store"); CheckEqual(expected, codule); } public void OneLength() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.ReversalMutation(ref codule, 5, 1); var expected = Codule.Parse("2 3 add 4 mul 5 store"); CheckEqual(expected, codule); } public void Everything() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.ReversalMutation(ref codule, 0, 7); var expected = Codule.Parse("store 5 mul 4 add 3 2"); CheckEqual(expected, codule); } } public class MoveTests : UnitTestSharp.TestFixture { public void Basic() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.MoveMutation(ref codule, 2, 3, 4); var expected = Codule.Parse("2 3 5 store add 4 mul"); CheckEqual(expected, codule); } public void MoveAll() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.MoveMutation(ref codule, 0, 7, 0); var expected = Codule.Parse("2 3 add 4 mul 5 store"); CheckEqual(expected, codule); } public void NegativeExciseIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); CheckThrow(); Mutator.MoveMutation(ref codule, -1, 1, 2); } public void NegativeInsertionIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); CheckThrow(); Mutator.MoveMutation(ref codule, 1, 2, -1); } public void EndExciseIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); CheckThrow(); Mutator.MoveMutation(ref codule, 7, 0, 2); } public void LastExciseIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.MoveMutation(ref codule, 6, 1, 5); var expected = Codule.Parse("2 3 add 4 mul store 5"); CheckEqual(expected, codule); } public void EndInsertionIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); CheckThrow(); Mutator.MoveMutation(ref codule, 1, 2, 6); } public void LastInsertionIndex() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.MoveMutation(ref codule, 1, 2, 5); var expected = Codule.Parse("2 4 mul 5 store 3 add"); CheckEqual(expected, codule); } public void NegativeLength() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); CheckThrow(); Mutator.MoveMutation(ref codule, 3, -1, 4); } public void ZeroLength() { var codule = Codule.Parse("2 3 add 4 mul 5 store"); Mutator.MoveMutation(ref codule, 3, 0, 4); var expected = Codule.Parse("2 3 add 4 mul 5 store"); CheckEqual(expected, codule); } } } }