/**
*
*/
package org.orange.familylink.data;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.orange.familylink.data.Message.Code;
import static org.orange.familylink.data.Message.Code.EXTRA_BITS;
import junit.framework.TestCase;
/**
* {@link Code}的测试用例
* @author Team Orange
*/
public class MessageCodeTest extends TestCase {
// ------------------ Main Code ------------------
public void testIsLegalCode()
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
int min = Code.INFORM;
int max = Code.COMMAND | EXTRA_BITS;
testValidRange(min, max, Code.class.getMethod("isLegalCode", int.class));
}
public void testIsInform()
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
int min = Code.INFORM;
int max = Code.INFORM | EXTRA_BITS;
testValidRange(min, max, Code.class.getMethod("isInform", int.class));
}
public void testIsCommand()
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
int min = Code.COMMAND;
int max = Code.COMMAND | EXTRA_BITS;
testValidRange(min, max, Code.class.getMethod("isCommand", int.class));
}
// ------------------ Extra ------------------
// ---------- Inform ----------
public void testHasSetRespond()
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
testFlag(Code.INFORM, Code.Extra.Inform.RESPONSE,
Code.Extra.Inform.class.getMethod("hasSetRespond", int.class));
}
public void testHasSetPulse()
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
testFlag(Code.INFORM, Code.Extra.Inform.PULSE,
Code.Extra.Inform.class.getMethod("hasSetPulse", int.class));
}
public void testHasSetUrgent()
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
testFlag(Code.INFORM, Code.Extra.Inform.URGENT,
Code.Extra.Inform.class.getMethod("hasSetUrgent", int.class));
}
// ---------- Command ----------
public void testHasSetEcho()
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
testFlag(Code.COMMAND, Code.Extra.Command.ECHO,
Code.Extra.Command.class.getMethod("hasSetEcho", int.class));
}
public void testHasSetLocateNow()
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
testFlag(Code.COMMAND, Code.Extra.Command.LOCATE_NOW,
Code.Extra.Command.class.getMethod("hasSetLocateNow", int.class));
}
// ------------------ Helper ------------------
public static void testValidRange(int min, int max, Method testedMethod)
throws IllegalAccessException, InvocationTargetException {
for(int i = 1 ; i <= 100 ; i++)
assertFalse((Boolean)testedMethod.invoke(null, min - i * 100));
assertFalse((Boolean)testedMethod.invoke(null, min - 3));
assertFalse((Boolean)testedMethod.invoke(null, min - 2));
assertFalse((Boolean)testedMethod.invoke(null, min - 1));
for(int i = min; i <= max ; i++)
assertTrue((Boolean)testedMethod.invoke(null, i));
assertFalse((Boolean)testedMethod.invoke(null, max + 1));
assertFalse((Boolean)testedMethod.invoke(null, max + 2));
assertFalse((Boolean)testedMethod.invoke(null, max + 3));
for(int i = 1; i <= 100 ; i++)
assertFalse((Boolean)testedMethod.invoke(null, max + i * 100));
}
public void testFlag(int mainCode, int testedFlag, Method testedMethod)
throws IllegalAccessException, InvocationTargetException {
int min = mainCode;
int max = mainCode | EXTRA_BITS;
for(int i = 1 ; i <= 100 ; i++)
assertFalse((Boolean)testedMethod.invoke(null, (min - i * 100)));
assertFalse((Boolean)testedMethod.invoke(null, min - 3));
assertFalse((Boolean)testedMethod.invoke(null, min - 2));
assertFalse((Boolean)testedMethod.invoke(null, min - 1));
// 无flag
int code = mainCode;
assertFalse((Boolean)testedMethod.invoke(null, code));
// 正好有待测flag
code |= testedFlag;
assertTrue((Boolean)testedMethod.invoke(null, code));
// 全flag
code |= EXTRA_BITS;
assertTrue((Boolean)testedMethod.invoke(null, code));
// 除待测flag外,全部set
code = (mainCode | EXTRA_BITS) & (~testedFlag);
assertFalse((Boolean)testedMethod.invoke(null, code));
assertFalse((Boolean)testedMethod.invoke(null, max + 1));
assertFalse((Boolean)testedMethod.invoke(null, max + 2));
assertFalse((Boolean)testedMethod.invoke(null, max + 3));
for(int i = 1; i <= 100 ; i++)
assertFalse((Boolean)testedMethod.invoke(null, max + i * 100));
}
}