public void CreateActionTestWith2x2() { // Setup ISpace <int> space = new Space <int>(new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); for (int i = 1; i < 10; i++) { space.Add(i, new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); } Keys <int> group = new Keys <int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; ConstraintMutuallyExclusive <int> target = new ConstraintMutuallyExclusive <int>("row1", group); IPuzzle <int> puzzle = new PuzzleBase <int>(space); puzzle.Constraints.Add(target); IPuzzleEngine <int> engine = new PuzzleEngine <int>(puzzle); // Action space[8].SetValues(new Possible() { 1, 2 }); space[9].SetValues(new Possible() { 1, 2 }); Keys <int> keysChangedIn = new Keys <int>() { 8, 9 }; target.CreateSearchJobs(keysChangedIn, engine); // Tests Possible expectedFilter = new Possible() { 1, 2 }; Keys <int> expectedKeys = new Keys <int>() { 1, 2, 3, 4, 5, 6, 7 }; Assert.AreEqual(1, engine.Count, "Incorrect Jobs added"); IJobFilter <int> nextJob = engine.Peek() as IJobFilter <int>; Assert.IsTrue(nextJob.Keys.SetEquals(expectedKeys), "ConstraintME did not change the correct keys"); Assert.IsTrue(nextJob.Filter.SetEquals(expectedFilter), "ConstraintME did not set the correct values"); }
// //You can use the following additional attributes as you write your tests: // //Use ClassInitialize to run code before running the first test in the class //[ClassInitialize()] //public static void MyClassInitialize(TestContext testContext) //{ //} // //Use ClassCleanup to run code after all tests in a class have run //[ClassCleanup()] //public static void MyClassCleanup() //{ //} // //Use TestInitialize to run code before running each test //[TestInitialize()] //public void MyTestInitialize() //{ //} // //Use TestCleanup to run code after each test has run //[TestCleanup()] //public void MyTestCleanup() //{ //} // #endregion /// <summary> ///A test for Process ///</summary> public void ProcessIntersectionEliminateProcessTestHelper <TKey>() { Keys <int> group1In = new Keys <int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Keys <int> group2In = new Keys <int>() { 1, 2, 3, 10, 11, 12, 19, 20, 21 }; ISpace <int> space = new Space <int>(new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); for (int i = 1; i < 22; i++) { space.Add(i, new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); } // remove 1 from part of row1 for (int i = 4; i < 10; i++) { space[i].Values.Remove(1); } space[1].Values.Remove(5); space[2].Values.Remove(5); space[3].Values.Remove(5); IPuzzle <int> puzzle = new PuzzleBase <int>(space); IPuzzleEngine <int> engine = new PuzzleEngine <int>(puzzle); // Action int jobsAdded = ConstraintMutuallyExclusive <int> .CreateCompleteIntersectActions(group1In, group2In, engine); // Tests Assert.AreEqual(1, jobsAdded, "Incorrect filter job count"); Keys <int> expected = new Keys <int>() { 10, 11, 12, 19, 20, 21 }; IJobFilter <int> job = engine.Peek() as IJobFilter <int>; Assert.IsNotNull(job); Assert.AreEqual(6, job.Keys.Count, "Unexpected key change."); Assert.IsTrue(expected.SetEquals(job.Keys), "Unexpected Keys Changed. Should be 10,11,12,19,20,21"); Possible expectedValues = new Possible() { 1 }; Assert.IsTrue(expectedValues.SetEquals(job.Filter), "Unexpected values. Should have eliminated 1"); }
// //You can use the following additional attributes as you write your tests: // //Use ClassInitialize to run code before running the first test in the class //[ClassInitialize()] //public static void MyClassInitialize(TestContext testContext) //{ //} // //Use ClassCleanup to run code after all tests in a class have run //[ClassCleanup()] //public static void MyClassCleanup() //{ //} // //Use TestInitialize to run code before running each test //[TestInitialize()] //public void MyTestInitialize() //{ //} // //Use TestCleanup to run code after each test has run //[TestCleanup()] //public void MyTestCleanup() //{ //} // #endregion /// <summary> ///A test for CreateSearchJobs ///</summary> public void ApplyConstraintsTestHelper <TKey>() { // Initialise Space ISpace <int> space = new Space <int>(new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); for (int i = 1; i < 82; i++) { space.Add(i, new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); } IConstraints <int> constraints = new Constraints <int>(); Keys <int> group = new Keys <int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; IConstraint <int> constraint = new ConstraintMutuallyExclusive <int>("row1", group); Keys <int> group2 = new Keys <int>() { 1, 2, 3, 10, 11, 12, 19, 20, 21 }; IConstraint <int> constraint2 = new ConstraintMutuallyExclusive <int>("grid1", group2); constraints.Add(constraint); constraints.Add(constraint2); IPuzzle <int> puzzle = new PuzzleBase <int>(); puzzle.Space = space; puzzle.Constraints = constraints; IPuzzleEngine <int> engine = new PuzzleEngine <int>(puzzle); ISpace <int> init = new Space <int>(new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); init[1] = new Possible() { 1 }; engine.SetInitialValues(init); Assert.AreEqual(1, engine.Count, "Constraint not added to queue"); engine.DoNextJob(); // this brings back keys 2 and 3 with constraint grid1? is Assert.AreEqual(2, engine.Count, "MutuallyExclusive constraint did not create jobs"); }
public void RunAlgorithmTest() { // Initialise Space ISpace <int> space = new Space <int>(new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); for (int i = 1; i < 82; i++) { space.Add(i, new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); } // Initialise one group (top row) Keys <int> group = new Keys <int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; IPuzzle <int> puzzle = new PuzzleBase <int>(space); IPuzzleEngine <int> engine = new PuzzleEngine <int>(puzzle); // Action space[1].SetValue(1); Keys <int> keysInner = new Keys <int>() { 1 }; int jobsAdded = ConstraintMutuallyExclusive <int> .CreateCompleteSetActions(keysInner, group, engine); // Test Keys <int> expectedK = new Keys <int>() { 2, 3, 4, 5, 6, 7, 8, 9 }; Possible expectedV = new Possible() { 1 }; IJobFilter <int> job = engine.Peek() as IJobFilter <int>; Keys <int> actual = job.Keys; IPossible filter = job.Filter; // Check the algorithm returned 8 changes Assert.AreEqual(8, actual.Count(), "Algorithm Eliminate did not return 8 changes"); Assert.IsTrue(expectedK.SetEquals(actual)); Assert.AreEqual(1, filter.Count, "Filter value incorrect"); Assert.IsTrue(expectedV.SetEquals(filter), "Filter values incorrect"); }
public void AddColumns(int xOffset, int yOffset, int xSize, int ySize, int xWidth, IConstraints <int> constraints) { for (int x = 0; x < xSize; x++) { Keys <int> group = new Keys <int>(); for (int y = 0; y < ySize; y++) { group.Add(1 + x + xOffset + ((y + yOffset) * xWidth)); } string name = string.Format("Column {0}: At {1}", x + 1, x + 1 + xOffset + (yOffset * xWidth)); IConstraint <int> constraint = new ConstraintMutuallyExclusive <int>(name, group); constraints.Add(constraint); } }
public void FindOtherConstraintsContainingAllKeysTest2() { IConstraints <int> constraints = new Constraints <int>(); Keys <int> group1 = new Keys <int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; IConstraint <int> constraint1 = new ConstraintMutuallyExclusive <int>("row1", group1); Keys <int> group2 = new Keys <int>() { 1, 10, 19, 28, 37, 46, 55, 64, 73 }; IConstraint <int> constraint2 = new ConstraintMutuallyExclusive <int>("col1", group2); Keys <int> group3 = new Keys <int>() { 1, 2, 3, 10, 11, 12, 19, 20, 21 }; IConstraint <int> constraint3 = new ConstraintMutuallyExclusive <int>("grid1", group3); Keys <int> group4 = new Keys <int>() { 2, 11, 20, 29, 38, 47, 56, 65, 74 }; IConstraint <int> constraint4 = new ConstraintMutuallyExclusive <int>("col2", group4); constraints.Add(constraint1); constraints.Add(constraint2); constraints.Add(constraint3); constraints.Add(constraint4); // Calling Params Keys <int> keys = new Keys <int>() { 1, 2 }; ICollection <ConstraintType> types = new List <ConstraintType>() { ConstraintType.MutuallyExclusive }; IConstraints <int> excluding = new Constraints <int>(); IConstraints <int> expected = new Constraints <int>() { constraint1, constraint3 }; IConstraints <int> actual = constraints.FindOtherConstraintsContainingAllKeys(keys, types, excluding); Assert.AreEqual(expected.Count, actual.Count, "Incorrect count"); Assert.AreEqual(actual.ElementAt(0).Name, constraint1.Name, "First element does not equal col1"); Assert.AreEqual(actual.ElementAt(1).Name, constraint3.Name, "Second element does not equal grid1"); }
public void AddGrid(int xOffset, int yOffset, int xSize, int ySize, int xWidth, IConstraints <int> constraints) { Keys <int> group = new Keys <int>(); for (int y = 0; y < ySize; y++) { for (int x = 0; x < xSize; x++) { group.Add(1 + x + xOffset + ((y + yOffset) * xWidth)); } } int xGrid = xOffset > 0 ? (xOffset / xSize) + 1 : 1; int yGrid = yOffset > 0 ? (yOffset * xWidth) / ySize + 1 : 1; string name = string.Format("Grid {0},{1}: At {2}", xGrid, yGrid, xOffset + 1 + (yOffset * xWidth)); IConstraint <int> constraint = new ConstraintMutuallyExclusive <int>(name, group); constraints.Add(constraint); }
public void CreateXWingActionsHardTest() { // Setup Keys <int> row1 = new Keys <int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Keys <int> col1 = new Keys <int>() { 1, 10, 19, 28, 37, 46, 55, 64, 73 }; Keys <int> col3 = new Keys <int>() { 3, 12, 21, 30, 39, 48, 57, 66, 75 }; Keys <int> col9 = new Keys <int>() { 9, 18, 27, 36, 45, 54, 63, 72, 81 }; Keys <int> row3 = new Keys <int>() { 19, 20, 21, 22, 23, 24, 25, 26, 27 }; Keys <int> row4 = new Keys <int>() { 28, 29, 30, 31, 32, 33, 34, 35, 36 }; Keys <int> grid1 = new Keys <int>() { 1, 2, 3, 10, 11, 12, 19, 20, 21 }; ISpace <int> space = new Space <int>(new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); for (int i = 1; i < 82; i++) { space.Add(i, new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); } Keys <int> reducedSet1 = new Keys <int>() { 2, 3, 4, 5, 6, 7, 8, 9 }; foreach (int k in reducedSet1) { space[k].Values.Remove(2); } Keys <int> reducedSet2 = new Keys <int>() { 2, 10, 11, 12, 19, 20 }; foreach (int k in reducedSet2) { space[k].Values.Remove(2); } ConstraintMutuallyExclusive <int> cGrid1 = new ConstraintMutuallyExclusive <int>("grid1", grid1); ConstraintTester <int> cCol1 = new ConstraintTester <int>("col1", col1); ConstraintMutuallyExclusive <int> cCol3 = new ConstraintMutuallyExclusive <int>("col3", col3); ConstraintMutuallyExclusive <int> cCol9 = new ConstraintMutuallyExclusive <int>("col9", col9); ConstraintTester <int> cRow1 = new ConstraintTester <int>("row1", row1); ConstraintTester <int> cRow3 = new ConstraintTester <int>("row3", row3); IPuzzle <int> puzzle = new PuzzleBase <int>(space); puzzle.Constraints.Add(cGrid1); puzzle.Constraints.Add(cCol1); puzzle.Constraints.Add(cCol3); puzzle.Constraints.Add(cCol9); puzzle.Constraints.Add(cRow1); puzzle.Constraints.Add(cRow3); IPuzzleEngine <int> engine = new PuzzleEngine <int>(puzzle); //SpaceAdapter<int>.ToFile(puzzle.Space.ToString(),0); // Action cRow1.CreateActions3(reducedSet1, engine); //SpaceAdapter<int>.ToFile(puzzle.Space.ToString(),1); Assert.AreEqual(0, engine.Count, "Two X wing sets not found"); }
public void CreateXWingActionsTest() { // Setup Keys <int> group1In = new Keys <int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Keys <int> group2In = new Keys <int>() { 1, 10, 19, 28, 37, 46, 55, 64, 73 }; Keys <int> group3In = new Keys <int>() { 9, 18, 27, 36, 45, 54, 63, 72, 81 }; Keys <int> group4In = new Keys <int>() { 28, 29, 30, 31, 32, 33, 34, 35, 36 }; Keys <int> group5In = new Keys <int>() { 1, 2, 3, 10, 11, 12, 19, 20, 21 }; ISpace <int> space = new Space <int>(new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); for (int i = 1; i < 82; i++) { space.Add(i, new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); } ConstraintTester <int> target1 = new ConstraintTester <int>("row1", group1In); ConstraintMutuallyExclusive <int> target2 = new ConstraintMutuallyExclusive <int>("col1", group2In); ConstraintMutuallyExclusive <int> target3 = new ConstraintMutuallyExclusive <int>("col9", group3In); ConstraintMutuallyExclusive <int> target4 = new ConstraintMutuallyExclusive <int>("row4", group4In); ConstraintMutuallyExclusive <int> target5 = new ConstraintMutuallyExclusive <int>("grid1", group5In); IPuzzle <int> puzzle = new PuzzleBase <int>(space); puzzle.Constraints.Add(target1); puzzle.Constraints.Add(target2); puzzle.Constraints.Add(target3); puzzle.Constraints.Add(target4); puzzle.Constraints.Add(target5); IPuzzleEngine <int> engine = new PuzzleEngine <int>(puzzle); // Action Keys <int> keysChanged = new Keys <int>() { 2, 3, 4, 5, 6, 7, 8, 29, 30, 31, 32, 33, 34, 35 }; foreach (int k in keysChanged) { space[k].Values.Remove(2); } target1.CreateActions3(keysChanged, engine); // Test Possible origValue = new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Possible expectedFilter = new Possible() { 2 }; Assert.AreEqual(2, engine.Count, "Two X wing sets not found"); IJobFilter <int> job1 = engine.ElementAt(0) as IJobFilter <int>; IJobFilter <int> job2 = engine.ElementAt(1) as IJobFilter <int>; //Keys<int> kExpected11 = new Keys<int>() {1, 28}; //Keys<int> kExpected12 = new Keys<int>() {9, 36}; Keys <int> kExpected21 = new Keys <int>() { 10, 19, 37, 46, 55, 64, 73 }; Keys <int> kExpected22 = new Keys <int>() { 18, 27, 45, 54, 63, 72, 81 }; Keys <int> kNotExpected2 = new Keys <int>() { 11, 12, 20, 21 }; Assert.IsTrue(job1.Keys.SetEquals(kExpected21)); Assert.IsTrue(job1.Filter.SetEquals(expectedFilter)); Assert.IsTrue(job2.Keys.SetEquals(kExpected22)); Assert.IsTrue(job2.Filter.SetEquals(expectedFilter)); }
public void CreateActions2Test() { // Setup Keys <int> group1In = new Keys <int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Keys <int> group2In = new Keys <int>() { 10, 11, 12, 13, 14, 15, 16, 17, 18 }; Keys <int> group3In = new Keys <int>() { 1, 2, 3, 10, 11, 12, 19, 20, 21 }; ISpace <int> space = new Space <int>(new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); for (int i = 1; i < 22; i++) { space.Add(i, new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); } ConstraintTester <int> target1 = new ConstraintTester <int>("row1", group1In); ConstraintMutuallyExclusive <int> target2 = new ConstraintMutuallyExclusive <int>("row2", group2In); ConstraintMutuallyExclusive <int> target3 = new ConstraintMutuallyExclusive <int>("grid1", group3In); IPuzzle <int> puzzle = new PuzzleBase <int>(space); puzzle.Constraints.Add(target1); puzzle.Constraints.Add(target2); puzzle.Constraints.Add(target3); IPuzzleEngine <int> engine = new PuzzleEngine <int>(puzzle); // Action Possible no3 = new Possible() { 1, 2, 4, 5, 6, 7, 8, 9 }; Keys <int> keysOuter1 = new Keys <int>() { 4, 5, 6, 7, 8, 9 }; foreach (int k in keysOuter1) { space[k].SetValues(no3); } target1.CreateActions2(keysOuter1, engine); // Tests Possible expectedFilter = new Possible() { 3 }; Keys <int> expectedKeys = new Keys <int>() { 10, 11, 12, 19, 20, 21 }; IJobFilter <int> nextJob = engine.Peek() as IJobFilter <int>; Assert.AreEqual(1, engine.Count, "Incorrect Jobs added"); Assert.IsTrue(nextJob.Keys.SetEquals(expectedKeys), "ConstraintME did not change the correct keys"); Assert.IsTrue(nextJob.Filter.SetEquals(expectedFilter), "ConstraintME did not set the correct values"); }
public void RunAlgorithmEliminateTest1() { // Initialise Possible IPossible possibleAll = new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // Initialise Space ISpace <int> space = new Space <int>(new Possible() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); for (int i = 1; i < 82; i++) { space.Add(i, new Possible(possibleAll)); } // Initialise one group (top row) Keys <int> group = new Keys <int>(); for (int i = 1; i < 10; i++) { group.Add(i); } IPuzzle <int> puzzle = new PuzzleBase <int>(space); IPuzzleEngine <int> engine = new PuzzleEngine <int>(puzzle); // Action Possible values2To9 = new Possible(possibleAll); values2To9.Remove(1); Keys <int> keysInner = new Keys <int>(); for (int j = 2; j < 10; j++) { keysInner.Add(j); space[j] = new Possible(values2To9); } int jobsAdded = ConstraintMutuallyExclusive <int> .CreateCompleteSetActions(keysInner, group, engine); Assert.AreEqual(1, engine.Count); // Test Keys <int> expectedK = new Keys <int>() { 1 }; IPossible expectedV = new Possible() { 2, 3, 4, 5, 6, 7, 8, 9 }; IJobFilter <int> job = engine.Peek() as IJobFilter <int>; Keys <int> actual = job.Keys; IPossible filter = job.Filter; Assert.AreEqual(1, actual.Count(), "Algorithm Eliminate did not return 8 changes"); Assert.IsTrue(expectedK.SetEquals(actual)); Assert.AreEqual(8, filter.Count, "Filter value incorrect"); Assert.IsTrue(expectedV.SetEquals(filter), "Filter values incorrect"); }