1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
/*
* 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 junit.framework.TestCase;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import java.util.Set;
/**
* Test utility class for inspecting {@link com.sun.jna.Structure#getFieldOrder()} methods.
*
* @author Dan Rollo
* Date: 1/17/13
* Time: 4:29 PM
*/
public class StructureFieldOrderInspectorTest extends TestCase {
private String origPropJNANoSys;
@Override
protected void setUp() {
origPropJNANoSys = System.getProperty("jna.nosys");
System.setProperty("jna.nosys", "true"); // would be set by ant script, set here for IDE usage
}
@Override
protected void tearDown() {
if (origPropJNANoSys == null) {
Properties props = (Properties)System.getProperties().clone();
props.remove("jna.nosys");
System.setProperties(props);
} else {
System.setProperty("jna.nosys", origPropJNANoSys);
}
}
public void testFindStructureSubClasses() {
final Set<Class<? extends Structure>> classes = StructureFieldOrderInspector.findSubTypesOfStructure(Platform.class);
assertTrue("Found no Structure sub types.", classes.size() > 0);
for (final Class<? extends Structure> structureSubType : classes) {
assertTrue(structureSubType.getName(), Structure.class.isAssignableFrom(structureSubType));
}
}
public void testCheckMethodGetFieldOrderExisting() {
StructureFieldOrderInspector.checkMethodGetFieldOrder(StructureByValueTest.TestNativeMappedInStructure.class, null);
}
public void testCheckMethodGetFieldOrderTagInterface() {
StructureFieldOrderInspector.checkMethodGetFieldOrder(StructureByValueTest.TestNativeMappedInStructure.ByValue.class, null);
}
private static final class MyStructMissingField extends Structure {
public String missingDeclaredField;
@Override
protected List<String> getFieldOrder() {
//noinspection unchecked
return Collections.<String>emptyList();
}
}
public void testCheckMethodGetFieldOrderMissingField() throws Exception {
try {
StructureFieldOrderInspector.checkMethodGetFieldOrder(MyStructMissingField.class, null);
fail("Expected Error: Structure.getFieldOrder()...");
} catch (RuntimeException e) {
assertTrue(e.getCause().getCause().getMessage().contains("not match declared field names"));
}
}
private static final class MyStructExtraField extends Structure {
@Override
protected List<String> getFieldOrder() {
return Arrays.asList("extraField");
}
}
public void testCheckMethodGetFieldOrderExtraField() throws Exception {
try {
StructureFieldOrderInspector.checkMethodGetFieldOrder(MyStructExtraField.class, null);
fail("Expected Error: Structure.getFieldOrder()...");
} catch (RuntimeException e) {
assertTrue(e.getCause().getCause().getMessage().contains("not match declared field names"));
}
}
private static final class MyStructStaticField extends Structure {
public long instanceField;
public static long myStaticField = -1;
@Override
protected List<String> getFieldOrder() {
return Arrays.asList("instanceField");
}
}
public void testCheckMethodGetFieldOrderStaticField() throws Exception {
StructureFieldOrderInspector.checkMethodGetFieldOrder(MyStructStaticField.class, null);
}
private static class MyStructSuper extends Structure {
public long instanceField;
@Override
protected List<String> getFieldOrder() {
return Arrays.asList("instanceField");
}
}
private static final class MyStructChildEmpty extends MyStructSuper {
}
public void testCheckMethodGetFieldOrderSuperImplOnly() throws Exception {
StructureFieldOrderInspector.checkMethodGetFieldOrder(MyStructChildEmpty.class, null);
}
public void testCheckMethodGetFieldOrderWithAbstractSubtype() throws Exception {
StructureFieldOrderInspector.checkMethodGetFieldOrder(Union.class, null);
}
public void testCheckMethodGetFieldOrderWithIgnoreCtorError() throws Exception {
final List<String> ignoreConstructorError = new ArrayList<>();
ignoreConstructorError.add(StructureFieldOrderInspectorTest.class.getName());
StructureFieldOrderInspector.checkMethodGetFieldOrder(MyStructExtraField.class, ignoreConstructorError);
}
public void testCheckStructureGetFieldOrder() throws Exception {
StructureFieldOrderInspector.checkStructureGetFieldOrder(Platform.class, null);
}
public void testBatchCheckStructureGetFieldOrder() throws Exception {
try {
StructureFieldOrderInspector.batchCheckStructureGetFieldOrder(StructureTest.class, null);
fail("Expected structure failures");
} catch (RuntimeException e) {
assertTrue(e.getMessage().startsWith("Some Structure sub types"));
}
}
}
|