blob: a00e496251b69c61f7f7685d6560821d78900571 [file] [log] [blame]
package groovy.util
import groovy.lang.MissingMethodException
/**
* Test for FactoryBuilderSupport based in BuilderSupportTest
* as it should comply with the same contract
* @author Andres Almiray
*/
class FactoryBuilderSupportTest extends GroovyTestCase{
void testSimpleNode() {
def b = new SpoofFactoryBuilder()
assert b.log == []
def node = b.foo()
assert b.log == [ 'new_instance','foo', null,
'handle_node_attributes', node,
'node_completed',null, node,
'post_node_completion',null, node
]
}
void testSimpleNodeWithValue() {
def b = new SpoofFactoryBuilder()
def node = b.foo('value')
assert b.log == [ 'new_instance','foo', 'value',
'handle_node_attributes', node,
'node_completed',null,node,
'post_node_completion',null, node
]
}
void testSimpleNodeWithOneAttribute() {
def b = new SpoofFactoryBuilder()
def node = b.foo(name:'value')
assert b.log == [
'new_instance','foo',null,'name','value',
'handle_node_attributes',node,'name','value',
'node_completed',null, node,
'post_node_completion',null, node
]
}
void testSimpleNodeWithClosure() {
def b = new SpoofFactoryBuilder()
b.foo(){
b.bar()
}
assert b.log == [
'new_instance','foo',null,
'handle_node_attributes','x',
'new_instance','bar',null,
'handle_node_attributes','x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed','x','x',
'post_node_completion', 'x', 'x',
'node_completed',null,'x',
'post_node_completion',null, 'x'
]
}
void testSimpleNodeWithOneAttributeAndValue() {
def b = new SpoofFactoryBuilder()
def node = b.foo(bar:'baz', 'value')
assert b.log == [
'new_instance', 'foo', 'value', 'bar','baz',
'handle_node_attributes',node,'bar','baz',
'node_completed',null,node,
'post_node_completion',null, node
]
}
void testSimpleNodeWithValueAndOneAttribute() {
def b = new SpoofFactoryBuilder()
def node = b.foo('value', bar:'baz')
assert b.log == [
'new_instance', 'foo', 'value', 'bar','baz',
'handle_node_attributes',node,'bar','baz',
'node_completed',null,node,
'post_node_completion',null, node
]
}
void testSimpleNodeWithOneAttributeAndValueAndClosure() {
def b = new SpoofFactoryBuilder()
def node = b.foo(bar:'baz', 'value') { 1 }
assert b.log == [
'new_instance', 'foo', 'value', 'bar','baz',
'handle_node_attributes',node,'bar','baz',
'node_completed',null,node,
'post_node_completion',null, node
]
}
void testSimpleNodeWithValueAndOneAttributeAndClosure() {
def b = new SpoofFactoryBuilder()
def node = b.foo('value', bar:'baz') { 1 }
assert b.log == [
'new_instance', 'foo', 'value', 'bar','baz',
'handle_node_attributes',node,'bar','baz',
'node_completed',null,node,
'post_node_completion',null, node
]
}
void testSimpleNodeTwoValues() {
def b = new SpoofFactoryBuilder()
shouldFail(MissingMethodException, {def node = b.foo('arg1', 'arg2')})
}
void testSimpleNodeTwoValuesClosure() {
def b = new SpoofFactoryBuilder()
shouldFail(MissingMethodException, {def node = b.foo('arg1', 'arg2') { 1 } })
}
void testSimpleNodeThreeValues() {
def b = new SpoofFactoryBuilder()
shouldFail(MissingMethodException, {def node = b.foo('arg1', 'arg2', 'arg3') })
}
void testSimpleNodeFourValues() {
def b = new SpoofFactoryBuilder()
shouldFail(MissingMethodException, {def node = b.foo('arg1', 'arg2', 'arg3', 'arg4') })
}
void testNestedMethodCallsResolution() {
def b = new SpoofFactoryBuilder()
b.outest {
b.outer {
nestedBuilderCall(b)
}
}
assert b.log.contains('inner')
}
void nestedBuilderCall(builder) {
builder.inner()
}
// ==================================
void testNestedBuilderSimpleNode() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
assert b.log == []
assert n.log == []
def node = b.foo()
assert b.log == []
assert n.log == [ 'new_instance','foo', null,
'handle_node_attributes', node,
'node_completed',null, node,
'post_node_completion',null, node
]
}
void testNestedBuilderSimpleNodeWithValue() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
def node = b.foo('value')
assert b.log == []
assert n.log == [ 'new_instance','foo', 'value',
'handle_node_attributes', node,
'node_completed',null,node,
'post_node_completion',null, node
]
}
void testNestedBuilderSimpleNodeWithOneAttribute() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
def node = b.foo(name:'value')
assert b.log == []
assert n.log == [
'new_instance','foo',null,'name','value',
'handle_node_attributes',node,'name','value',
'node_completed',null, node,
'post_node_completion',null, node
]
}
void testNestedBuilderSimpleNodeWithClosure() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
b.foo(){
b.bar()
}
assert b.log == []
assert n.log == [
'new_instance','foo',null,
'handle_node_attributes','x',
'new_instance','bar',null,
'handle_node_attributes','x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed','x','x',
'post_node_completion', 'x', 'x',
'node_completed',null,'x',
'post_node_completion',null, 'x'
]
}
void testNestedBuilderSimpleNodeWithOneAttributeAndValue() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
def node = b.foo(bar:'baz', 'value')
assert b.log == []
assert n.log == [
'new_instance', 'foo', 'value', 'bar','baz',
'handle_node_attributes',node,'bar','baz',
'node_completed',null,node,
'post_node_completion',null, node
]
}
void testNestedBuilderSimpleNodeWithValueAndOneAttribute() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
def node = b.foo('value', bar:'baz')
assert b.log == []
assert n.log == [
'new_instance', 'foo', 'value', 'bar','baz',
'handle_node_attributes',node,'bar','baz',
'node_completed',null,node,
'post_node_completion',null, node
]
}
void testNestedBuilderSimpleNodeWithOneAttributeAndValueAndClosure() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
def node = b.foo(bar:'baz', 'value') { 1 }
assert b.log == []
assert n.log == [
'new_instance', 'foo', 'value', 'bar','baz',
'handle_node_attributes',node,'bar','baz',
'node_completed',null,node,
'post_node_completion',null, node
]
}
void testNestedBuilderSimpleNodeWithValueAndOneAttributeAndClosure() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
def node = b.foo('value', bar:'baz') { 1 }
assert b.log == []
assert n.log == [
'new_instance', 'foo', 'value', 'bar','baz',
'handle_node_attributes',node,'bar','baz',
'node_completed',null,node,
'post_node_completion',null, node
]
}
void testWithBuilder() {
def b = new SpoofFactoryBuilder()
def c = new SpoofFactoryBuilder()
def factory = new XFactory( builder:c )
c.registerFactory( "fooz", factory )
c.registerFactory( "baz", factory )
b.foo(){
bar()
withBuilder(c){
fooz(){
baz()
}
}
}
assert b.log == [
'new_instance','foo',null,
'handle_node_attributes','x',
'new_instance','bar',null,
'handle_node_attributes','x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed','x','x',
'post_node_completion', 'x', 'x',
'node_completed',null,'x',
'post_node_completion',null, 'x'
]
assert c.log == [
'new_instance','fooz',null,
'handle_node_attributes','x',
'new_instance','baz',null,
'handle_node_attributes','x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed','x','x',
'post_node_completion', 'x', 'x',
'node_completed',null,'x',
'post_node_completion',null, 'x'
]
}
void testWithBuilderAndName() {
def b = new SpoofFactoryBuilder()
def c = new SpoofFactoryBuilder()
def factory = new XFactory( builder:c )
c.registerFactory( "fooz", factory )
c.registerFactory( "baz", factory )
b.foo(){
bar()
withBuilder(c,'foo'){
fooz(){
baz()
}
}
}
assert b.log == [
'new_instance','foo',null,
'handle_node_attributes','x',
'new_instance','bar',null,
'handle_node_attributes','x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed','x','x',
'post_node_completion', 'x', 'x',
'new_instance','foo','x',
'handle_node_attributes','x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed','x','x',
'post_node_completion', 'x', 'x',
'node_completed',null,'x',
'post_node_completion',null, 'x'
]
assert c.log == [
'new_instance','fooz',null,
'handle_node_attributes','x',
'new_instance','baz',null,
'handle_node_attributes','x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed','x','x',
'post_node_completion', 'x', 'x',
'node_completed',null,'x',
'post_node_completion',null, 'x'
]
}
void testWithBuilderAndNameAndAttributes() {
def b = new SpoofFactoryBuilder()
def c = new SpoofFactoryBuilder()
def factory = new XFactory( builder:c )
c.registerFactory( "fooz", factory )
c.registerFactory( "baz", factory )
b.foo(){
bar()
withBuilder(c,'foo',bar:'baz'){
fooz(){
baz()
}
}
}
assert b.log == [
'new_instance','foo',null,
'handle_node_attributes','x',
'new_instance','bar',null,
'handle_node_attributes','x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed','x','x',
'post_node_completion', 'x', 'x',
'new_instance','foo','x','bar','baz',
'handle_node_attributes','x','bar','baz',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed','x','x',
'post_node_completion', 'x', 'x',
'node_completed',null,'x',
'post_node_completion',null, 'x'
]
assert c.log == [
'new_instance','fooz',null,
'handle_node_attributes','x',
'new_instance','baz',null,
'handle_node_attributes','x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed','x','x',
'post_node_completion', 'x', 'x',
'node_completed',null,'x',
'post_node_completion',null, 'x'
]
}
void testWithBuilderAndThrowAnException() {
def b = new SpoofFactoryBuilder()
def c = new SpoofFactoryBuilder()
shouldFail( RuntimeException ) {
b.foo(){
bar()
withBuilder(c){
throw new RuntimeException("expected")
}
}
}
assert b.log == [
'new_instance','foo',null,
'handle_node_attributes','x',
'new_instance','bar',null,
'handle_node_attributes','x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed','x','x',
'post_node_completion', 'x', 'x'/*,
'node_completed',null,'x',
'post_node_completion',null, 'x'*/
// node foo() was not completed successfuly
]
assert c.log == []
}
}
/**
The SpoofFactoryBuilder is a sample instance of the abstract FactoryBuilderSupport class
that does nothing but logging how it was called, returning 'x' for each node.
**/
class SpoofFactoryBuilder extends FactoryBuilderSupport{
def log = []
SpoofFactoryBuilder() {
def factory = new XFactory( builder:this )
registerFactory( "foo", factory )
registerFactory( "bar", factory )
registerFactory( "outest", factory )
registerFactory( "outer", factory )
registerFactory( "inner", factory )
}
protected Object postNodeCompletion(Object parent, Object node) {
log << 'post_node_completion'
log << parent
log << node
node
}
}
class XFactory extends AbstractFactory {
SpoofFactoryBuilder builder
public Object newInstance( FactoryBuilderSupport builder, Object name, Object value, Map properties )
throws InstantiationException, IllegalAccessException {
builder.log << 'new_instance'
builder.log << name
builder.log << value
properties.each{entry -> builder.log << entry.key; builder.log << entry.value}
return 'x'
}
public boolean onHandleNodeAttributes( FactoryBuilderSupport builder, Object node, Map attributes ) {
builder.log << 'handle_node_attributes'
builder.log << node
attributes.each{entry -> builder.log << entry.key; builder.log << entry.value}
return false
}
public void onNodeCompleted( FactoryBuilderSupport builder, Object parent, Object node ) {
builder.log << 'node_completed'
builder.log << parent
builder.log << node
}
public void setParent( FactoryBuilderSupport builder, Object parent, Object child ) {
builder.log << "set_parent"
builder.log << parent
builder.log << child
}
public void setChild( FactoryBuilderSupport builder, Object parent, Object child ) {
builder.log << "set_child"
builder.log << parent
builder.log << child
}
}