You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2006/11/23 02:49:48 UTC
svn commit: r478428 [1/3] - in /tapestry/tapestry5/tapestry-core/trunk/src:
main/java/org/apache/tapestry/internal/test/
main/java/org/apache/tapestry/test/
test/java/org/apache/tapestry/internal/bindings/
test/java/org/apache/tapestry/internal/service...
Author: hlship
Date: Wed Nov 22 17:49:47 2006
New Revision: 478428
URL: http://svn.apache.org/viewvc?view=rev&rev=478428
Log:
Make use of the EasyMock expect().andReturn() coding pattern.
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/bindings/PropBindingFactoryTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentLifecycleMethodWorkerTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/InfrastructureImplTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/InjectWorkerTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/MixinWorkerTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/OnEventWorkerTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PagePoolImplTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageRenderDispatcherTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/RequestPageCacheImplTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/UnclaimedFieldWorkerTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/WebSessionImplTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/util/InternalUtilsTest.java
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java?view=diff&rev=478428&r1=478427&r2=478428
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java Wed Nov 22 17:49:47 2006
@@ -124,8 +124,7 @@
protected final <T> void train_getService(InternalRegistry registry, String serviceId,
Class<T> serviceInterface, Module module, T service)
{
- registry.getService(serviceId, serviceInterface, module);
- setReturnValue(service);
+ expect(registry.getService(serviceId, serviceInterface, module)).andReturn(service);
}
@@ -151,14 +150,12 @@
protected final void train_loadPage(PageLoader loader, String pageName, Locale locale, Page page)
{
- loader.loadPage(pageName, locale);
- setReturnValue(page);
+ expect(loader.loadPage(pageName, locale)).andReturn(page);
}
protected final void train_getName(Page page, String name)
{
- page.getName();
- setReturnValue(name);
+ expect(page.getName()).andReturn(name);
}
protected final PagePool newPagePool()
@@ -174,8 +171,7 @@
protected final void train_parseTemplate(TemplateParser parser, Resource resource,
ComponentTemplate template)
{
- parser.parseTemplate(resource);
- setReturnValue(template);
+ expect(parser.parseTemplate(resource)).andReturn(template);
}
protected final TemplateParser newTemplateParser()
@@ -190,59 +186,50 @@
protected final void train_getComponent(ComponentPageElement element, Component component)
{
- element.getComponent();
- setReturnValue(component);
+ expect(element.getComponent()).andReturn(component);
}
protected final void train_getId(ComponentPageElement childElement, String id)
{
- childElement.getId();
- setReturnValue(id).atLeastOnce();
+ expect(childElement.getId()).andReturn(id).atLeastOnce();
}
protected final void train_getNestedId(ComponentPageElement element, String nestedId)
{
- element.getNestedId();
- setReturnValue(nestedId).atLeastOnce();
+ expect(element.getNestedId()).andReturn(nestedId).atLeastOnce();
}
protected final void train_getContextPath(WebRequest request, String contextPath)
{
- request.getContextPath();
- setReturnValue(contextPath).atLeastOnce();
+ expect(request.getContextPath()).andReturn(contextPath).atLeastOnce();
}
protected final void train_resolvePageClassNameToPageName(ComponentClassResolver resolver,
String pageClassName, String pageName)
{
- resolver.resolvePageClassNameToPageName(pageClassName);
- setReturnValue(pageName);
+ expect(resolver.resolvePageClassNameToPageName(pageClassName)).andReturn(pageName);
}
protected final void train_getContainingPage(ComponentPageElement element, Page page)
{
- element.getContainingPage();
- setReturnValue(page).atLeastOnce();
+ expect(element.getContainingPage()).andReturn(page).atLeastOnce();
}
protected final void train_getComponentResources(ComponentPageElement element,
InternalComponentResources resources)
{
- element.getComponentResources();
- setReturnValue(resources).atLeastOnce();
+ expect(element.getComponentResources()).andReturn(resources).atLeastOnce();
}
protected final void train_getComponentClassName(EmbeddedComponentModel model, String className)
{
- model.getComponentClassName();
- setReturnValue(className).atLeastOnce();
+ expect(model.getComponentClassName()).andReturn(className).atLeastOnce();
}
protected final void train_newRenderBodyElement(PageElementFactory elementFactory,
ComponentPageElement component, PageElement body)
{
- elementFactory.newRenderBodyElement(component);
- setReturnValue(body);
+ expect(elementFactory.newRenderBodyElement(component)).andReturn(body);
}
protected final PageElement newPageElement()
@@ -252,35 +239,32 @@
protected final void train_getParameterNames(EmbeddedComponentModel model, String... names)
{
- model.getParameterNames();
- setReturnValue(Arrays.asList(names));
+ expect(model.getParameterNames()).andReturn(Arrays.asList(names));
}
protected final void train_newComponentElement(PageElementFactory elementFactory,
ComponentPageElement container, String embeddedId, String embeddedType,
String componentClassName, Location location, ComponentPageElement embedded)
{
- elementFactory.newComponentElement(
- isA(Page.class),
- eq(container),
- eq(embeddedId),
- eq(embeddedType),
- eq(componentClassName),
- eq(location));
- setReturnValue(embedded);
+ expect(
+ elementFactory.newComponentElement(
+ isA(Page.class),
+ eq(container),
+ eq(embeddedId),
+ eq(embeddedType),
+ eq(componentClassName),
+ eq(location))).andReturn(embedded);
}
protected final void train_getComponentType(EmbeddedComponentModel emodel, String componentType)
{
- emodel.getComponentType();
- setReturnValue(componentType).atLeastOnce();
+ expect(emodel.getComponentType()).andReturn(componentType).atLeastOnce();
}
protected final void train_getEmbeddedComponentModel(ComponentModel model, String embeddedId,
EmbeddedComponentModel emodel)
{
- model.getEmbeddedComponentModel(embeddedId);
- setReturnValue(emodel).atLeastOnce();
+ expect(model.getEmbeddedComponentModel(embeddedId)).andReturn(emodel).atLeastOnce();
}
protected final EmbeddedComponentModel newEmbeddedComponentModel()
@@ -305,61 +289,53 @@
protected final void train_getLog(ComponentModel model, Log log)
{
- model.getLog();
- setReturnValue(log).atLeastOnce();
+ expect(model.getLog()).andReturn(log).atLeastOnce();
}
protected final void train_getTokens(ComponentTemplate template, TemplateToken... tokens)
{
- template.getTokens();
- setReturnValue(Arrays.asList(tokens));
+ expect(template.getTokens()).andReturn(Arrays.asList(tokens));
}
protected final void train_getComponentIds(ComponentTemplate template, String... ids)
{
- template.getComponentIds();
- setReturnValue(newSet(Arrays.asList(ids)));
+ expect(template.getComponentIds()).andReturn(newSet(Arrays.asList(ids)));
}
protected final void train_getEmbeddedIds(ComponentModel model, String... ids)
{
- model.getEmbeddedComponentIds();
-
- setReturnValue(Arrays.asList(ids));
+ expect(model.getEmbeddedComponentIds()).andReturn(Arrays.asList(ids));
}
protected void train_getTemplate(ComponentTemplateSource templateSource, String className,
Locale locale, ComponentTemplate template)
{
- templateSource.getTemplate(className, locale);
- setReturnValue(template);
+ expect(templateSource.getTemplate(className, locale)).andReturn(template);
}
protected final void train_getComponentModel(ComponentResources component, ComponentModel model)
{
- component.getComponentModel();
- setReturnValue(model);
+ expect(component.getComponentModel()).andReturn(model);
}
protected final void train_newRootComponentElement(PageElementFactory elementFactory,
String className, ComponentPageElement rootElement)
{
- elementFactory.newRootComponentElement(isA(Page.class), eq(className));
- setReturnValue(rootElement);
+ expect(elementFactory.newRootComponentElement(isA(Page.class), eq(className))).andReturn(
+ rootElement);
}
protected final void train_getModel(Instantiator ins, ComponentModel model)
{
- ins.getModel();
- setReturnValue(model).atLeastOnce();
+ expect(ins.getModel()).andReturn(model).atLeastOnce();
}
protected final Instantiator newInstantiator(Component component)
{
Instantiator ins = newMock(Instantiator.class);
- ins.newInstance(EasyMock.isA(InternalComponentResources.class));
- setReturnValue(component);
+ expect(ins.newInstance(EasyMock.isA(InternalComponentResources.class)))
+ .andReturn(component);
return ins;
}
@@ -367,8 +343,7 @@
protected final void train_getByClassName(RequestPageCache cache, String pageClassName,
Page page)
{
- cache.getByClassName(pageClassName);
- setReturnValue(page).atLeastOnce();
+ expect(cache.getByClassName(pageClassName)).andReturn(page).atLeastOnce();
}
protected final RequestPageCache newRequestPageCache()
@@ -379,31 +354,26 @@
protected final void train_getComponentElementByNestedId(Page page, String nestedId,
ComponentPageElement element)
{
- page.getComponentElementByNestedId(nestedId);
- setReturnValue(element).atLeastOnce();
+ expect(page.getComponentElementByNestedId(nestedId)).andReturn(element).atLeastOnce();
}
protected final void train_getRootElement(Page page, ComponentPageElement element)
{
- page.getRootElement();
- setReturnValue(element).atLeastOnce();
+ expect(page.getRootElement()).andReturn(element).atLeastOnce();
}
protected final void train_isMissing(ComponentTemplate template, boolean isMissing)
{
- template.isMissing();
- setReturnValue(isMissing).atLeastOnce();
+ expect(template.isMissing()).andReturn(isMissing).atLeastOnce();
}
protected final void train_getMixinClassNames(EmbeddedComponentModel model, String... names)
{
- model.getMixinClassNames();
- setReturnValue(Arrays.asList(names));
+ expect(model.getMixinClassNames()).andReturn(Arrays.asList(names));
}
protected final void train_getRootComponent(Page page, Component component)
{
- page.getRootComponent();
- setReturnValue(component).atLeastOnce();
+ expect(page.getRootComponent()).andReturn(component).atLeastOnce();
}
}
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java?view=diff&rev=478428&r1=478427&r2=478428
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TapestryTestCase.java Wed Nov 22 17:49:47 2006
@@ -68,16 +68,14 @@
protected final void train_findFieldsWithAnnotation(ClassTransformation transformation,
Class<? extends Annotation> annotationClass, List<String> fieldNames)
{
- transformation.findFieldsWithAnnotation(annotationClass);
- setReturnValue(fieldNames);
+ expect(transformation.findFieldsWithAnnotation(annotationClass)).andReturn(fieldNames);
}
protected final <T extends Annotation> void train_getFieldAnnotation(
ClassTransformation transformation, String fieldName, Class<T> annotationClass,
T annotation)
{
- transformation.getFieldAnnotation(fieldName, annotationClass);
- setReturnValue(annotation);
+ expect(transformation.getFieldAnnotation(fieldName, annotationClass)).andReturn(annotation);
}
protected final MutableComponentModel newMutableComponentModel()
@@ -93,15 +91,13 @@
protected final void train_addInjectedField(ClassTransformation ct, Class type,
String suggestedName, Object value, String fieldName)
{
- ct.addInjectedField(type, suggestedName, value);
- setReturnValue(fieldName);
+ expect(ct.addInjectedField(type, suggestedName, value)).andReturn(fieldName);
}
protected final void train_findUnclaimedFields(ClassTransformation transformation,
String... fieldNames)
{
- transformation.findUnclaimedFields();
- setReturnValue(fieldNames);
+ expect(transformation.findUnclaimedFields()).andReturn(fieldNames);
}
/** Writes a change to a file. */
@@ -164,8 +160,7 @@
protected final void train_newBinding(BindingFactory factory, String description,
ComponentResources component, String expression, Location l, Binding b)
{
- factory.newBinding(description, component, expression, l);
- setReturnValue(b);
+ expect(factory.newBinding(description, component, expression, l)).andReturn(b);
}
protected final ComponentResources newComponentResources()
@@ -197,8 +192,7 @@
protected final void train_newMemberName(ClassTransformation transformation, String suggested,
String name)
{
- transformation.newMemberName(suggested);
- setReturnValue(name);
+ expect(transformation.newMemberName(suggested)).andReturn(name);
}
protected final void train_extendMethod(ClassTransformation transformation,
@@ -209,36 +203,31 @@
protected final void train_getResourcesFieldName(ClassTransformation transformation, String name)
{
- transformation.getResourcesFieldName();
- setReturnValue(name).atLeastOnce();
+ expect(transformation.getResourcesFieldName()).andReturn(name).atLeastOnce();
}
protected final void train_addField(ClassTransformation transformation, int modifiers,
String type, String suggestedName, String actualName)
{
- transformation.addField(modifiers, type, suggestedName);
- setReturnValue(actualName);
+ expect(transformation.addField(modifiers, type, suggestedName)).andReturn(actualName);
}
protected final void train_getFieldType(ClassTransformation transformation, String fieldName,
String type)
{
- transformation.getFieldType(fieldName);
- setReturnValue(type).atLeastOnce();
+ expect(transformation.getFieldType(fieldName)).andReturn(type).atLeastOnce();
}
protected final void train_name(Parameter parameter, String name)
{
- parameter.name();
- setReturnValue(name).atLeastOnce();
+ expect(parameter.name()).andReturn(name).atLeastOnce();
}
protected final void train_findMethodsWithAnnotation(ClassTransformation tf,
Class<? extends Annotation> annotationType, List<MethodSignature> sigs)
{
- tf.findMethodsWithAnnotation(annotationType);
- setReturnValue(sigs);
+ expect(tf.findMethodsWithAnnotation(annotationType)).andReturn(sigs);
}
protected final WebRequest newWebRequest()
@@ -250,15 +239,14 @@
String fieldType, ServiceLocator locator, ClassTransformation transformation,
MutableComponentModel model, boolean result)
{
- provider.provideInjection(fieldName, fieldType, locator, transformation, model);
- setReturnValue(result);
+ expect(provider.provideInjection(fieldName, fieldType, locator, transformation, model))
+ .andReturn(result);
}
protected final void train_toClass(ClassTransformation transformation, String type,
Class classForType)
{
- transformation.toClass(type);
- setReturnValue(classForType);
+ expect(transformation.toClass(type)).andReturn(classForType);
}
protected final ParameterModel newParameterModel()
@@ -268,33 +256,28 @@
protected final void train_getComponentClassName(ComponentModel model, String className)
{
- model.getComponentClassName();
- setReturnValue(className).atLeastOnce();
+ expect(model.getComponentClassName()).andReturn(className).atLeastOnce();
}
protected final void train_isRequired(ParameterModel model, boolean isRequired)
{
- model.isRequired();
- setReturnValue(isRequired);
+ expect(model.isRequired()).andReturn(isRequired);
}
protected final void train_getParameterModel(ComponentModel model, String parameterName,
ParameterModel parameterModel)
{
- model.getParameterModel(parameterName);
- setReturnValue(parameterModel);
+ expect(model.getParameterModel(parameterName)).andReturn(parameterModel);
}
protected final void train_getParameterNames(ComponentModel model, String... names)
{
- model.getParameterNames();
- setReturnValue(Arrays.asList(names));
+ expect(model.getParameterNames()).andReturn(Arrays.asList(names));
}
protected final void train_isInvariant(Binding binding, boolean isInvariant)
{
- binding.isInvariant();
- setReturnValue(isInvariant);
+ expect(binding.isInvariant()).andReturn(isInvariant);
}
protected final MarkupWriter newMarkupWriter()
@@ -304,14 +287,12 @@
protected final void train_get(Binding binding, Object value)
{
- binding.get();
- setReturnValue(value);
+ expect(binding.get()).andReturn(value);
}
protected final void train_encodeURL(WebResponse response, String inputURL, String outputURL)
{
- response.encodeURL(inputURL);
- setReturnValue(outputURL);
+ expect(response.encodeURL(inputURL)).andReturn(outputURL);
}
protected final WebResponse newWebResponse()
@@ -321,8 +302,7 @@
protected void train_getAttribute(HttpSession session, String attributeName, Object value)
{
- session.getAttribute(attributeName);
- setReturnValue(value);
+ expect(session.getAttribute(attributeName)).andReturn(value);
}
protected final HttpServletRequest newHttpServletRequest()
@@ -333,8 +313,7 @@
protected final void train_getSession(HttpServletRequest request, boolean create,
HttpSession session)
{
- request.getSession(create);
- setReturnValue(session);
+ expect(request.getSession(create)).andReturn(session);
}
protected final HttpSession newHttpSession()
@@ -344,14 +323,12 @@
protected final void train_getAttributeNames(WebSession session, String prefix, String... names)
{
- session.getAttributeNames(prefix);
- setReturnValue(Arrays.asList(names));
+ expect(session.getAttributeNames(prefix)).andReturn(Arrays.asList(names));
}
protected final void train_getAttribute(WebSession session, String name, Object attribute)
{
- session.getAttribute(name);
- setReturnValue(attribute);
+ expect(session.getAttribute(name)).andReturn(attribute);
}
protected final WebSession newWebSession()
@@ -361,45 +338,38 @@
protected final void train_getSession(WebRequest request, boolean create, WebSession session)
{
- request.getSession(create);
- setReturnValue(session);
+ expect(request.getSession(create)).andReturn(session);
}
protected final void train_encodeRedirectURL(WebResponse response, String URI, String encoded)
{
- response.encodeRedirectURL(URI);
- setReturnValue(encoded);
+ expect(response.encodeRedirectURL(URI)).andReturn(encoded);
}
protected final <T extends Annotation> void train_getAnnotation(
ClassTransformation transformation, Class<T> annotationClass, T annotation)
{
- transformation.getAnnotation(annotationClass);
- setReturnValue(annotation);
+ expect(transformation.getAnnotation(annotationClass)).andReturn(annotation);
}
protected final void train_getPage(ComponentResources resources, Component page)
{
- resources.getPage();
- setReturnValue(page).atLeastOnce();
+ expect(resources.getPage()).andReturn(page).atLeastOnce();
}
protected final void train_getCompleteId(ComponentResources resources, String completeId)
{
- resources.getCompleteId();
- setReturnValue(completeId).atLeastOnce();
+ expect(resources.getCompleteId()).andReturn(completeId).atLeastOnce();
}
protected final void train_getComponentResources(Component component,
ComponentResources resources)
{
- component.getComponentResources();
- setReturnValue(resources).atLeastOnce();
+ expect(component.getComponentResources()).andReturn(resources).atLeastOnce();
}
protected final void train_getContainer(ComponentResources resources, Component container)
{
- resources.getContainer();
- setReturnValue(container).atLeastOnce();
+ expect(resources.getContainer()).andReturn(container).atLeastOnce();
}
}
Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/bindings/PropBindingFactoryTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/bindings/PropBindingFactoryTest.java?view=diff&rev=478428&r1=478427&r2=478428
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/bindings/PropBindingFactoryTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/bindings/PropBindingFactoryTest.java Wed Nov 22 17:49:47 2006
@@ -12,388 +12,387 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry.internal.bindings;
-
-import org.apache.tapestry.Binding;
-import org.apache.tapestry.ComponentResources;
-import org.apache.tapestry.internal.test.InternalBaseTestCase;
+package org.apache.tapestry.internal.bindings;
+
+import org.apache.tapestry.Binding;
+import org.apache.tapestry.ComponentResources;
+import org.apache.tapestry.internal.test.InternalBaseTestCase;
import org.apache.tapestry.internal.util.IntegerRange;
-import org.apache.tapestry.ioc.Location;
+import org.apache.tapestry.ioc.Location;
import org.apache.tapestry.ioc.internal.util.InternalUtils;
import org.apache.tapestry.ioc.internal.util.TapestryException;
-import org.apache.tapestry.ioc.services.ClassFactory;
-import org.apache.tapestry.ioc.services.PropertyAccess;
-import org.apache.tapestry.runtime.Component;
-import org.apache.tapestry.services.BindingFactory;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class PropBindingFactoryTest extends InternalBaseTestCase
-{
- private BindingFactory _factory;
-
- @BeforeClass
- public void setup_factory()
- {
- _factory = getService("tapestry.internal.PropBindingFactory", BindingFactory.class);
- }
-
- @AfterClass
- public void cleanup_factory()
- {
- _factory = null;
- }
-
- private ComponentResources newComponentResources(Component component)
- {
- ComponentResources resources = newComponentResources();
- train_getComponent(resources, component);
-
- train_getCompleteId(resources, "foo.Bar:baz");
-
- return resources;
- }
-
- private void train_getComponent(ComponentResources resources, Component component)
- {
- resources.getComponent();
- setReturnValue(component);
- }
-
- @Test
- public void object_property()
- {
- TargetBean bean = new TargetBean();
- ComponentResources resources = newComponentResources(bean);
- Location l = newLocation();
-
- replay();
-
- Binding binding = _factory.newBinding("test binding", resources, "objectValue", l);
-
- assertSame(binding.getBindingType(), String.class);
-
- bean.setObjectValue("first");
-
- assertEquals(binding.get(), "first");
-
- binding.set("second");
-
- assertEquals(bean.getObjectValue(), "second");
- assertEquals(InternalUtils.locationOf(binding), l);
-
- assertEquals(binding.toString(), "PropBinding[test binding foo.Bar:baz(objectValue)]");
-
- verify();
- }
-
- @Test
- public void property_path()
- {
- TargetBean bean = new TargetBean();
- ComponentResources resources = newComponentResources(bean);
- Location l = newLocation();
-
- replay();
-
- Binding binding = _factory.newBinding("test binding", resources, "stringHolder.value", l);
-
- assertSame(binding.getBindingType(), String.class);
-
- bean.getStringHolder().setValue("first");
-
- assertEquals(binding.get(), "first");
-
- binding.set("second");
-
- assertEquals(bean.getStringHolder().getValue(), "second");
-
- assertEquals(
- binding.toString(),
- "PropBinding[test binding foo.Bar:baz(stringHolder.value)]");
-
- verify();
-
- }
-
- @Test
- public void property_path_through_missing_property()
- {
- TargetBean bean = new TargetBean();
- ComponentResources resources = newComponentResources();
- Location l = newLocation();
-
- train_getComponent(resources, bean);
-
- replay();
-
- String propertyPath = "stringHolder.missingProperty.terminalProperty";
-
- try
- {
- _factory.newBinding("test binding", resources, propertyPath, l);
- unreachable();
- }
- catch (TapestryException ex)
- {
- assertEquals(ex.getMessage(), BindingsMessages.noSuchProperty(
- StringHolder.class,
- "missingProperty",
- propertyPath));
- assertSame(ex.getLocation(), l);
- }
-
- verify();
- }
-
- @Test
- public void property_path_through_write_only_property()
- {
- TargetBean bean = new TargetBean();
- ComponentResources resources = newComponentResources();
- Location l = newLocation();
-
- train_getComponent(resources, bean);
-
- replay();
-
- String propertyPath = "writeOnly.terminalProperty";
-
- try
- {
- _factory.newBinding("test binding", resources, propertyPath, l);
- unreachable();
- }
- catch (TapestryException ex)
- {
- assertEquals(ex.getMessage(), BindingsMessages.writeOnlyProperty(
- "writeOnly",
- TargetBean.class,
- propertyPath));
- assertSame(ex.getLocation(), l);
- }
-
- verify();
-
- }
-
- @Test
- public void primitive_property()
- {
- TargetBean bean = new TargetBean();
- ComponentResources resources = newComponentResources(bean);
- Location l = newLocation();
-
- replay();
-
- Binding binding = _factory.newBinding("test binding", resources, "intValue", l);
-
- assertSame(binding.getBindingType(), int.class);
-
- bean.setIntValue(1);
-
- assertEquals(binding.get(), 1);
-
- binding.set(2);
-
- assertEquals(bean.getIntValue(), 2);
-
- verify();
- }
-
- @Test
- public void read_only_property()
- {
- TargetBean bean = new TargetBean();
- ComponentResources resources = newComponentResources(bean);
- Location l = newLocation();
-
- replay();
-
- Binding binding = _factory.newBinding("test binding", resources, "readOnly", l);
-
- assertEquals(binding.get(), "ReadOnly");
-
- try
- {
- binding.set("fail");
- unreachable();
- }
- catch (TapestryException ex)
- {
- assertEquals(
- "Binding PropBinding[test binding foo.Bar:baz(readOnly)] is read-only.",
- ex.getMessage());
- assertEquals(ex.getLocation(), l);
- }
-
- verify();
- }
-
- @Test
- public void write_only_property()
- {
- TargetBean bean = new TargetBean();
- ComponentResources resources = newComponentResources(bean);
- Location l = newLocation();
-
- replay();
-
- Binding binding = _factory.newBinding("test binding", resources, "writeOnly", l);
-
- binding.set("updated");
-
- assertEquals(bean._writeOnly, "updated");
-
- try
- {
- assertEquals(binding.get(), "ReadOnly");
- unreachable();
- }
- catch (TapestryException ex)
- {
- assertEquals(
- "Binding PropBinding[test binding foo.Bar:baz(writeOnly)] is write-only.",
- ex.getMessage());
- assertEquals(ex.getLocation(), l);
- }
-
- verify();
- }
-
- @Test
- public void caching()
- {
- PropertyAccess access = getService("tapestry.ioc.PropertyAccess", PropertyAccess.class);
- ClassFactory classFactory = getService("tapestry.ioc.ClassFactory", ClassFactory.class);
-
- PropBindingFactory factory = new PropBindingFactory(access, classFactory);
-
- TargetBean bean1 = new TargetBean();
- ComponentResources resources1 = newComponentResources(bean1);
- TargetBean bean2 = new TargetBean();
- ComponentResources resources2 = newComponentResources(bean2);
- TargetBean bean3 = new TargetBean();
- ComponentResources resources3 = newComponentResources(bean3);
-
- Location l = newLocation();
-
- replay();
-
- Binding binding1 = factory.newBinding("test binding 1", resources1, "objectValue", l);
- Binding binding2 = factory.newBinding("test binding 2", resources2, "objectValue", l);
-
- assertSame(binding2.getClass(), binding1.getClass());
-
- binding1.set("foo");
- binding2.set("bar");
-
- assertEquals(bean1.getObjectValue(), "foo");
- assertEquals(bean2.getObjectValue(), "bar");
-
- // Now, clear the cache.
-
- factory.objectWasInvalidated();
-
- Binding binding3 = factory.newBinding("test binding 3", resources3, "objectValue", l);
-
- // We'll assume the behavior is the same, but expect the class to be different.
-
- assertNotSame(binding3.getClass(), binding1.getClass());
-
- verify();
- }
-
- @Test
- public void unknown_property()
- {
- TargetBean bean = new TargetBean();
- ComponentResources resources = newComponentResources();
- Location l = newLocation();
-
- train_getComponent(resources, bean);
-
- replay();
-
- try
- {
- _factory.newBinding("test binding", resources, "missingProperty", l);
- unreachable();
- }
- catch (TapestryException ex)
- {
- assertEquals(ex.getMessage(), BindingsMessages.noSuchProperty(
- TargetBean.class,
- "missingProperty",
- "missingProperty"));
- assertSame(ex.getLocation(), l);
- }
-
- verify();
- }
-
- @Test
- public void special_prop_binding_value_null()
- {
- Location l = newLocation();
- String description = "my description";
- ComponentResources resources = newComponentResources();
- Component component = newComponent();
-
- train_getComponent(resources, component);
-
- replay();
-
- Binding binding = _factory.newBinding(description, resources, "this", l);
-
- assertSame(binding.get(), component);
-
- verify();
- }
-
- @Test(dataProvider = "values")
- public void special_prop_binding_values(String expression, Object expected)
- {
- Location l = newLocation();
- String description = "my description";
- ComponentResources resources = newComponentResources();
-
- replay();
-
- Binding binding = _factory.newBinding(description, resources, expression, l);
-
- assertEquals(binding.get(), expected);
-
- verify();
- }
-
- @DataProvider(name = "values")
- public Object[][] values()
- {
- return new Object[][]
- {
- { "true", true, },
- { "True", true, },
- { " true ", true, },
- { "false", false },
- { "null", null },
- { "3", 3l },
- { " 37 ", 37l },
- { " -227", -227l },
- { " 5.", 5d },
- { " -100.", -100d },
- { " -0.0 ", -0d },
- { "1..10", new IntegerRange(1, 10) },
- { " -20 .. -30 ", new IntegerRange(-20, -30) },
- { "0.", 0d },
- { " 227.75", 227.75d },
- { " -10123.67", -10123.67d },
- { "'Hello World'", "Hello World" },
- { " 'Whitespace Ignored' ", "Whitespace Ignored" },
- { " ' Inside ' ", " Inside " },
- { " 'Nested ' Quotes ' Inside'", "Nested ' Quotes ' Inside" },
- { "'''", "'" } };
- }
-}
+import org.apache.tapestry.ioc.services.ClassFactory;
+import org.apache.tapestry.ioc.services.PropertyAccess;
+import org.apache.tapestry.runtime.Component;
+import org.apache.tapestry.services.BindingFactory;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+public class PropBindingFactoryTest extends InternalBaseTestCase
+{
+ private BindingFactory _factory;
+
+ @BeforeClass
+ public void setup_factory()
+ {
+ _factory = getService("tapestry.internal.PropBindingFactory", BindingFactory.class);
+ }
+
+ @AfterClass
+ public void cleanup_factory()
+ {
+ _factory = null;
+ }
+
+ private ComponentResources newComponentResources(Component component)
+ {
+ ComponentResources resources = newComponentResources();
+ train_getComponent(resources, component);
+
+ train_getCompleteId(resources, "foo.Bar:baz");
+
+ return resources;
+ }
+
+ private void train_getComponent(ComponentResources resources, Component component)
+ {
+ expect(resources.getComponent()).andReturn(component);
+ }
+
+ @Test
+ public void object_property()
+ {
+ TargetBean bean = new TargetBean();
+ ComponentResources resources = newComponentResources(bean);
+ Location l = newLocation();
+
+ replay();
+
+ Binding binding = _factory.newBinding("test binding", resources, "objectValue", l);
+
+ assertSame(binding.getBindingType(), String.class);
+
+ bean.setObjectValue("first");
+
+ assertEquals(binding.get(), "first");
+
+ binding.set("second");
+
+ assertEquals(bean.getObjectValue(), "second");
+ assertEquals(InternalUtils.locationOf(binding), l);
+
+ assertEquals(binding.toString(), "PropBinding[test binding foo.Bar:baz(objectValue)]");
+
+ verify();
+ }
+
+ @Test
+ public void property_path()
+ {
+ TargetBean bean = new TargetBean();
+ ComponentResources resources = newComponentResources(bean);
+ Location l = newLocation();
+
+ replay();
+
+ Binding binding = _factory.newBinding("test binding", resources, "stringHolder.value", l);
+
+ assertSame(binding.getBindingType(), String.class);
+
+ bean.getStringHolder().setValue("first");
+
+ assertEquals(binding.get(), "first");
+
+ binding.set("second");
+
+ assertEquals(bean.getStringHolder().getValue(), "second");
+
+ assertEquals(
+ binding.toString(),
+ "PropBinding[test binding foo.Bar:baz(stringHolder.value)]");
+
+ verify();
+
+ }
+
+ @Test
+ public void property_path_through_missing_property()
+ {
+ TargetBean bean = new TargetBean();
+ ComponentResources resources = newComponentResources();
+ Location l = newLocation();
+
+ train_getComponent(resources, bean);
+
+ replay();
+
+ String propertyPath = "stringHolder.missingProperty.terminalProperty";
+
+ try
+ {
+ _factory.newBinding("test binding", resources, propertyPath, l);
+ unreachable();
+ }
+ catch (TapestryException ex)
+ {
+ assertEquals(ex.getMessage(), BindingsMessages.noSuchProperty(
+ StringHolder.class,
+ "missingProperty",
+ propertyPath));
+ assertSame(ex.getLocation(), l);
+ }
+
+ verify();
+ }
+
+ @Test
+ public void property_path_through_write_only_property()
+ {
+ TargetBean bean = new TargetBean();
+ ComponentResources resources = newComponentResources();
+ Location l = newLocation();
+
+ train_getComponent(resources, bean);
+
+ replay();
+
+ String propertyPath = "writeOnly.terminalProperty";
+
+ try
+ {
+ _factory.newBinding("test binding", resources, propertyPath, l);
+ unreachable();
+ }
+ catch (TapestryException ex)
+ {
+ assertEquals(ex.getMessage(), BindingsMessages.writeOnlyProperty(
+ "writeOnly",
+ TargetBean.class,
+ propertyPath));
+ assertSame(ex.getLocation(), l);
+ }
+
+ verify();
+
+ }
+
+ @Test
+ public void primitive_property()
+ {
+ TargetBean bean = new TargetBean();
+ ComponentResources resources = newComponentResources(bean);
+ Location l = newLocation();
+
+ replay();
+
+ Binding binding = _factory.newBinding("test binding", resources, "intValue", l);
+
+ assertSame(binding.getBindingType(), int.class);
+
+ bean.setIntValue(1);
+
+ assertEquals(binding.get(), 1);
+
+ binding.set(2);
+
+ assertEquals(bean.getIntValue(), 2);
+
+ verify();
+ }
+
+ @Test
+ public void read_only_property()
+ {
+ TargetBean bean = new TargetBean();
+ ComponentResources resources = newComponentResources(bean);
+ Location l = newLocation();
+
+ replay();
+
+ Binding binding = _factory.newBinding("test binding", resources, "readOnly", l);
+
+ assertEquals(binding.get(), "ReadOnly");
+
+ try
+ {
+ binding.set("fail");
+ unreachable();
+ }
+ catch (TapestryException ex)
+ {
+ assertEquals(
+ "Binding PropBinding[test binding foo.Bar:baz(readOnly)] is read-only.",
+ ex.getMessage());
+ assertEquals(ex.getLocation(), l);
+ }
+
+ verify();
+ }
+
+ @Test
+ public void write_only_property()
+ {
+ TargetBean bean = new TargetBean();
+ ComponentResources resources = newComponentResources(bean);
+ Location l = newLocation();
+
+ replay();
+
+ Binding binding = _factory.newBinding("test binding", resources, "writeOnly", l);
+
+ binding.set("updated");
+
+ assertEquals(bean._writeOnly, "updated");
+
+ try
+ {
+ assertEquals(binding.get(), "ReadOnly");
+ unreachable();
+ }
+ catch (TapestryException ex)
+ {
+ assertEquals(
+ "Binding PropBinding[test binding foo.Bar:baz(writeOnly)] is write-only.",
+ ex.getMessage());
+ assertEquals(ex.getLocation(), l);
+ }
+
+ verify();
+ }
+
+ @Test
+ public void caching()
+ {
+ PropertyAccess access = getService("tapestry.ioc.PropertyAccess", PropertyAccess.class);
+ ClassFactory classFactory = getService("tapestry.ioc.ClassFactory", ClassFactory.class);
+
+ PropBindingFactory factory = new PropBindingFactory(access, classFactory);
+
+ TargetBean bean1 = new TargetBean();
+ ComponentResources resources1 = newComponentResources(bean1);
+ TargetBean bean2 = new TargetBean();
+ ComponentResources resources2 = newComponentResources(bean2);
+ TargetBean bean3 = new TargetBean();
+ ComponentResources resources3 = newComponentResources(bean3);
+
+ Location l = newLocation();
+
+ replay();
+
+ Binding binding1 = factory.newBinding("test binding 1", resources1, "objectValue", l);
+ Binding binding2 = factory.newBinding("test binding 2", resources2, "objectValue", l);
+
+ assertSame(binding2.getClass(), binding1.getClass());
+
+ binding1.set("foo");
+ binding2.set("bar");
+
+ assertEquals(bean1.getObjectValue(), "foo");
+ assertEquals(bean2.getObjectValue(), "bar");
+
+ // Now, clear the cache.
+
+ factory.objectWasInvalidated();
+
+ Binding binding3 = factory.newBinding("test binding 3", resources3, "objectValue", l);
+
+ // We'll assume the behavior is the same, but expect the class to be different.
+
+ assertNotSame(binding3.getClass(), binding1.getClass());
+
+ verify();
+ }
+
+ @Test
+ public void unknown_property()
+ {
+ TargetBean bean = new TargetBean();
+ ComponentResources resources = newComponentResources();
+ Location l = newLocation();
+
+ train_getComponent(resources, bean);
+
+ replay();
+
+ try
+ {
+ _factory.newBinding("test binding", resources, "missingProperty", l);
+ unreachable();
+ }
+ catch (TapestryException ex)
+ {
+ assertEquals(ex.getMessage(), BindingsMessages.noSuchProperty(
+ TargetBean.class,
+ "missingProperty",
+ "missingProperty"));
+ assertSame(ex.getLocation(), l);
+ }
+
+ verify();
+ }
+
+ @Test
+ public void special_prop_binding_value_null()
+ {
+ Location l = newLocation();
+ String description = "my description";
+ ComponentResources resources = newComponentResources();
+ Component component = newComponent();
+
+ train_getComponent(resources, component);
+
+ replay();
+
+ Binding binding = _factory.newBinding(description, resources, "this", l);
+
+ assertSame(binding.get(), component);
+
+ verify();
+ }
+
+ @Test(dataProvider = "values")
+ public void special_prop_binding_values(String expression, Object expected)
+ {
+ Location l = newLocation();
+ String description = "my description";
+ ComponentResources resources = newComponentResources();
+
+ replay();
+
+ Binding binding = _factory.newBinding(description, resources, expression, l);
+
+ assertEquals(binding.get(), expected);
+
+ verify();
+ }
+
+ @DataProvider(name = "values")
+ public Object[][] values()
+ {
+ return new Object[][]
+ {
+ { "true", true, },
+ { "True", true, },
+ { " true ", true, },
+ { "false", false },
+ { "null", null },
+ { "3", 3l },
+ { " 37 ", 37l },
+ { " -227", -227l },
+ { " 5.", 5d },
+ { " -100.", -100d },
+ { " -0.0 ", -0d },
+ { "1..10", new IntegerRange(1, 10) },
+ { " -20 .. -30 ", new IntegerRange(-20, -30) },
+ { "0.", 0d },
+ { " 227.75", 227.75d },
+ { " -10123.67", -10123.67d },
+ { "'Hello World'", "Hello World" },
+ { " 'Whitespace Ignored' ", "Whitespace Ignored" },
+ { " ' Inside ' ", " Inside " },
+ { " 'Nested ' Quotes ' Inside'", "Nested ' Quotes ' Inside" },
+ { "'''", "'" } };
+ }
+}
Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java?view=diff&rev=478428&r1=478427&r2=478428
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java Wed Nov 22 17:49:47 2006
@@ -12,566 +12,565 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package org.apache.tapestry.internal.services;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.tapestry.internal.test.InternalBaseTestCase;
-import org.apache.tapestry.services.ComponentClassResolver;
-import org.apache.tapestry.services.LibraryMapping;
-import org.testng.annotations.Test;
-
-public class ComponentClassResolverImplTest extends InternalBaseTestCase
-{
- private static final String APP_ROOT_PACKAGE = "org.example.app";
-
- private static final String CORE_PREFIX = "core";
-
- private static final String CORE_ROOT_PACKAGE = "org.apache.tapestry.corelib";
-
- private static final String LIB_PREFIX = "lib";
-
- private static final String LIB_ROOT_PACKAGE = "org.example.lib";
-
- private ComponentClassResolverImpl create(ComponentInstantiatorSource source,
- LibraryMapping... mappings)
- {
- List<LibraryMapping> list = Arrays.asList(mappings);
-
- ComponentClassResolverImpl resolver = new ComponentClassResolverImpl(source, list);
-
- resolver.setApplicationPackage(APP_ROOT_PACKAGE);
-
- return resolver;
- }
-
- @Test
- public void simple_page_name()
- {
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_app_packages(source);
-
- train_exists(source, APP_ROOT_PACKAGE + ".pages.SimplePage", true);
-
- replay();
-
- ComponentClassResolver resolver = create(source);
-
- assertEquals(resolver.resolvePageNameToClassName("SimplePage"), APP_ROOT_PACKAGE
- + ".pages.SimplePage");
-
- verify();
- }
-
- @Test
- public void class_name_to_simple_page_name()
- {
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_app_packages(source);
-
- replay();
-
- ComponentClassResolver resolver = create(source);
-
- assertEquals(
- resolver.resolvePageClassNameToPageName(APP_ROOT_PACKAGE + ".pages.SimplePage"),
- "SimplePage");
-
- verify();
- }
-
- @Test
- public void resolved_page_names_are_cached()
- {
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_app_packages(source);
-
- String pageClassName = APP_ROOT_PACKAGE + ".pages.SimplePage";
-
- train_exists(source, pageClassName, true);
-
- replay();
-
- ComponentClassResolverImpl resolver = create(source);
-
- assertEquals(resolver.resolvePageNameToClassName("SimplePage"), pageClassName);
-
- verify();
-
- // No more training, because it's already cached.
-
- replay();
-
- assertEquals(resolver.resolvePageNameToClassName("SimplePage"), pageClassName);
-
- verify();
-
- // After clearing the cache, redoes the work.
-
- train_exists(source, pageClassName, true);
-
- replay();
-
- resolver.objectWasInvalidated();
-
- assertEquals(resolver.resolvePageNameToClassName("SimplePage"), pageClassName);
-
- verify();
- }
-
- @Test
- public void page_found_in_core_lib()
- {
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_packages(source, CORE_ROOT_PACKAGE);
- train_for_app_packages(source);
-
- train_exists(source, APP_ROOT_PACKAGE + ".pages.CorePage", false);
- train_exists(source, CORE_ROOT_PACKAGE + ".pages.CorePage", true);
-
- replay();
-
- ComponentClassResolver resolver = create(source, new LibraryMapping(CORE_PREFIX,
- CORE_ROOT_PACKAGE));
-
- assertEquals(resolver.resolvePageNameToClassName("CorePage"), CORE_ROOT_PACKAGE
- + ".pages.CorePage");
-
- verify();
- }
-
- @Test
- public void page_class_name_resolved_to_core_page()
- {
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_packages(source, CORE_ROOT_PACKAGE);
- train_for_app_packages(source);
-
- replay();
-
- ComponentClassResolver resolver = create(source, new LibraryMapping(CORE_PREFIX,
- CORE_ROOT_PACKAGE));
-
- assertEquals(
- resolver.resolvePageClassNameToPageName(CORE_ROOT_PACKAGE + ".pages.CorePage"),
- "core/CorePage");
-
- verify();
- }
-
- @Test
- public void resolved_logical_page_names_are_cached()
- {
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_packages(source, CORE_ROOT_PACKAGE);
- train_for_app_packages(source);
-
- replay();
-
- ComponentClassResolver resolver = create(source, new LibraryMapping(CORE_PREFIX,
- CORE_ROOT_PACKAGE));
-
- String className = CORE_ROOT_PACKAGE + ".pages.CorePage";
-
- String logicalName1 = resolver.resolvePageClassNameToPageName(className);
- String logicalName2 = resolver.resolvePageClassNameToPageName(className);
-
- // Given that the value is computed on the fly, if its the same (not just equal, but the
- // same), that proves that the value was cached.
-
- assertSame(logicalName2, logicalName1);
-
- verify();
- }
-
- @Test
- public void page_found_in_library()
- {
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_packages(source, LIB_ROOT_PACKAGE);
- train_for_packages(source, CORE_ROOT_PACKAGE);
- train_for_app_packages(source);
-
- train_exists(source, LIB_ROOT_PACKAGE + ".pages.LibPage", true);
-
- replay();
-
- ComponentClassResolver resolver = create(source, new LibraryMapping(LIB_PREFIX,
- LIB_ROOT_PACKAGE), new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
-
- assertEquals(resolver.resolvePageNameToClassName("lib/LibPage"), LIB_ROOT_PACKAGE
- + ".pages.LibPage");
-
- verify();
- }
-
- @Test
- public void class_name_resolves_to_folder_under_library()
- {
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_packages(source, LIB_ROOT_PACKAGE);
- train_for_packages(source, CORE_ROOT_PACKAGE);
- train_for_app_packages(source);
-
- replay();
-
- ComponentClassResolver resolver = create(source, new LibraryMapping(LIB_PREFIX,
- LIB_ROOT_PACKAGE), new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
-
- assertEquals(resolver.resolvePageClassNameToPageName(LIB_ROOT_PACKAGE
- + ".pages.foo.bar.LibPage"), LIB_PREFIX + "/foo/bar/LibPage");
-
- verify();
- }
-
- @Test
- public void class_name_does_not_resolve_to_page_name()
- {
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_packages(source, CORE_ROOT_PACKAGE);
- train_for_app_packages(source);
-
- replay();
-
- ComponentClassResolver resolver = create(source, new LibraryMapping(CORE_PREFIX,
- CORE_ROOT_PACKAGE));
-
- String className = LIB_ROOT_PACKAGE + ".pages.LibPage";
-
- try
- {
- resolver.resolvePageClassNameToPageName(className);
- unreachable();
- }
- catch (IllegalArgumentException ex)
- {
- assertEquals(ex.getMessage(), "Unable to resolve class name " + className
- + " to a logical page name.");
- }
-
- verify();
- }
-
- @Test
- public void class_name_not_in_a_pages_package()
- {
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_packages(source, CORE_ROOT_PACKAGE);
- train_for_app_packages(source);
-
- replay();
-
- ComponentClassResolver resolver = create(source, new LibraryMapping(CORE_PREFIX,
- CORE_ROOT_PACKAGE));
-
- String className = CORE_ROOT_PACKAGE + ".foo.CorePage";
-
- try
- {
- resolver.resolvePageClassNameToPageName(className);
- unreachable();
- }
- catch (IllegalArgumentException ex)
- {
- assertEquals(ex.getMessage(), "Unable to resolve class name " + className
- + " to a logical page name.");
- }
-
- verify();
- }
-
- @Test
- public void multiple_mappings_for_same_prefix()
- {
- String secondaryLibPackage = "org.examples.addon.lib";
-
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_packages(source, LIB_ROOT_PACKAGE);
- train_for_packages(source, secondaryLibPackage);
- train_for_packages(source, CORE_ROOT_PACKAGE);
- train_for_app_packages(source);
-
- train_exists(source, LIB_ROOT_PACKAGE + ".pages.LibPage", false);
- train_exists(source, secondaryLibPackage + ".pages.LibPage", true);
-
- replay();
-
- ComponentClassResolver resolver = create(
- source,
- new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
- new LibraryMapping(LIB_PREFIX, secondaryLibPackage),
- new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
-
- assertEquals(resolver.resolvePageNameToClassName("lib/LibPage"), secondaryLibPackage
- + ".pages.LibPage");
-
- verify();
- }
-
- @Test
- public void complex_prefix_search_fails()
- {
- String deepPackage = "org.deep";
-
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_packages(source, deepPackage);
- train_for_packages(source, LIB_ROOT_PACKAGE);
- train_for_packages(source, CORE_ROOT_PACKAGE);
- train_for_app_packages(source);
-
- // In early searches, the prefix is "absorbed" into the root package.
- // In later searches, the prefix is used as a sub-package.
-
- train_exists(source, deepPackage + ".pages.DeepPage", false);
- train_exists(source, LIB_ROOT_PACKAGE + ".pages.deep.DeepPage", false);
- train_exists(source, APP_ROOT_PACKAGE + ".pages.lib.deep.DeepPage", false);
- train_exists(source, CORE_ROOT_PACKAGE + ".pages.lib.deep.DeepPage", false);
-
- replay();
-
- ComponentClassResolver resolver = create(
- source,
- new LibraryMapping("lib/deep", deepPackage),
- new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
- new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
-
- try
- {
- resolver.resolvePageNameToClassName("lib/deep/DeepPage");
- unreachable();
- }
- catch (IllegalArgumentException ex)
- {
- assertEquals(
- ex.getMessage(),
- "Unable to resolve page 'lib/deep/DeepPage' to a component class name.");
- }
-
- verify();
- }
-
- @Test
- public void prefix_page_totally_missing()
- {
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_packages(source, LIB_ROOT_PACKAGE);
- train_for_packages(source, CORE_ROOT_PACKAGE);
- train_for_app_packages(source);
-
- train_exists(source, LIB_ROOT_PACKAGE + ".pages.MissingPage", false);
- train_exists(source, APP_ROOT_PACKAGE + ".pages.lib.MissingPage", false);
- train_exists(source, CORE_ROOT_PACKAGE + ".pages.lib.MissingPage", false);
-
- replay();
-
- ComponentClassResolver resolver = create(source, new LibraryMapping(LIB_PREFIX,
- LIB_ROOT_PACKAGE), new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
-
- try
- {
- resolver.resolvePageNameToClassName("lib/MissingPage");
- unreachable();
- }
- catch (IllegalArgumentException ex)
- {
- assertEquals(
- ex.getMessage(),
- "Unable to resolve page 'lib/MissingPage' to a component class name.");
- }
-
- verify();
- }
-
- private void train_for_packages(ComponentInstantiatorSource source, String packageName)
- {
- source.addPackage(packageName + ".pages");
- source.addPackage(packageName + ".components");
- source.addPackage(packageName + ".mixins");
- }
-
- /**
- * The logic for searching is pretty much identical for both components and pages, so even a
- * cursory test of component types should nail it.
- */
- @Test
- public void simple_component_type()
- {
- String expectedClassName = APP_ROOT_PACKAGE + ".components.SimpleComponent";
-
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_app_packages(source);
-
- train_exists(source, expectedClassName, true);
-
- replay();
-
- ComponentClassResolver resolver = create(source);
-
- assertEquals(resolver.resolveComponentTypeToClassName("SimpleComponent"), APP_ROOT_PACKAGE
- + ".components.SimpleComponent");
-
- verify();
- }
-
- /**
- * Likewise for mixins; it's all just setup for a particular method.
- */
-
- @Test
- public void simple_mixin_type()
- {
- String expectedClassName = APP_ROOT_PACKAGE + ".mixins.SimpleMixin";
-
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_app_packages(source);
-
- train_exists(source, expectedClassName, true);
-
- replay();
-
- ComponentClassResolver resolver = create(source);
-
- assertEquals(resolver.resolveMixinTypeToClassName("SimpleMixin"), expectedClassName);
-
- verify();
- }
-
- @Test
- public void mixin_type_not_found()
- {
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_packages(source, CORE_ROOT_PACKAGE);
- train_for_app_packages(source);
-
- train_exists(source, APP_ROOT_PACKAGE + ".mixins.SimpleMixin", false);
- train_exists(source, CORE_ROOT_PACKAGE + ".mixins.SimpleMixin", false);
-
- replay();
-
- ComponentClassResolver resolver = create(source, new LibraryMapping(CORE_PREFIX,
- CORE_ROOT_PACKAGE));
-
- try
- {
- resolver.resolveMixinTypeToClassName("SimpleMixin");
- unreachable();
- }
- catch (IllegalArgumentException ex)
- {
- assertEquals(
- ex.getMessage(),
- "Unable to resolve mixin type 'SimpleMixin' to a component class name.");
- }
-
- verify();
-
- }
-
- @Test
- public void component_type_not_found()
- {
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_packages(source, CORE_ROOT_PACKAGE);
- train_for_app_packages(source);
-
- train_exists(source, APP_ROOT_PACKAGE + ".components.SimpleComponent", false);
- train_exists(source, CORE_ROOT_PACKAGE + ".components.SimpleComponent", false);
-
- replay();
-
- ComponentClassResolver resolver = create(source, new LibraryMapping(CORE_PREFIX,
- CORE_ROOT_PACKAGE));
-
- try
- {
- resolver.resolveComponentTypeToClassName("SimpleComponent");
- unreachable();
- }
- catch (IllegalArgumentException ex)
- {
- assertEquals(
- ex.getMessage(),
- "Unable to resolve component type 'SimpleComponent' to a component class name.");
- }
-
- verify();
-
- }
-
- @Test
- public void component_types_are_cached()
- {
- ComponentInstantiatorSource source = newComponentInstantiatorSource();
-
- train_for_app_packages(source);
-
- String componentClassName = APP_ROOT_PACKAGE + ".components.SimpleComponent";
-
- train_exists(source, componentClassName, true);
-
- replay();
-
- ComponentClassResolverImpl resolver = create(source);
-
- assertEquals(
- resolver.resolveComponentTypeToClassName("SimpleComponent"),
- componentClassName);
-
- verify();
-
- // No training, its in the cache
-
- replay();
-
- assertEquals(
- resolver.resolveComponentTypeToClassName("SimpleComponent"),
- componentClassName);
-
- verify();
-
- // The cache is cleared, so the search will re-execute
-
- train_exists(source, componentClassName, true);
-
- replay();
-
- resolver.objectWasInvalidated();
-
- assertEquals(
- resolver.resolveComponentTypeToClassName("SimpleComponent"),
- componentClassName);
-
- verify();
-
- }
-
- protected final void train_exists(ComponentInstantiatorSource source, String className,
- boolean exists)
- {
- source.exists(className);
- setReturnValue(exists);
- }
-
- private void train_for_app_packages(ComponentInstantiatorSource source)
- {
- train_for_packages(source, APP_ROOT_PACKAGE);
- }
-}
+package org.apache.tapestry.internal.services;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.tapestry.internal.test.InternalBaseTestCase;
+import org.apache.tapestry.services.ComponentClassResolver;
+import org.apache.tapestry.services.LibraryMapping;
+import org.testng.annotations.Test;
+
+public class ComponentClassResolverImplTest extends InternalBaseTestCase
+{
+ private static final String APP_ROOT_PACKAGE = "org.example.app";
+
+ private static final String CORE_PREFIX = "core";
+
+ private static final String CORE_ROOT_PACKAGE = "org.apache.tapestry.corelib";
+
+ private static final String LIB_PREFIX = "lib";
+
+ private static final String LIB_ROOT_PACKAGE = "org.example.lib";
+
+ private ComponentClassResolverImpl create(ComponentInstantiatorSource source,
+ LibraryMapping... mappings)
+ {
+ List<LibraryMapping> list = Arrays.asList(mappings);
+
+ ComponentClassResolverImpl resolver = new ComponentClassResolverImpl(source, list);
+
+ resolver.setApplicationPackage(APP_ROOT_PACKAGE);
+
+ return resolver;
+ }
+
+ @Test
+ public void simple_page_name()
+ {
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_app_packages(source);
+
+ train_exists(source, APP_ROOT_PACKAGE + ".pages.SimplePage", true);
+
+ replay();
+
+ ComponentClassResolver resolver = create(source);
+
+ assertEquals(resolver.resolvePageNameToClassName("SimplePage"), APP_ROOT_PACKAGE
+ + ".pages.SimplePage");
+
+ verify();
+ }
+
+ @Test
+ public void class_name_to_simple_page_name()
+ {
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_app_packages(source);
+
+ replay();
+
+ ComponentClassResolver resolver = create(source);
+
+ assertEquals(
+ resolver.resolvePageClassNameToPageName(APP_ROOT_PACKAGE + ".pages.SimplePage"),
+ "SimplePage");
+
+ verify();
+ }
+
+ @Test
+ public void resolved_page_names_are_cached()
+ {
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_app_packages(source);
+
+ String pageClassName = APP_ROOT_PACKAGE + ".pages.SimplePage";
+
+ train_exists(source, pageClassName, true);
+
+ replay();
+
+ ComponentClassResolverImpl resolver = create(source);
+
+ assertEquals(resolver.resolvePageNameToClassName("SimplePage"), pageClassName);
+
+ verify();
+
+ // No more training, because it's already cached.
+
+ replay();
+
+ assertEquals(resolver.resolvePageNameToClassName("SimplePage"), pageClassName);
+
+ verify();
+
+ // After clearing the cache, redoes the work.
+
+ train_exists(source, pageClassName, true);
+
+ replay();
+
+ resolver.objectWasInvalidated();
+
+ assertEquals(resolver.resolvePageNameToClassName("SimplePage"), pageClassName);
+
+ verify();
+ }
+
+ @Test
+ public void page_found_in_core_lib()
+ {
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_packages(source, CORE_ROOT_PACKAGE);
+ train_for_app_packages(source);
+
+ train_exists(source, APP_ROOT_PACKAGE + ".pages.CorePage", false);
+ train_exists(source, CORE_ROOT_PACKAGE + ".pages.CorePage", true);
+
+ replay();
+
+ ComponentClassResolver resolver = create(source, new LibraryMapping(CORE_PREFIX,
+ CORE_ROOT_PACKAGE));
+
+ assertEquals(resolver.resolvePageNameToClassName("CorePage"), CORE_ROOT_PACKAGE
+ + ".pages.CorePage");
+
+ verify();
+ }
+
+ @Test
+ public void page_class_name_resolved_to_core_page()
+ {
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_packages(source, CORE_ROOT_PACKAGE);
+ train_for_app_packages(source);
+
+ replay();
+
+ ComponentClassResolver resolver = create(source, new LibraryMapping(CORE_PREFIX,
+ CORE_ROOT_PACKAGE));
+
+ assertEquals(
+ resolver.resolvePageClassNameToPageName(CORE_ROOT_PACKAGE + ".pages.CorePage"),
+ "core/CorePage");
+
+ verify();
+ }
+
+ @Test
+ public void resolved_logical_page_names_are_cached()
+ {
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_packages(source, CORE_ROOT_PACKAGE);
+ train_for_app_packages(source);
+
+ replay();
+
+ ComponentClassResolver resolver = create(source, new LibraryMapping(CORE_PREFIX,
+ CORE_ROOT_PACKAGE));
+
+ String className = CORE_ROOT_PACKAGE + ".pages.CorePage";
+
+ String logicalName1 = resolver.resolvePageClassNameToPageName(className);
+ String logicalName2 = resolver.resolvePageClassNameToPageName(className);
+
+ // Given that the value is computed on the fly, if its the same (not just equal, but the
+ // same), that proves that the value was cached.
+
+ assertSame(logicalName2, logicalName1);
+
+ verify();
+ }
+
+ @Test
+ public void page_found_in_library()
+ {
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_packages(source, LIB_ROOT_PACKAGE);
+ train_for_packages(source, CORE_ROOT_PACKAGE);
+ train_for_app_packages(source);
+
+ train_exists(source, LIB_ROOT_PACKAGE + ".pages.LibPage", true);
+
+ replay();
+
+ ComponentClassResolver resolver = create(source, new LibraryMapping(LIB_PREFIX,
+ LIB_ROOT_PACKAGE), new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
+
+ assertEquals(resolver.resolvePageNameToClassName("lib/LibPage"), LIB_ROOT_PACKAGE
+ + ".pages.LibPage");
+
+ verify();
+ }
+
+ @Test
+ public void class_name_resolves_to_folder_under_library()
+ {
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_packages(source, LIB_ROOT_PACKAGE);
+ train_for_packages(source, CORE_ROOT_PACKAGE);
+ train_for_app_packages(source);
+
+ replay();
+
+ ComponentClassResolver resolver = create(source, new LibraryMapping(LIB_PREFIX,
+ LIB_ROOT_PACKAGE), new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
+
+ assertEquals(resolver.resolvePageClassNameToPageName(LIB_ROOT_PACKAGE
+ + ".pages.foo.bar.LibPage"), LIB_PREFIX + "/foo/bar/LibPage");
+
+ verify();
+ }
+
+ @Test
+ public void class_name_does_not_resolve_to_page_name()
+ {
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_packages(source, CORE_ROOT_PACKAGE);
+ train_for_app_packages(source);
+
+ replay();
+
+ ComponentClassResolver resolver = create(source, new LibraryMapping(CORE_PREFIX,
+ CORE_ROOT_PACKAGE));
+
+ String className = LIB_ROOT_PACKAGE + ".pages.LibPage";
+
+ try
+ {
+ resolver.resolvePageClassNameToPageName(className);
+ unreachable();
+ }
+ catch (IllegalArgumentException ex)
+ {
+ assertEquals(ex.getMessage(), "Unable to resolve class name " + className
+ + " to a logical page name.");
+ }
+
+ verify();
+ }
+
+ @Test
+ public void class_name_not_in_a_pages_package()
+ {
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_packages(source, CORE_ROOT_PACKAGE);
+ train_for_app_packages(source);
+
+ replay();
+
+ ComponentClassResolver resolver = create(source, new LibraryMapping(CORE_PREFIX,
+ CORE_ROOT_PACKAGE));
+
+ String className = CORE_ROOT_PACKAGE + ".foo.CorePage";
+
+ try
+ {
+ resolver.resolvePageClassNameToPageName(className);
+ unreachable();
+ }
+ catch (IllegalArgumentException ex)
+ {
+ assertEquals(ex.getMessage(), "Unable to resolve class name " + className
+ + " to a logical page name.");
+ }
+
+ verify();
+ }
+
+ @Test
+ public void multiple_mappings_for_same_prefix()
+ {
+ String secondaryLibPackage = "org.examples.addon.lib";
+
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_packages(source, LIB_ROOT_PACKAGE);
+ train_for_packages(source, secondaryLibPackage);
+ train_for_packages(source, CORE_ROOT_PACKAGE);
+ train_for_app_packages(source);
+
+ train_exists(source, LIB_ROOT_PACKAGE + ".pages.LibPage", false);
+ train_exists(source, secondaryLibPackage + ".pages.LibPage", true);
+
+ replay();
+
+ ComponentClassResolver resolver = create(
+ source,
+ new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
+ new LibraryMapping(LIB_PREFIX, secondaryLibPackage),
+ new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
+
+ assertEquals(resolver.resolvePageNameToClassName("lib/LibPage"), secondaryLibPackage
+ + ".pages.LibPage");
+
+ verify();
+ }
+
+ @Test
+ public void complex_prefix_search_fails()
+ {
+ String deepPackage = "org.deep";
+
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_packages(source, deepPackage);
+ train_for_packages(source, LIB_ROOT_PACKAGE);
+ train_for_packages(source, CORE_ROOT_PACKAGE);
+ train_for_app_packages(source);
+
+ // In early searches, the prefix is "absorbed" into the root package.
+ // In later searches, the prefix is used as a sub-package.
+
+ train_exists(source, deepPackage + ".pages.DeepPage", false);
+ train_exists(source, LIB_ROOT_PACKAGE + ".pages.deep.DeepPage", false);
+ train_exists(source, APP_ROOT_PACKAGE + ".pages.lib.deep.DeepPage", false);
+ train_exists(source, CORE_ROOT_PACKAGE + ".pages.lib.deep.DeepPage", false);
+
+ replay();
+
+ ComponentClassResolver resolver = create(
+ source,
+ new LibraryMapping("lib/deep", deepPackage),
+ new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
+ new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
+
+ try
+ {
+ resolver.resolvePageNameToClassName("lib/deep/DeepPage");
+ unreachable();
+ }
+ catch (IllegalArgumentException ex)
+ {
+ assertEquals(
+ ex.getMessage(),
+ "Unable to resolve page 'lib/deep/DeepPage' to a component class name.");
+ }
+
+ verify();
+ }
+
+ @Test
+ public void prefix_page_totally_missing()
+ {
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_packages(source, LIB_ROOT_PACKAGE);
+ train_for_packages(source, CORE_ROOT_PACKAGE);
+ train_for_app_packages(source);
+
+ train_exists(source, LIB_ROOT_PACKAGE + ".pages.MissingPage", false);
+ train_exists(source, APP_ROOT_PACKAGE + ".pages.lib.MissingPage", false);
+ train_exists(source, CORE_ROOT_PACKAGE + ".pages.lib.MissingPage", false);
+
+ replay();
+
+ ComponentClassResolver resolver = create(source, new LibraryMapping(LIB_PREFIX,
+ LIB_ROOT_PACKAGE), new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
+
+ try
+ {
+ resolver.resolvePageNameToClassName("lib/MissingPage");
+ unreachable();
+ }
+ catch (IllegalArgumentException ex)
+ {
+ assertEquals(
+ ex.getMessage(),
+ "Unable to resolve page 'lib/MissingPage' to a component class name.");
+ }
+
+ verify();
+ }
+
+ private void train_for_packages(ComponentInstantiatorSource source, String packageName)
+ {
+ source.addPackage(packageName + ".pages");
+ source.addPackage(packageName + ".components");
+ source.addPackage(packageName + ".mixins");
+ }
+
+ /**
+ * The logic for searching is pretty much identical for both components and pages, so even a
+ * cursory test of component types should nail it.
+ */
+ @Test
+ public void simple_component_type()
+ {
+ String expectedClassName = APP_ROOT_PACKAGE + ".components.SimpleComponent";
+
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_app_packages(source);
+
+ train_exists(source, expectedClassName, true);
+
+ replay();
+
+ ComponentClassResolver resolver = create(source);
+
+ assertEquals(resolver.resolveComponentTypeToClassName("SimpleComponent"), APP_ROOT_PACKAGE
+ + ".components.SimpleComponent");
+
+ verify();
+ }
+
+ /**
+ * Likewise for mixins; it's all just setup for a particular method.
+ */
+
+ @Test
+ public void simple_mixin_type()
+ {
+ String expectedClassName = APP_ROOT_PACKAGE + ".mixins.SimpleMixin";
+
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_app_packages(source);
+
+ train_exists(source, expectedClassName, true);
+
+ replay();
+
+ ComponentClassResolver resolver = create(source);
+
+ assertEquals(resolver.resolveMixinTypeToClassName("SimpleMixin"), expectedClassName);
+
+ verify();
+ }
+
+ @Test
+ public void mixin_type_not_found()
+ {
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_packages(source, CORE_ROOT_PACKAGE);
+ train_for_app_packages(source);
+
+ train_exists(source, APP_ROOT_PACKAGE + ".mixins.SimpleMixin", false);
+ train_exists(source, CORE_ROOT_PACKAGE + ".mixins.SimpleMixin", false);
+
+ replay();
+
+ ComponentClassResolver resolver = create(source, new LibraryMapping(CORE_PREFIX,
+ CORE_ROOT_PACKAGE));
+
+ try
+ {
+ resolver.resolveMixinTypeToClassName("SimpleMixin");
+ unreachable();
+ }
+ catch (IllegalArgumentException ex)
+ {
+ assertEquals(
+ ex.getMessage(),
+ "Unable to resolve mixin type 'SimpleMixin' to a component class name.");
+ }
+
+ verify();
+
+ }
+
+ @Test
+ public void component_type_not_found()
+ {
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_packages(source, CORE_ROOT_PACKAGE);
+ train_for_app_packages(source);
+
+ train_exists(source, APP_ROOT_PACKAGE + ".components.SimpleComponent", false);
+ train_exists(source, CORE_ROOT_PACKAGE + ".components.SimpleComponent", false);
+
+ replay();
+
+ ComponentClassResolver resolver = create(source, new LibraryMapping(CORE_PREFIX,
+ CORE_ROOT_PACKAGE));
+
+ try
+ {
+ resolver.resolveComponentTypeToClassName("SimpleComponent");
+ unreachable();
+ }
+ catch (IllegalArgumentException ex)
+ {
+ assertEquals(
+ ex.getMessage(),
+ "Unable to resolve component type 'SimpleComponent' to a component class name.");
+ }
+
+ verify();
+
+ }
+
+ @Test
+ public void component_types_are_cached()
+ {
+ ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+ train_for_app_packages(source);
+
+ String componentClassName = APP_ROOT_PACKAGE + ".components.SimpleComponent";
+
+ train_exists(source, componentClassName, true);
+
+ replay();
+
+ ComponentClassResolverImpl resolver = create(source);
+
+ assertEquals(
+ resolver.resolveComponentTypeToClassName("SimpleComponent"),
+ componentClassName);
+
+ verify();
+
+ // No training, its in the cache
+
+ replay();
+
+ assertEquals(
+ resolver.resolveComponentTypeToClassName("SimpleComponent"),
+ componentClassName);
+
+ verify();
+
+ // The cache is cleared, so the search will re-execute
+
+ train_exists(source, componentClassName, true);
+
+ replay();
+
+ resolver.objectWasInvalidated();
+
+ assertEquals(
+ resolver.resolveComponentTypeToClassName("SimpleComponent"),
+ componentClassName);
+
+ verify();
+
+ }
+
+ protected final void train_exists(ComponentInstantiatorSource source, String className,
+ boolean exists)
+ {
+ expect(source.exists(className)).andReturn(exists);
+ }
+
+ private void train_for_app_packages(ComponentInstantiatorSource source)
+ {
+ train_for_packages(source, APP_ROOT_PACKAGE);
+ }
+}