Repository: tapestry-5
Updated Branches:
  refs/heads/master efd7eaedd -> 9a4dd3245


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9a4dd324/genericsresolver-guava/src/test/java/org/apache/tapestry5/internal/genericsresolverguava/AbstractBeanModelSourceImplTest.java
----------------------------------------------------------------------
diff --git 
a/genericsresolver-guava/src/test/java/org/apache/tapestry5/internal/genericsresolverguava/AbstractBeanModelSourceImplTest.java
 
b/genericsresolver-guava/src/test/java/org/apache/tapestry5/internal/genericsresolverguava/AbstractBeanModelSourceImplTest.java
new file mode 100644
index 0000000..96ea169
--- /dev/null
+++ 
b/genericsresolver-guava/src/test/java/org/apache/tapestry5/internal/genericsresolverguava/AbstractBeanModelSourceImplTest.java
@@ -0,0 +1,872 @@
+package org.apache.tapestry5.internal.genericsresolverguava;
+//Copyright 2007, 2008, 2009, 2010, 2011 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.
+
+import org.apache.tapestry5.PropertyConduit;
+import org.apache.tapestry5.beaneditor.BeanModel;
+import org.apache.tapestry5.beaneditor.BeanModelSourceBuilder;
+import org.apache.tapestry5.beaneditor.PropertyModel;
+import org.apache.tapestry5.beaneditor.RelativePosition;
+import org.apache.tapestry5.beaneditor.Sortable;
+import org.apache.tapestry5.internal.PropertyOrderBean;
+import org.apache.tapestry5.internal.services.BeanWithStaticField;
+import org.apache.tapestry5.internal.services.CompositeBean;
+import org.apache.tapestry5.internal.services.EnumBean;
+import org.apache.tapestry5.internal.services.NonVisualBean;
+import org.apache.tapestry5.internal.services.PropertyExpressionException;
+import org.apache.tapestry5.internal.services.SimpleBean;
+import org.apache.tapestry5.internal.services.StoogeBean;
+import org.apache.tapestry5.internal.services.StringArrayBean;
+import org.apache.tapestry5.internal.services.WriteOnlyBean;
+import org.apache.tapestry5.internal.test.InternalBaseTestCase;
+import org.apache.tapestry5.internal.transform.pages.ReadOnlyBean;
+import org.apache.tapestry5.ioc.Messages;
+import org.apache.tapestry5.ioc.util.UnknownValueException;
+import org.apache.tapestry5.services.BeanModelSource;
+import org.easymock.EasyMock;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+/**
+ * Copied from tapestry-core's tests due to the lack of a better option.
+* Tests for the bean editor model source itself, as well as the model classes.
+*/
+public abstract class AbstractBeanModelSourceImplTest extends 
InternalBaseTestCase
+{
+ private BeanModelSource source;
+
+ protected abstract BeanModelSource create();
+
+ @BeforeClass
+ public void setup()
+ {
+     source = create();
+ }
+
+ /**
+  * Tests defaults for property names, labels and conduits.
+  */
+ @Test
+ public void default_model_for_bean()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     assertSame(model.getBeanType(), SimpleBean.class);
+
+     // Based on order of the getter methods (no longer alphabetical)
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("firstName", 
"lastName", "age"));
+
+     assertEquals(model.toString(),
+             "BeanModel[org.apache.tapestry5.internal.services.SimpleBean 
properties:firstName, lastName, age]");
+
+     PropertyModel age = model.get("age");
+
+     assertEquals(age.getLabel(), "Age");
+     assertSame(age.getPropertyType(), int.class);
+     assertEquals(age.getDataType(), "number");
+
+     PropertyModel firstName = model.get("firstName");
+
+     assertEquals(firstName.getLabel(), "First Name");
+     assertEquals(firstName.getPropertyType(), String.class);
+     assertEquals(firstName.getDataType(), "text");
+
+     assertEquals(model.get("lastName").getLabel(), "Last Name");
+
+     PropertyConduit conduit = model.get("lastName").getConduit();
+
+     SimpleBean instance = new SimpleBean();
+
+     instance.setLastName("Lewis Ship");
+
+     assertEquals(conduit.get(instance), "Lewis Ship");
+
+     conduit.set(instance, "TapestryDude");
+
+     assertEquals(instance.getLastName(), "TapestryDude");
+
+     // Now, one with some type coercion.
+
+     age.getConduit().set(instance, "40");
+
+     assertEquals(instance.getAge(), 40);
+
+     verify();
+ }
+
+ @Test
+ public void include_properties()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     assertSame(model.getBeanType(), SimpleBean.class);
+
+     model.include("lastname", "firstname");
+
+     // Based on order of the getter methods (no longer alphabetical)
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("lastName", 
"firstName"));
+
+     verify();
+ }
+
+ @Test
+ public void add_before()
+ {
+     Messages messages = mockMessages();
+     PropertyConduit conduit = mockPropertyConduit();
+
+     Class propertyType = String.class;
+
+     stub_contains(messages, false);
+
+     expect(conduit.getPropertyType()).andReturn(propertyType).atLeastOnce();
+     
expect(conduit.getAnnotation(EasyMock.isA(Class.class))).andStubReturn(null);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("firstName", 
"lastName", "age"));
+
+     // Note the use of case insensitivity here.
+
+     PropertyModel property = model.add(RelativePosition.BEFORE, "lastname", 
"middleInitial", conduit);
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("firstName", 
"middleInitial", "lastName", "age"));
+
+     assertEquals(property.getPropertyName(), "middleInitial");
+     assertSame(property.getConduit(), conduit);
+     assertSame(property.getPropertyType(), propertyType);
+
+     verify();
+ }
+
+ /**
+  * TAPESTRY-2202
+  */
+ @Test
+ public void new_instance()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel<SimpleBean> model = source.create(SimpleBean.class, true, 
messages);
+
+     SimpleBean s1 = model.newInstance();
+
+     assertNotNull(s1);
+
+     SimpleBean s2 = model.newInstance();
+
+     assertNotNull(s2);
+     assertNotSame(s1, s2);
+
+     verify();
+ }
+
+ @Test
+ public void add_before_using_default_conduit()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     model.exclude("firstname");
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("lastName", "age"));
+
+     // Note the use of case insensitivity here.
+
+     PropertyModel property = model.add(RelativePosition.BEFORE, "lastname", 
"firstName");
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("firstName", 
"lastName", "age"));
+
+     assertEquals(property.getPropertyName(), "firstName");
+     assertSame(property.getPropertyType(), String.class);
+
+     verify();
+ }
+
+ @Test
+ public void add_after()
+ {
+     Messages messages = mockMessages();
+     PropertyConduit conduit = mockPropertyConduit();
+
+     Class propertyType = String.class;
+
+     stub_contains(messages, false);
+
+     expect(conduit.getPropertyType()).andReturn(propertyType).atLeastOnce();
+
+     
expect(conduit.getAnnotation(EasyMock.isA(Class.class))).andStubReturn(null);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("firstName", 
"lastName", "age"));
+
+     PropertyModel property = model.add(RelativePosition.AFTER, "firstname", 
"middleInitial", conduit);
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("firstName", 
"middleInitial", "lastName", "age"));
+
+     assertEquals(property.getPropertyName(), "middleInitial");
+     assertSame(property.getConduit(), conduit);
+     assertSame(property.getPropertyType(), propertyType);
+
+     verify();
+ }
+
+ @Test
+ public void filtering_out_read_only_properties()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(ReadOnlyBean.class, true, messages);
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("value"));
+
+     model = source.create(ReadOnlyBean.class, false, messages);
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("value", 
"readOnly"));
+
+     verify();
+ }
+
+ @Test
+ public void non_text_property()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(EnumBean.class, true, messages);
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("token"));
+
+     assertEquals(model.get("token").getDataType(), "enum");
+
+     verify();
+ }
+
+ @Test
+ public void add_duplicate_property_name_is_failure()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     try
+     {
+         model.add("age");
+         unreachable();
+     } catch (RuntimeException ex)
+     {
+         assertEquals(
+                 ex.getMessage(),
+                 "Bean editor model for 
org.apache.tapestry5.internal.services.SimpleBean already contains a property 
model for property \'age\'.");
+     }
+
+     verify();
+ }
+
+ @Test
+ public void unknown_property_name()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     try
+     {
+         model.get("frobozz");
+         unreachable();
+     } catch (UnknownValueException ex)
+     {
+         assertEquals(
+                 ex.getMessage(),
+                 "Bean editor model for 
org.apache.tapestry5.internal.services.SimpleBean does not contain a property 
named \'frobozz\'.");
+
+         assertListsEquals(ex.getAvailableValues().getValues(), "age", 
"firstName", "lastName");
+     }
+
+     verify();
+ }
+
+ @Test
+ public void unknown_property_id()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     model.addEmpty("shrub.foo()");
+
+     try
+     {
+         model.getById("frobozz");
+         unreachable();
+     } catch (UnknownValueException ex)
+     {
+         assertEquals(
+                 ex.getMessage(),
+                 "Bean editor model for 
org.apache.tapestry5.internal.services.SimpleBean does not contain a property 
with id \'frobozz\'.");
+
+         assertListsEquals(ex.getAvailableValues().getValues(), "age", 
"firstName", "lastName", "shrubfoo");
+     }
+
+     verify();
+ }
+
+ @Test
+ public void get_added_property_by_name()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     PropertyModel pm = model.addEmpty("shrub.foo()");
+
+     assertSame(model.get("Shrub.Foo()"), pm);
+
+     verify();
+ }
+
+ @Test
+ public void get_added_property_by_id()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     PropertyModel pm = model.addEmpty("shrub.foo()");
+
+     assertSame(model.getById("ShrubFoo"), pm);
+
+     verify();
+
+ }
+
+ @Test
+ public void order_via_annotation()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(StoogeBean.class, true, messages);
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("larry", "moe", 
"shemp", "curly"));
+
+     verify();
+ }
+
+ @Test
+ public void edit_property_label()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, 
messages).get("age").label("Decrepitude").model();
+
+     assertEquals(model.get("age").getLabel(), "Decrepitude");
+
+     verify();
+ }
+
+ @Test
+ public void label_from_component_messages()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     train_contains(messages, "age-label", true);
+     train_get(messages, "age-label", "Decrepitude");
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     assertEquals(model.get("age").getLabel(), "Decrepitude");
+
+     verify();
+ }
+
+ @Test
+ public void array_type_bean()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(StringArrayBean.class, true, messages);
+
+     // There's not editor for string arrays yet, so it won't show up normally.
+
+     PropertyModel propertyModel = model.add("array");
+
+     assertSame(propertyModel.getPropertyType(), String[].class);
+
+     String[] value =
+             {"foo", "bar"};
+
+     StringArrayBean bean = new StringArrayBean();
+
+     PropertyConduit conduit = propertyModel.getConduit();
+
+     conduit.set(bean, value);
+
+     assertSame(bean.getArray(), value);
+
+     assertSame(conduit.get(bean), value);
+
+     verify();
+ }
+
+ @Test
+ public void composite_bean()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     train_contains(messages, "simpleage-label", true);
+     train_get(messages, "simpleage-label", "Years of Age");
+
+     replay();
+
+     BeanModel model = source.create(CompositeBean.class, true, messages);
+
+     // No editor for CompositeBean, so this will be empty.
+
+     assertEquals(model.getPropertyNames(), Collections.emptyList());
+
+     // There's not editor for string arrays yet, so it won't show up normally.
+
+     PropertyModel firstName = model.add("simple.firstName");
+
+     assertEquals(firstName.getLabel(), "First Name");
+
+     PropertyModel age = model.add("simple.age");
+     assertEquals(age.getLabel(), "Years of Age");
+
+     CompositeBean bean = new CompositeBean();
+
+     firstName.getConduit().set(bean, "Fred");
+     age.getConduit().set(bean, "97");
+
+     assertEquals(bean.getSimple().getFirstName(), "Fred");
+     assertEquals(bean.getSimple().getAge(), 97);
+
+     bean.getSimple().setAge(24);
+
+     assertEquals(age.getConduit().get(bean), new Integer(24));
+
+     verify();
+ }
+
+ @Test
+ public void default_properties_exclude_write_only()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(WriteOnlyBean.class, false, messages);
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("readOnly", 
"readWrite"));
+
+     verify();
+ }
+
+ @Test
+ public void add_synthetic_property()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     PropertyModel property = model.addEmpty("placeholder");
+
+     assertFalse(property.isSortable());
+     assertSame(property.getPropertyType(), Object.class);
+     assertEquals(property.getLabel(), "Placeholder");
+
+     verify();
+ }
+
+ @Test
+ public void add_missing_property_is_failure()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     try
+     {
+         model.add("doesNotExist");
+         unreachable();
+     } catch (PropertyExpressionException ex)
+     {
+         assertMessageContains(ex, "does not contain", "doesNotExist");
+     }
+
+     verify();
+ }
+
+ @Test
+ public void exclude_property()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     assertSame(model.exclude("age"), model);
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("firstName", 
"lastName"));
+
+     verify();
+ }
+
+ @Test
+ public void exclude_unknown_property_is_noop()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     assertSame(model.exclude("frobozz"), model);
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("firstName", 
"lastName", "age"));
+
+     verify();
+ }
+
+ @Test
+ public void nonvisual_properties_are_excluded()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(NonVisualBean.class, true, messages);
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("name"));
+
+     verify();
+ }
+
+ @Test
+ public void reorder()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(SimpleBean.class, true, messages);
+
+     assertSame(model.getBeanType(), SimpleBean.class);
+
+     // Based on order of the getter methods (no longer alphabetical)
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("firstName", 
"lastName", "age"));
+
+     // Testing a couple of things here:
+     // 1) case insensitive
+     // 2) unreferenced property names added to the end.
+
+     model.reorder("lastname", "AGE");
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("lastName", "age", 
"firstName"));
+
+     verify();
+ }
+
+ @Test
+ public void reoder_from_annotation()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel model = source.create(PropertyOrderBean.class, true, messages);
+
+     assertEquals(model.getPropertyNames(), Arrays.asList("third", "first", 
"second"));
+
+     verify();
+ }
+
+ // https://issues.apache.org/jira/browse/TAP5-1798
+ @Test
+ public void static_fields_are_ignored()
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel<BeanWithStaticField> model = 
source.createDisplayModel(BeanWithStaticField.class,  messages);
+
+     assertListsEquals(model.getPropertyNames(), "name");
+
+     verify();
+ }
+ 
+ // https://issues.apache.org/jira/browse/TAP5-2305
+ @Test
+ public void sortable_annotation() 
+ {
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel<SortableBean> model = 
source.createDisplayModel(SortableBean.class,  messages);
+     model.add("nonSortableByDefault");
+     model.add("sortable");
+     
+     // checking whether non-@Sortable annotated properties still behave in 
the old ways
+     assertTrue(model.get("sortableByDefault").isSortable());
+     assertFalse(model.get("nonSortableByDefault").isSortable());
+     
+     // checking @Sortable itself
+     assertFalse(model.get("nonSortable").isSortable());
+     assertTrue(model.get("sortable").isSortable());
+
+     verify();
+ }
+ 
+ // https://issues.apache.org/jira/browse/TAP5-2560
+ @Test
+ public void missing_property_due_to_wrong_type_parameter_resolution() 
+ {
+
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel<FileContentUnit> beanModel = 
source.createDisplayModel(FileContentUnit.class, messages);
+     
+     // throws 
"org.apache.tapestry5.internal.services.PropertyExpressionException: Exception 
generating conduit for expression 'content.mimeType': Class 
org.apache.tapestry5.internal.services.AbstractBeanModelSourceImplTest$ContentData
 does not contain a property (or public field) named 'mimeType'." without fix
+     beanModel.add("content.mimeType");
+
+     verify();
+
+ }
+ 
+ // https://issues.apache.org/jira/browse/TAP5-2560
+ @Test
+ public void handling_nested_generics() 
+ {
+
+     Messages messages = mockMessages();
+
+     stub_contains(messages, false);
+
+     replay();
+
+     BeanModel<BeanHolder> beanModel = 
source.createDisplayModel(BeanHolder.class, messages);
+     
+     // this line would throw an exception
+     beanModel.add("bean.value");
+
+     verify();
+
+ }
+ 
+ 
+ final private static class SortableBean
+ {
+     private int sortableByDefault;
+     private int nonSortable;
+     private SimpleBean sortable;
+     private SimpleBean nonSortableByDefault;
+     
+     public int getSortableByDefault()
+     {
+         return sortableByDefault;
+     }
+     
+     @Sortable(false)
+     public int getNonSortable()
+     {
+         return nonSortable;
+     }
+     
+     @Sortable(true)
+     public SimpleBean getSortable()
+     {
+         return sortable;
+     }
+     
+     public SimpleBean getNonSortableByDefault()
+     {
+         return nonSortableByDefault;
+     }
+     
+ }
+ 
+    public interface NonTranslatableContentUnit<T extends ContentData> {
+        T getContent();
+    }
+
+    public interface BinaryContentUnit<T extends BinaryContent> extends 
NonTranslatableContentUnit<T> {
+    }
+
+    public interface FileContentUnit extends BinaryContentUnit<FileContent> {
+    }
+
+    public interface ContentData {
+
+        boolean isEmpty();
+    }
+
+    public interface BinaryContent extends ContentData {
+
+        String getMimeType();
+    }
+
+    public interface FileContent extends BinaryContent {
+    }
+
+    public class ConcreteFileContent implements FileContentUnit {
+
+        @Override
+        public FileContent getContent() {
+            return null;
+        }
+
+    }
+    
+    public class BeanHolder {
+        private final Bean bean;
+
+        public BeanHolder(Bean bean) {
+            super();
+            this.bean = bean;
+        }
+
+        
+        public Bean getBean() {
+            return bean;
+        }
+        
+    }
+    
+    public class Bean<T> implements Comparable<Bean<T>> {
+
+        private final T value_;
+
+        public Bean(T value) {
+            value_ = value;
+        }
+
+        @Override
+        public int compareTo(Bean<T> o) {
+            return 0;
+        }
+
+        public T getValue() {
+            return value_;
+        }
+    }
+ 
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9a4dd324/genericsresolver-guava/src/test/java/org/apache/tapestry5/internal/genericsresolverguava/GuavaBeanModelSourceImplTest.java
----------------------------------------------------------------------
diff --git 
a/genericsresolver-guava/src/test/java/org/apache/tapestry5/internal/genericsresolverguava/GuavaBeanModelSourceImplTest.java
 
b/genericsresolver-guava/src/test/java/org/apache/tapestry5/internal/genericsresolverguava/GuavaBeanModelSourceImplTest.java
new file mode 100644
index 0000000..dd75b37
--- /dev/null
+++ 
b/genericsresolver-guava/src/test/java/org/apache/tapestry5/internal/genericsresolverguava/GuavaBeanModelSourceImplTest.java
@@ -0,0 +1,24 @@
+// 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.tapestry5.internal.genericsresolverguava;
+
+import org.apache.tapestry5.services.BeanModelSource;
+
+public class GuavaBeanModelSourceImplTest extends 
AbstractBeanModelSourceImplTest {
+
+    @Override
+    protected BeanModelSource create()
+    {
+        return getObject(BeanModelSource.class, null);
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9a4dd324/genericsresolver-guava/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/genericsresolver-guava/src/test/resources/log4j.properties 
b/genericsresolver-guava/src/test/resources/log4j.properties
new file mode 100644
index 0000000..3042b69
--- /dev/null
+++ b/genericsresolver-guava/src/test/resources/log4j.properties
@@ -0,0 +1,10 @@
+log4j.rootCategory=INFO, A1
+
+# A1 is set to be a ConsoleAppender. 
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+# A1 uses PatternLayout.
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=[%p] %c{1} %m%n
+
+log4j.category.org.example.testapp=debug

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9a4dd324/settings.gradle
----------------------------------------------------------------------
diff --git a/settings.gradle b/settings.gradle
index 593c3a4..5368408 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -4,5 +4,5 @@ include "tapestry-beanvalidator", "tapestry-jpa", 
"tapestry-kaptcha"
 include "tapestry-javadoc", "quickstart", "tapestry-clojure", 
"tapestry-mongodb"
 include "tapestry-test-data", 'tapestry-internal-test', "tapestry-ioc-junit"
 include "tapestry-webresources", "tapestry-runner", "tapestry-test-constants"
-include "tapestry-ioc-jcache", "beanmodel", "commons"
+include "tapestry-ioc-jcache", "beanmodel", "commons", "genericsresolver-guava"
 // include "tapestry-cdi"

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/9a4dd324/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AbstractBeanModelSourceImplTest.java
----------------------------------------------------------------------
diff --git 
a/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AbstractBeanModelSourceImplTest.java
 
b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AbstractBeanModelSourceImplTest.java
index a3b5939..83b1067 100644
--- 
a/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AbstractBeanModelSourceImplTest.java
+++ 
b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/AbstractBeanModelSourceImplTest.java
@@ -724,7 +724,8 @@ public abstract class AbstractBeanModelSourceImplTest 
extends InternalBaseTestCa
     }
     
     // https://issues.apache.org/jira/browse/TAP5-2560
-    @Test
+    // Tapestry's GenericsResolver cannot handle this.
+    @Test(enabled = false) 
     public void missing_property_due_to_wrong_type_parameter_resolution() 
     {
 

Reply via email to