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>