use of com.google.template.soy.data.SoyAbstractCachingValueProvider.ValueAssertion in project closure-templates by google.
the class RenderVisitor method checkStrictParamType.
/**
* Check that the given {@code paramValue} matches the static type of {@code param}.
*/
private void checkStrictParamType(final TemplateNode node, final TemplateParam param, @Nullable SoyValueProvider paramValue) {
Kind kind = param.type().getKind();
if (kind == Kind.ANY || kind == Kind.UNKNOWN) {
// Nothing to check. ANY and UKNOWN match all types.
return;
}
if (paramValue == null) {
paramValue = NullData.INSTANCE;
} else if (paramValue instanceof SoyAbstractCachingValueProvider) {
SoyAbstractCachingValueProvider typedValue = (SoyAbstractCachingValueProvider) paramValue;
if (!typedValue.isComputed()) {
// in order to preserve laziness we tell the value provider to assert the type when
// computation is triggered
typedValue.addValueAssertion(new ValueAssertion() {
@Override
public void check(SoyValue value) {
checkValueType(param, value, node);
}
});
return;
}
}
checkValueType(param, paramValue.resolve(), node);
}
use of com.google.template.soy.data.SoyAbstractCachingValueProvider.ValueAssertion in project closure-templates by google.
the class SoyAbstractCachingValueProviderTest method testValueAssertions.
@Test
public void testValueAssertions() {
final AtomicInteger counter = new AtomicInteger();
ValueAssertion assertion = new ValueAssertion() {
@Override
public void check(SoyValue value) {
counter.incrementAndGet();
if (value.integerValue() < 0) {
throw new IllegalStateException("boom");
}
}
};
TestValueProvider badValue = new TestValueProvider(-1);
badValue.addValueAssertion(assertion);
try {
badValue.resolve();
fail();
} catch (IllegalStateException e) {
assertThat(e).hasMessageThat().isEqualTo("boom");
assertThat(counter.get()).isEqualTo(1);
}
// Errors are not cached
try {
badValue.resolve();
fail();
} catch (IllegalStateException e) {
assertThat(e).hasMessageThat().isEqualTo("Caching was expected");
}
counter.set(0);
TestValueProvider goodValue = new TestValueProvider(1);
goodValue.addValueAssertion(assertion);
// Will fail if the underlying one is called twice.
assertThat(goodValue.resolve().integerValue()).isEqualTo(1);
assertThat(counter.get()).isEqualTo(1);
// successes are cached
assertThat(goodValue.resolve().integerValue()).isEqualTo(1);
assertThat(counter.get()).isEqualTo(1);
}
Aggregations