gago/mutation_test.go

232 lines
5.5 KiB
Go
Raw Normal View History

2021-09-11 12:47:32 +02:00
package gago
import (
"testing"
)
func sliceContainsInt(x int, ints []int) bool {
for _, v := range ints {
if v == x {
return true
}
}
return false
}
func sliceContainsFloat64(x float64, floats []float64) bool {
for _, v := range floats {
if v == x {
return true
}
}
return false
}
func sliceContainsString(x string, strings []string) bool {
for _, v := range strings {
if v == x {
return true
}
}
return false
}
func TestMutNormalFloat64All(t *testing.T) {
var (
rng = newRandomNumberGenerator()
genome = []float64{1, 2, 3}
mutated = make([]float64, len(genome))
)
copy(mutated, genome)
MutNormalFloat64(mutated, 1, rng)
for i, v := range mutated {
if v == genome[i] {
t.Error("Gene should have been modified but hasn't")
}
}
}
func TestMutNormalFloat64None(t *testing.T) {
var (
rng = newRandomNumberGenerator()
genome = []float64{1, 2, 3}
mutated = make([]float64, len(genome))
)
copy(mutated, genome)
MutNormalFloat64(mutated, 0, rng)
for i, v := range mutated {
if v != genome[i] {
t.Error("Gene has been modified but shouldn't have")
}
}
}
func TestMutUniformString(t *testing.T) {
var (
rng = newRandomNumberGenerator()
genome = []string{"a", "b", "c"}
corpus = []string{"d", "e", "f"}
mutated = make([]string, len(genome))
)
copy(mutated, genome)
MutUniformString(mutated, corpus, 3, rng)
// Check the length of the mutated genome is consistent
if len(mutated) != len(genome) {
t.Error("Mutated genome has the wrong length")
}
// Check the new genes are present in the previous genome or in the corpus
for _, v := range mutated {
var inGenome = false
for _, gene := range genome {
if gene == v {
inGenome = true
}
}
var inCorpus = false
for _, element := range corpus {
if element == v {
inCorpus = true
}
}
if !inGenome && !inCorpus {
t.Error("New genome is not present in previous genome or in corpus")
}
}
}
func TestMutPermuteSingleGene(t *testing.T) {
var (
rng = newRandomNumberGenerator()
genome = []int{42}
)
MutPermuteInt(genome, 1, rng)
// Check the length of the mutated genome
if len(genome) != 1 {
t.Error("Mutated genome has the wrong length")
}
// Check the value of the mutated genome
for genome[0] != 42 {
t.Error("Mutated genome has the wrong value")
}
}
func TestMutPermuteInt(t *testing.T) {
var (
rng = newRandomNumberGenerator()
genome = []int{1, 2, 3}
mutated = make([]int, len(genome))
)
copy(mutated, genome)
MutPermuteInt(mutated, 3, rng)
// Check the length of the mutated genome is consistent
if len(mutated) != len(genome) {
t.Error("Mutated genome has the wrong length")
}
// Check the genes in the initial genome are still present
for _, v := range genome {
if !sliceContainsInt(v, mutated) {
t.Error("Gene in initial genome has disappeared")
}
}
}
func TestMutPermuteFloat64(t *testing.T) {
var (
rng = newRandomNumberGenerator()
genome = []float64{1, 2, 3}
mutated = make([]float64, len(genome))
)
copy(mutated, genome)
MutPermuteFloat64(mutated, 3, rng)
// Check the length of the mutated genome is consistent
if len(mutated) != len(genome) {
t.Error("Mutated genome has the wrong length")
}
// Check the genes in the initial genome are still present
for _, v := range genome {
if !sliceContainsFloat64(v, mutated) {
t.Error("Gene in initial genome has disappeared")
}
}
}
func TestMutPermuteString(t *testing.T) {
var (
rng = newRandomNumberGenerator()
genome = []string{"a", "b", "c"}
mutated = make([]string, len(genome))
)
copy(mutated, genome)
MutPermuteString(mutated, 3, rng)
// Check the length of the mutated genome is consistent
if len(mutated) != len(genome) {
t.Error("Mutated genome has the wrong length")
}
// Check the genes in the initial genome are still present
for _, v := range genome {
if !sliceContainsString(v, mutated) {
t.Error("Gene in initial genome has disappeared")
}
}
}
func TestMutSpliceInt(t *testing.T) {
var (
rng = newRandomNumberGenerator()
genome = []int{1, 2, 3}
mutated = make([]int, len(genome))
)
copy(mutated, genome)
MutSpliceInt(mutated, rng)
// Check the length of the mutated genome is consistent
if len(mutated) != len(genome) {
t.Error("Mutated genome has the wrong length")
}
// Check the genes in the initial genome are still present
for _, v := range genome {
if !sliceContainsInt(v, mutated) {
t.Error("Gene in initial genome has disappeared")
}
}
}
func TestMutSpliceFloat64(t *testing.T) {
var (
rng = newRandomNumberGenerator()
genome = []float64{1, 2, 3}
mutated = make([]float64, len(genome))
)
copy(mutated, genome)
MutSpliceFloat64(mutated, rng)
// Check the length of the mutated genome is consistent
if len(mutated) != len(genome) {
t.Error("Mutated genome has the wrong length")
}
// Check the genes in the initial genome are still present
for _, v := range genome {
if !sliceContainsFloat64(v, mutated) {
t.Error("Gene in initial genome has disappeared")
}
}
}
func TestMutSpliceString(t *testing.T) {
var (
rng = newRandomNumberGenerator()
genome = []string{"a", "b", "c"}
mutated = make([]string, len(genome))
)
copy(mutated, genome)
MutSpliceString(mutated, rng)
// Check the length of the mutated genome is consistent
if len(mutated) != len(genome) {
t.Error("Mutated genome has the wrong length")
}
// Check the genes in the initial genome are still present
for _, v := range genome {
if !sliceContainsString(v, mutated) {
t.Error("Gene in initial genome has disappeared")
}
}
}