/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.test.uitools.app; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.eclipse.persistence.tools.workbench.test.utility.TestTools; import org.eclipse.persistence.tools.workbench.uitools.app.ListValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.SimpleListValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.TransformationListValueModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.ValueModel; import org.eclipse.persistence.tools.workbench.utility.AbstractModel; import org.eclipse.persistence.tools.workbench.utility.CollectionTools; import org.eclipse.persistence.tools.workbench.utility.Transformer; import org.eclipse.persistence.tools.workbench.utility.events.ListChangeEvent; import org.eclipse.persistence.tools.workbench.utility.events.ListChangeListener; public class TransformationListValueModelAdapterTests extends TestCase { private ListValueModel listHolder; private ListValueModel transformedListHolder; ListChangeEvent event; String eventType; private static final String ADD = "add"; private static final String REMOVE = "remove"; private static final String REPLACE = "replace"; private static final String CHANGE = "change"; public static Test suite() { TestSuite suite = new TestSuite(TransformationListValueModelAdapterTests.class); suite.addTestSuite(TransformerTests.class); return suite; } public TransformationListValueModelAdapterTests(String name) { super(name); } protected void setUp() throws Exception { super.setUp(); this.listHolder = new SimpleListValueModel(this.buildList()); this.transformedListHolder = this.buildTransformedListHolder(this.listHolder); } private List buildList() { List result = new ArrayList(); result.add("foo"); result.add("bar"); result.add("baz"); return result; } private List buildTransformedList() { return this.transform(this.buildList()); } private List transform(List list) { List result = new ArrayList(list.size()); for (Iterator stream = list.iterator(); stream.hasNext(); ) { String string = (String) stream.next(); if (string == null) { result.add(null); } else { result.add(string.toUpperCase()); } } return result; } private List buildAddList() { List result = new ArrayList(); result.add("joo"); result.add("jar"); result.add("jaz"); return result; } private List buildTransformedAddList() { return this.transform(this.buildAddList()); } private List buildRemoveList() { List result = new ArrayList(); result.add("foo"); result.add("bar"); return result; } private List buildTransformedRemoveList() { return this.transform(this.buildRemoveList()); } ListValueModel buildTransformedListHolder(ListValueModel lvm) { return new TransformationListValueModelAdapter(lvm) { protected Object transformItem(Object item) { return (item == null) ? null : ((String) item).toUpperCase(); } }; } protected void tearDown() throws Exception { TestTools.clear(this); super.tearDown(); } public void testGetValue() { this.transformedListHolder.addListChangeListener(ValueModel.VALUE, this.buildListener()); assertEquals(this.buildTransformedList(), CollectionTools.list((Iterator) this.transformedListHolder.getValue())); } public void testStaleValue() { ListChangeListener listener = this.buildListener(); this.transformedListHolder.addListChangeListener(ValueModel.VALUE, listener); assertEquals(this.buildTransformedList(), CollectionTools.list((Iterator) this.transformedListHolder.getValue())); this.transformedListHolder.removeListChangeListener(ValueModel.VALUE, listener); assertEquals(Collections.EMPTY_LIST, CollectionTools.list((Iterator) this.transformedListHolder.getValue())); } public void testSize() { this.transformedListHolder.addListChangeListener(ValueModel.VALUE, this.buildListener()); assertEquals(this.buildTransformedList().size(), CollectionTools.size((Iterator) this.transformedListHolder.getValue())); } private boolean transformedListContains(Object item) { return CollectionTools.contains((Iterator) this.transformedListHolder.getValue(), item); } private boolean transformedListContainsAll(Collection items) { return CollectionTools.containsAll((Iterator) this.transformedListHolder.getValue(), items); } private boolean transformedListContainsAny(Collection items) { List transformedList = CollectionTools.list((ListIterator) this.transformedListHolder.getValue()); for (Iterator stream = items.iterator(); stream.hasNext(); ) { if (transformedList.contains(stream.next())) { return true; } } return false; } public void testAddItem() { this.transformedListHolder.addListChangeListener(ValueModel.VALUE, this.buildListener()); assertFalse(this.transformedListContains("JOO")); this.listHolder.addItem(2, "joo"); assertTrue(this.transformedListContains("JOO")); assertFalse(this.transformedListContains(null)); this.listHolder.addItem(0, null); assertTrue(this.transformedListContains(null)); } public void testAddItems() { this.transformedListHolder.addListChangeListener(ValueModel.VALUE, this.buildListener()); assertFalse(this.transformedListContainsAny(this.buildTransformedAddList())); this.listHolder.addItems(2, this.buildAddList()); assertTrue(this.transformedListContainsAll(this.buildTransformedAddList())); } public void testRemoveItem() { this.transformedListHolder.addListChangeListener(ValueModel.VALUE, this.buildListener()); assertTrue(this.transformedListContains("BAR")); this.listHolder.removeItem(this.buildList().indexOf("bar")); assertFalse(this.transformedListContains("BAR")); this.listHolder.addItem(1, null); assertTrue(this.transformedListContains(null)); this.listHolder.removeItem(1); assertFalse(this.transformedListContains(null)); } public void testRemoveItems() { this.transformedListHolder.addListChangeListener(ValueModel.VALUE, this.buildListener()); assertTrue(this.transformedListContainsAll(this.buildTransformedRemoveList())); this.listHolder.removeItems(0, 2); assertFalse(this.transformedListContainsAny(this.buildTransformedRemoveList())); } public void testListChangeGeneric() { this.transformedListHolder.addListChangeListener(this.buildListener()); this.verifyListChange(); } public void testListChangeNamed() { this.transformedListHolder.addListChangeListener(ValueModel.VALUE, this.buildListener()); this.verifyListChange(); } private void verifyListChange() { this.event = null; this.eventType = null; this.listHolder.addItem(1, "joo"); this.verifyEvent(ADD, 1, "JOO"); this.event = null; this.eventType = null; this.listHolder.addItem(1, null); this.verifyEvent(ADD, 1, null); this.event = null; this.eventType = null; this.listHolder.removeItem(1); this.verifyEvent(REMOVE, 1, null); this.event = null; this.eventType = null; this.listHolder.removeItem(1); this.verifyEvent(REMOVE, 1, "JOO"); this.event = null; this.eventType = null; this.listHolder.addItems(0, this.buildList()); this.verifyEvent(ADD); assertEquals(this.buildTransformedList(), CollectionTools.list(this.event.items())); this.event = null; this.eventType = null; this.listHolder.replaceItem(0, "joo"); this.verifyEvent(REPLACE); assertFalse(CollectionTools.contains(this.event.items(), "FOO")); assertTrue(CollectionTools.contains(this.event.items(), "JOO")); } private ListChangeListener buildListener() { return new ListChangeListener() { public void itemsAdded(ListChangeEvent e) { TransformationListValueModelAdapterTests.this.eventType = ADD; TransformationListValueModelAdapterTests.this.event = e; } public void itemsRemoved(ListChangeEvent e) { TransformationListValueModelAdapterTests.this.eventType = REMOVE; TransformationListValueModelAdapterTests.this.event = e; } public void itemsReplaced(ListChangeEvent e) { TransformationListValueModelAdapterTests.this.eventType = REPLACE; TransformationListValueModelAdapterTests.this.event = e; } public void listChanged(ListChangeEvent e) { TransformationListValueModelAdapterTests.this.eventType = CHANGE; TransformationListValueModelAdapterTests.this.event = e; } }; } private void verifyEvent(String type) { assertEquals(type, this.eventType); assertEquals(this.transformedListHolder, this.event.getSource()); assertEquals(ValueModel.VALUE, this.event.getListName()); } private void verifyEvent(String type, int index, Object item) { this.verifyEvent(type); assertEquals(index, this.event.getIndex()); assertEquals(item, this.event.items().next()); } public void testHasListeners() { /* * adding listeners to the transformed list will cause listeners * to be added to the wrapped list; * likewise, removing listeners from the transformed list will * cause listeners to be removed from the wrapped list */ assertFalse(((AbstractModel) this.listHolder).hasAnyListChangeListeners(ValueModel.VALUE)); ListChangeListener listener = this.buildListener(); this.transformedListHolder.addListChangeListener(ValueModel.VALUE, listener); assertTrue(((AbstractModel) this.listHolder).hasAnyListChangeListeners(ValueModel.VALUE)); this.transformedListHolder.removeListChangeListener(ValueModel.VALUE, listener); assertFalse(((AbstractModel) this.listHolder).hasAnyListChangeListeners(ValueModel.VALUE)); this.transformedListHolder.addListChangeListener(listener); assertTrue(((AbstractModel) this.listHolder).hasAnyListChangeListeners(ValueModel.VALUE)); this.transformedListHolder.removeListChangeListener(listener); assertFalse(((AbstractModel) this.listHolder).hasAnyListChangeListeners(ValueModel.VALUE)); } /** * execute the same set of tests again, but by passing a Transformer to the adapter * (as opposed to overriding #transformItem(Object)) */ public static class TransformerTests extends TransformationListValueModelAdapterTests { public static Test suite() { TestSuite suite = new TestSuite(TransformationListValueModelAdapterTests.class); suite.addTestSuite(TransformerTests.class); return suite; } public TransformerTests(String name) { super(name); } ListValueModel buildTransformedListHolder(ListValueModel lvm) { return new TransformationListValueModelAdapter(lvm, this.buildTransformer()); } private Transformer buildTransformer() { return new Transformer() { public Object transform(Object o) { return (o == null) ? null : ((String) o).toUpperCase(); } }; } } }