package bytecode.operators;

import static org.junit.Assert.*;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Vector;

import org.junit.Ignore;
import org.junit.Test;

import bytecode.SourceFileBytecodeTest;

public class AddOperatorTest extends SourceFileBytecodeTest{
	@Override
	protected void init() {
		testName = "AddOperator";
		rootDirectory = System.getProperty("user.dir")+"/test/bytecode/operators/";
	}

	@Test
	public void testConstruct() throws Exception{
	    ClassLoader classLoader = getClassLoader();

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

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

	    Class cls =  classLoader.loadClass(testName);
	    
		Object obj = cls.newInstance();
		
		Double x = new Double(1.0);
		
		Class[] params = new Class[]{
				x.getClass()
		};
		
		Method method = cls.getDeclaredMethod("method", params);
		Double returnValue = (Double) method.invoke(obj, x);
		assertEquals(new Double(2.0), returnValue);
	}
	
	@Test
	public void testTwoFloats() throws Exception{
	    ClassLoader classLoader = getClassLoader();

	    Class cls =  classLoader.loadClass(testName);
	    
		Object obj = cls.newInstance();
		
		Float x = new Float(1.0);
		
		Class[] params = new Class[]{
				x.getClass()
		};
		
		Method method = cls.getDeclaredMethod("method", params);
		Float returnValue = (Float) method.invoke(obj, x);
		assertEquals(new Float(2.0), returnValue);
	}
	
	@Test
	public void testTwoLongs() throws Exception{
	    ClassLoader classLoader = getClassLoader();

	    Class cls =  classLoader.loadClass(testName);
	    
		Object obj = cls.newInstance();
		
		Long x = new Long(1);
		
		Class[] params = new Class[]{
				x.getClass()
		};
		
		Method method = cls.getDeclaredMethod("method", params);
		Long returnValue = (Long) method.invoke(obj, x);
		assertEquals(new Long(3), returnValue);
	}
}