package org.tynamo.descriptor; import java.util.Arrays; import java.util.List; import java.util.Set; import org.apache.tapestry5.func.F; import org.apache.tapestry5.func.Predicate; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.tynamo.test.Bar; import org.tynamo.test.BlogEntry; import org.tynamo.test.Foo; import org.tynamo.test.Searchee; public class TynamoClassDescriptorTest extends Assert { TynamoClassDescriptorImpl classDescriptor; IdentifierDescriptor idProp; TynamoPropertyDescriptor multiWordProp; @BeforeMethod public void setUp() throws Exception { classDescriptor = new TynamoClassDescriptorImpl(Foo.class); idProp = new IdentifierDescriptorImpl(Foo.class, "id", String.class); multiWordProp = new TynamoPropertyDescriptorImpl(Foo.class, "multiWordProperty", String.class); classDescriptor.getPropertyDescriptors().add(idProp); classDescriptor.getPropertyDescriptors().add(multiWordProp); classDescriptor.getMethodDescriptors().add(new TynamoMethodDescriptorImpl(Foo.class, "foo", void.class, new Class[]{})); classDescriptor.setHasCyclicRelationships(true); } @Test public void testClone() throws Exception { TynamoClassDescriptorImpl clone = (TynamoClassDescriptorImpl) classDescriptor.clone(); assertEquals(Foo.class, clone.getBeanType(), "still foo"); assertEquals(clone.getPropertyDescriptors().size(), 2, "2 props"); assertTrue(clone.getPropertyDescriptor("id") instanceof IdentifierDescriptor, "clone has id"); assertEquals(idProp.getName(), clone.getIdentifierDescriptor().getName(), "clone has id"); assertEquals(1, clone.getMethodDescriptors().size(), "still has a method"); assertTrue(clone.getHasCyclicRelationships(), "still has cyclic relationships"); } @Test public void testCopyConstructor() throws Exception { TynamoClassDescriptorImpl copiedDescriptor = new TynamoClassDescriptorImpl(classDescriptor); assertEquals(copiedDescriptor.getBeanType().getSimpleName(), "Foo"); assertEquals(2, copiedDescriptor.getPropertyDescriptors().size(), "2 properties"); assertTrue(copiedDescriptor.getHasCyclicRelationships(), "still has cyclic relationships"); } @Test public void testGetIdentifierProperty() throws Exception { assertEquals(idProp, classDescriptor.getIdentifierDescriptor(), "right id prop"); EmbeddedDescriptor embeddeeDescriptor = new EmbeddedDescriptor(Foo.class, new TynamoPropertyDescriptorImpl(Foo.class, "blork", Bar.class), new TynamoClassDescriptorImpl(Bar.class)); classDescriptor.getPropertyDescriptors().add(embeddeeDescriptor); assertEquals(idProp, classDescriptor.getIdentifierDescriptor(), "right id prop"); } @Test public void testGetDescriptor() throws Exception { assertEquals(multiWordProp, classDescriptor.getPropertyDescriptor("multiWordProperty"), "got right descriptor"); assertNull(classDescriptor.getPropertyDescriptor("doesntexist"), "should return null if none found"); List descriptors = classDescriptor.getPropertyDescriptors(Arrays.asList("multiWordProperty", "id")); assertEquals(2, descriptors.size(), "get 2 descriptors"); assertEquals(multiWordProp, descriptors.get(0), "in specified order"); } @Test public void testHasCyclicRelationshipsDefaultValueFalse() throws Exception { classDescriptor = new TynamoClassDescriptorImpl(BlogEntry.class); assertFalse(classDescriptor.getHasCyclicRelationships(), "default value should be false"); } @Test public void testGetSearchableProperties() { TynamoClassDescriptorImpl classDescriptor = new TynamoClassDescriptorImpl(Searchee.class); classDescriptor.getPropertyDescriptors().add( new TynamoPropertyDescriptorImpl(Foo.class, "someProperty", String.class)); classDescriptor.getPropertyDescriptors().add(new IdentifierDescriptorImpl(Foo.class, "id", String.class)); classDescriptor.getPropertyDescriptors().add(new CollectionDescriptor(Foo.class, "name", Set.class)); List<TynamoPropertyDescriptor> searchableProperties = classDescriptor.getPropertyDescriptors(); searchableProperties = F.flow(searchableProperties).filter(new Predicate<TynamoPropertyDescriptor>() { public boolean accept(TynamoPropertyDescriptor element) { return element.isSearchable(); } }).toList(); assertEquals(2, searchableProperties.size(), "should only be 2 search properties"); assertEquals(searchableProperties.get(0).getName(), "someProperty"); } }