232 lines
5.5 KiB
Go
232 lines
5.5 KiB
Go
|
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")
|
||
|
}
|
||
|
}
|
||
|
}
|