module GenomeTest (suite) where import Test.Tasty import Test.Tasty.HUnit import qualified Mind as M import Genome import System.Random suite :: TestTree suite = testGroup "genome tests" $ [ mutationTests ] mutationTests :: TestTree mutationTests = testGroup "mutations" $ [ testCase "mutating the source of a gene" $ let rand = mkStdGen 1 -- randomR generates sequence (1, 2, 0, ...) genome = Genome { numInput = 2, numInternal = 1, numOutput = 5, genes = [] } sourceGene = Gene { source = M.Input 0, sink = M.Output 1, weight = 4 } mutatedGenes = fst $ foldl (\(list, r) g -> let (g', r') = mutateGeneSource genome g r in (list ++ [g'], r') ) ([], rand) (replicate 3 sourceGene) in mutatedGenes @?= [ Gene { source = M.Input 1, sink = M.Output 1, weight = 4 } , Gene { source = M.Internal 0, sink = M.Output 1, weight = 4 } , Gene { source = M.Input 0, sink = M.Output 1, weight = 4 } ] , testCase "mutating the sink of a gene" $ let rand = mkStdGen 1 -- randomR generates sequence (1, 2, 0, ...) genome = Genome { numInput = 2, numInternal = 1, numOutput = 2, genes = [] } sourceGene = Gene { source = M.Input 0, sink = M.Output 1, weight = 4 } mutatedGenes = fst $ foldl (\(list, r) g -> let (g', r') = mutateGeneSink genome g r in (list ++ [g'], r') ) ([], rand) (replicate 3 sourceGene) in mutatedGenes @?= [ Gene { source = M.Input 0, sink = M.Output 0, weight = 4 } , Gene { source = M.Input 0, sink = M.Output 1, weight = 4 } , Gene { source = M.Input 0, sink = M.Internal 0, weight = 4 } ] , testCase "mutating the weight of a gene" $ let rand = mkStdGen 0 -- randomR generates sequence (7.572357,-1.4116564,-7.2413177, ...) genome = Genome { numInput = 2, numInternal = 1, numOutput = 2, genes = [] } sourceGene = Gene { source = M.Input 0, sink = M.Output 1, weight = 4 } mutatedGenes = fst $ foldl (\(list, r) g -> let (g', r') = mutateGeneWeight genome g r in (list ++ [g'], r') ) ([], rand) (replicate 3 sourceGene) in mutatedGenes @?= [ Gene { source = M.Input 0, sink = M.Output 1, weight = 7.572357} , Gene { source = M.Input 0, sink = M.Output 1, weight = -1.4116564 } , Gene { source = M.Input 0, sink = M.Internal 1, weight = -7.2413177 } ] ]