/*
* Java Genetic Algorithm Library (@__identifier__@).
* Copyright (c) @__year__@ Franz Wilhelmstötter
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Author:
* Franz Wilhelmstötter (franz.wilhelmstoetter@gmx.at)
*/
package org.jenetics.util;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;
import java.util.Random;
import java.util.function.Supplier;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.jenetics.internal.math.random;
/**
* @author <a href="mailto:franz.wilhelmstoetter@gmx.at">Franz Wilhelmstötter</a>
*/
public abstract class MSeqTestBase extends SeqTestBase {
@Override
protected abstract MSeq<Integer> newSeq(final int length);
private Supplier<Integer> RandomInt(final Random random) {
return random::nextInt;
}
@Test
public void asList() {
final long seed = random.seed();
final Random random = new Random(seed);
final MSeq<Integer> seq = newSeq(1000);
for (int i = 0; i < seq.length(); ++i) {
seq.set(i, random.nextInt());
}
final List<Integer> list = seq.asList();
random.setSeed(seed);
for (int i = 0; i < seq.length(); ++i) {
list.set(i, random.nextInt());
}
random.setSeed(seed);
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(list.get(i).intValue(), random.nextInt());
}
random.setSeed(seed);
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(seq.get(i).intValue(), random.nextInt());
}
}
@Test(dataProvider = "sequences")
public void reverse(final MSeq<Integer> seq) {
final ISeq<Integer> original = seq.toISeq();
seq.reverse();
Assert.assertNotEquals(seq, original);
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(seq.get(i), original.get(seq.length() - i - 1));
}
Assert.assertEquals(original, seq.reverse());
}
@Test(dataProvider = "sequences")
public void sort(final MSeq<Integer> seq) {
seq.shuffle(new Random(23));
Assert.assertFalse(seq.isSorted());
seq.sort();
Assert.assertTrue(seq.isSorted());
}
@Test(dataProvider = "sequences")
public void sortWithComparator(final MSeq<Integer> seq) {
seq.shuffle(new Random(23));
Assert.assertFalse(seq.isSorted());
seq.sort((a, b) -> b.compareTo(a));
Assert.assertTrue(seq.isSorted((a, b) -> b.compareTo(a)));
Assert.assertTrue(seq.reverse().isSorted());
}
@Test(dataProvider = "sequences")
public void sortWithStart(final MSeq<Integer> seq) {
seq.shuffle(new Random(23));
Assert.assertFalse(seq.isSorted());
seq.sort(2);
Assert.assertTrue(seq.subSeq(2).isSorted());
Assert.assertFalse(seq.isSorted());
}
@Test(dataProvider = "sequences")
public void sortWithEnd(final MSeq<Integer> seq) {
seq.shuffle(new Random(23));
Assert.assertFalse(seq.isSorted());
seq.sort(0, seq.length() - 2);
Assert.assertTrue(seq.subSeq(0, seq.length() - 2).isSorted());
Assert.assertFalse(seq.isSorted());
}
@Test(dataProvider = "sequences")
public void fill(final MSeq<Integer> seq) {
final long seed = random.seed();
final Random random = new Random(seed);
seq.fill(RandomInt(random));
random.setSeed(seed);
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(seq.get(i).intValue(), random.nextInt());
}
}
@Test(dataProvider = "sequences")
public void set(final MSeq<Integer> seq) {
final long seed = random.seed();
final Random random = new Random(seed);
for (int i = 0; i < seq.length(); ++i) {
seq.set(i, random.nextInt());
}
random.setSeed(seed);
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(seq.get(i).intValue(), random.nextInt());
}
}
@Test(dataProvider = "sequences")
public void setAll(final MSeq<Integer> seq) {
final long seed = random.seed();
final Random random = new Random(seed);
final Integer v = random.nextInt();
seq.fill(() -> v);
random.setSeed(seed);
final Integer value = random.nextInt();
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(seq.get(i), value);
}
}
@Test(dataProvider = "sequences")
public void setAllArray(final MSeq<Integer> seq) {
final long seed = random.seed();
final Random random = new Random(seed);
final Integer[] array = new Integer[seq.length()];
for (int i = 0; i < array.length; ++i) {
array[i] = random.nextInt();
}
seq.setAll(array);
random.setSeed(seed);
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(seq.get(i).intValue(), random.nextInt());
}
}
@Test(dataProvider = "sequences")
public void setAllIterable(final MSeq<Integer> seq) {
final long seed = random.seed();
final Random random = new Random(seed);
final Integer[] array = new Integer[seq.length()];
for (int i = 0; i < array.length; ++i) {
array[i] = random.nextInt();
}
seq.setAll(Arrays.asList(array));
random.setSeed(seed);
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(seq.get(i).intValue(), random.nextInt());
}
}
@Test(dataProvider = "sequences")
public void setAllIterator(final MSeq<Integer> seq) {
final long seed = random.seed();
final Random random = new Random(seed);
final Integer[] array = new Integer[seq.length()];
for (int i = 0; i < array.length; ++i) {
array[i] = random.nextInt();
}
seq.setAll(Arrays.asList(array).iterator());
random.setSeed(seed);
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(seq.get(i).intValue(), random.nextInt());
}
}
@Test(dataProvider = "sequences")
public void swapIntInt(final MSeq<Integer> seq) {
for (int i = 0; i < seq.length() - 3; ++i) {
final Integer[] copy = seq.toArray(new Integer[0]);
final int j = i + 2;
final Integer vi = seq.get(i);
final Integer vj = seq.get(j);
seq.swap(i, j);
Assert.assertEquals(seq.get(i), vj);
Assert.assertEquals(seq.get(j), vi);
for (int k = 0; k < seq.length(); ++k) {
if (k != i && k != j) {
Assert.assertEquals(seq.get(k), copy[k]);
}
}
}
}
@Test(dataProvider = "sequences")
public void swapIntIntMSeqInt(final MSeq<Integer> seq) {
for (int start = 0; start < seq.length() - 3; ++start) {
final long seed = random.seed();
final Random random = new Random(seed);
final MSeq<Integer> other = newSeq(seq.length());
final MSeq<Integer> otherCopy = newSeq(seq.length());
for (int j = 0; j < other.length(); ++j) {
other.set(j, random.nextInt());
otherCopy.set(j, other.get(j));
}
final Integer[] copy = seq.toArray(new Integer[0]);
final int end = start + 2;
final int otherStart = 1;
seq.swap(start, end, other, otherStart);
for (int j = start; j < end; ++j) {
Assert.assertEquals(seq.get(j), otherCopy.get(j + otherStart - start));
}
for (int j = 0; j < (end - start); ++j) {
Assert.assertEquals(other.get(j + otherStart), copy[j + start]);
}
}
}
@Test(dataProvider = "sequences")
public void toISeq(final MSeq<Integer> seq) {
final ISeq<Integer> iseq = seq.toISeq();
final Integer[] copy = seq.toArray(new Integer[0]);
final long seed = random.seed();
final Random random = new Random(seed);
for (int i = 0; i < seq.length(); ++i) {
seq.set(i, random.nextInt());
}
random.setSeed(seed);
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(seq.get(i).intValue(), random.nextInt());
}
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(iseq.get(i), copy[i]);
}
}
@Test
public void toSeqMSeqChange() {
final MSeq<Integer> mseq = newSeq(20);
final ISeq<Integer> iseq1 = mseq.toISeq();
mseq.shuffle();
final ISeq<Integer> iseq2 = mseq.toISeq();
Assert.assertNotEquals(iseq1, iseq2, "ISeq instances must not be equal.");
}
@Test
public void toListIteratorChange() {
final MSeq<Integer> mseq = newSeq(20);
final ISeq<Integer> iseq1 = mseq.toISeq();
final ListIterator<Integer> it = mseq.listIterator();
it.next();
it.set(300);
final ISeq<Integer> iseq2 = mseq.toISeq();
Assert.assertNotEquals(iseq1, iseq2, "ISeq instances must not be equal.");
}
@Test
public void toListChange() {
final MSeq<Integer> mseq = newSeq(20);
final ISeq<Integer> iseq1 = mseq.toISeq();
final List<Integer> list = mseq.asList();
list.set(0, 300);
final ISeq<Integer> iseq2 = mseq.toISeq();
Assert.assertNotEquals(iseq1, iseq2, "ISeq instances must not be equal.");
}
}