/* Copyright (c) 2007 Timothy Wall, All Rights Reserved
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*/
package com.sun.jna.platform.win32;
import java.lang.reflect.Constructor;
import org.junit.Test;
import com.sun.jna.IntegerType;
import com.sun.jna.platform.win32.WinDef.BOOL;
import com.sun.jna.platform.win32.WinDef.CHAR;
import com.sun.jna.platform.win32.WinDef.DWORD;
import com.sun.jna.platform.win32.WinDef.DWORDLONG;
import com.sun.jna.platform.win32.WinDef.LONG;
import com.sun.jna.platform.win32.WinDef.LONGLONG;
import com.sun.jna.platform.win32.WinDef.SHORT;
import com.sun.jna.platform.win32.WinDef.UCHAR;
import com.sun.jna.platform.win32.WinDef.UINT;
import com.sun.jna.platform.win32.WinDef.ULONG;
import com.sun.jna.platform.win32.WinDef.ULONGLONG;
import com.sun.jna.platform.win32.WinDef.USHORT;
import com.sun.jna.platform.win32.WinDef.WORD;
public class WinDefTypesTest extends AbstractWin32TestSupport {
@Test
public void testComparableDWORD() throws Exception {
testComparableIntegerType(DWORD.class, 7365L, 3777347L);
}
@Test
public void testComparableUINT() throws Exception {
testComparableIntegerType(UINT.class, 7365L, 3777347L);
}
@Test
public void testComparableULONG() throws Exception {
testComparableIntegerType(ULONG.class, 7365L, 3777347L);
}
@Test
public void testComparableULONGLONG() throws Exception {
testComparableIntegerType(ULONGLONG.class, 7365L, 3777347L);
}
@Test
public void testComparableDWORDLONG() throws Exception {
testComparableIntegerType(DWORDLONG.class, 7365L, 3777347L);
}
@Test
public void testComparableWORD() throws Exception {
testComparableIntegerType(WORD.class, 5637L, 7365L);
}
@Test
public void testComparableUSHORT() throws Exception {
testComparableIntegerType(USHORT.class, 5637L, 7365L);
}
@Test
public void testComparableSHORT() throws Exception {
testComparableIntegerType(SHORT.class, 5637L, 7365L);
}
@Test
public void testComparableLONG() throws Exception {
testComparableIntegerType(LONG.class, 7365L, 3777347L);
}
@Test
public void testComparableLONGLONG() throws Exception {
testComparableIntegerType(LONGLONG.class, 7365L, 3777347L);
}
@Test
public void testComparableCHAR() throws Exception {
testComparableIntegerType(CHAR.class, 'a', 'z');
}
@Test
public void testComparableUCHAR() throws Exception {
testComparableIntegerType(UCHAR.class, 'a', 'z');
}
@Test
public void testComparableBOOL() {
assertEquals("Mismatched null/null comparison", 0, BOOL.compare(null, null));
BOOL FALSE = new BOOL(false);
BOOL TRUE = new BOOL(true);
for (BOOL v : new BOOL[] { FALSE, TRUE }) {
assertEquals("Mismatched null/" + v + " object comparison", 1, BOOL.compare(null, v));
assertEquals("Mismatched null/" + v + " value comparison", 1, BOOL.compare(null, v.booleanValue()));
assertEquals("Mismatched self/" + v + " comparison", 0, BOOL.compare(v, v.booleanValue()));
assertEquals("Mismatched self " + v + "#compareTo() result", 0, v.compareTo(v));
assertEquals("Mismatched null " + v + "#compareTo() result", (-1), v.compareTo(null));
}
assertEquals("Mismatched natural order comparison", (-1), FALSE.compareTo(TRUE));
assertEquals("Mismatched reversed order comparison", 1, TRUE.compareTo(FALSE));
}
public static <T extends IntegerType & Comparable<T>> void testComparableIntegerType(Class<T> clazz, long v1, long v2) throws Exception {
assertTrue(clazz.getSimpleName() + " test values not in natural order: v1=" + v1 + ", v2=" + v2, v1 < v2);
Constructor<T> ctor = clazz.getDeclaredConstructor(Long.TYPE);
testComparableIntegerType(clazz, ctor.newInstance(v1), ctor.newInstance(v2));
}
public static <T extends IntegerType & Comparable<T>> void testComparableIntegerType(Class<T> clazz, T v1, T v2) throws Exception {
assertTrue(clazz.getSimpleName() + " test values not in natural order: v1=" + v1 + ", v2=" + v2, v1.longValue() < v2.longValue());
assertEquals("Mismatched null/null comparison", 0, IntegerType.compare(null, null));
assertEquals("Mismatched null/value comparison", 1, IntegerType.compare(null, v1));
assertEquals("Mismatched null/long comparison", 1, IntegerType.compare(null, v2.longValue()));
assertEquals("Mismatched natural order value/long comparison", -1, IntegerType.compare(v1, v2.longValue()));
assertEquals("Mismatched reversed order value/long comparison", 1, IntegerType.compare(v2, v1.longValue()));
assertEquals("Mismatched self value/long comparison", 0, IntegerType.compare(v1, v1.longValue()));
assertEquals("Mismatched value/null comparison", (-1), v1.compareTo(null));
assertEquals("Mismatched self value comparison", 0, v1.compareTo(v1));
assertEquals("Mismatched natural order comparison", (-1), v1.compareTo(v2));
assertEquals("Mismatched reversed order comparison", 1, v2.compareTo(v1));
}
}