001: // Copyright 2006, 2007 The Apache Software Foundation
002: //
003: // Licensed under the Apache License, Version 2.0 (the "License");
004: // you may not use this file except in compliance with the License.
005: // You may obtain a copy of the License at
006: //
007: // http://www.apache.org/licenses/LICENSE-2.0
008: //
009: // Unless required by applicable law or agreed to in writing, software
010: // distributed under the License is distributed on an "AS IS" BASIS,
011: // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012: // See the License for the specific language governing permissions and
013: // limitations under the License.
014:
015: package org.apache.tapestry.ioc.services;
016:
017: import java.util.Map;
018:
019: import org.apache.tapestry.ioc.Registry;
020: import org.apache.tapestry.ioc.internal.IOCInternalTestCase;
021: import org.testng.annotations.BeforeClass;
022: import org.testng.annotations.Test;
023:
024: public class PropertyShadowBuilderImplTest extends IOCInternalTestCase {
025: private PropertyShadowBuilder _builder;
026:
027: private final String CLASS_NAME = getClass().getName();
028:
029: @BeforeClass
030: public void setupBuilder() {
031: Registry registry = buildRegistry();
032:
033: _builder = registry.getService("PropertyShadowBuilder",
034: PropertyShadowBuilder.class);
035: }
036:
037: public class FooHolder {
038: private Foo _foo;
039:
040: private int _count = 0;
041:
042: public Foo getFoo() {
043: _count++;
044:
045: return _foo;
046: }
047:
048: public int getCount() {
049: return _count;
050: }
051:
052: public void setFoo(Foo foo) {
053: _foo = foo;
054: }
055:
056: @Override
057: public String toString() {
058: return "[FooHolder]";
059: }
060:
061: public void setWriteOnly(Foo foo) {
062:
063: }
064: }
065:
066: public interface Foo {
067: void foo();
068: }
069:
070: @Test
071: public void basic_delegation() {
072: Foo foo = newMock(Foo.class);
073: FooHolder holder = new FooHolder();
074:
075: holder.setFoo(foo);
076:
077: Foo shadow = _builder.build(holder, "foo", Foo.class);
078:
079: for (int i = 0; i < 3; i++) {
080: foo.foo();
081:
082: replay();
083:
084: shadow.foo();
085:
086: verify();
087:
088: assertEquals(holder.getCount(), i + 1);
089: }
090:
091: assertEquals(shadow.toString(),
092: "<Shadow: property foo of [FooHolder]>");
093: }
094:
095: @Test
096: public void property_does_not_exist() {
097: FooHolder holder = new FooHolder();
098:
099: try {
100: _builder.build(holder, "bar", Foo.class);
101: unreachable();
102: } catch (RuntimeException ex) {
103: assertEquals(
104: ex.getMessage(),
105: "Class "
106: + CLASS_NAME
107: + "$FooHolder does not contain a property named 'bar'.");
108: }
109: }
110:
111: @Test
112: public void property_type_mismatch() {
113: FooHolder holder = new FooHolder();
114:
115: try {
116: _builder.build(holder, "count", Map.class);
117: unreachable();
118: } catch (RuntimeException ex) {
119: assertEquals(
120: ex.getMessage(),
121: "Property 'count' of class "
122: + CLASS_NAME
123: + "$FooHolder is of type int, which is not assignable to type java.util.Map.");
124: }
125: }
126:
127: @Test
128: public void property_write_only() {
129: FooHolder holder = new FooHolder();
130:
131: try {
132: _builder.build(holder, "writeOnly", Foo.class);
133: unreachable();
134: } catch (RuntimeException ex) {
135: assertEquals(
136: ex.getMessage(),
137: "Class "
138: + CLASS_NAME
139: + "$FooHolder does not provide an accessor ('getter') method for property 'writeOnly'.");
140: }
141: }
142: }
|