JEXP                       Closure
Java /

Tests for the Closure

public class ClosureTest extends TestCase {
    public void testClosureMinimal() {
        final StringBuilder input=new StringBuilder("abc");
        final Integer input2=10;

        final Closure closure = new Closure() {{
                result=(input+input2.toString()).startsWith("a");
        }};

        assertEquals(true, closure.eval());
        input.setCharAt(0,'b');
        assertEquals(false, closure.eval());
    }

    public void testClosureRaw() {
        final StringBuilder input=new StringBuilder("abc");

        final Closure closure = new Closure() {{
                result=input.toString().startsWith("a");
        }};
        assertEquals(true, closure.eval());

        input.setCharAt(0,'b');
        assertEquals(false, closure.eval());
    }

    public void testClosureInt() {
        final StringBuilder input=new StringBuilder("abc");

        final Closure closure = new Closure<Integer>() {{
                result=input.length();
        }};

        assertEquals(3, closure.eval());
        input.append("def");
        assertEquals(6, closure.eval());
    }

    public void testClosureString() {
        final StringBuilder input=new StringBuilder("abc");

        final Closure closure = new Closure<CharSequence>() {{
                result=input.toString().toUpperCase();
        }};

        assertEquals("ABC", closure.eval());
        input.setLength(0);
        input.append("def");
        assertEquals("DEF", closure.eval());
    }
}

The Closure superclass used

public class Closure<R> {
    protected R result;

    public R eval() {
        this.result=newInstance().result;
        return result;
    }

    private Closure<R> newInstance() {
        try {
            final Constructor syntheticConstructor = getClass().getDeclaredConstructors()[0];
            return (Closure<R>) syntheticConstructor.newInstance(createParams());
        } catch (Exception e) {
            throw new RuntimeException("Error creating new instance of closure", e);
        }
    }

    private Object[] createParams() throws IllegalAccessException {
        final Field[] fields = getClass().getDeclaredFields();
        final int fieldCount = fields.length;
        final Object[] params = new Object[fieldCount];
        params[0] = fields[fieldCount - 1].get(this); // enclosing Instance
        for (int i = fieldCount - 2; i >= 0; i--) {
            params[i + 1] = fields[i].get(this);
        }
        return params;
    }
}


edit SideBar
Page last modified on 04.12.2007 22:44 Uhr
Bearbeiten - Historie - Druckansicht