You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2006/10/01 23:44:10 UTC

svn commit: r451817 [3/3] - in /tapestry/tapestry5/tapestry-core/trunk/src: main/java/org/apache/tapestry/annotations/ main/java/org/apache/tapestry/corelib/ main/java/org/apache/tapestry/corelib/components/ main/java/org/apache/tapestry/corelib/pages/...

Added: 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=auto&rev=451817
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java Sun Oct  1 14:44:07 2006
@@ -0,0 +1,314 @@
+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;
+
+/**
+ * @author Howard M. Lewis Ship
+ */
+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 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_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 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));
+
+        assertNull(resolver.resolvePageNameToClassName("lib/deep/DeepPage"));
+
+        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));
+
+        assertNull(resolver.resolvePageNameToClassName("lib/MissingPage"));
+
+        verify();
+    }
+
+    private void train_for_packages(ComponentInstantiatorSource source, String packageName)
+    {
+        source.addPackage(packageName + ".pages");
+        source.addPackage(packageName + ".components");
+    }
+
+    /**
+     * 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()
+    {
+        ComponentInstantiatorSource source = newComponentInstantiatorSource();
+
+        train_for_app_packages(source);
+
+        train_exists(source, APP_ROOT_PACKAGE + ".components.SimpleComponent", true);
+
+        replay();
+
+        ComponentClassResolver resolver = create(source);
+
+        assertEquals(resolver.resolveComponentTypeToClassName("SimpleComponent"), APP_ROOT_PACKAGE
+                + ".components.SimpleComponent");
+
+        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)
+    {
+        source.addPackage(APP_ROOT_PACKAGE + ".pages");
+        source.addPackage(APP_ROOT_PACKAGE + ".components");
+    }
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentInstantiatorSourceImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentInstantiatorSourceImplTest.java?view=diff&rev=451817&r1=451816&r2=451817
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentInstantiatorSourceImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentInstantiatorSourceImplTest.java Sun Oct  1 14:44:07 2006
@@ -148,13 +148,22 @@
         assertEquals(_access.get(target, "intValue"), 0);
     }
 
+    /**
+     * This allows tests the exists() method.
+     */
     @Test
     public void component_class_reload() throws Exception
     {
+        // Ensure it doesn't already exist:
+
+        assertFalse(_source.exists(SYNTH_COMPONENT_CLASSNAME));
+
         // Create the class on the fly.
 
         createSynthComponentClass("Original");
 
+        assertTrue(_source.exists(SYNTH_COMPONENT_CLASSNAME));
+
         Named named = (Named) createComponent(SYNTH_COMPONENT_CLASSNAME);
 
         assertEquals(named.getName(), "Original");
@@ -232,7 +241,7 @@
     }
 
     @BeforeClass
-    public void createRegistry() throws Exception
+    public void setup_tests() throws Exception
     {
         String tempdir = System.getProperty("java.io.tmpdir");
         String uid = UUID.randomUUID().toString();
@@ -260,7 +269,7 @@
     }
 
     @AfterClass
-    public void shutdownRegistry()
+    public void cleanup_tests()
     {
         _registry.shutdown();
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentTemplateSourceImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentTemplateSourceImplTest.java?view=diff&rev=451817&r1=451816&r2=451817
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentTemplateSourceImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentTemplateSourceImplTest.java Sun Oct  1 14:44:07 2006
@@ -14,16 +14,13 @@
 
 package org.apache.tapestry.internal.services;
 
-import static org.easymock.EasyMock.isA;
 
 import java.io.File;
 import java.net.URLClassLoader;
 import java.util.Locale;
 
 import org.apache.tapestry.Resource;
-import org.apache.tapestry.events.InvalidationEvent;
 import org.apache.tapestry.events.InvalidationListener;
-import org.apache.tapestry.events.UpdateEvent;
 import org.apache.tapestry.internal.ClasspathResource;
 import org.apache.tapestry.internal.parser.ComponentTemplate;
 import org.apache.tapestry.internal.test.InternalBaseTestCase;
@@ -97,7 +94,7 @@
         assertSame(source.getTemplate(name, Locale.ENGLISH), template);
 
         // Check for updates (which won't be found).
-        source.checkForUpdates(new UpdateEvent(this));
+        source.checkForUpdates();
 
         // A second pass will test the caching (the
         // parser is not invoked).
@@ -110,12 +107,12 @@
 
         touch(f);
 
-        listener.objectWasInvalidated(isA(InvalidationEvent.class));
+        listener.objectWasInvalidated();
 
         replay();
 
         // Check for updates (which will be found).
-        source.checkForUpdates(new UpdateEvent(this));
+        source.checkForUpdates();
 
         verify();
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageLoaderImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageLoaderImplTest.java?view=diff&rev=451817&r1=451816&r2=451817
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageLoaderImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageLoaderImplTest.java Sun Oct  1 14:44:07 2006
@@ -126,14 +126,21 @@
 
         log.error(ServicesMessages.compTypeConflict("foo", "Fred", "Barney"));
 
-        train_newComponentElement(elementFactory, rootElement, "foo", "Barney", l, childElement);
+        train_getComponentClassName(emodel, "foo.components.Barney");
+
+        train_newComponentElement(
+                elementFactory,
+                rootElement,
+                "foo",
+                "Barney",
+                "foo.components.Barney",
+                l,
+                childElement);
 
         rootElement.addToTemplate(childElement);
 
         train_getParameterNames(emodel);
 
-        rootElement.addEmbeddedElement(childElement);
-
         // Alas, what comes next is the recursive call to load the child element
 
         train_getComponentModel(childElement, model);
@@ -151,33 +158,40 @@
         verify();
     }
 
-    protected void train_newRenderBodyElement(PageElementFactory elementFactory,
+    protected final void train_getComponentClassName(EmbeddedComponentModel model, String className)
+    {
+        model.getComponentClassName();
+        setReturnValue(className);
+    }
+
+    protected final void train_newRenderBodyElement(PageElementFactory elementFactory,
             ComponentPageElement component, PageElement body)
     {
         elementFactory.newRenderBodyElement(component);
         setReturnValue(body);
     }
 
-    private PageElement newPageElement()
+    protected final PageElement newPageElement()
     {
         return newMock(PageElement.class);
     }
 
-    protected void train_getParameterNames(EmbeddedComponentModel model, String... names)
+    protected final void train_getParameterNames(EmbeddedComponentModel model, String... names)
     {
         model.getParameterNames();
         setReturnValue(Arrays.asList(names));
     }
 
-    protected void train_newComponentElement(PageElementFactory elementFactory,
+    protected final void train_newComponentElement(PageElementFactory elementFactory,
             ComponentPageElement container, String embeddedId, String embeddedType,
-            Location location, ComponentPageElement embedded)
+            String componentClassName, Location location, ComponentPageElement embedded)
     {
         elementFactory.newComponentElement(
                 isA(Page.class),
                 eq(container),
                 eq(embeddedId),
                 eq(embeddedType),
+                eq(componentClassName),
                 eq(location));
         setReturnValue(embedded);
     }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/RequestPageCacheImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/RequestPageCacheImplTest.java?view=diff&rev=451817&r1=451816&r2=451817
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/RequestPageCacheImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/RequestPageCacheImplTest.java Sun Oct  1 14:44:07 2006
@@ -16,38 +16,93 @@
 
 import org.apache.tapestry.internal.structure.Page;
 import org.apache.tapestry.internal.test.InternalBaseTestCase;
+import org.apache.tapestry.services.ComponentClassResolver;
 import org.testng.annotations.Test;
 
+/**
+ * @author Howard M. Lewis Ship
+ */
 public class RequestPageCacheImplTest extends InternalBaseTestCase
 {
-    private static final String PAGE_NAME = "com.foo.pages.MyPage";
+    private static final String PAGE_NAME = "MyPage";
+
+    private static final String PAGE_CLASS_NAME = "com.foo.pages.MyPage";
 
     @Test
     public void get_is_cached()
     {
+        ComponentClassResolver resolver = newComponentClassResolver();
         PagePool pool = newPagePool();
         Page page = newPage();
 
-        pool.checkout(PAGE_NAME);
+        train_resolvePageNameToClassName(resolver, PAGE_NAME, PAGE_CLASS_NAME);
+
+        pool.checkout(PAGE_CLASS_NAME);
         setReturnValue(page);
 
         page.attached();
 
-        pool.release(page);
-
         replay();
 
-        RequestPageCacheImpl cache = new RequestPageCacheImpl(pool);
+        RequestPageCacheImpl cache = new RequestPageCacheImpl(resolver, pool);
 
         assertSame(cache.get(PAGE_NAME), page);
 
+        verify();
+
+        // Asking for a page always resolves the name to a class (fortunately,
+        // this is cached by resolver).
+
+        train_resolvePageNameToClassName(resolver, PAGE_NAME, PAGE_CLASS_NAME);
+
+        replay();
+
         // Again, same object, but no PagePool this time.
         assertSame(cache.get(PAGE_NAME), page);
 
+        verify();
+
+        pool.release(page);
+
+        replay();
+
         // Now, trigger the release()
 
         cache.threadDidCleanup();
 
         verify();
+    }
+
+    @Test
+    public void page_does_not_exist()
+    {
+        ComponentClassResolver resolver = newComponentClassResolver();
+        PagePool pool = newPagePool();
+
+        train_resolvePageNameToClassName(resolver, PAGE_NAME, null);
+
+        replay();
+
+        try
+        {
+            RequestPageCacheImpl cache = new RequestPageCacheImpl(resolver, pool);
+
+            cache.get(PAGE_NAME);
+
+            unreachable();
+        }
+        catch (RuntimeException ex)
+        {
+            assertEquals(ex.getMessage(), "Page 'MyPage' is not defined by this application.");
+        }
+
+        verify();
+    }
+
+    protected final void train_resolvePageNameToClassName(ComponentClassResolver resolver,
+            String pageName, String className)
+    {
+        resolver.resolvePageNameToClassName(pageName);
+        setReturnValue(className);
     }
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/UpdateListenerHubImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/UpdateListenerHubImplTest.java?view=diff&rev=451817&r1=451816&r2=451817
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/UpdateListenerHubImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/UpdateListenerHubImplTest.java Sun Oct  1 14:44:07 2006
@@ -14,9 +14,7 @@
 
 package org.apache.tapestry.internal.services;
 
-import static org.easymock.EasyMock.isA;
 
-import org.apache.tapestry.events.UpdateEvent;
 import org.apache.tapestry.events.UpdateListener;
 import org.apache.tapestry.test.TestBase;
 import org.testng.annotations.Test;
@@ -33,7 +31,7 @@
 
         UpdateListenerHub hub = new UpdateListenerHubImpl();
 
-        listener.checkForUpdates(isA(UpdateEvent.class));
+        listener.checkForUpdates();
 
         replay();
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/log4j.properties?view=diff&rev=451817&r1=451816&r2=451817
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/resources/log4j.properties (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/resources/log4j.properties Sun Oct  1 14:44:07 2006
@@ -25,3 +25,4 @@
 log4j.category.tapestry=debug
 log4j.category.tapestry.ioc.ClassFactory=error
 
+log4j.category.app=info

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Countdown.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Countdown.html?view=diff&rev=451817&r1=451816&r2=451817
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Countdown.html (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Countdown.html Sun Oct  1 14:44:07 2006
@@ -1,11 +1,11 @@
 <t:comp type="Border" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
     <p> This component demonstrates embedded components defined in the component class using the @Component annotation.</p>
-    <p> Countdown: <t:comp id="loop">
-            ${count}
+    <p> Countdown: <t:comp id="count">
+            ${countValue}
         </t:comp>
     </p>
     
     <p>
-        Brought to you by the ${loop} component.
+        Brought to you by the ${component} component.
     </p>
 </t:comp>

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/MerryChristmas.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/MerryChristmas.html?view=diff&rev=451817&r1=451816&r2=451817
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/MerryChristmas.html (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/MerryChristmas.html Sun Oct  1 14:44:07 2006
@@ -1,5 +1,5 @@
 <t:comp type="Border" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
     <p> The Loop component demonstrates reading and writing of properties with the prop: binding prefix.</p>
-    <p> Merry Christmas: <t:comp type="Loop" end="3"> Ho! </t:comp>
+    <p> Merry Christmas: <t:comp type="Count" end="3"> Ho! </t:comp>
     </p>
 </t:comp>