/* * 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; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertSame; import static org.junit.Assert.fail; import static org.oakgp.TestUtils.createVariable; import static org.oakgp.TestUtils.integerConstant; import java.util.Arrays; import java.util.List; import org.junit.Test; import org.oakgp.node.Node; public class ArgumentsTest { @Test public void testCreateArguments() { Node x = integerConstant(1); Node y = integerConstant(2); Node z = integerConstant(3); Node[] args = { x, y, z }; Arguments first = Arguments.createArguments(args); assertArguments(first, x, y, z); Node a = integerConstant(4); args[1] = a; Arguments second = Arguments.createArguments(args); assertArguments(second, x, a, z); // assert the Arguments created first remains unchanged by subsequent changes to args assertArguments(first, x, y, z); } @Test public void testCreateArgumentsFromList() { Node x = integerConstant(1); Node y = integerConstant(2); Node z = integerConstant(3); Node[] array = { x, y, z }; List<Node> list = Arrays.asList(array); Arguments first = Arguments.createArguments(array); Arguments second = Arguments.createArguments(list); assertEquals(first, second); } @Test public void testReplaceAt() { // create arguments Node x = integerConstant(1); Node y = integerConstant(2); Node z = integerConstant(3); Arguments original = Arguments.createArguments(x, y, z); assertArguments(original, x, y, z); // create new arguments based on original Node replacement = integerConstant(9); assertArguments(original.replaceAt(0, replacement), replacement, y, z); assertArguments(original.replaceAt(1, replacement), x, replacement, z); assertArguments(original.replaceAt(2, replacement), x, y, replacement); // assert original arguments has remained unchanged assertArguments(original, x, y, z); } @Test public void testSwap() { // create arguments Node x = integerConstant(1); Node y = integerConstant(2); Node z = integerConstant(3); Arguments original = Arguments.createArguments(x, y, z); assertArguments(original.swap(0, 0), x, y, z); assertArguments(original.swap(1, 1), x, y, z); assertArguments(original.swap(2, 2), x, y, z); assertArguments(original.swap(0, 1), y, x, z); assertArguments(original.swap(1, 0), y, x, z); assertArguments(original.swap(0, 2), z, y, x); assertArguments(original.swap(2, 0), z, y, x); assertArguments(original.swap(1, 2), x, z, y); assertArguments(original.swap(2, 1), x, z, y); } @Test public void testArrayIndexOutOfBoundsException() { Arguments arguments = Arguments.createArguments(integerConstant(7), integerConstant(42)); assertArrayIndexOutOfBoundsException(arguments, -1); assertArrayIndexOutOfBoundsException(arguments, 2); } @Test public void testEqualsAndHashCode() { Arguments a1 = Arguments.createArguments(integerConstant(7), createVariable(0), integerConstant(42)); Arguments a2 = Arguments.createArguments(integerConstant(7), createVariable(0), integerConstant(42)); assertEquals(a1, a1); assertEquals(a1.hashCode(), a2.hashCode()); assertEquals(a1, a2); } @Test public void testNotEquals() { Arguments a = Arguments.createArguments(integerConstant(7), createVariable(0), integerConstant(42)); // same arguments, different order assertNotEquals(a, Arguments.createArguments(integerConstant(42), createVariable(0), integerConstant(7))); // different arguments assertNotEquals(a, Arguments.createArguments(integerConstant(7), createVariable(0), integerConstant(43))); // one fewer argument assertNotEquals(a, Arguments.createArguments(integerConstant(7), createVariable(0))); // one extra argument assertNotEquals(a, Arguments.createArguments(integerConstant(7), createVariable(0), integerConstant(42), integerConstant(42))); } @Test public void testToString() { Arguments arguments = Arguments.createArguments(integerConstant(7), createVariable(0), integerConstant(42)); assertEquals("[7, v0, 42]", arguments.toString()); } private void assertArrayIndexOutOfBoundsException(Arguments arguments, int index) { try { arguments.getArg(index); fail(); } catch (ArrayIndexOutOfBoundsException e) { // expected } } /** * tests {@link Arguments#getArgCount()}, {@link Arguments#getArg(int)}, {@link Arguments#firstArg()}, {@link Arguments#secondArg()}, * {@link Arguments#thirdArg()} */ private void assertArguments(Arguments actual, Node... expected) { assertEquals(expected.length, actual.getArgCount()); assertSame(expected[0], actual.firstArg()); assertSame(expected[1], actual.secondArg()); assertSame(expected[2], actual.thirdArg()); for (int i = 0; i < expected.length; i++) { assertSame(expected[i], actual.getArg(i)); } } }