Package st.gravel.support.compiler

Source Code of st.gravel.support.compiler.ExceptionTest

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;
import st.gravel.support.jvm.runtime.MethodTools;
import st.gravel.support.jvm.runtime.UnhandledException;

public class ExceptionTest {
  private static Class testExceptionAClass;
  private static Class testExceptionBClass;

  @Before
  public void setUp() {
    TestBootstrap.getSingleton();
    if (testExceptionAClass == null) {
      testExceptionAClass = new ClassBuilder("TestExceptionA")
          .superclassName("st.gravel.lang.Exception")
          .method("testValue ^7").build();
    }
    if (testExceptionBClass == null) {
      testExceptionBClass = new ClassBuilder("TestExceptionB")
          .superclassName("st.gravel.lang.Exception")
          .method("testValue ^11").build();
    }
  }

  @Test
  public void test_on_do_() throws NoSuchMethodException, SecurityException,
      IllegalAccessException, IllegalArgumentException,
      InvocationTargetException, InstantiationException {


    Class stClass = new ClassBuilder("FooObject_test_on_do_").instVar("bar")
        .method("foo" + "  ^self foo: [TestExceptionA raise. bar := #failed]")
        .method("isFailed ^bar notNil")
        .method("foo: aBlock  "
            + "^[aBlock value] on: TestExceptionA do: [:ex | ex testValue]")
        .build();

    Object fooObject = stClass.newInstance();
    Method method = fooObject.getClass().getMethod("foo");
    Method isFailed = fooObject.getClass().getMethod("isFailed");
    assertEquals(Integer.valueOf(7), method.invoke(fooObject));
    assertEquals(Boolean.FALSE, isFailed.invoke(fooObject));
  }

  @Test
  public void testNested_on_do_1() throws NoSuchMethodException, SecurityException,
      IllegalAccessException, IllegalArgumentException,
      InvocationTargetException, InstantiationException {


    Class stClass = new ClassBuilder("FooObject_testNested_on_do_1").instVar("bar")
        .method("foo" + "  ^self foo: [TestExceptionA raise. bar := #failed]")
        .method("isFailed ^bar notNil")
        .method("foo: aBlock  "
            + "^[[aBlock value] on: TestExceptionA do: [:ex1 | ex1 testValue]] on: TestExceptionB do: [:ex | ex testValue]")
        .build();

    Object fooObject = stClass.newInstance();
    Method method = fooObject.getClass().getMethod("foo");
    Method isFailed = fooObject.getClass().getMethod("isFailed");
    assertEquals(Integer.valueOf(7), method.invoke(fooObject));
    assertEquals(Boolean.FALSE, isFailed.invoke(fooObject));
  }

  @Test
  public void testNested_on_do_2() throws NoSuchMethodException, SecurityException,
      IllegalAccessException, IllegalArgumentException,
      InvocationTargetException, InstantiationException {


    Class stClass = new ClassBuilder("FooObject_testNested_on_do_2").instVar("bar")
        .method("foo" + "  ^self foo: [TestExceptionA raise. bar := #failed]")
        .method("isFailed ^bar notNil")
        .method("foo: aBlock  "
            + "^[[aBlock value] on: TestExceptionB do: [:ex | ex testValue]] on: TestExceptionA do: [:ex1 | ex1 testValue]")
        .build();

    Object fooObject = stClass.newInstance();
    Method method = fooObject.getClass().getMethod("foo");
    Method isFailed = fooObject.getClass().getMethod("isFailed");
    assertEquals(Integer.valueOf(7), method.invoke(fooObject));
    assertEquals(Boolean.FALSE, isFailed.invoke(fooObject));
  }

  @Test
  public void test_pass() throws NoSuchMethodException, SecurityException,
      IllegalAccessException, IllegalArgumentException,
      InvocationTargetException, InstantiationException {


    Class stClass = new ClassBuilder("FooObject_test_pass").instVar("bar")
        .method("foo" + "  ^self foo: [TestExceptionA raise. bar := #failed]")
        .method("isFailed ^bar notNil")
        .method("foo: aBlock  "
            + "^[[aBlock value] on: Exception do: [:ex | ex pass]] on: TestExceptionA do: [:ex1 | ex1 testValue]")
        .build();

    Object fooObject = stClass.newInstance();
    Method method = fooObject.getClass().getMethod("foo");
    Method isFailed = fooObject.getClass().getMethod("isFailed");
    assertEquals(Integer.valueOf(7), method.invoke(fooObject));
    assertEquals(Boolean.FALSE, isFailed.invoke(fooObject));
  }

  @Test
  public void test_MessageNotUnderstood1() throws NoSuchMethodException, SecurityException,
      IllegalAccessException, IllegalArgumentException,
      InvocationTargetException, InstantiationException {


    Class stClass = new ClassBuilder("FooObject_test_MessageNotUnderstood1")
        .method("foo"
            + "^[3 zork] on: MessageNotUnderstood do: [:ex | 7]"
            )
        .build();

    Object fooObject = stClass.newInstance();
    Method method = fooObject.getClass().getMethod("foo");
    assertEquals(Integer.valueOf(7), method.invoke(fooObject));
  }


  @Test(expected=UnhandledException.class)
  public void test_MessageNotUnderstood2() throws Throwable {


    Class stClass = new ClassBuilder("FooObject_test_MessageNotUnderstood2")
        .method("foo"
            + "^3 zork"
            )
        .build();

    Object fooObject = stClass.newInstance();
    assertEquals(Integer.valueOf(7), MethodTools.perform(fooObject, "foo"));
  }
 
  @Test
  public void test_MessageNotUnderstood3() throws Throwable {


    Class stClass = new ClassBuilder("FooObject_test_MessageNotUnderstood3")
        .method("foo"
            + "^[3 zork: 4] on: MessageNotUnderstood do: [:ex | ex receiver + ex message argument]"
            )
        .build();

    Object fooObject = stClass.newInstance();
    assertEquals(Integer.valueOf(7), MethodTools.perform(fooObject, "foo"));
  }
 
  @Test
  public void test_MessageNotUnderstood4() throws Throwable {


    Class stClass = new ClassBuilder("FooObject_test_MessageNotUnderstood4")
        .method("foo"
            + "^self zork: 4"
            )
        .method("doesNotUnderstand: aMessage"
            + "^3 + aMessage argument"
            )
        .build();

    Object fooObject = stClass.newInstance();
    assertEquals(Integer.valueOf(7), MethodTools.perform(fooObject, "foo"));
  }
}
TOP

Related Classes of st.gravel.support.compiler.ExceptionTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.