/*
* 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.Iterator;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.jenetics.internal.util.IntRef;
/**
* @author <a href="mailto:franz.wilhelmstoetter@gmx.at">Franz Wilhelmstötter</a>
*/
public abstract class SeqTestBase {
protected abstract Seq<Integer> newSeq(final int length);
private static Predicate<Integer> ValueOf(final int value) {
return i -> i == value;
}
@Test
public void length() {
for (int i = 0; i < 100; ++i) {
final Seq<Integer> seq = newSeq(i);
for (int j = 0; j < i; ++j) {
Assert.assertEquals(seq.get(j).intValue(), j);
}
Assert.assertEquals(seq.length(), i);
}
}
@Test(dataProvider = "sequences")
public void contains(final Seq<Integer> seq) {
for (int i = 0; i < seq.length(); ++i) {
final Integer value = seq.get(i);
Assert.assertTrue(seq.contains(value));
}
for (int i = seq.length(); i < 2*seq.length(); ++i) {
Assert.assertFalse(seq.contains(Integer.toString(i)));
}
}
@Test(dataProvider = "sequences")
public void indexOf(final Seq<Integer> seq) {
for (int i = 0; i < seq.length(); ++i) {
final int value = seq.get(i);
Assert.assertEquals(seq.indexOf(value), i);
}
}
@Test(dataProvider = "sequences")
public void indexOfInt(final Seq<Integer> seq) {
for (int start = 0; start < seq.length(); ++start) {
for (int i = 0; i < seq.length(); ++i) {
final int value = seq.get(i);
final int index = seq.indexOf(value, start);
if (i >= start) {
Assert.assertEquals(index, i);
} else {
Assert.assertEquals(index, -1);
}
}
}
}
@Test(dataProvider = "sequences")
public void indexOfIntInt(final Seq<Integer> seq) {
for (int start = 0; start < seq.length(); ++start) {
for (int end = start; end < seq.length(); ++end) {
for (int i = 0; i < seq.length(); ++i) {
final int value = seq.get(i);
final int index = seq.indexOf(value, start, end);
if (i >= start && i < end) {
Assert.assertEquals(index, i);
} else {
Assert.assertEquals(index, -1);
}
}
}
}
}
@Test(dataProvider = "sequences")
public void indexWhere(final Seq<Integer> seq) {
for (int i = 0; i < seq.length(); ++i) {
final int value = seq.get(i);
Assert.assertEquals(seq.indexWhere(ValueOf(value)), i);
}
}
@Test(dataProvider = "sequences")
public void indexWhereInt(final Seq<Integer> seq) {
for (int start = 0; start < seq.length(); ++start) {
for (int i = 0; i < seq.length(); ++i) {
final int value = seq.get(i);
final int index = seq.indexWhere(ValueOf(value), start);
if (i >= start) {
Assert.assertEquals(index, i);
} else {
Assert.assertEquals(index, -1);
}
}
}
}
@Test(dataProvider = "sequences")
public void indexWhereIntInt(final Seq<Integer> seq) {
for (int start = 0; start < seq.length(); ++start) {
for (int end = start; end < seq.length(); ++end) {
for (int i = 0; i < seq.length(); ++i) {
final int value = seq.get(i);
final int index = seq.indexWhere(ValueOf(value), start, end);
if (i >= start && i < end) {
Assert.assertEquals(index, i);
} else {
Assert.assertEquals(index, -1);
}
}
}
}
}
@Test(dataProvider = "sequences")
public void lastIndexOf(final Seq<Integer> seq) {
for (int i = 0; i < seq.length(); ++i) {
final int value = seq.get(i);
Assert.assertEquals(seq.lastIndexOf(value), i);
}
}
@Test(dataProvider = "sequences")
public void lastIndexOfInt(final Seq<Integer> seq) {
for (int end = seq.length(); end <= 0; --end) {
for (int i = 0; i < seq.length(); ++i) {
final int value = seq.get(i);
final int index = seq.lastIndexOf(value, end);
if (i < end) {
Assert.assertEquals(index, i);
} else {
Assert.assertEquals(index, -1);
}
}
}
}
@Test(dataProvider = "sequences")
public void lastIndexOfIntInt(final Seq<Integer> seq) {
for (int start = 0; start < seq.length(); ++start) {
for (int end = start; end < seq.length(); ++end) {
for (int i = 0; i < seq.length(); ++i) {
final int value = seq.get(i);
final int index = seq.lastIndexOf(value, start, end);
if (i >= start && i < end) {
Assert.assertEquals(index, i);
} else {
Assert.assertEquals(index, -1);
}
}
}
}
}
@Test(dataProvider = "sequences")
public void lastIndexWhere(final Seq<Integer> seq) {
for (int i = 0; i < seq.length(); ++i) {
final int value = seq.get(i);
Assert.assertEquals(seq.lastIndexWhere(ValueOf(value)), i);
}
}
@Test(dataProvider = "sequences")
public void lastIndexWhereInt(final Seq<Integer> seq) {
for (int end = seq.length(); end <= 0; --end) {
for (int i = 0; i < seq.length(); ++i) {
final int value = seq.get(i);
final int index = seq.lastIndexWhere(ValueOf(value), end);
if (i < end) {
Assert.assertEquals(index, i);
} else {
Assert.assertEquals(index, -1);
}
}
}
}
@Test(dataProvider = "sequences")
public void lastIndexWhereIntInt(final Seq<Integer> seq) {
for (int start = 0; start < seq.length(); ++start) {
for (int end = start; end < seq.length(); ++end) {
for (int i = 0; i < seq.length(); ++i) {
final int value = seq.get(i);
final int index = seq.lastIndexWhere(ValueOf(value), start, end);
if (i >= start && i < end) {
Assert.assertEquals(index, i);
} else {
Assert.assertEquals(index, -1);
}
}
}
}
}
@Test(dataProvider = "sequences")
public void iterator(final Seq<Integer> seq) {
int count = 0;
final Iterator<Integer> it = seq.iterator();
while (it.hasNext()) {
final Integer value = it.next();
Assert.assertTrue(seq.contains(value));
++count;
}
Assert.assertEquals(count, seq.length());
}
@Test(dataProvider = "sequences")
public void stream(final Seq<Integer> seq) {
final IntRef count = new IntRef();
seq.stream().forEach(value -> {
Assert.assertTrue(seq.contains(value));
++count.value;
});
Assert.assertEquals(count.value, seq.length());
}
@Test(dataProvider = "sequences")
public void forEach(final Seq<Integer> seq) {
final AtomicInteger counter = new AtomicInteger();
final AtomicInteger lastValue = new AtomicInteger(-1);
seq.forEach(value -> {
Assert.assertTrue(lastValue.get() < value);
Assert.assertTrue(seq.contains(value));
lastValue.set(value);
counter.incrementAndGet();
});
Assert.assertEquals(counter.get(), seq.length());
}
@Test(dataProvider = "sequences")
public void forAll(final Seq<Integer> seq) {
final AtomicInteger counter = new AtomicInteger();
seq.forAll(value -> {
Assert.assertTrue(seq.contains(value));
counter.incrementAndGet();
return true;
});
Assert.assertEquals(counter.get(), seq.length());
}
@Test(dataProvider = "sequences")
public void forAll2(final Seq<Integer> seq) {
final AtomicInteger counter = new AtomicInteger();
seq.forAll(value -> counter.incrementAndGet() < seq.length()/2);
Assert.assertEquals(counter.get(), seq.length()/2);
}
@Test(dataProvider = "sequences")
public void get(final Seq<Integer> seq) {
int lastValue = -1;
for (int i = 0; i < seq.length(); ++i) {
Assert.assertTrue(lastValue < seq.get(i));
lastValue = seq.get(i);
}
}
@Test(
dataProvider = "sequences",
expectedExceptions = IndexOutOfBoundsException.class
)
public void indexOutOfBoundsGet(final Seq<Integer> seq) {
seq.get(seq.length());
}
@Test(
dataProvider = "sequences",
expectedExceptions = IndexOutOfBoundsException.class
)
public void negativeIndexGet(final Seq<Integer> seq) {
seq.get(-1);
}
@Test(dataProvider = "sequences")
public void map(final Seq<Integer> seq) {
final Seq<String> sseq = seq.map(Objects::toString);
Assert.assertEquals(sseq.length(), seq.length());
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(sseq.get(i), seq.get(i).toString());
}
}
@Test(dataProvider = "sequences")
public void append(final Seq<Integer> seq) {
final Seq<Integer> appended = seq.append(-1000, -5000);
Assert.assertEquals(appended.length(), seq.length() + 2);
Assert.assertEquals(appended.get(appended.length() - 2).intValue(), -1000);
Assert.assertEquals(appended.get(appended.length() - 1).intValue(), -5000);
}
@Test(dataProvider = "sequences")
public void prepend(final Seq<Integer> seq) {
final Seq<Integer> prepended = seq.prepend(-1000, -5000);
Assert.assertEquals(prepended.length(), seq.length() + 2);
Assert.assertEquals(prepended.get(0).intValue(), -1000);
Assert.assertEquals(prepended.get(1).intValue(), -5000);
}
@Test(dataProvider = "sequences")
public void toArrayObject(final Seq<Integer> seq) {
final Object[] array = seq.toArray();
Assert.assertEquals(array.length, seq.length());
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(array[i], seq.get(i));
}
}
@Test(dataProvider = "sequences")
public void toArrayInteger(final Seq<Integer> seq) {
final Integer[] array = seq.toArray(new Integer[0]);
Assert.assertEquals(array.length, seq.length());
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(array[i], seq.get(i));
}
}
@Test(dataProvider = "sequences")
public void toArrayInteger2(final Seq<Integer> seq) {
final Integer[] array = seq.toArray(new Integer[seq.length()]);
Assert.assertEquals(array.length, seq.length());
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(array[i], seq.get(i));
}
}
@Test(dataProvider = "sequences")
public void toArrayInteger3(final Seq<Integer> seq) {
final Integer[] array = seq.toArray(new Integer[seq.length() + 5]);
Assert.assertEquals(array.length, seq.length() + 5);
for (int i = 0; i < seq.length(); ++i) {
Assert.assertEquals(array[i], seq.get(i));
}
}
@Test(dataProvider = "sequences")
public void subSeqInt(final Seq<Integer> seq) {
for (int start = 0; start < seq.length(); ++start) {
final Seq<Integer> sub = seq.subSeq(start);
Assert.assertEquals(sub.length(), seq.length() - start);
for (int i = 0; i < sub.length(); ++i) {
Assert.assertEquals(sub.get(i), seq.get(i + start));
}
}
}
@Test(dataProvider = "sequences")
public void subSeqIntInt(final Seq<Integer> seq) {
for (int start = 0; start < seq.length(); ++start) {
for (int end = start; end < seq.length(); ++end) {
final Seq<Integer> sub = seq.subSeq(start, end);
Assert.assertEquals(sub.length(), end - start);
for (int i = 0; i < sub.length(); ++i) {
Assert.assertEquals(sub.get(i), seq.get(i + start));
}
}
}
}
@DataProvider
public Object[][] sequences() {
return new Object[][] {
{newSeq(33)},
{newSeq(35).subSeq(5)} ,
{newSeq(33).subSeq(8, 23)},
{newSeq(50).subSeq(5, 43).subSeq(10)},
{newSeq(100).subSeq(1, 95).subSeq(1, 80).subSeq(1, 75)},
{newSeq(100).subSeq(1, 95).subSeq(1, 80).subSeq(1, 75).subSeq(1, 70)},
{newSeq(100).subSeq(0, 95).subSeq(1, 80).subSeq(1).subSeq(1, 70)},
{newSeq(100).subSeq(0, 95).subSeq(1, 80).subSeq(1).subSeq(1, 70).subSeq(0)}
};
}
}