/* * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.oracle.truffle.api.dsl.test; import org.junit.Assert; import org.junit.Test; import com.oracle.truffle.api.dsl.NodeChild; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.dsl.test.NoTypeSystemTestFactory.JustFrameTestNodeGen; import com.oracle.truffle.api.dsl.test.NoTypeSystemTestFactory.NoParameterTestNodeGen; import com.oracle.truffle.api.dsl.test.NoTypeSystemTestFactory.ObjectInterfaceNodeGen; import com.oracle.truffle.api.dsl.test.NoTypeSystemTestFactory.ObjectPrimitiveTestNodeGen; import com.oracle.truffle.api.dsl.test.NoTypeSystemTestFactory.ObjectStringTestNodeGen; import com.oracle.truffle.api.dsl.test.NoTypeSystemTestFactory.PrimitiveTestNodeGen; import com.oracle.truffle.api.dsl.test.NoTypeSystemTestFactory.TypesNotInTypeSystemTestNodeGen; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.UnexpectedResultException; public class NoTypeSystemTest { abstract static class DummyChild extends Node { abstract Object execute(); } abstract static class NoParameterTestNode extends Node { abstract void execute(); @Specialization void s1() { } } @Test public void testNoParameter() { NoParameterTestNodeGen.create().execute(); } abstract static class JustFrameTestNode extends Node { abstract void execute(VirtualFrame frames); @Specialization void s1(@SuppressWarnings("unused") VirtualFrame frame) { } } @Test public void testJustFrame() { JustFrameTestNodeGen.create().execute(null); } abstract static class PrimitiveTestNode extends Node { abstract int execute(int primitive); @Specialization int test(int primitive) { return primitive; } } @Test public void testPrimitive() { Assert.assertEquals(42, PrimitiveTestNodeGen.create().execute(42)); } abstract static class ObjectInterfaceNode extends Node { abstract CharSequence execute(Object operand); @Specialization CharSequence s1(CharSequence operandSpecial) { return operandSpecial; } } @Test public void testObjectInterface() { Assert.assertEquals("42", ObjectInterfaceNodeGen.create().execute("42")); } abstract static class ObjectPrimitiveTestNode extends Node { abstract int execute(Object primitive); @Specialization int s1(int primitive) { return primitive; } } @Test public void testObjectPrimitiveTest() { Assert.assertEquals(42, ObjectPrimitiveTestNodeGen.create().execute(42)); } abstract static class ObjectStringTestNode extends Node { abstract String execute(Object operand); @Specialization String s1(String operand) { return operand; } } @Test public void testObjectStringTest() { Assert.assertEquals("42", ObjectStringTestNodeGen.create().execute("42")); } abstract static class TypesNotInTypeSystemTest extends Node { abstract Object execute(Object primitive); abstract int executeInt(Object primitive) throws UnexpectedResultException; abstract double executeDouble(Object primitive) throws UnexpectedResultException; abstract String executeString(Object primitive) throws UnexpectedResultException; abstract int[] executeIntArray(Object primitive) throws UnexpectedResultException; abstract void executeVoid(Object primitive); abstract void executeChar(Object primitive); abstract int executeInt(int primitive) throws UnexpectedResultException; abstract double executeDouble(double primitive) throws UnexpectedResultException; abstract String executeString(String primitive) throws UnexpectedResultException; abstract int[] executeIntArray(int[] primitive) throws UnexpectedResultException; abstract void executeChar(char primitive); @Specialization int s1(int primitive) { return primitive; } @Specialization double s2(double primitive) { return (int) primitive; } @Specialization String s3(String object) { return object; } @Specialization int[] s4(int[] object) { return object; } @Specialization void s5(@SuppressWarnings("unused") char object) { } } @Test public void testTypesNotInTypeSystem() throws UnexpectedResultException { int[] someArray = {1, 2, 3}; Assert.assertEquals(42, createTypesNotInTypeSystem().execute(42)); Assert.assertEquals(42d, createTypesNotInTypeSystem().execute(42d)); Assert.assertEquals(someArray, createTypesNotInTypeSystem().execute(someArray)); Assert.assertNull(createTypesNotInTypeSystem().execute((char) 42)); Assert.assertEquals(42, createTypesNotInTypeSystem().executeInt((Object) 42)); Assert.assertEquals(42d, createTypesNotInTypeSystem().executeDouble((Object) 42d), 0d); Assert.assertEquals(someArray, createTypesNotInTypeSystem().executeIntArray((Object) someArray)); createTypesNotInTypeSystem().executeChar((Object) (char) 42); Assert.assertEquals(42, createTypesNotInTypeSystem().executeInt(42)); Assert.assertEquals(42d, createTypesNotInTypeSystem().executeDouble(42d), 0d); Assert.assertEquals(someArray, createTypesNotInTypeSystem().executeIntArray(someArray)); createTypesNotInTypeSystem().executeChar((char) 42); try { createTypesNotInTypeSystem().executeInt("a"); Assert.fail(); } catch (UnexpectedResultException e) { } try { createTypesNotInTypeSystem().executeDouble("a"); Assert.fail(); } catch (UnexpectedResultException e) { } try { createTypesNotInTypeSystem().executeIntArray("a"); Assert.fail(); } catch (UnexpectedResultException e) { } createTypesNotInTypeSystem().executeChar("a"); } private static TypesNotInTypeSystemTest createTypesNotInTypeSystem() { return TestHelper.createRoot(TypesNotInTypeSystemTestNodeGen.create()); } abstract static class ErrorImpossibleTypes1 extends Node { abstract int execute(int primitive); @Specialization int test(int primitive) { return primitive; } @ExpectError("The provided return type \"Object\" does not match expected return type \"int\".%") @Specialization Object s2(int arg0) { return arg0; } } abstract static class ErrorImpossibleTypes2 extends Node { abstract int execute(int primitive); @Specialization int test(int primitive) { return primitive; } @ExpectError("Method signature (Object) does not match to the expected signature: %") @Specialization int s2(Object arg0) { return (int) arg0; } } @ExpectError("Not enough child node declarations found. Please annotate the node class with addtional @NodeChild annotations or remove all execute methods that do not provide all evaluated values. " + "The following execute methods do not provide all evaluated values for the expected signature size 1: [execute()].") abstract static class ErrorMissingNodeChild1 extends Node { abstract int execute(); @Specialization int s1(int arg0) { return arg0; } } @ExpectError("Not enough child node declarations found. Please annotate the node class with addtional @NodeChild annotations or remove all execute methods that do not provide all evaluated values. " + "The following execute methods do not provide all evaluated values for the expected signature size 2: [execute(int)].") @NodeChild(type = DummyChild.class) abstract static class ErrorMissingNodeChild2 extends Node { abstract int execute(int arg0); @Specialization int s1(int arg0, int arg1) { return arg0 + arg1; } } @ExpectError("Not enough child node declarations found. Please annotate the node class with addtional @NodeChild annotations or remove all execute methods that do not provide all evaluated values. " + "The following execute methods do not provide all evaluated values for the expected signature size 1: [execute()].") abstract static class ErrorMissingNodeChild3 extends Node { abstract int execute(); abstract int execute(int arg0); @Specialization int s1(int arg0) { return arg0; } } @ExpectError("Unnecessary @NodeChild declaration. All evaluated child values are provided as parameters in execute methods.") @NodeChild(type = DummyChild.class) abstract static class ErrorAdditionalNodeChild1 extends Node { abstract int execute(int arg0); @Specialization int s1(int arg0) { return arg0; } } @NodeChild(type = DummyChild.class) @ExpectError("Not enough child node declarations found. Please annotate the node class with addtional @NodeChild annotations or remove all execute methods that do not provide all evaluated values. " + "The following execute methods do not provide all evaluated values for the expected signature size 2: [execute(int)].") abstract static class ErrorAdditionalNodeChild2 extends Node { abstract int execute(int arg0); @Specialization int s1(int arg0, int arg1) { return arg0 + arg1; } } }