diff truffle/com.oracle.truffle.api.interop.java.test/src/com/oracle/truffle/api/interop/java/test/PrimitiveRawArrayInteropTest.java @ 22135:e70b20f4bb00

Implementing API for Java/Truffle interop. Based around JavaInterop.asJavaObject and JavaInterop.asTruffleObject methods. Connected to TruffleVM via Symbol.as(Class) wrapper. Verified by extended TCK.
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Mon, 07 Sep 2015 17:07:20 +0200
parents
children dc83cc1f94f2
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/truffle/com.oracle.truffle.api.interop.java.test/src/com/oracle/truffle/api/interop/java/test/PrimitiveRawArrayInteropTest.java	Mon Sep 07 17:07:20 2015 +0200
@@ -0,0 +1,224 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.interop.java.test;
+
+import com.oracle.truffle.api.interop.TruffleObject;
+import com.oracle.truffle.api.interop.java.JavaInterop;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+public class PrimitiveRawArrayInteropTest {
+    private Object[] objArr;
+    private byte[] byteArr;
+    private short[] shortArr;
+    private int[] intArr;
+    private long[] longArr;
+    private float[] floatArr;
+    private double[] doubleArr;
+    private char[] charArr;
+    private boolean[] boolArr;
+
+    public Object arr(int type) {
+        switch (type) {
+            case 0:
+                return objArr;
+            case 1:
+                return byteArr;
+            case 2:
+                return shortArr;
+            case 3:
+                return intArr;
+            case 4:
+                return longArr;
+            case 5:
+                return floatArr;
+            case 6:
+                return doubleArr;
+            case 7:
+                return charArr;
+            case 8:
+                return boolArr;
+            default:
+                throw new IllegalStateException("type: " + type);
+        }
+    }
+
+    public interface RawInterop {
+        List<Object> arr(int type);
+    }
+
+    private TruffleObject obj;
+    private RawInterop interop;
+
+    @Before
+    public void initObjects() {
+        obj = JavaInterop.asTruffleObject(this);
+        interop = JavaInterop.asJavaObject(RawInterop.class, obj);
+    }
+
+    @Test
+    public void everyThingIsNull() {
+        assertNull(interop.arr(0));
+        assertNull(interop.arr(1));
+        assertNull(interop.arr(2));
+        assertNull(interop.arr(3));
+        assertNull(interop.arr(4));
+        assertNull(interop.arr(5));
+        assertNull(interop.arr(6));
+        assertNull(interop.arr(7));
+        assertNull(interop.arr(8));
+    }
+
+    @Test
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    public void stringAsList() {
+        objArr = new Object[]{"Hello", "World", "!"};
+        List<Object> list = interop.arr(0);
+        assertEquals("Three elements", 3, list.size());
+        assertEquals("Hello", list.get(0));
+        assertEquals("World", list.get(1));
+        assertEquals("!", list.get(2));
+
+        list.set(1, "there");
+        assertEquals("there", objArr[1]);
+
+        list.set(0, null);
+        assertNull("set to null", objArr[0]);
+
+        List rawList = list;
+        rawList.set(0, 42);
+        assertEquals("safelly changed", 42, objArr[0]);
+    }
+
+    @Test
+    public void charOp() {
+        charArr = new char[]{'A', 'h', 'o', 'j'};
+        assertEquals('j', (char) interop.arr(7).get(3));
+        interop.arr(7).set(3, 'y');
+
+        String s = new String(charArr);
+        assertEquals("Ahoy", s);
+    }
+
+    @Test
+    public void boolOp() {
+        boolArr = new boolean[]{true, false};
+
+        interop.arr(8).set(1, !(Boolean) interop.arr(8).get(1));
+
+        assertEquals(boolArr[0], boolArr[1]);
+    }
+
+    @Test
+    public void byteSum() {
+        byteArr = new byte[]{(byte) 1, (byte) 2, (byte) 3};
+        assertSum("Sum is OK", 6, interop.arr(1));
+    }
+
+    @Test
+    public void shortSum() {
+        shortArr = new short[]{(short) 1, (short) 2, (short) 3};
+        assertSum("Sum is OK", 6, interop.arr(2));
+    }
+
+    @Test
+    public void intSum() {
+        intArr = new int[]{1, 2, 3};
+        assertSum("Sum is OK", 6, interop.arr(3));
+    }
+
+    @Test
+    public void longSum() {
+        longArr = new long[]{1, 2, 3};
+        assertSum("Sum is OK", 6, interop.arr(4));
+    }
+
+    @Test
+    public void floatSum() {
+        floatArr = new float[]{1, 2, 3};
+        assertSum("Sum is OK", 6, interop.arr(5));
+    }
+
+    @Test
+    public void doubleSum() {
+        doubleArr = new double[]{1, 2, 3};
+        assertSum("Sum is OK", 6, interop.arr(6));
+    }
+
+    @Test
+    public void writeSomebyteSum() {
+        byteArr = new byte[]{(byte) 10, (byte) 2, (byte) 3};
+        interop.arr(1).set(0, (byte) 1);
+        assertSum("Sum is OK", 6, interop.arr(1));
+    }
+
+    @Test
+    public void writeSomeshortSum() {
+        shortArr = new short[]{(short) 10, (short) 2, (short) 3};
+        interop.arr(2).set(0, (short) 1);
+        assertSum("Sum is OK", 6, interop.arr(2));
+    }
+
+    @Test
+    public void writeSomeintSum() {
+        intArr = new int[]{10, 2, 3};
+        interop.arr(3).set(0, 1);
+        assertSum("Sum is OK", 6, interop.arr(3));
+    }
+
+    @Test
+    public void writeSomelongSum() {
+        longArr = new long[]{10, 2, 3};
+        interop.arr(4).set(0, (long) 1);
+        assertSum("Sum is OK", 6, interop.arr(4));
+    }
+
+    @Test
+    public void writeSomefloatSum() {
+        floatArr = new float[]{10, 2, 3};
+        interop.arr(5).set(0, (float) 1);
+        assertSum("Sum is OK", 6, interop.arr(5));
+    }
+
+    @Test
+    public void writeSomedoubleSum() {
+        doubleArr = new double[]{10, 2, 3};
+        interop.arr(6).set(0, (double) 1);
+        assertSum("Sum is OK", 6, interop.arr(6));
+    }
+
+    private static void assertSum(String msg, double expected, List<? extends Object> numbers) {
+        double v = 0.0;
+        for (Object o : numbers) {
+            if (o instanceof Number) {
+                Number n = (Number) o;
+                v += n.doubleValue();
+            }
+        }
+        assertEquals(msg, expected, v, 0.05);
+    }
+}