blob: 402d3a9e12e09c97a7b2bae4b6dc76fd4c2694ac [file] [log] [blame]
package ioc.specs
import org.apache.tapestry5.ioc.services.PlasticProxyFactory
import org.slf4j.Logger
import spock.lang.Shared
import org.apache.tapestry5.ioc.internal.services.*
class BridgeBuilderSpec extends AbstractSharedRegistrySpecification {
@Shared
PlasticProxyFactory proxyFactory;
def setupSpec() {
proxyFactory = getService PlasticProxyFactory
}
def "toString() of proxy is as expected"() {
Logger logger = Mock()
StandardFilter sf = Mock()
StandardService ss = Mock()
BridgeBuilder builder = new BridgeBuilder(logger, StandardService, StandardFilter, proxyFactory)
when:
def bridge = builder.instantiateBridge(ss, sf)
then:
bridge.toString() == "<PipelineBridge from org.apache.tapestry5.ioc.internal.services.StandardService to org.apache.tapestry5.ioc.internal.services.StandardFilter>"
}
def "standard service and interface"() {
Logger logger = Mock()
StandardFilter sf = Mock()
StandardService ss = Mock()
BridgeBuilder builder = new BridgeBuilder(logger, StandardService, StandardFilter, proxyFactory)
def bridge = builder.instantiateBridge(ss, sf)
when:
assert bridge.run(5) == 18
// 18 = 3 * (5 + 1)
// so the filter runs first, and passes 6 to the service
// seems there's an issue in Spock with chaining mocks this way
then:
1 * sf.run(_, _) >> { i, service -> service.run(i + 1) }
1 * ss.run(_) >> { i -> 3 * i }
0 * _
}
def "when toString() is part of service interface, it is forwarded through the filter"() {
Logger logger = Mock()
ToStringService service = new ToStringService() {
String toString() { "Service" }
}
ToStringFilter filter = new ToStringFilter() {
String toString(ToStringService s) {
s.toString().toUpperCase()
}
}
BridgeBuilder builder = new BridgeBuilder(logger, ToStringService, ToStringFilter, proxyFactory)
when:
ToStringService bridge = builder.instantiateBridge(service, filter)
then:
bridge.toString() == "SERVICE"
}
def "unmatched service interface method is logged and exception thrown"() {
Logger logger = Mock()
ExtraServiceMethod next = Mock()
Serializable filter = Mock()
BridgeBuilder builder = new BridgeBuilder(logger, ExtraServiceMethod, Serializable, proxyFactory)
when:
ExtraServiceMethod esm = builder.instantiateBridge(next, filter)
then:
1 * logger.error("Method void extraServiceMethod() has no match in filter interface java.io.Serializable.")
when:
esm.extraServiceMethod()
then:
RuntimeException e = thrown()
e.message == "Method void extraServiceMethod() has no match in filter interface java.io.Serializable."
}
def "extra methods in filter interface are logged and ignored"() {
Logger logger = Mock()
Serializable next = Mock()
ExtraFilterMethod filter = Mock()
BridgeBuilder builder = new BridgeBuilder(logger, Serializable, ExtraFilterMethod, proxyFactory)
when:
assert builder.instantiateBridge(next, filter) != null
then:
1 * logger.error("Method void extraFilterMethod() of filter interface org.apache.tapestry5.ioc.internal.services.ExtraFilterMethod does not have a matching method in java.io.Serializable.")
0 * _
}
def "the service parameter may be a middle parameter of the filter method"() {
Logger logger = Mock()
MiddleFilter mf = new MiddleFilter() {
@Override
void execute(int count, char ch, MiddleService service, StringBuilder buffer) {
service.execute(count, ch, buffer)
buffer.append(' ')
service.execute(count + 1, Character.toUpperCase(ch), buffer)
}
}
MiddleService ms = new MiddleService() {
@Override
void execute(int count, char ch, StringBuilder buffer) {
count.times() { buffer.append ch }
}
}
BridgeBuilder builder = new BridgeBuilder(logger, MiddleService, MiddleFilter, proxyFactory)
MiddleService bridge = builder.instantiateBridge(ms, mf)
StringBuilder buffer = new StringBuilder("CODE: ")
when:
bridge.execute(3, 'a' as char, buffer)
then:
buffer.toString() == "CODE: aaa AAAA"
}
}