/*
* Copyright 2015 S. Webber
*
* 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.
*/
package org.oakgp.rank;
import static java.util.stream.Collectors.toList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.oakgp.TestUtils.mockNode;
import java.util.Collections;
import java.util.Iterator;
import java.util.NoSuchElementException;
import org.junit.Test;
public class RankedCandidatesTest {
private final RankedCandidate element1 = new RankedCandidate(mockNode(), -7);
private final RankedCandidate element2 = new RankedCandidate(mockNode(), -2.25);
private final RankedCandidate element3 = new RankedCandidate(mockNode(), 0);
private final RankedCandidate element4 = new RankedCandidate(mockNode(), 1);
private final RankedCandidate element5 = new RankedCandidate(mockNode(), 785.5);
private final RankedCandidate[] input = { element5, element3, element1, element2, element4 };
private final RankedCandidates rankedCandidates = new RankedCandidates(input);
@Test
public void testSize() {
assertEquals(5, rankedCandidates.size());
}
@Test
public void testGet() {
assertSame(element1, rankedCandidates.get(0));
assertSame(element2, rankedCandidates.get(1));
assertSame(element3, rankedCandidates.get(2));
assertSame(element4, rankedCandidates.get(3));
assertSame(element5, rankedCandidates.get(4));
}
@Test
public void testNext() {
Iterator<RankedCandidate> itr = rankedCandidates.iterator();
assertSame(element1, itr.next());
assertSame(element2, itr.next());
assertSame(element3, itr.next());
assertSame(element4, itr.next());
assertSame(element5, itr.next());
try {
itr.next();
fail();
} catch (NoSuchElementException e) {
// expected
}
}
@Test
public void testHasNext() {
Iterator<RankedCandidate> itr = rankedCandidates.iterator();
assertTrue(itr.hasNext());
assertTrue(itr.hasNext());
assertSame(element1, itr.next());
assertTrue(itr.hasNext());
assertSame(element2, itr.next());
assertTrue(itr.hasNext());
assertSame(element3, itr.next());
assertTrue(itr.hasNext());
assertSame(element4, itr.next());
assertTrue(itr.hasNext());
assertSame(element5, itr.next());
assertFalse(itr.hasNext());
assertFalse(itr.hasNext());
}
@Test(expected = UnsupportedOperationException.class)
public void testRemove() {
Iterator<RankedCandidate> itr = rankedCandidates.iterator();
itr.remove();
}
@Test
public void testCustomComparator() {
RankedCandidates defaultOrderedCandidates = new RankedCandidates(input);
RankedCandidates reverseOrderedCandidates = new RankedCandidates(input, Collections.reverseOrder());
assertEquals(5, defaultOrderedCandidates.size());
assertEquals(5, reverseOrderedCandidates.size());
assertSame(defaultOrderedCandidates.get(0), reverseOrderedCandidates.get(4));
assertSame(defaultOrderedCandidates.get(1), reverseOrderedCandidates.get(3));
assertSame(defaultOrderedCandidates.get(2), reverseOrderedCandidates.get(2));
assertSame(defaultOrderedCandidates.get(3), reverseOrderedCandidates.get(1));
assertSame(defaultOrderedCandidates.get(4), reverseOrderedCandidates.get(0));
}
@Test
public void testBest() {
RankedCandidates defaultOrderedCandidates = new RankedCandidates(input);
RankedCandidates reverseOrderedCandidates = new RankedCandidates(input, Collections.reverseOrder());
assertSame(element1, defaultOrderedCandidates.best());
assertSame(element5, reverseOrderedCandidates.best());
}
@Test
public void testStream() {
assertEquals("[-7.0, -2.25, 0.0, 1.0, 785.5]", rankedCandidates.stream().map(c -> c.getFitness()).collect(toList()).toString());
}
@Test
public void testImmutable() {
// test that making subsequent changes to the array given to the constructor does not alter the RandedCandidate
final RankedCandidate[] input = { element3, element1, element2 };
final RankedCandidates rankedCandidates = new RankedCandidates(input);
input[0] = element4;
input[1] = element5;
input[2] = element1;
assertSame(element1, rankedCandidates.get(0));
assertSame(element2, rankedCandidates.get(1));
assertSame(element3, rankedCandidates.get(2));
}
@Test
public void testGetIndexOutOfBounds() {
assertArrayIndexOutOfBoundsException(rankedCandidates, -1);
assertArrayIndexOutOfBoundsException(rankedCandidates, rankedCandidates.size());
assertArrayIndexOutOfBoundsException(rankedCandidates, rankedCandidates.size() + 1);
assertArrayIndexOutOfBoundsException(rankedCandidates, Integer.MAX_VALUE);
}
private void assertArrayIndexOutOfBoundsException(RankedCandidates candidates, int index) {
try {
candidates.get(index);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
// expected
}
}
}