package bytecode.operators;

import static org.junit.Assert.*;

import java.lang.reflect.Method;
import org.junit.Test;
import bytecode.SourceFileBytecodeTest;

public abstract class RelOperatorTest extends SourceFileBytecodeTest{
	@Test
	public void testConstruct() throws Exception{
	    ClassLoader classLoader = getClassLoader();

	    Class cls =  classLoader.loadClass(testName);
	    
		Object obj = cls.newInstance();
		assertTrue(true);
	}
	
	@Test
	public void test1x2() throws Exception{
	    ClassLoader classLoader = getClassLoader();

	    Class cls =  classLoader.loadClass(testName);
	    
		Object obj = cls.newInstance();
		
		Integer x = new Integer(1);
		Integer y = new Integer(2);
		
		Class[] params = new Class[]{
				x.getClass(),
				y.getClass(),
		};
		
		Method method = cls.getDeclaredMethod("method", params);
		Boolean returnValue = (Boolean) method.invoke(obj, x, y);
		assertEquals(getTest1x2ReturnValue(), returnValue);
	}
	
	@Test
	public void test2x2() throws Exception{
	    ClassLoader classLoader = getClassLoader();

	    Class cls =  classLoader.loadClass(testName);
	    
		Object obj = cls.newInstance();
		
		Integer x = new Integer(2);
		Integer y = new Integer(2);
		
		Class[] params = new Class[]{
				x.getClass(),
				y.getClass(),
		};
		
		Method method = cls.getDeclaredMethod("method", params);
		Boolean returnValue = (Boolean) method.invoke(obj, x, y);
		assertEquals(getTest2x2ReturnValue(), returnValue);
	}
	
	@Test
	public void test2x1() throws Exception{
	    ClassLoader classLoader = getClassLoader();

	    Class cls =  classLoader.loadClass(testName);
	    
		Object obj = cls.newInstance();
		
		Integer x = new Integer(2);
		Integer y = new Integer(2);
		
		Class[] params = new Class[]{
				x.getClass(),
				y.getClass(),
		};
		
		Method method = cls.getDeclaredMethod("method", params);
		Boolean returnValue = (Boolean) method.invoke(obj, x, y);
		assertEquals(getTest2x1ReturnValue(), returnValue);
	}
	
	protected abstract Boolean getTest1x2ReturnValue();
	protected abstract Boolean getTest2x2ReturnValue();
	protected abstract Boolean getTest2x1ReturnValue();
}