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);
+    }
+}