package st.gravel.support.compiler;
import static org.junit.Assert.assertEquals;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.junit.Before;
import org.junit.Test;
import st.gravel.support.compiler.testtools.ClassBuilder;
import st.gravel.support.compiler.testtools.TestBootstrap;
import st.gravel.support.jvm.runtime.ImageBootstrapper;
public class FlowControlTest {
@Before
public void setUp() {
TestBootstrap.getSingleton();
}
@Test
public void testToDo() throws InstantiationException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, NoSuchMethodException, SecurityException {
Class stClass = new ClassBuilder("FooObject_testToDo")
.method("foo ^self foo: 4")
.method("foo: bar |t| t := 0. 1 to: bar do: [:i | t := t + i]. ^t")
.build();
Object fooObject = stClass.newInstance();
Method method = fooObject.getClass().getMethod("foo");
Object result = method.invoke(fooObject);
assertEquals(Integer.valueOf(10), result);
}
@Test
public void testIfTrue1() throws NoSuchMethodException, SecurityException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, InstantiationException {
Class stClass = new ClassBuilder("FooObject_testIfTrue1").method(
"foo: bar bar ifTrue: [^1]. ^2").build();
Object fooObject = stClass.newInstance();
Method method = fooObject.getClass().getMethod("foo_", Object.class);
assertEquals(Integer.valueOf(1), method.invoke(fooObject, true));
assertEquals(Integer.valueOf(2), method.invoke(fooObject, false));
}
@Test
public void testIfTrue2() throws NoSuchMethodException, SecurityException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, InstantiationException {
Class stClass = new ClassBuilder("FooObject_testIfTrue2").method(
"foo: bar |t| t := 2. bar ifTrue: [t := 1]. ^t").build();
Object fooObject = stClass.newInstance();
Method method = fooObject.getClass().getMethod("foo_", Object.class);
assertEquals(Integer.valueOf(1), method.invoke(fooObject, true));
assertEquals(Integer.valueOf(2), method.invoke(fooObject, false));
}
@Test
public void testIfTrue3() throws NoSuchMethodException, SecurityException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, InstantiationException {
Class stClass = new ClassBuilder("FooObject_testIfTrue3").method(
"foo: bar ^bar ifTrue: [1]").build();
Object fooObject = stClass.newInstance();
Method method = fooObject.getClass().getMethod("foo_", Object.class);
assertEquals(Integer.valueOf(1), method.invoke(fooObject, true));
assertEquals(null, method.invoke(fooObject, false));
}
@Test
public void testIfFalse1() throws NoSuchMethodException, SecurityException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, InstantiationException {
Class stClass = new ClassBuilder("FooObject_testIfFalse1").method(
"foo: bar\n" +
" bar ifFalse: [^1].\n" +
" ^2").build();
Object fooObject = stClass.newInstance();
Method method = fooObject.getClass().getMethod("foo_", Object.class);
assertEquals(Integer.valueOf(2), method.invoke(fooObject, true));
assertEquals(Integer.valueOf(1), method.invoke(fooObject, false));
}
@Test
public void testIfFalse2() throws NoSuchMethodException, SecurityException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, InstantiationException {
Class stClass = new ClassBuilder("FooObject_testIfFalse2").method(
"foo: bar\n" +
" |t| t := 2.\n" +
" bar ifFalse: [t := 1].\n" +
" ^t").build();
Object fooObject = stClass.newInstance();
Method method = fooObject.getClass().getMethod("foo_", Object.class);
assertEquals(Integer.valueOf(2), method.invoke(fooObject, true));
assertEquals(Integer.valueOf(1), method.invoke(fooObject, false));
}
@Test
public void testIfFalse3() throws NoSuchMethodException, SecurityException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, InstantiationException {
Class stClass = new ClassBuilder("FooObject_testIfFalse3").method(
"foo: bar\n" +
" ^bar ifFalse: [1]").build();
Object fooObject = stClass.newInstance();
Method method = fooObject.getClass().getMethod("foo_", Object.class);
assertEquals(null, method.invoke(fooObject, true));
assertEquals(Integer.valueOf(1), method.invoke(fooObject, false));
}
@Test
public void testIfTrueIfFalse1() throws NoSuchMethodException, SecurityException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, InstantiationException {
Class stClass = new ClassBuilder("FooObject_testIfTrueIfFalse1").method(
"foo: bar\n" +
" bar ifTrue: [^1] ifFalse: [^2]").build();
Object fooObject = stClass.newInstance();
Method method = fooObject.getClass().getMethod("foo_", Object.class);
assertEquals(Integer.valueOf(1), method.invoke(fooObject, true));
assertEquals(Integer.valueOf(2), method.invoke(fooObject, false));
}
@Test
public void testIfTrueIfFalse2() throws NoSuchMethodException, SecurityException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, InstantiationException {
Class stClass = new ClassBuilder("FooObject_testIfTrueIfFalse2").method(
"foo: bar\n" +
" |res|\n" +
" res := bar ifTrue: [1] ifFalse: [2].\n" +
" ^res").build();
Object fooObject = stClass.newInstance();
Method method = fooObject.getClass().getMethod("foo_", Object.class);
assertEquals(Integer.valueOf(1), method.invoke(fooObject, true));
assertEquals(Integer.valueOf(2), method.invoke(fooObject, false));
}
@Test
public void testIfTrueIfFalse3() throws NoSuchMethodException, SecurityException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, InstantiationException {
Class stClass = new ClassBuilder("FooObject_testIfTrueIfFalse3").method(
"foo: bar\n" +
" |res|\n" +
" bar ifTrue: [res := 1] ifFalse: [res := 2].\n" +
" ^res").build();
Object fooObject = stClass.newInstance();
Method method = fooObject.getClass().getMethod("foo_", Object.class);
assertEquals(Integer.valueOf(1), method.invoke(fooObject, true));
assertEquals(Integer.valueOf(2), method.invoke(fooObject, false));
}
@Test
public void testIfTrueIfFalse_withSameTempNames() throws NoSuchMethodException, SecurityException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, InstantiationException {
Class stClass = new ClassBuilder("FooObject_testIfTrueIfFalse_withSameTempNames").method(
"foo: bar\n" +
" |res|\n" +
" bar ifTrue: [|tmp| tmp := 1. res := tmp] ifFalse: [|tmp| tmp := 2. res := tmp].\n" +
" ^res").build();
Object fooObject = stClass.newInstance();
Method method = fooObject.getClass().getMethod("foo_", Object.class);
assertEquals(Integer.valueOf(1), method.invoke(fooObject, true));
assertEquals(Integer.valueOf(2), method.invoke(fooObject, false));
}
}