F# - Sudoku Solver using search trees Step Three: Adding Unit Tests

Post date: Jan 29, 2012 8:52:50 PM

Part one: https://sites.google.com/site/mrmbookmarks/msg/F---Sudoku-Solver-using-search-trees-Step-one-Defining-the-datastructure

Part two: https://sites.google.com/site/mrmbookmarks/msg/F---Sudoku-Solver-using-search-trees-Step-two-The-algorithm

Part Three: https://sites.google.com/site/mrmbookmarks/msg/F---Sudoku-Solver-using-search-trees-Step-Three-Adding-Unit-Tests

Part Four: https://sites.google.com/site/mrmbookmarks/msg/F---Sudoku-Solver-using-search-trees-Step-Four-Adding-more-Unit-Tests

Part Five: https://sites.google.com/site/mrmbookmarks/msg/F---Sudoku-Solver-using-search-trees-Step-Five-Defining-the-data-structure-for-the-complete-problem

Part Six: https://sites.google.com/site/mrmbookmarks/msg/F---Sudoku-Solver-using-search-trees-Step-Six-Solving-Sudoku

Party Seven: https://sites.google.com/site/mrmbookmarks/msg/F---Sudoku-Solver-using-search-trees-Step-Seven-Increasing-performance-using-parallel-tasks

Full Source: http://code.google.com/p/peter-henell-f-sharp-sudoku-solver/source/browse/#git%2FSearchTrees

Before we start modifying the code we should have some basic unit tests so that we know what we are breaking.

I am using FsUnit as my framework for writing these unit tests and TestDriven.Net to run them.

http://fsunit.codeplex.com/

http://www.testdriven.net/

Starting with the unit tests for the SodukoProblem type.

module SodukoProblemTests open DataStructure open NUnit.Framework open FsUnit [<TestFixture>]type SodukoProblemFixture() = [<Test>] member this. ``Should Find Spots For Each Slot Of The List based on the previous step``() = let step1 = new SodukoProblem(1, 0, 0, 0, 0, 0, 0, 0, 0) let step2 = SodukoProblem.FromList (step1.findSpotFor 2) let step3 = SodukoProblem.FromList (step2.findSpotFor 3) let step4 = SodukoProblem.FromList (step3.findSpotFor 4) let step5 = SodukoProblem.FromList (step4.findSpotFor 5) let step6 = SodukoProblem.FromList (step5.findSpotFor 6) let step7 = SodukoProblem.FromList (step6.findSpotFor 7) let step8 = SodukoProblem.FromList (step7.findSpotFor 8) let step9 = SodukoProblem.FromList (step8.findSpotFor 9) step1.toList |> should equal [1; 0; 0; 0; 0; 0; 0; 0; 0] step2.toList |> should equal [1; 2; 0; 0; 0; 0; 0; 0; 0] step3.toList |> should equal [1; 2; 3; 0; 0; 0; 0; 0; 0] step4.toList |> should equal [1; 2; 3; 4; 0; 0; 0; 0; 0] step5.toList |> should equal [1; 2; 3; 4; 5; 0; 0; 0; 0] step6.toList |> should equal [1; 2; 3; 4; 5; 6; 0; 0; 0] step7.toList |> should equal [1; 2; 3; 4; 5; 6; 7; 0; 0] step8.toList |> should equal [1; 2; 3; 4; 5; 6; 7; 8; 0] step9.toList |> should equal [1; 2; 3; 4; 5; 6; 7; 8; 9] [<Test>] member this. ``Should find spots on the list when there is one spot taken in the middle of the list``() = let step = new SodukoProblem(0, 0, 0, 0, 5, 0, 0, 0, 0) let step2 = SodukoProblem.FromList (step.findSpotFor 1) step2.toList |> should equal [1; 0; 0; 0; 5; 0; 0; 0; 0] [<Test>] member this. ``Should find spots for a number that already exists (Should not care about the number itself)``() = let step = new SodukoProblem(0, 0, 0, 0, 5, 0, 0, 0, 0) let step2 = SodukoProblem.FromList (step.findSpotFor 5) step2.toList |> should equal [5; 0; 0; 0; 5; 0; 0; 0; 0] [<Test>] member this. ``Should find a spot for a number when there are no numbers in the list``() = let step = new SodukoProblem(0, 0, 0, 0, 0, 0, 0, 0, 0) let step2 = SodukoProblem.FromList (step.findSpotFor 5) step2.toList |> should equal [5; 0; 0; 0; 0; 0; 0; 0; 0] [<Test>] member this. ``Should create empty list when trying to find a slot for a number when the list is full``() = let step = new SodukoProblem(5, 5, 5, 5, 5, 5, 5, 5, 5) let step2 = (step.findSpotFor 5) step2 |> should haveLength 0 [<Test>] member this. ``Should throw exception when trying to create a SodukoProblem from an empty list``() = let step = new SodukoProblem(5, 5, 5, 5, 5, 5, 5, 5, 5) let step2 = (step.findSpotFor 5) (fun () -> SodukoProblem.FromList step2 |> ignore ) |> should throw typeof<System.ArgumentException>