Skip to content

Commit

Permalink
Optional elresolver updates (#1224)
Browse files Browse the repository at this point in the history
* Update existing tests to reflect specification changes for consistency

* Simplify code

* Refactor in preparation for adding method invocation tests

* Add new tests for OptionalELResolver.invoke()
  • Loading branch information
markt-asf authored Feb 26, 2024
1 parent d9f32dd commit 94f463f
Showing 1 changed file with 99 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import jakarta.el.CompositeELResolver;
import jakarta.el.ELContext;
import jakarta.el.ELResolver;
import jakarta.el.MethodNotFoundException;
import jakarta.el.OptionalELResolver;
import jakarta.el.PropertyNotWritableException;

Expand Down Expand Up @@ -65,11 +66,7 @@ public void optionalELResolverEmptyNullTest() throws Exception {
StringBuffer buf = new StringBuffer();
Object testObject = Optional.empty();

try {
pass = testOptionalELResolver(buf, testObject, null, null);
} catch (Exception ex) {
throw new Exception(ex);
}
pass = testOptionalELResolverProperty(buf, testObject, null, null);

if (!pass) {
throw new Exception(ELTestUtil.FAIL + buf.toString());
Expand All @@ -90,11 +87,7 @@ public void optionalELResolverEmptyNonNullTest() throws Exception {
StringBuffer buf = new StringBuffer();
Object testObject = Optional.empty();

try {
pass = testOptionalELResolver(buf, testObject, "property", Optional.empty());
} catch (Exception ex) {
throw new Exception(ex);
}
pass = testOptionalELResolverProperty(buf, testObject, "property", null);

if (!pass) {
throw new Exception(ELTestUtil.FAIL + buf.toString());
Expand All @@ -116,11 +109,7 @@ public void optionalELResolverObjectNullTest() throws Exception {
TestBean testBean = new TestBean("data");
Object testObject = Optional.of(testBean);

try {
pass = testOptionalELResolver(buf, testObject, null, testBean);
} catch (Exception ex) {
throw new Exception(ex);
}
pass = testOptionalELResolverProperty(buf, testObject, null, testBean);

if (!pass) {
throw new Exception(ELTestUtil.FAIL + buf.toString());
Expand All @@ -142,24 +131,20 @@ public void optionalELResolverObjectNonNullTest() throws Exception {
TestBean testBean = new TestBean("data");
Object testObject = Optional.of(testBean);

try {
pass = testOptionalELResolver(buf, testObject, "propertyA", "data");
} catch (Exception ex) {
throw new Exception(ex);
}
pass = testOptionalELResolverProperty(buf, testObject, "propertyA", "data");

if (!pass) {
throw new Exception(ELTestUtil.FAIL + buf.toString());
}
logger.log(Logger.Level.TRACE, buf.toString());
}

public static boolean testOptionalELResolver(StringBuffer buf, Object base, Object property, Object expectedValue) {
public static boolean testOptionalELResolverProperty(StringBuffer buf, Object base, Object property, Object expectedValue) {
boolean pass = true;

BareBonesELContext barebonesContext = new BareBonesELContext();

// OptionalELResolver depends on BeanELResolver to resolve properties of an Optional
// OptionalELResolver depends on BeanELResolver to resolve properties of an object wrapped in an Optional
ELResolver resolver = barebonesContext.getELResolver();
BeanELResolver beanResolver = new BeanELResolver();
OptionalELResolver optionalResolver = new OptionalELResolver();
Expand Down Expand Up @@ -204,13 +189,104 @@ public static boolean testOptionalELResolver(StringBuffer buf, Object base, Obje
return pass;
}

public class TestBean {
@Test
public void optionalELResolverEmptyInvoke() throws Exception {
boolean pass = true;
StringBuffer buf = new StringBuffer();
Object testObject = Optional.empty();

pass = testOptionalELResolverInvoke(buf, testObject, "doSomething", null);

if (!pass) {
throw new Exception(ELTestUtil.FAIL + buf.toString());
}
logger.log(Logger.Level.TRACE, buf.toString());
}

@Test
public void optionalELResolverEmptyInvokeInvalid() throws Exception {
boolean pass = true;
StringBuffer buf = new StringBuffer();
Object testObject = Optional.empty();

pass = testOptionalELResolverInvoke(buf, testObject, "unknownMethod", null);

if (!pass) {
throw new Exception(ELTestUtil.FAIL + buf.toString());
}
logger.log(Logger.Level.TRACE, buf.toString());
}

@Test
public void optionalELResolverObjectInvoke() throws Exception {
boolean pass = true;
StringBuffer buf = new StringBuffer();
TestBean testBean = new TestBean("data");
Object testObject = Optional.of(testBean);

pass = testOptionalELResolverInvoke(buf, testObject, "doSomething", TestBean.DATA);

if (!pass) {
throw new Exception(ELTestUtil.FAIL + buf.toString());
}
logger.log(Logger.Level.TRACE, buf.toString());
}

@Test
public void optionalELResolverObjectInvokeInvalid() throws Exception {
boolean pass = true;
StringBuffer buf = new StringBuffer();
TestBean testBean = new TestBean("data");
Object testObject = Optional.of(testBean);

try {
testOptionalELResolverInvoke(buf, testObject, "unknownMethod", null);
pass = false;
buf.append("invoke(): Expected MethodNotFoundException but no exception was thrown");
} catch (MethodNotFoundException mnfe) {
// Expected (so pass is not set to false)
}

if (!pass) {
throw new Exception(ELTestUtil.FAIL + buf.toString());
}
logger.log(Logger.Level.TRACE, buf.toString());
}

public static boolean testOptionalELResolverInvoke(StringBuffer buf, Object base, Object method, Object expectedValue) {
boolean pass = true;

BareBonesELContext barebonesContext = new BareBonesELContext();

// OptionalELResolver depends on BeanELResolver to invoke methods of an object wrapped in an Optional
ELResolver resolver = barebonesContext.getELResolver();
BeanELResolver beanResolver = new BeanELResolver();
OptionalELResolver optionalResolver = new OptionalELResolver();
((CompositeELResolver) resolver).add(optionalResolver);
((CompositeELResolver) resolver).add(beanResolver);
ELContext context = barebonesContext.getELContext();

// invoke()
Object result = resolver.invoke(context, base, method, null, null);
if (expectedValue == null && result != null || expectedValue != null && !expectedValue.equals(result)) {
buf.append("invoke(): Expected [" + expectedValue + "] but got [" + result + "]");
pass = false;
}

return pass;
}

public static class TestBean {
private static final String DATA = "interesting data";
private final String propertyA;
public TestBean(String propertyA) {
this.propertyA = propertyA;
}
public String getPropertyA() {
return propertyA;
}
public String doSomething() {
return DATA;
}
}
}

0 comments on commit 94f463f

Please # to comment.