/* Copyright (c) 2007 Timothy Wall, All Rights Reserved * * The contents of this file is dual-licensed under 2 * alternative Open Source/Free licenses: LGPL 2.1 or later and * Apache License 2.0. (starting with JNA version 4.0.0). * * You can freely decide which license you want to apply to * the project. * * You may obtain a copy of the LGPL License at: * * http://www.gnu.org/licenses/licenses.html * * A copy is also included in the downloadable source code package * containing JNA, in file "LGPL2.1". * * You may obtain a copy of the Apache License at: * * http://www.apache.org/licenses/ * * A copy is also included in the downloadable source code package * containing JNA, in file "AL2.0". */ package com.sun.jna; import java.util.List; import junit.framework.TestCase; /** General structure by value functionality tests. */ public class StructureByValueTest extends TestCase { public static void main(java.lang.String[] argList) { junit.textui.TestRunner.run(StructureByValueTest.class); } public static class TestNativeMappedInStructure extends Structure { public static class ByValue extends TestNativeMappedInStructure implements Structure.ByValue { } public static final List<String> FIELDS = createFieldsOrder("field"); public NativeLong field; @Override protected List<String> getFieldOrder() { return FIELDS; } } public void testNativeMappedInByValue() { new TestNativeMappedInStructure.ByValue(); } public interface TestLibrary extends Library { byte testStructureByValueArgument8(ByValue8 arg); short testStructureByValueArgument16(ByValue16 arg); int testStructureByValueArgument32(ByValue32 arg); long testStructureByValueArgument64(ByValue64 arg); long testStructureByValueArgument128(ByValue128 arg); } TestLibrary lib; @Override protected void setUp() { lib = Native.loadLibrary("testlib", TestLibrary.class); } @Override protected void tearDown() { lib = null; } public static abstract class ByValueStruct extends Structure implements Structure.ByValue { } public static class ByValue8 extends ByValueStruct { public static final List<String> FIELDS = createFieldsOrder("data"); public byte data; @Override protected List<String> getFieldOrder() { return FIELDS; } } public static class ByValue16 extends ByValueStruct { public static final List<String> FIELDS = createFieldsOrder("data"); public short data; @Override protected List<String> getFieldOrder() { return FIELDS; } } public static class ByValue32 extends ByValueStruct { public static final List<String> FIELDS = createFieldsOrder("data"); public int data; @Override protected List<String> getFieldOrder() { return FIELDS; } } public static class ByValue64 extends ByValueStruct { public static final List<String> FIELDS = createFieldsOrder("data"); public long data; @Override protected List<String> getFieldOrder() { return FIELDS; } } public static class ByValue128 extends ByValueStruct { public static final List<String> FIELDS = createFieldsOrder("data", "data1"); public long data, data1; @Override protected List<String> getFieldOrder() { return FIELDS; } } final long MAGIC = 0x0123456789ABCDEFL; public void testStructureArgByValue8() { ByValue8 data = new ByValue8(); final byte DATA = (byte)MAGIC; data.data = DATA; assertEquals("Failed to pass 8-bit struct by value", DATA, lib.testStructureByValueArgument8(data)); } public void testStructureArgByValue16() { ByValue16 data = new ByValue16(); final short DATA = (short)MAGIC; data.data = DATA; assertEquals("Failed to pass 16-bit struct by value", DATA, lib.testStructureByValueArgument16(data)); } public void testStructureArgByValue32() { ByValue32 data = new ByValue32(); final int DATA = (int)MAGIC; data.data = DATA; assertEquals("Failed to pass 32-bit struct by value", DATA, lib.testStructureByValueArgument32(data)); } public void testStructureArgByValue64() { ByValue64 data = new ByValue64(); final long DATA = MAGIC; data.data = DATA; assertEquals("Failed to pass 64-bit struct by value", DATA, lib.testStructureByValueArgument64(data)); } public void testStructureArgByValue128() { ByValue128 data = new ByValue128(); final long DATA = MAGIC; data.data = DATA; data.data1 = DATA; assertEquals("Failed to pass 128-bit struct by value", 2*DATA, lib.testStructureByValueArgument128(data)); } }