Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/model/MutableComponentModelImplTest.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/model/MutableComponentModelImplTest.java?view=diff&rev=480728&r1=480727&r2=480728 ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/model/MutableComponentModelImplTest.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/model/MutableComponentModelImplTest.java Wed Nov 29 14:02:40 2006 @@ -12,545 +12,561 @@ // See the License for the specific language governing permissions and // limitations under the License. -package org.apache.tapestry.internal.model; - -import java.util.Arrays; - -import org.apache.commons.logging.Log; -import org.apache.tapestry.internal.test.InternalBaseTestCase; +package org.apache.tapestry.internal.model; + +import java.util.Arrays; + +import org.apache.commons.logging.Log; +import org.apache.tapestry.internal.test.InternalBaseTestCase; import org.apache.tapestry.ioc.Resource; -import org.apache.tapestry.model.ComponentModel; -import org.apache.tapestry.model.MutableComponentModel; -import org.apache.tapestry.model.MutableEmbeddedComponentModel; -import org.apache.tapestry.model.ParameterModel; -import org.testng.annotations.Test; - -/** - * Tests [EMAIL PROTECTED] org.apache.tapestry.internal.model.MutableComponentModelImpl} and - * [EMAIL PROTECTED] org.apache.tapestry.internal.model.MutableEmbeddedComponentModelImpl}. - */ -public class MutableComponentModelImplTest extends InternalBaseTestCase -{ - private static final String COMPONENT_CLASS_NAME = "org.example.components.Fred"; - - private static final String CLASS_NAME = "org.example.components.Foo"; - - @Test - public void root_class_vs_sub_class() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - assertTrue(model.isRootClass()); - - MutableComponentModel subModel = new MutableComponentModelImpl(CLASS_NAME, log, r, model); - - assertFalse(subModel.isRootClass()); - - verify(); - } - - @Test - public void add_new_parameter() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - assertTrue(model.getParameterNames().isEmpty()); - - String parameterName = "value"; - - model.addParameter(parameterName, true); - - ParameterModel pm = model.getParameterModel(parameterName); - - assertEquals(pm.getName(), parameterName); - assertEquals(true, pm.isRequired()); - - verify(); - } - - @Test - public void add_duplicate_parameter() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - model.addParameter("fred", true); - - try - { - model.addParameter("fred", true); - unreachable(); - } - catch (IllegalArgumentException ex) - { - assertEquals( - ex.getMessage(), - "Parameter 'fred' of component org.example.components.Foo is already defined."); - } - - verify(); - } - - @Test - public void get_parameter_by_name_with_no_parameters_defined() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - assertNull(model.getParameterModel("foo")); - - verify(); - } - - @Test - public void get_unknown_parameter() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - model.addParameter("fred", true); - - assertNull(model.getParameterModel("barney")); - - verify(); - } - - @Test - public void add_embedded() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - assertTrue(model.getEmbeddedComponentIds().isEmpty()); - - MutableEmbeddedComponentModel fred = model.addEmbeddedComponent( - "fred", - "Fred", - COMPONENT_CLASS_NAME); - - assertEquals(fred.getId(), "fred"); - assertEquals(fred.getComponentType(), "Fred"); - - MutableEmbeddedComponentModel barney = model.addEmbeddedComponent( - "barney", - "Barney", - COMPONENT_CLASS_NAME); - - assertEquals(model.getEmbeddedComponentIds(), Arrays.asList("barney", "fred")); - - assertSame(model.getEmbeddedComponentModel("fred"), fred); - assertSame(model.getEmbeddedComponentModel("barney"), barney); - - assertEquals( - fred.toString(), - "EmbeddedComponentModel[id=fred type=Fred class=org.example.components.Fred]"); - - verify(); - } - - @Test - public void add_embedded_component_with_duplicate_id() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - model.addEmbeddedComponent("fred", "Fred1", COMPONENT_CLASS_NAME); - - try - { - model.addEmbeddedComponent("fred", "Fred2", COMPONENT_CLASS_NAME); - unreachable(); - } - catch (IllegalArgumentException ex) - { - assertEquals( - ex.getMessage(), - "Embedded component 'fred' has already been defined for component class org.example.components.Foo."); - } - - verify(); - - } - - @Test - public void add_parameters_to_embedded() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - MutableEmbeddedComponentModel fred = model.addEmbeddedComponent( - "fred", - "Fred", - COMPONENT_CLASS_NAME); - - assertTrue(fred.getParameterNames().isEmpty()); - - fred.addParameter("city", "bedrock"); - fred.addParameter("job", "crane operator"); - - assertEquals(fred.getParameterNames(), Arrays.asList("city", "job")); - - assertEquals(fred.getParameterValue("city"), "bedrock"); - - verify(); - } - - @Test - public void add_duplicate_parameters_to_embedded() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - MutableEmbeddedComponentModel fred = model.addEmbeddedComponent( - "fred", - "Fred", - COMPONENT_CLASS_NAME); - - fred.addParameter("city", "bedrock"); - - try - { - fred.addParameter("city", "slateville"); - unreachable(); - } - catch (IllegalArgumentException ex) - { - assertEquals( - ex.getMessage(), - "A value for parameter 'city' of embedded component fred (of component class org.example.components.Foo) has already been provided."); - } - - verify(); - } - - @Test - public void mixin_names_is_initially_empty_list() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - MutableEmbeddedComponentModel fred = model.addEmbeddedComponent( - "fred", - "Fred", - COMPONENT_CLASS_NAME); - - assertTrue(fred.getMixinClassNames().isEmpty()); - - verify(); - } - - @Test - public void mixin_class_names_remembered_in_order_added() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - MutableEmbeddedComponentModel fred = model.addEmbeddedComponent( - "fred", - "Fred", - COMPONENT_CLASS_NAME); - - fred.addMixin("zip.zop.Zoom"); - fred.addMixin("foo.bar.Baz"); - - assertEquals(fred.getMixinClassNames(), Arrays.asList("zip.zop.Zoom", "foo.bar.Baz")); - - verify(); - } - - @Test - public void mixin_name_conflict() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - MutableEmbeddedComponentModel fred = model.addEmbeddedComponent( - "fred", - "Fred", - COMPONENT_CLASS_NAME); - - fred.addMixin("zip.zop.Zoom"); - - try - { - fred.addMixin("zip.zop.Zoom"); - unreachable(); - } - catch (IllegalArgumentException ex) - { - assertEquals( - ex.getMessage(), - "Mixin zip.zop.Zoom (for component fred) has already been defined."); - } - - // Make sure it wasn't actually added. - - assertEquals(fred.getMixinClassNames(), Arrays.asList("zip.zop.Zoom")); - - verify(); - } - - @Test - public void get_persistent_field_names_when_none_defined() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - assertTrue(model.getPersistentFieldNames().isEmpty()); - - verify(); - } - - @Test - public void get_persistent_field_names_are_sorted() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - assertEquals(model.setFieldPersistenceStrategy("fred", "session"), "fred"); - assertEquals(model.setFieldPersistenceStrategy("barney", "client"), "barney"); - - assertEquals(model.getPersistentFieldNames(), Arrays.asList("barney", "fred")); - - verify(); - } - - @Test - public void persistent_field_names_have_punctuation_stripped() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - assertEquals(model.setFieldPersistenceStrategy("_fred", "session"), "fred"); - assertEquals(model.setFieldPersistenceStrategy("_$barney", "client"), "barney"); - - assertEquals(model.getPersistentFieldNames(), Arrays.asList("barney", "fred")); - - verify(); - } - - @Test - public void get_persistent_field_names_reflects_parent_model() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel parent = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - assertEquals(parent.setFieldPersistenceStrategy("wilma", "session"), "wilma"); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, parent); - - assertEquals(model.setFieldPersistenceStrategy("fred", "session"), "fred"); - assertEquals(model.setFieldPersistenceStrategy("barney", "client"), "barney"); - - assertEquals(model.getPersistentFieldNames(), Arrays.asList("barney", "fred", "wilma")); - - verify(); - } - - @Test - public void persistent_field_names_allocated_in_subclasses_are_unique() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel parent = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - assertEquals(parent.setFieldPersistenceStrategy("wilma", "session"), "wilma"); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, parent); - - assertEquals(model.setFieldPersistenceStrategy("wilma", "session"), "wilma_0"); - - assertEquals(model.getPersistentFieldNames(), Arrays.asList("wilma", "wilma_0")); - - verify(); - } - - @Test - public void get_persistent_field_defined_in_model() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - model.setFieldPersistenceStrategy("fred", "session"); - model.setFieldPersistenceStrategy("barney", "client"); - - assertEquals(model.getFieldPersistenceStrategy("fred"), "session"); - assertEquals(model.getFieldPersistenceStrategy("barney"), "client"); - - verify(); - } - - @Test - public void no_persistence_defined_for_field() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - try - { - model.getFieldPersistenceStrategy("someField"); - unreachable(); - } - catch (IllegalArgumentException ex) - { - assertEquals( - ex.getMessage(), - "No field persistence strategy has been defined for field \'someField\'."); - } - - verify(); - - } - - @Test - public void get_persistent_field_defined_in_parent() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel parent = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, parent); - - parent.setFieldPersistenceStrategy("wilma", "parent"); - - model.setFieldPersistenceStrategy("fred", "session"); - - assertEquals(model.getFieldPersistenceStrategy("wilma"), "parent"); - - verify(); - } - - @Test - public void default_for_supports_informal_parameters_is_false() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - assertFalse(model.getSupportsInformalParameters()); - - model.enableSupportsInformalParameters(); - - assertTrue(model.getSupportsInformalParameters()); - - verify(); - } - - @Test - public void get_mixin_class_names_with_no_mixins() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - ComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - assertTrue(model.getMixinClassNames().isEmpty()); - - verify(); - } - - @Test - public void get_mixin_class_names_mixes_with_parent_model() - { - Resource r = newResource(); - Log log = newLog(); - - replay(); - - MutableComponentModel parent = new MutableComponentModelImpl(CLASS_NAME, log, r, null); - - parent.addMixinClassName("Wilma"); - - MutableComponentModel child = new MutableComponentModelImpl(CLASS_NAME, log, r, parent); - - child.addMixinClassName("Fred"); - child.addMixinClassName("Barney"); - - assertEquals(child.getMixinClassNames(), Arrays.asList("Barney", "Fred", "Wilma")); - - verify(); - - } - -} +import org.apache.tapestry.model.ComponentModel; +import org.apache.tapestry.model.MutableComponentModel; +import org.apache.tapestry.model.MutableEmbeddedComponentModel; +import org.apache.tapestry.model.ParameterModel; +import org.testng.annotations.Test; + +/** + * Tests [EMAIL PROTECTED] org.apache.tapestry.internal.model.MutableComponentModelImpl} and + * [EMAIL PROTECTED] org.apache.tapestry.internal.model.MutableEmbeddedComponentModelImpl}. + */ +public class MutableComponentModelImplTest extends InternalBaseTestCase +{ + private static final String COMPONENT_CLASS_NAME = "org.example.components.Fred"; + + private static final String CLASS_NAME = "org.example.components.Foo"; + + @Test + public void root_class_vs_sub_class() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + assertTrue(model.isRootClass()); + + MutableComponentModel subModel = new MutableComponentModelImpl(CLASS_NAME, log, r, model); + + assertFalse(subModel.isRootClass()); + + verify(); + } + + @Test + public void add_new_parameter() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + assertTrue(model.getParameterNames().isEmpty()); + + String parameterName = "value"; + + model.addParameter(parameterName, true); + + ParameterModel pm = model.getParameterModel(parameterName); + + assertEquals(pm.getName(), parameterName); + assertEquals(true, pm.isRequired()); + + verify(); + } + + @Test + public void add_duplicate_parameter() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + model.addParameter("fred", true); + + try + { + model.addParameter("fred", true); + unreachable(); + } + catch (IllegalArgumentException ex) + { + assertEquals( + ex.getMessage(), + "Parameter 'fred' of component org.example.components.Foo is already defined."); + } + + verify(); + } + + @Test + public void get_parameter_by_name_with_no_parameters_defined() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + assertNull(model.getParameterModel("foo")); + + verify(); + } + + @Test + public void get_unknown_parameter() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + model.addParameter("fred", true); + + assertNull(model.getParameterModel("barney")); + + verify(); + } + + @Test + public void add_embedded() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + assertTrue(model.getEmbeddedComponentIds().isEmpty()); + + MutableEmbeddedComponentModel fred = model.addEmbeddedComponent( + "fred", + "Fred", + COMPONENT_CLASS_NAME); + + assertEquals(fred.getId(), "fred"); + assertEquals(fred.getComponentType(), "Fred"); + + MutableEmbeddedComponentModel barney = model.addEmbeddedComponent( + "barney", + "Barney", + COMPONENT_CLASS_NAME); + + assertEquals(model.getEmbeddedComponentIds(), Arrays.asList("barney", "fred")); + + assertSame(model.getEmbeddedComponentModel("fred"), fred); + assertSame(model.getEmbeddedComponentModel("barney"), barney); + + assertEquals( + fred.toString(), + "EmbeddedComponentModel[id=fred type=Fred class=org.example.components.Fred]"); + + verify(); + } + + @Test + public void add_embedded_component_with_duplicate_id() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + model.addEmbeddedComponent("fred", "Fred1", COMPONENT_CLASS_NAME); + + try + { + model.addEmbeddedComponent("fred", "Fred2", COMPONENT_CLASS_NAME); + unreachable(); + } + catch (IllegalArgumentException ex) + { + assertEquals( + ex.getMessage(), + "Embedded component 'fred' has already been defined for component class org.example.components.Foo."); + } + + verify(); + + } + + @Test + public void add_parameters_to_embedded() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + MutableEmbeddedComponentModel fred = model.addEmbeddedComponent( + "fred", + "Fred", + COMPONENT_CLASS_NAME); + + assertTrue(fred.getParameterNames().isEmpty()); + + fred.addParameter("city", "bedrock"); + fred.addParameter("job", "crane operator"); + + assertEquals(fred.getParameterNames(), Arrays.asList("city", "job")); + + assertEquals(fred.getParameterValue("city"), "bedrock"); + + verify(); + } + + @Test + public void add_duplicate_parameters_to_embedded() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + MutableEmbeddedComponentModel fred = model.addEmbeddedComponent( + "fred", + "Fred", + COMPONENT_CLASS_NAME); + + fred.addParameter("city", "bedrock"); + + try + { + fred.addParameter("city", "slateville"); + unreachable(); + } + catch (IllegalArgumentException ex) + { + assertEquals( + ex.getMessage(), + "A value for parameter 'city' of embedded component fred (of component class org.example.components.Foo) has already been provided."); + } + + verify(); + } + + @Test + public void mixin_names_is_initially_empty_list() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + MutableEmbeddedComponentModel fred = model.addEmbeddedComponent( + "fred", + "Fred", + COMPONENT_CLASS_NAME); + + assertTrue(fred.getMixinClassNames().isEmpty()); + + verify(); + } + + @Test + public void mixin_class_names_remembered_in_order_added() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + MutableEmbeddedComponentModel fred = model.addEmbeddedComponent( + "fred", + "Fred", + COMPONENT_CLASS_NAME); + + fred.addMixin("zip.zop.Zoom"); + fred.addMixin("foo.bar.Baz"); + + assertEquals(fred.getMixinClassNames(), Arrays.asList("zip.zop.Zoom", "foo.bar.Baz")); + + verify(); + } + + @Test + public void mixin_name_conflict() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + MutableEmbeddedComponentModel fred = model.addEmbeddedComponent( + "fred", + "Fred", + COMPONENT_CLASS_NAME); + + fred.addMixin("zip.zop.Zoom"); + + try + { + fred.addMixin("zip.zop.Zoom"); + unreachable(); + } + catch (IllegalArgumentException ex) + { + assertEquals( + ex.getMessage(), + "Mixin zip.zop.Zoom (for component fred) has already been defined."); + } + + // Make sure it wasn't actually added. + + assertEquals(fred.getMixinClassNames(), Arrays.asList("zip.zop.Zoom")); + + verify(); + } + + @Test + public void get_persistent_field_names_when_none_defined() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + assertTrue(model.getPersistentFieldNames().isEmpty()); + + verify(); + } + + @Test + public void get_persistent_field_names_are_sorted() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + assertEquals(model.setFieldPersistenceStrategy("fred", "session"), "fred"); + assertEquals(model.setFieldPersistenceStrategy("barney", "client"), "barney"); + + assertEquals(model.getPersistentFieldNames(), Arrays.asList("barney", "fred")); + + verify(); + } + + @Test + public void persistent_field_names_have_punctuation_stripped() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + assertEquals(model.setFieldPersistenceStrategy("_fred", "session"), "fred"); + assertEquals(model.setFieldPersistenceStrategy("_$barney", "client"), "barney"); + + assertEquals(model.getPersistentFieldNames(), Arrays.asList("barney", "fred")); + + verify(); + } + + @Test + public void get_persistent_field_names_reflects_parent_model() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel parent = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + assertEquals(parent.setFieldPersistenceStrategy("wilma", "session"), "wilma"); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, parent); + + assertEquals(model.setFieldPersistenceStrategy("fred", "session"), "fred"); + assertEquals(model.setFieldPersistenceStrategy("barney", "client"), "barney"); + + assertEquals(model.getPersistentFieldNames(), Arrays.asList("barney", "fred", "wilma")); + + verify(); + } + + @Test + public void persistent_field_names_allocated_in_subclasses_are_unique() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel parent = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + assertEquals(parent.setFieldPersistenceStrategy("wilma", "session"), "wilma"); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, parent); + + assertEquals(model.setFieldPersistenceStrategy("wilma", "session"), "wilma_0"); + + assertEquals(model.getPersistentFieldNames(), Arrays.asList("wilma", "wilma_0")); + + verify(); + } + + @Test + public void get_persistent_field_defined_in_model() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + model.setFieldPersistenceStrategy("fred", "session"); + model.setFieldPersistenceStrategy("barney", "client"); + + assertEquals(model.getFieldPersistenceStrategy("fred"), "session"); + assertEquals(model.getFieldPersistenceStrategy("barney"), "client"); + + verify(); + } + + @Test + public void no_persistence_defined_for_field() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + try + { + model.getFieldPersistenceStrategy("someField"); + unreachable(); + } + catch (IllegalArgumentException ex) + { + assertEquals( + ex.getMessage(), + "No field persistence strategy has been defined for field \'someField\'."); + } + + verify(); + + } + + @Test + public void get_persistent_field_defined_in_parent() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel parent = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, parent); + + parent.setFieldPersistenceStrategy("wilma", "parent"); + + model.setFieldPersistenceStrategy("fred", "session"); + + assertEquals(model.getFieldPersistenceStrategy("wilma"), "parent"); + + verify(); + } + + @Test + public void default_for_supports_informal_parameters_is_false() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + assertFalse(model.getSupportsInformalParameters()); + + model.enableSupportsInformalParameters(); + + assertTrue(model.getSupportsInformalParameters()); + + verify(); + } + + @Test + public void get_mixin_class_names_with_no_mixins() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + ComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + assertTrue(model.getMixinClassNames().isEmpty()); + + verify(); + } + + @Test + public void get_mixin_class_names_mixes_with_parent_model() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel parent = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + + parent.addMixinClassName("Wilma"); + + MutableComponentModel child = new MutableComponentModelImpl(CLASS_NAME, log, r, parent); + + child.addMixinClassName("Fred"); + child.addMixinClassName("Barney"); + + assertEquals(child.getMixinClassNames(), Arrays.asList("Barney", "Fred", "Wilma")); + + verify(); + } + + @Test + public void get_parent_from_subclass() + { + Resource r = newResource(); + Log log = newLog(); + + replay(); + + MutableComponentModel parent = new MutableComponentModelImpl(CLASS_NAME, log, r, null); + MutableComponentModel child = new MutableComponentModelImpl(CLASS_NAME, log, r, parent); + + assertSame(child.getParentModel(), parent); + assertNull(parent.getParentModel()); + + verify(); + } + +}
Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentMessagesSourceImplTest.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentMessagesSourceImplTest.java?view=auto&rev=480728 ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentMessagesSourceImplTest.java (added) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentMessagesSourceImplTest.java Wed Nov 29 14:02:40 2006 @@ -0,0 +1,147 @@ +// Copyright 2006 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package org.apache.tapestry.internal.services; + +import java.util.Locale; + +import org.apache.tapestry.internal.test.InternalBaseTestCase; +import org.apache.tapestry.internal.util.URLChangeTracker; +import org.apache.tapestry.ioc.Messages; +import org.apache.tapestry.ioc.internal.util.ClasspathResource; +import org.apache.tapestry.model.ComponentModel; +import org.testng.annotations.Test; + [EMAIL PROTECTED](sequential = true) +public class ComponentMessagesSourceImplTest extends InternalBaseTestCase +{ + // With control of the tracker, we can force changes as if underlying files were changed. + + private static final String SIMPLE_COMPONENT_CLASS_NAME = "org.apache.tapestry.internal.services.SimpleComponent"; + + private final URLChangeTracker _tracker = new URLChangeTracker(); + + private final ComponentMessagesSourceImpl _source = new ComponentMessagesSourceImpl(_tracker); + + @Test + public void simple_component() + { + ComponentModel model = newComponentModel(); + + train_getComponentClassName(model, SIMPLE_COMPONENT_CLASS_NAME); + + train_getBaseResource(model, _simpleComponentResource); + + train_getParentModel(model, null); + + replay(); + + forceCacheClear(); + + Messages messages = _source.getMessages(model, Locale.ENGLISH); + + assertEquals(messages.get("color"), "color"); + assertEquals(messages.get("framework"), "Tapestry"); + + // Check normal caching + + assertSame(_source.getMessages(model, Locale.ENGLISH), messages); + + // Now, force a cache clear and retry. + + forceCacheClear(); + + Messages messages2 = _source.getMessages(model, Locale.ENGLISH); + + // Check that a new Messages was created + + assertNotSame(messages2, messages); + + assertEquals(messages2.get("color"), "color"); + assertEquals(messages2.get("framework"), "Tapestry"); + + verify(); + } + + private void forceCacheClear() + { + _tracker.forceChange(); + _source.checkForUpdates(); + } + + @Test + public void per_language_messages_override() + { + ComponentModel model = newComponentModel(); + + train_getComponentClassName(model, SIMPLE_COMPONENT_CLASS_NAME); + + train_getBaseResource(model, _simpleComponentResource); + + train_getParentModel(model, null); + + replay(); + + forceCacheClear(); + + Messages messages = _source.getMessages(model, Locale.UK); + + assertEquals(messages.get("color"), "colour"); + assertEquals(messages.get("framework"), "Tapestry"); + + verify(); + } + + @Test + public void subclass_inherits_base_class_messages() + { + ComponentModel model = newComponentModel(); + ComponentModel parent = newComponentModel(); + + train_getComponentClassName( + model, + "org.apache.tapestry.internal.services.SubclassComponent"); + + train_getBaseResource(model, new ClasspathResource( + "org/apache/tapestry/internal/services/SubclassComponent.class")); + + train_getParentModel(model, parent); + + train_getComponentClassName(parent, SIMPLE_COMPONENT_CLASS_NAME); + + train_getBaseResource(parent, _simpleComponentResource); + + train_getParentModel(parent, null); + + replay(); + + forceCacheClear(); + + Messages messages = _source.getMessages(model, Locale.ENGLISH); + + assertEquals(messages.get("color"), "color"); + assertEquals(messages.get("framework"), "Tapestry"); + assertEquals(messages.get("source"), "SubclassComponent"); + assertEquals(messages.get("metal"), "steel"); + + messages = _source.getMessages(model, Locale.UK); + + assertEquals(messages.get("color"), "colour"); + assertEquals(messages.get("framework"), "Tapestry"); + assertEquals(messages.get("source"), "SubclassComponent"); + assertEquals(messages.get("metal"), "aluminium"); + + verify(); + } +} Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/util/MultiKeyTest.java URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/util/MultiKeyTest.java?view=auto&rev=480728 ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/util/MultiKeyTest.java (added) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/util/MultiKeyTest.java Wed Nov 29 14:02:40 2006 @@ -0,0 +1,75 @@ +// Copyright 2006 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package org.apache.tapestry.internal.util; + +import org.testng.Assert; +import org.testng.annotations.Test; + +public class MultiKeyTest extends Assert +{ + @Test + public void same_values_same_hash_codes() + { + MultiKey key1 = new MultiKey(1, 3, "foo"); + MultiKey key2 = new MultiKey(1, 3, "foo"); + MultiKey key3 = new MultiKey(1, 3); + MultiKey key4 = new MultiKey(1, 3, "bar"); + MultiKey key5 = new MultiKey(1, 3, "foo", "bar"); + + assertEquals(key2.hashCode(), key1.hashCode()); + assertFalse(key3.hashCode() == key1.hashCode()); + assertFalse(key4.hashCode() == key1.hashCode()); + assertFalse(key5.hashCode() == key1.hashCode()); + } + + @Test + public void comparisons_against_not_multi_key() + { + MultiKey key = new MultiKey(1, 3, "foo"); + + assertFalse(key.equals(null)); + assertFalse(key.equals("foo")); + } + + @Test + public void comparison_against_self() + { + MultiKey key = new MultiKey(1, 3, "foo"); + + assertTrue(key.equals(key)); + } + + @Test + public void comparisons_against_other_keys() + { + MultiKey key1 = new MultiKey(1, 3, "foo"); + MultiKey key2 = new MultiKey(1, 3, "foo"); + MultiKey key3 = new MultiKey(1, 3); + MultiKey key4 = new MultiKey(1, 3, "bar"); + MultiKey key5 = new MultiKey(1, 3, "foo", "bar"); + + assertEquals(key2, key1); + assertFalse(key3.equals(key1)); + assertFalse(key4.equals(key1)); + assertFalse(key5.equals(key1)); + } + + @Test + public void to_string() + { + assertEquals(new MultiKey("fred").toString(), "MultiKey[fred]"); + assertEquals(new MultiKey("fred", "barney").toString(), "MultiKey[fred, barney]"); + } +} Added: tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SimpleComponent.properties URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SimpleComponent.properties?view=auto&rev=480728 ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SimpleComponent.properties (added) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SimpleComponent.properties Wed Nov 29 14:02:40 2006 @@ -0,0 +1,4 @@ +# Default, American English spelling +color=color +framework=Tapestry +source=SimpleComponent Added: tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SimpleComponent_en_GB.properties URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SimpleComponent_en_GB.properties?view=auto&rev=480728 ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SimpleComponent_en_GB.properties (added) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SimpleComponent_en_GB.properties Wed Nov 29 14:02:40 2006 @@ -0,0 +1,3 @@ +# British spelling + +color=colour Added: tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SubclassComponent.properties URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SubclassComponent.properties?view=auto&rev=480728 ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SubclassComponent.properties (added) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SubclassComponent.properties Wed Nov 29 14:02:40 2006 @@ -0,0 +1,2 @@ +metal=steel +source=SubclassComponent \ No newline at end of file Added: tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SubclassComponent_en_GB.properties URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SubclassComponent_en_GB.properties?view=auto&rev=480728 ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SubclassComponent_en_GB.properties (added) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/internal/services/SubclassComponent_en_GB.properties Wed Nov 29 14:02:40 2006 @@ -0,0 +1 @@ +metal=aluminium
