You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2014/11/14 18:47:18 UTC

[17/50] [abbrv] cayenne git commit: random tests cleanup

random tests cleanup


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/8990e655
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/8990e655
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/8990e655

Branch: refs/heads/CAY-1946
Commit: 8990e65545d4d65773a0e5d1350a9e602a0d3d77
Parents: 2430e94
Author: aadamchik <aa...@apache.org>
Authored: Tue Nov 4 20:16:05 2014 +0300
Committer: aadamchik <aa...@apache.org>
Committed: Tue Nov 4 20:21:01 2014 +0300

----------------------------------------------------------------------
 .../apache/cayenne/NestedCayenneContextIT.java  | 1309 +++++++++---------
 .../org/apache/cayenne/remote/MockMessage.java  |   50 -
 .../remote/NestedObjectContextLocalIT.java      |    2 +-
 .../cayenne/remote/ROPPrefetchToManyMapIT.java  |    2 +-
 .../remote/RemoteIncrementalFaultListIT.java    |  483 +++----
 .../apache/cayenne/remote/ValueInjectorIT.java  |    5 +-
 6 files changed, 906 insertions(+), 945 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/8990e655/cayenne-client/src/test/java/org/apache/cayenne/NestedCayenneContextIT.java
----------------------------------------------------------------------
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/NestedCayenneContextIT.java b/cayenne-client/src/test/java/org/apache/cayenne/NestedCayenneContextIT.java
index 8420770..d40ed76 100644
--- a/cayenne-client/src/test/java/org/apache/cayenne/NestedCayenneContextIT.java
+++ b/cayenne-client/src/test/java/org/apache/cayenne/NestedCayenneContextIT.java
@@ -18,6 +18,11 @@
  ****************************************************************/
 package org.apache.cayenne;
 
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
 import org.apache.cayenne.configuration.rop.client.ClientRuntime;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.graph.GraphChangeHandler;
@@ -40,862 +45,864 @@ import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
 /**
  * Tests nested object contexts
  */
 @UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-@RunWith(value=Parameterized.class)
+@RunWith(value = Parameterized.class)
 public class NestedCayenneContextIT extends RemoteCayenneCase {
 
-    @Inject
-    private ClientRuntime runtime;
-    
-    @Inject
-    private DBHelper dbHelper;
+	@Inject
+	private ClientRuntime runtime;
+
+	@Inject
+	private DBHelper dbHelper;
+
+	@Inject
+	private DataChannelInterceptor queryInterceptor;
+
+	@Parameters
+	public static Collection<Object[]> data() {
+		return Arrays.asList(new Object[][] {
+				{ LocalConnection.HESSIAN_SERIALIZATION },
+				{ LocalConnection.JAVA_SERIALIZATION },
+				{ LocalConnection.NO_SERIALIZATION }, });
+	}
+
+	public NestedCayenneContextIT(int serializationPolicy) {
+		super.serializationPolicy = serializationPolicy;
+	}
+
+	@Override
+	public void setUpAfterInjection() throws Exception {
+		super.setUpAfterInjection();
+
+		dbHelper.deleteAll("MT_TABLE2");
+		dbHelper.deleteAll("MT_TABLE1");
+	}
+
+	@Test
+	public void testChannels() {
+		ObjectContext child = runtime.newContext(clientContext);
+
+		assertNotNull(child);
+		assertSame(clientContext, child.getChannel());
+
+		// second level of nesting
+		ObjectContext grandchild = runtime.newContext((DataChannel) child);
+
+		assertNotNull(grandchild);
+		assertSame(child, grandchild.getChannel());
+	}
+
+	@Test
+	public void testSelect() throws Exception {
+		ObjectContext child = runtime.newContext(clientContext);
+
+		ClientMtTable1 committed = clientContext
+				.newObject(ClientMtTable1.class);
+		ClientMtTable1 deleted = clientContext.newObject(ClientMtTable1.class);
+		ClientMtTable1 modified = clientContext.newObject(ClientMtTable1.class);
+
+		clientContext.commitChanges();
+		int modifiedid = Cayenne.intPKForObject(modified);
+
+		// test how different object states appear in the child on select
+
+		clientContext.deleteObjects(deleted);
+		modified.setGlobalAttribute1("a");
+
+		ClientMtTable1 _new = clientContext.newObject(ClientMtTable1.class);
 
-    @Inject
-    private DataChannelInterceptor queryInterceptor;
+		assertEquals(PersistenceState.COMMITTED,
+				committed.getPersistenceState());
+		assertEquals(PersistenceState.MODIFIED, modified.getPersistenceState());
+		assertEquals(PersistenceState.DELETED, deleted.getPersistenceState());
+		assertEquals(PersistenceState.NEW, _new.getPersistenceState());
 
-    @Parameters
-    public static Collection<Object[]> data() {
-        return Arrays.asList(new Object[][]{
-                {LocalConnection.HESSIAN_SERIALIZATION},
-                {LocalConnection.JAVA_SERIALIZATION},
-                {LocalConnection.NO_SERIALIZATION},
-        });
-    }
+		List<ClientMtTable1> objects = child
+				.select(new SelectQuery<ClientMtTable1>(ClientMtTable1.class));
+		assertEquals("All but NEW object must have been included", 3,
+				objects.size());
 
-    public NestedCayenneContextIT(int serializationPolicy) {
-        super.serializationPolicy = serializationPolicy;
-    }
+		for (ClientMtTable1 next : objects) {
+			assertEquals(PersistenceState.COMMITTED, next.getPersistenceState());
 
-    @Override
-    public void setUpAfterInjection() throws Exception {
-        super.setUpAfterInjection();
+			int id = Cayenne.intPKForObject(next);
+			if (id == modifiedid) {
+				assertEquals("a", next.getGlobalAttribute1());
+			}
+		}
+	}
 
-        dbHelper.deleteAll("MT_TABLE2");
-        dbHelper.deleteAll("MT_TABLE1");
-    }
+	@Test
+	public void testPrefetchingToOne() throws Exception {
+		final ClientMtTable1 mt11 = clientContext
+				.newObject(ClientMtTable1.class);
+		clientContext.newObject(ClientMtTable1.class);
+		ClientMtTable2 mt21 = clientContext.newObject(ClientMtTable2.class);
+		ClientMtTable2 mt22 = clientContext.newObject(ClientMtTable2.class);
 
-    @Test
-    public void testChannels() {
-        ObjectContext child = runtime.newContext(clientContext);
+		mt21.setTable1(mt11);
+		mt22.setTable1(mt11);
 
-        assertNotNull(child);
-        assertSame(clientContext, child.getChannel());
+		clientContext.commitChanges();
 
-        // second level of nesting
-        ObjectContext grandchild = runtime.newContext((DataChannel) child);
+		final ObjectContext child = runtime.newContext(clientContext);
 
-        assertNotNull(grandchild);
-        assertSame(child, grandchild.getChannel());
-    }
+		SelectQuery<ClientMtTable2> q = new SelectQuery<ClientMtTable2>(
+				ClientMtTable2.class);
+		q.addPrefetch(ClientMtTable2.TABLE1_PROPERTY);
 
-    @Test
-    public void testSelect() throws Exception {
-        ObjectContext child = runtime.newContext(clientContext);
+		final List<ClientMtTable2> results = child.select(q);
 
-        ClientMtTable1 committed = clientContext.newObject(ClientMtTable1.class);
-        ClientMtTable1 deleted = clientContext.newObject(ClientMtTable1.class);
-        ClientMtTable1 modified = clientContext.newObject(ClientMtTable1.class);
+		queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
 
-        clientContext.commitChanges();
-        int modifiedid = Cayenne.intPKForObject(modified);
+			public void execute() {
+				assertEquals(2, results.size());
+				Iterator<?> it = results.iterator();
+				while (it.hasNext()) {
+					ClientMtTable2 o = (ClientMtTable2) it.next();
+					assertEquals(PersistenceState.COMMITTED,
+							o.getPersistenceState());
+					assertSame(child, o.getObjectContext());
 
-        // test how different object states appear in the child on select
+					ClientMtTable1 o1 = o.getTable1();
+					assertNotNull(o1);
+					assertEquals(PersistenceState.COMMITTED,
+							o1.getPersistenceState());
+					assertSame(child, o1.getObjectContext());
+					assertEquals(mt11.getObjectId(), o1.getObjectId());
+				}
+			}
+		});
+	}
 
-        clientContext.deleteObjects(deleted);
-        modified.setGlobalAttribute1("a");
+	@Test
+	public void testPrefetchingToMany() throws Exception {
+		ClientMtTable1 mt11 = clientContext.newObject(ClientMtTable1.class);
+		mt11.setGlobalAttribute1("1");
 
-        ClientMtTable1 _new = clientContext.newObject(ClientMtTable1.class);
+		ClientMtTable1 mt12 = clientContext.newObject(ClientMtTable1.class);
+		mt12.setGlobalAttribute1("2");
 
-        assertEquals(PersistenceState.COMMITTED, committed.getPersistenceState());
-        assertEquals(PersistenceState.MODIFIED, modified.getPersistenceState());
-        assertEquals(PersistenceState.DELETED, deleted.getPersistenceState());
-        assertEquals(PersistenceState.NEW, _new.getPersistenceState());
+		ClientMtTable2 mt21 = clientContext.newObject(ClientMtTable2.class);
+		ClientMtTable2 mt22 = clientContext.newObject(ClientMtTable2.class);
 
-        List<?> objects = child.performQuery(new SelectQuery(ClientMtTable1.class));
-        assertEquals("All but NEW object must have been included", 3, objects.size());
+		mt21.setTable1(mt11);
+		mt22.setTable1(mt11);
 
-        Iterator<?> it = objects.iterator();
-        while (it.hasNext()) {
-            ClientMtTable1 next = (ClientMtTable1) it.next();
-            assertEquals(PersistenceState.COMMITTED, next.getPersistenceState());
+		clientContext.commitChanges();
 
-            int id = Cayenne.intPKForObject(next);
-            if (id == modifiedid) {
-                assertEquals("a", next.getGlobalAttribute1());
-            }
-        }
-    }
+		final ObjectContext child = runtime.newContext(clientContext);
 
-    @Test
-    public void testPrefetchingToOne() throws Exception {
-        final ClientMtTable1 mt11 = clientContext.newObject(ClientMtTable1.class);
-        clientContext.newObject(ClientMtTable1.class);
-        ClientMtTable2 mt21 = clientContext.newObject(ClientMtTable2.class);
-        ClientMtTable2 mt22 = clientContext.newObject(ClientMtTable2.class);
+		SelectQuery<ClientMtTable1> q = new SelectQuery<ClientMtTable1>(
+				ClientMtTable1.class);
+		q.addOrdering("globalAttribute1", SortOrder.ASCENDING);
+		q.addPrefetch(ClientMtTable1.TABLE2ARRAY_PROPERTY);
 
-        mt21.setTable1(mt11);
-        mt22.setTable1(mt11);
+		final List<ClientMtTable1> results = child.select(q);
 
-        clientContext.commitChanges();
+		queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
 
-        final ObjectContext child = runtime.newContext(clientContext);
+			public void execute() {
+				ClientMtTable1 o1 = results.get(0);
+				assertEquals(PersistenceState.COMMITTED,
+						o1.getPersistenceState());
+				assertSame(child, o1.getObjectContext());
 
-        SelectQuery q = new SelectQuery(ClientMtTable2.class);
-        q.addPrefetch(ClientMtTable2.TABLE1_PROPERTY);
+				List<ClientMtTable2> children1 = o1.getTable2Array();
 
-        final List<?> results = child.performQuery(q);
+				assertEquals(2, children1.size());
+				Iterator<ClientMtTable2> it = children1.iterator();
+				while (it.hasNext()) {
+					ClientMtTable2 o = it.next();
+					assertEquals(PersistenceState.COMMITTED,
+							o.getPersistenceState());
+					assertSame(child, o.getObjectContext());
 
-        queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+					assertEquals(o1, o.getTable1());
+				}
 
-            public void execute() {
-                assertEquals(2, results.size());
-                Iterator<?> it = results.iterator();
-                while (it.hasNext()) {
-                    ClientMtTable2 o = (ClientMtTable2) it.next();
-                    assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-                    assertSame(child, o.getObjectContext());
+				ClientMtTable1 o2 = results.get(1);
+				assertEquals(PersistenceState.COMMITTED,
+						o2.getPersistenceState());
+				assertSame(child, o2.getObjectContext());
 
-                    ClientMtTable1 o1 = o.getTable1();
-                    assertNotNull(o1);
-                    assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
-                    assertSame(child, o1.getObjectContext());
-                    assertEquals(mt11.getObjectId(), o1.getObjectId());
-                }
-            }
-        });
-    }
+				List<?> children2 = o2.getTable2Array();
 
-    @Test
-    public void testPrefetchingToMany() throws Exception {
-        ClientMtTable1 mt11 = clientContext.newObject(ClientMtTable1.class);
-        mt11.setGlobalAttribute1("1");
+				assertEquals(0, children2.size());
+			}
+		});
+	}
 
-        ClientMtTable1 mt12 = clientContext.newObject(ClientMtTable1.class);
-        mt12.setGlobalAttribute1("2");
+	@Test
+	public void testDeleteNew() throws Exception {
+		ObjectContext child = runtime.newContext(clientContext);
 
-        ClientMtTable2 mt21 = clientContext.newObject(ClientMtTable2.class);
-        ClientMtTable2 mt22 = clientContext.newObject(ClientMtTable2.class);
+		ClientMtTable1 a = clientContext.newObject(ClientMtTable1.class);
+		clientContext.commitChanges();
 
-        mt21.setTable1(mt11);
-        mt22.setTable1(mt11);
+		ClientMtTable2 p = child.newObject(ClientMtTable2.class);
+		ClientMtTable1 aChild = (ClientMtTable1) Cayenne.objectForPK(child,
+				a.getObjectId());
+		p.setGlobalAttribute("X");
+		aChild.addToTable2Array(p);
 
-        clientContext.commitChanges();
+		child.commitChangesToParent();
 
-        final ObjectContext child = runtime.newContext(clientContext);
+		child.deleteObjects(p);
+		aChild.removeFromTable2Array(p);
 
-        SelectQuery q = new SelectQuery(ClientMtTable1.class);
-        q.addOrdering("globalAttribute1", SortOrder.ASCENDING);
-        q.addPrefetch(ClientMtTable1.TABLE2ARRAY_PROPERTY);
+		child.commitChangesToParent();
+	}
 
-        final List<?> results = child.performQuery(q);
+	/**
+	 * A test case for CAY-698 bug.
+	 */
+	@Test
+	public void testNullifyToOne() throws Exception {
+		ClientMtTable1 a = clientContext.newObject(ClientMtTable1.class);
+		ClientMtTable2 b = clientContext.newObject(ClientMtTable2.class);
+		a.addToTable2Array(b);
 
-        queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+		clientContext.commitChanges();
 
-            public void execute() {
-                ClientMtTable1 o1 = (ClientMtTable1) results.get(0);
-                assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
-                assertSame(child, o1.getObjectContext());
+		final ObjectContext child = runtime.newContext(clientContext);
+		ObjectContext childPeer = runtime.newContext(clientContext);
 
-                List<ClientMtTable2> children1 = o1.getTable2Array();
+		final ClientMtTable2 childP1 = (ClientMtTable2) Cayenne.objectForPK(
+				child, b.getObjectId());
 
-                assertEquals(2, children1.size());
-                Iterator<ClientMtTable2> it = children1.iterator();
-                while (it.hasNext()) {
-                    ClientMtTable2 o = it.next();
-                    assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-                    assertSame(child, o.getObjectContext());
+		// trigger object creation in the peer nested DC
+		Cayenne.objectForPK(childPeer, b.getObjectId());
+		childP1.setTable1(null);
 
-                    assertEquals(o1, o.getTable1());
-                }
+		queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
 
-                ClientMtTable1 o2 = (ClientMtTable1) results.get(1);
-                assertEquals(PersistenceState.COMMITTED, o2.getPersistenceState());
-                assertSame(child, o2.getObjectContext());
+			public void execute() {
+				child.commitChangesToParent();
+				assertEquals(PersistenceState.COMMITTED,
+						childP1.getPersistenceState());
 
-                List<?> children2 = o2.getTable2Array();
+				ClientMtTable2 parentP1 = (ClientMtTable2) clientContext
+						.getGraphManager().getNode(childP1.getObjectId());
 
-                assertEquals(0, children2.size());
-            }
-        });
-    }
+				assertNotNull(parentP1);
+				assertEquals(PersistenceState.MODIFIED,
+						parentP1.getPersistenceState());
+				assertNull(parentP1.getTable1());
 
-    @Test
-    public void testDeleteNew() throws Exception {
-        ObjectContext child = runtime.newContext(clientContext);
+				// check that arc changes got recorded in the parent context
+				GraphDiff diffs = clientContext.internalGraphManager()
+						.getDiffs();
+				final int[] arcDiffs = new int[1];
 
-        ClientMtTable1 a = clientContext.newObject(ClientMtTable1.class);
-        clientContext.commitChanges();
+				diffs.apply(new GraphChangeHandler() {
 
-        ClientMtTable2 p = child.newObject(ClientMtTable2.class);
-        ClientMtTable1 aChild = (ClientMtTable1) Cayenne.objectForPK(
-                child,
-                a.getObjectId());
-        p.setGlobalAttribute("X");
-        aChild.addToTable2Array(p);
+					public void arcCreated(Object nodeId, Object targetNodeId,
+							Object arcId) {
+						arcDiffs[0]++;
+					}
 
-        child.commitChangesToParent();
+					public void arcDeleted(Object nodeId, Object targetNodeId,
+							Object arcId) {
+						arcDiffs[0]--;
+					}
 
-        child.deleteObjects(p);
-        aChild.removeFromTable2Array(p);
+					public void nodeCreated(Object nodeId) {
 
-        child.commitChangesToParent();
-    }
+					}
 
-    /**
-     * A test case for CAY-698 bug.
-     */
-    @Test
-    public void testNullifyToOne() throws Exception {
-        ClientMtTable1 a = clientContext.newObject(ClientMtTable1.class);
-        ClientMtTable2 b = clientContext.newObject(ClientMtTable2.class);
-        a.addToTable2Array(b);
+					public void nodeIdChanged(Object nodeId, Object newId) {
+					}
 
-        clientContext.commitChanges();
+					public void nodePropertyChanged(Object nodeId,
+							String property, Object oldValue, Object newValue) {
+					}
 
-        final ObjectContext child = runtime.newContext(clientContext);
-        ObjectContext childPeer = runtime.newContext(clientContext);
+					public void nodeRemoved(Object nodeId) {
 
-        final ClientMtTable2 childP1 = (ClientMtTable2) Cayenne.objectForPK(
-                child,
-                b.getObjectId());
+					}
+				});
 
-        // trigger object creation in the peer nested DC
-        Cayenne.objectForPK(childPeer, b.getObjectId());
-        childP1.setTable1(null);
+				assertEquals(-2, arcDiffs[0]);
+			}
+		});
+	}
 
-        queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+	@Test
+	public void testCommitChangesToParent() throws Exception {
+		clientContext.newObject(ClientMtTable1.class);
+		clientContext.newObject(ClientMtTable1.class);
+		clientContext.newObject(ClientMtTable1.class);
+		clientContext.newObject(ClientMtTable1.class);
+		clientContext.commitChanges();
 
-            public void execute() {
-                child.commitChangesToParent();
-                assertEquals(PersistenceState.COMMITTED, childP1.getPersistenceState());
+		final ObjectContext child = runtime.newContext(clientContext);
 
-                ClientMtTable2 parentP1 = (ClientMtTable2) clientContext
-                        .getGraphManager()
-                        .getNode(childP1.getObjectId());
+		SelectQuery<ClientMtTable1> query = new SelectQuery<ClientMtTable1>(
+				ClientMtTable1.class);
+		List<ClientMtTable1> objects = child.select(query);
 
-                assertNotNull(parentP1);
-                assertEquals(PersistenceState.MODIFIED, parentP1.getPersistenceState());
-                assertNull(parentP1.getTable1());
+		assertEquals(4, objects.size());
 
-                // check that arc changes got recorded in the parent context
-                GraphDiff diffs = clientContext.internalGraphManager().getDiffs();
-                final int[] arcDiffs = new int[1];
+		final ClientMtTable1 childNew = child.newObject(ClientMtTable1.class);
+		childNew.setGlobalAttribute1("NNN");
 
-                diffs.apply(new GraphChangeHandler() {
+		final ClientMtTable1 childModified = objects.get(0);
+		childModified.setGlobalAttribute1("MMM");
 
-                    public void arcCreated(
-                            Object nodeId,
-                            Object targetNodeId,
-                            Object arcId) {
-                        arcDiffs[0]++;
-                    }
-
-                    public void arcDeleted(
-                            Object nodeId,
-                            Object targetNodeId,
-                            Object arcId) {
-                        arcDiffs[0]--;
-                    }
-
-                    public void nodeCreated(Object nodeId) {
-
-                    }
+		final ClientMtTable1 childCommitted = objects.get(1);
 
-                    public void nodeIdChanged(Object nodeId, Object newId) {
-                    }
+		final ClientMtTable1 childHollow = objects.get(3);
+		child.invalidateObjects(childHollow);
 
-                    public void nodePropertyChanged(
-                            Object nodeId,
-                            String property,
-                            Object oldValue,
-                            Object newValue) {
-                    }
+		queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
 
-                    public void nodeRemoved(Object nodeId) {
+			public void execute() {
+				child.commitChangesToParent();
 
-                    }
-                });
+				// * all modified child objects must be in committed state now
+				// * all modifications should be propagated to the parent
+				// * no actual commit should occur.
 
-                assertEquals(-2, arcDiffs[0]);
-            }
-        });
-    }
+				assertEquals(PersistenceState.COMMITTED,
+						childNew.getPersistenceState());
+				assertEquals(PersistenceState.COMMITTED,
+						childModified.getPersistenceState());
+				assertEquals(PersistenceState.COMMITTED,
+						childCommitted.getPersistenceState());
+				assertEquals(PersistenceState.HOLLOW,
+						childHollow.getPersistenceState());
 
-    @Test
-    public void testCommitChangesToParent() throws Exception {
-        clientContext.newObject(ClientMtTable1.class);
-        clientContext.newObject(ClientMtTable1.class);
-        clientContext.newObject(ClientMtTable1.class);
-        clientContext.newObject(ClientMtTable1.class);
-        clientContext.commitChanges();
+				ClientMtTable1 parentNew = (ClientMtTable1) clientContext
+						.getGraphManager().getNode(childNew.getObjectId());
+				final ClientMtTable1 parentModified = (ClientMtTable1) clientContext
+						.getGraphManager().getNode(childModified.getObjectId());
+				ClientMtTable1 parentCommitted = (ClientMtTable1) clientContext
+						.getGraphManager()
+						.getNode(childCommitted.getObjectId());
+				ClientMtTable1 parentHollow = (ClientMtTable1) clientContext
+						.getGraphManager().getNode(childHollow.getObjectId());
 
-        final ObjectContext child = runtime.newContext(clientContext);
+				assertNotNull(parentNew);
+				assertEquals(PersistenceState.NEW,
+						parentNew.getPersistenceState());
+				assertEquals("NNN", parentNew.getGlobalAttribute1());
 
-        SelectQuery query = new SelectQuery(ClientMtTable1.class);
-        List<?> objects = child.performQuery(query);
+				assertNotNull(parentModified);
+				assertEquals(PersistenceState.MODIFIED,
+						parentModified.getPersistenceState());
+				assertEquals("MMM", parentModified.getGlobalAttribute1());
 
-        assertEquals(4, objects.size());
+				assertNotNull(parentCommitted);
+				assertEquals(PersistenceState.COMMITTED,
+						parentCommitted.getPersistenceState());
 
-        final ClientMtTable1 childNew = child.newObject(ClientMtTable1.class);
-        childNew.setGlobalAttribute1("NNN");
+				assertNotNull(parentHollow);
 
-        final ClientMtTable1 childModified = (ClientMtTable1) objects.get(0);
-        childModified.setGlobalAttribute1("MMM");
+				// check that arc changes got recorded in the parent context
+				GraphDiff diffs = clientContext.internalGraphManager()
+						.getDiffs();
 
-        final ClientMtTable1 childCommitted = (ClientMtTable1) objects.get(1);
+				final int[] modifiedProperties = new int[1];
 
-        final ClientMtTable1 childHollow = (ClientMtTable1) objects.get(3);
-        child.invalidateObjects(childHollow);
+				diffs.apply(new GraphChangeHandler() {
 
-        queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+					@Override
+					public void arcCreated(Object nodeId, Object targetNodeId,
+							Object arcId) {
 
-            public void execute() {
-                child.commitChangesToParent();
+					}
 
-                // * all modified child objects must be in committed state now
-                // * all modifications should be propagated to the parent
-                // * no actual commit should occur.
+					@Override
+					public void arcDeleted(Object nodeId, Object targetNodeId,
+							Object arcId) {
 
-                assertEquals(PersistenceState.COMMITTED, childNew.getPersistenceState());
-                assertEquals(
-                        PersistenceState.COMMITTED,
-                        childModified.getPersistenceState());
-                assertEquals(
-                        PersistenceState.COMMITTED,
-                        childCommitted.getPersistenceState());
-                assertEquals(PersistenceState.HOLLOW, childHollow.getPersistenceState());
+					}
 
-                ClientMtTable1 parentNew = (ClientMtTable1) clientContext
-                        .getGraphManager()
-                        .getNode(childNew.getObjectId());
-                final ClientMtTable1 parentModified = (ClientMtTable1) clientContext
-                        .getGraphManager()
-                        .getNode(childModified.getObjectId());
-                ClientMtTable1 parentCommitted = (ClientMtTable1) clientContext
-                        .getGraphManager()
-                        .getNode(childCommitted.getObjectId());
-                ClientMtTable1 parentHollow = (ClientMtTable1) clientContext
-                        .getGraphManager()
-                        .getNode(childHollow.getObjectId());
+					@Override
+					public void nodeCreated(Object nodeId) {
 
-                assertNotNull(parentNew);
-                assertEquals(PersistenceState.NEW, parentNew.getPersistenceState());
-                assertEquals("NNN", parentNew.getGlobalAttribute1());
+					}
 
-                assertNotNull(parentModified);
-                assertEquals(
-                        PersistenceState.MODIFIED,
-                        parentModified.getPersistenceState());
-                assertEquals("MMM", parentModified.getGlobalAttribute1());
+					@Override
+					public void nodeIdChanged(Object nodeId, Object newId) {
+					}
 
-                assertNotNull(parentCommitted);
-                assertEquals(
-                        PersistenceState.COMMITTED,
-                        parentCommitted.getPersistenceState());
+					@Override
+					public void nodePropertyChanged(Object nodeId,
+							String property, Object oldValue, Object newValue) {
 
-                assertNotNull(parentHollow);
+						if (nodeId.equals(parentModified.getObjectId())) {
+							modifiedProperties[0]++;
+						}
+					}
 
-                // check that arc changes got recorded in the parent context
-                GraphDiff diffs = clientContext.internalGraphManager().getDiffs();
+					@Override
+					public void nodeRemoved(Object nodeId) {
 
-                final int[] modifiedProperties = new int[1];
+					}
+				});
 
-                diffs.apply(new GraphChangeHandler() {
+				assertEquals(1, modifiedProperties[0]);
+			}
+		});
+	}
 
-                    public void arcCreated(
-                            Object nodeId,
-                            Object targetNodeId,
-                            Object arcId) {
+	@Test
+	public void testCommitChangesToParentDeleted() throws Exception {
+		clientContext.newObject(ClientMtTable1.class);
+		clientContext.newObject(ClientMtTable1.class);
+		clientContext.newObject(ClientMtTable1.class);
+		clientContext.newObject(ClientMtTable1.class);
+		clientContext.commitChanges();
 
-                    }
+		ObjectContext child = runtime.newContext(clientContext);
 
-                    public void arcDeleted(
-                            Object nodeId,
-                            Object targetNodeId,
-                            Object arcId) {
+		// make sure we fetch in predictable order
+		SelectQuery<ClientMtTable1> query = new SelectQuery<ClientMtTable1>(
+				ClientMtTable1.class);
+		List<ClientMtTable1> objects = child.select(query);
 
-                    }
+		assertEquals(4, objects.size());
 
-                    public void nodeCreated(Object nodeId) {
+		// delete AND modify
+		ClientMtTable1 childDeleted = objects.get(2);
+		child.deleteObjects(childDeleted);
+		childDeleted.setGlobalAttribute1("DDD");
 
-                    }
+		// don't block queries - on delete Cayenne may need to resolve delete
+		// rules via fetch
+		child.commitChangesToParent();
 
-                    public void nodeIdChanged(Object nodeId, Object newId) {
-                    }
+		// * all modified child objects must be in committed state now
+		// * all modifications should be propagated to the parent
+		// * no actual commit should occur.
 
-                    public void nodePropertyChanged(
-                            Object nodeId,
-                            String property,
-                            Object oldValue,
-                            Object newValue) {
+		assertEquals(PersistenceState.TRANSIENT,
+				childDeleted.getPersistenceState());
 
-                        if (nodeId.equals(parentModified.getObjectId())) {
-                            modifiedProperties[0]++;
-                        }
-                    }
+		ClientMtTable1 parentDeleted = (ClientMtTable1) clientContext
+				.getGraphManager().getNode(childDeleted.getObjectId());
 
-                    public void nodeRemoved(Object nodeId) {
+		assertNotNull(parentDeleted);
+		assertEquals(PersistenceState.DELETED,
+				parentDeleted.getPersistenceState());
+		assertEquals("DDD", parentDeleted.getGlobalAttribute1());
+	}
 
-                    }
-                });
+	/*
+	 * was added for CAY-1636
+	 */
+	@Test
+	public void testCAY1636() throws Exception {
 
-                assertEquals(1, modifiedProperties[0]);
-            }
-        });
-    }
+		ClientMtTooneMaster A = clientContext
+				.newObject(ClientMtTooneMaster.class);
+		clientContext.commitChanges();
 
-    @Test
-    public void testCommitChangesToParentDeleted() throws Exception {
-        clientContext.newObject(ClientMtTable1.class);
-        clientContext.newObject(ClientMtTable1.class);
-        clientContext.newObject(ClientMtTable1.class);
-        clientContext.newObject(ClientMtTable1.class);
-        clientContext.commitChanges();
+		ClientMtTooneDep B = clientContext.newObject(ClientMtTooneDep.class);
+		A.setToDependent(B);
+		clientContext.commitChanges();
 
-        ObjectContext child = runtime.newContext(clientContext);
+		ObjectContext child = runtime.newContext(clientContext);
 
-        // make sure we fetch in predictable order
-        SelectQuery query = new SelectQuery(ClientMtTable1.class);
-        List<?> objects = child.performQuery(query);
+		SelectQuery<ClientMtTooneMaster> query = new SelectQuery<ClientMtTooneMaster>(
+				ClientMtTooneMaster.class);
+		List<ClientMtTooneMaster> objects = child.select(query);
 
-        assertEquals(4, objects.size());
+		assertEquals(1, objects.size());
 
-        // delete AND modify
-        ClientMtTable1 childDeleted = (ClientMtTable1) objects.get(2);
-        child.deleteObjects(childDeleted);
-        childDeleted.setGlobalAttribute1("DDD");
+		ClientMtTooneMaster childDeleted = (ClientMtTooneMaster) objects.get(0);
 
-        // don't block queries - on delete Cayenne may need to resolve delete rules via
-        // fetch
-        child.commitChangesToParent();
+		child.deleteObjects(childDeleted);
 
-        // * all modified child objects must be in committed state now
-        // * all modifications should be propagated to the parent
-        // * no actual commit should occur.
+		child.commitChangesToParent();
 
-        assertEquals(PersistenceState.TRANSIENT, childDeleted.getPersistenceState());
+		ClientMtTooneMaster parentDeleted = (ClientMtTooneMaster) clientContext
+				.getGraphManager().getNode(childDeleted.getObjectId());
 
-        ClientMtTable1 parentDeleted = (ClientMtTable1) clientContext
-                .getGraphManager()
-                .getNode(childDeleted.getObjectId());
+		assertNotNull(parentDeleted);
+		assertEquals(PersistenceState.DELETED,
+				parentDeleted.getPersistenceState());
 
-        assertNotNull(parentDeleted);
-        assertEquals(PersistenceState.DELETED, parentDeleted.getPersistenceState());
-        assertEquals("DDD", parentDeleted.getGlobalAttribute1());
-    }
+		clientContext.commitChanges();
 
-    /*
-     * was added for CAY-1636
-     */
-    @Test
-    public void testCAY1636() throws Exception {
+		SelectQuery<ClientMtTooneMaster> query2 = new SelectQuery<ClientMtTooneMaster>(
+				ClientMtTooneMaster.class);
+		List<ClientMtTooneMaster> objects2 = child.select(query2);
 
-        ClientMtTooneMaster A = clientContext.newObject(ClientMtTooneMaster.class);
-        clientContext.commitChanges();
+		assertEquals(0, objects2.size());
 
-        ClientMtTooneDep B = clientContext.newObject(ClientMtTooneDep.class);
-        A.setToDependent(B);
-        clientContext.commitChanges();
+	}
 
-        ObjectContext child = runtime.newContext(clientContext);
+	@Test
+	public void testCAY1636_2() throws Exception {
 
-        SelectQuery query = new SelectQuery(ClientMtTooneMaster.class);
-        List<?> objects = child.performQuery(query);
+		ClientMtTooneMaster A = clientContext
+				.newObject(ClientMtTooneMaster.class);
+		clientContext.commitChanges();
 
-        assertEquals(1, objects.size());
+		ClientMtTooneDep B = clientContext.newObject(ClientMtTooneDep.class);
+		A.setToDependent(B);
+		clientContext.commitChanges();
 
-        ClientMtTooneMaster childDeleted = (ClientMtTooneMaster) objects.get(0);
+		ObjectContext child = runtime.newContext(clientContext);
 
-        child.deleteObjects(childDeleted);
+		SelectQuery<ClientMtTooneDep> queryB = new SelectQuery<ClientMtTooneDep>(
+				ClientMtTooneDep.class);
+		List<?> objectsB = child.performQuery(queryB);
 
-        child.commitChangesToParent();
+		assertEquals(1, objectsB.size());
 
-        ClientMtTooneMaster parentDeleted = (ClientMtTooneMaster) clientContext
-                .getGraphManager()
-                .getNode(childDeleted.getObjectId());
+		ClientMtTooneDep childBDeleted = (ClientMtTooneDep) objectsB.get(0);
+		child.deleteObjects(childBDeleted);
 
-        assertNotNull(parentDeleted);
-        assertEquals(PersistenceState.DELETED, parentDeleted.getPersistenceState());
+		SelectQuery<ClientMtTooneMaster> query = new SelectQuery<ClientMtTooneMaster>(
+				ClientMtTooneMaster.class);
+		List<ClientMtTooneMaster> objects = child.select(query);
 
-        clientContext.commitChanges();
+		assertEquals(1, objects.size());
 
-        SelectQuery query2 = new SelectQuery(ClientMtTooneMaster.class);
-        List<?> objects2 = child.performQuery(query2);
+		ClientMtTooneMaster childDeleted = objects.get(0);
 
-        assertEquals(0, objects2.size());
+		child.deleteObjects(childDeleted);
 
-    }
+		child.commitChangesToParent();
 
-    @Test
-    public void testCAY1636_2() throws Exception {
+		ClientMtTooneMaster parentDeleted = (ClientMtTooneMaster) clientContext
+				.getGraphManager().getNode(childDeleted.getObjectId());
 
-        ClientMtTooneMaster A = clientContext.newObject(ClientMtTooneMaster.class);
-        clientContext.commitChanges();
+		assertNotNull(parentDeleted);
+		assertEquals(PersistenceState.DELETED,
+				parentDeleted.getPersistenceState());
 
-        ClientMtTooneDep B = clientContext.newObject(ClientMtTooneDep.class);
-        A.setToDependent(B);
-        clientContext.commitChanges();
+		clientContext.commitChanges();
 
-        ObjectContext child = runtime.newContext(clientContext);
+		SelectQuery<ClientMtTooneMaster> query2 = new SelectQuery<ClientMtTooneMaster>(
+				ClientMtTooneMaster.class);
+		List<ClientMtTooneMaster> objects2 = child.select(query2);
 
-        SelectQuery queryB = new SelectQuery(ClientMtTooneDep.class);
-        List<?> objectsB = child.performQuery(queryB);
+		assertEquals(0, objects2.size());
 
-        assertEquals(1, objectsB.size());
+	}
 
-        ClientMtTooneDep childBDeleted = (ClientMtTooneDep) objectsB.get(0);
-        child.deleteObjects(childBDeleted);
+	@Test
+	public void testCommitChanges() throws Exception {
+		clientContext.newObject(ClientMtTable1.class);
+		clientContext.newObject(ClientMtTable1.class);
+		clientContext.newObject(ClientMtTable1.class);
+		clientContext.newObject(ClientMtTable1.class);
+		clientContext.commitChanges();
 
-        SelectQuery query = new SelectQuery(ClientMtTooneMaster.class);
-        List<?> objects = child.performQuery(query);
+		ObjectContext child = runtime.newContext(clientContext);
 
-        assertEquals(1, objects.size());
+		// make sure we fetch in predictable order
+		SelectQuery<ClientMtTable1> query = new SelectQuery<ClientMtTable1>(
+				ClientMtTable1.class);
+		List<ClientMtTable1> objects = child.select(query);
 
-        ClientMtTooneMaster childDeleted = (ClientMtTooneMaster) objects.get(0);
+		assertEquals(4, objects.size());
 
-        child.deleteObjects(childDeleted);
+		ClientMtTable1 childNew = child.newObject(ClientMtTable1.class);
+		childNew.setGlobalAttribute1("NNN");
 
-        child.commitChangesToParent();
+		ClientMtTable1 childModified = objects.get(0);
+		childModified.setGlobalAttribute1("MMM");
 
-        ClientMtTooneMaster parentDeleted = (ClientMtTooneMaster) clientContext
-                .getGraphManager()
-                .getNode(childDeleted.getObjectId());
+		ClientMtTable1 childCommitted = objects.get(1);
 
-        assertNotNull(parentDeleted);
-        assertEquals(PersistenceState.DELETED, parentDeleted.getPersistenceState());
+		// delete AND modify
+		ClientMtTable1 childDeleted = objects.get(2);
+		child.deleteObjects(childDeleted);
+		childDeleted.setGlobalAttribute1("DDD");
 
-        clientContext.commitChanges();
+		ClientMtTable1 childHollow = objects.get(3);
+		child.invalidateObjects(childHollow);
 
-        SelectQuery query2 = new SelectQuery(ClientMtTooneMaster.class);
-        List<?> objects2 = child.performQuery(query2);
+		child.commitChanges();
 
-        assertEquals(0, objects2.size());
+		assertEquals(PersistenceState.COMMITTED, childNew.getPersistenceState());
+		assertEquals(PersistenceState.COMMITTED,
+				childModified.getPersistenceState());
+		assertEquals(PersistenceState.COMMITTED,
+				childCommitted.getPersistenceState());
+		assertEquals(PersistenceState.TRANSIENT,
+				childDeleted.getPersistenceState());
+		assertEquals(PersistenceState.HOLLOW, childHollow.getPersistenceState());
 
-    }
+		ClientMtTable1 parentNew = (ClientMtTable1) clientContext
+				.getGraphManager().getNode(childNew.getObjectId());
+		ClientMtTable1 parentModified = (ClientMtTable1) clientContext
+				.getGraphManager().getNode(childModified.getObjectId());
+		ClientMtTable1 parentCommitted = (ClientMtTable1) clientContext
+				.getGraphManager().getNode(childCommitted.getObjectId());
+		ClientMtTable1 parentDeleted = (ClientMtTable1) clientContext
+				.getGraphManager().getNode(childDeleted.getObjectId());
+		ClientMtTable1 parentHollow = (ClientMtTable1) clientContext
+				.getGraphManager().getNode(childHollow.getObjectId());
 
-    @Test
-    public void testCommitChanges() throws Exception {
-        clientContext.newObject(ClientMtTable1.class);
-        clientContext.newObject(ClientMtTable1.class);
-        clientContext.newObject(ClientMtTable1.class);
-        clientContext.newObject(ClientMtTable1.class);
-        clientContext.commitChanges();
+		assertNotNull(parentNew);
+		assertEquals(PersistenceState.COMMITTED,
+				parentNew.getPersistenceState());
+		assertEquals("NNN", parentNew.getGlobalAttribute1());
 
-        ObjectContext child = runtime.newContext(clientContext);
+		assertNotNull(parentModified);
+		assertEquals(PersistenceState.COMMITTED,
+				parentModified.getPersistenceState());
+		assertEquals("MMM", parentModified.getGlobalAttribute1());
 
-        // make sure we fetch in predictable order
-        SelectQuery query = new SelectQuery(ClientMtTable1.class);
-        List<?> objects = child.performQuery(query);
+		assertNull("Deleted object should not be registered.", parentDeleted);
 
-        assertEquals(4, objects.size());
+		assertNotNull(parentCommitted);
+		assertEquals(PersistenceState.COMMITTED,
+				parentCommitted.getPersistenceState());
 
-        ClientMtTable1 childNew = child.newObject(ClientMtTable1.class);
-        childNew.setGlobalAttribute1("NNN");
+		assertNotNull(parentHollow);
+	}
 
-        ClientMtTable1 childModified = (ClientMtTable1) objects.get(0);
-        childModified.setGlobalAttribute1("MMM");
+	@Test
+	public void testAddRemove() throws Exception {
+		ObjectContext child = runtime.newContext(clientContext);
 
-        ClientMtTable1 childCommitted = (ClientMtTable1) objects.get(1);
+		ClientMtTable1 a = child.newObject(ClientMtTable1.class);
+		a.setGlobalAttribute1("X");
+		child.commitChanges();
 
-        // delete AND modify
-        ClientMtTable1 childDeleted = (ClientMtTable1) objects.get(2);
-        child.deleteObjects(childDeleted);
-        childDeleted.setGlobalAttribute1("DDD");
+		ClientMtTable2 p1 = child.newObject(ClientMtTable2.class);
+		p1.setGlobalAttribute("P1");
+		a.addToTable2Array(p1);
 
-        ClientMtTable1 childHollow = (ClientMtTable1) objects.get(3);
-        child.invalidateObjects(childHollow);
+		ClientMtTable2 p2 = child.newObject(ClientMtTable2.class);
+		p2.setGlobalAttribute("P2");
+		a.addToTable2Array(p2);
 
-        child.commitChanges();
+		a.removeFromTable2Array(p2);
 
-        assertEquals(PersistenceState.COMMITTED, childNew.getPersistenceState());
-        assertEquals(PersistenceState.COMMITTED, childModified.getPersistenceState());
-        assertEquals(PersistenceState.COMMITTED, childCommitted.getPersistenceState());
-        assertEquals(PersistenceState.TRANSIENT, childDeleted.getPersistenceState());
-        assertEquals(PersistenceState.HOLLOW, childHollow.getPersistenceState());
+		// this causes an error on commit
+		child.deleteObjects(p2);
 
-        ClientMtTable1 parentNew = (ClientMtTable1) clientContext
-                .getGraphManager()
-                .getNode(childNew.getObjectId());
-        ClientMtTable1 parentModified = (ClientMtTable1) clientContext
-                .getGraphManager()
-                .getNode(childModified.getObjectId());
-        ClientMtTable1 parentCommitted = (ClientMtTable1) clientContext
-                .getGraphManager()
-                .getNode(childCommitted.getObjectId());
-        ClientMtTable1 parentDeleted = (ClientMtTable1) clientContext
-                .getGraphManager()
-                .getNode(childDeleted.getObjectId());
-        ClientMtTable1 parentHollow = (ClientMtTable1) clientContext
-                .getGraphManager()
-                .getNode(childHollow.getObjectId());
+		child.commitChangesToParent();
+
+	}
+
+	@Test
+	public void testChangeRel() throws Exception {
+		ObjectContext child = runtime.newContext(clientContext);
+
+		ClientMtTable1 a = child.newObject(ClientMtTable1.class);
+		ClientMtTable2 b = child.newObject(ClientMtTable2.class);
+		child.commitChanges();
 
-        assertNotNull(parentNew);
-        assertEquals(PersistenceState.COMMITTED, parentNew.getPersistenceState());
-        assertEquals("NNN", parentNew.getGlobalAttribute1());
+		assertEquals(PersistenceState.COMMITTED, a.getPersistenceState());
 
-        assertNotNull(parentModified);
-        assertEquals(PersistenceState.COMMITTED, parentModified.getPersistenceState());
-        assertEquals("MMM", parentModified.getGlobalAttribute1());
+		a.addToTable2Array(b);
+		assertEquals(PersistenceState.MODIFIED, a.getPersistenceState());
+
+		child.commitChangesToParent();
+		ClientMtTable1 parentA = (ClientMtTable1) clientContext
+				.getGraphManager().getNode(a.getObjectId());
+		assertEquals(PersistenceState.COMMITTED, a.getPersistenceState());
+		assertEquals(PersistenceState.MODIFIED, parentA.getPersistenceState());
+		assertEquals(1, parentA.getTable2Array().size());
+
+		clientContext.commitChanges();
+		assertEquals(PersistenceState.COMMITTED, parentA.getPersistenceState());
+
+		a.removeFromTable2Array(b);
+		assertEquals(PersistenceState.MODIFIED, a.getPersistenceState());
+
+		child.commitChangesToParent();
+		assertEquals(PersistenceState.COMMITTED, a.getPersistenceState());
+		assertEquals(PersistenceState.MODIFIED, parentA.getPersistenceState());
+		assertEquals(0, parentA.getTable2Array().size());
+	}
+
+	@Test
+	public void testCAY1183() throws Exception {
+		ClientMtTable1 parentMt = clientContext.newObject(ClientMtTable1.class);
+		clientContext.commitChanges();
+
+		ObjectContext child = runtime.newContext(clientContext);
+		ClientMtTable1 childMt = (ClientMtTable1) Cayenne.objectForPK(child,
+				parentMt.getObjectId());
+		childMt.setGlobalAttribute1("1183");
+		ClientMtTable2 childMt2 = child.newObject(ClientMtTable2.class);
+		childMt2.setGlobalAttribute("1183");
+		childMt2.setTable1(childMt);
 
-        assertNull("Deleted object should not be registered.", parentDeleted);
+		child.commitChangesToParent();
 
-        assertNotNull(parentCommitted);
-        assertEquals(PersistenceState.COMMITTED, parentCommitted.getPersistenceState());
+		// fetching other relationship... this fails per CAY-1183
+		childMt2.getTable3();
+	}
 
-        assertNotNull(parentHollow);
-    }
+	/**
+	 * CAY1714
+	 */
+	@Test
+	public void testQueriesOnTemporaryObject() throws Exception {
+		ObjectContext clientContext = runtime
+				.newContext((DataChannel) this.clientContext);
+		ClientMtTable1 parentMt = clientContext.newObject(ClientMtTable1.class);
 
-    @Test
-    public void testAddRemove() throws Exception {
-        ObjectContext child = runtime.newContext(clientContext);
+		ObjectContext childContext = runtime
+				.newContext((DataChannel) clientContext);
+		ClientMtTable1 childMt = (ClientMtTable1) Cayenne.objectForPK(
+				childContext, parentMt.getObjectId());
+		childMt.setGlobalAttribute1("1183");
+		ClientMtTable2 childMt2 = childContext.newObject(ClientMtTable2.class);
+		childMt2.setGlobalAttribute("1183");
+		childMt2.setTable1(childMt);
 
-        ClientMtTable1 a = child.newObject(ClientMtTable1.class);
-        a.setGlobalAttribute1("X");
-        child.commitChanges();
+		childContext.commitChangesToParent();
 
-        ClientMtTable2 p1 = child.newObject(ClientMtTable2.class);
-        p1.setGlobalAttribute("P1");
-        a.addToTable2Array(p1);
+		assertNull(childMt2.getTable3());
+	}
 
-        ClientMtTable2 p2 = child.newObject(ClientMtTable2.class);
-        p2.setGlobalAttribute("P2");
-        a.addToTable2Array(p2);
+	@Test
+	public void testCAY1194() throws Exception {
+		ClientMtTable1 parentMt = clientContext.newObject(ClientMtTable1.class);
+		ObjectContext child = runtime.newContext(clientContext);
 
-        a.removeFromTable2Array(p2);
+		ClientMtTable2 childMt2 = child.newObject(ClientMtTable2.class);
+		childMt2.setGlobalAttribute("222");
 
-        // this causes an error on commit
-        child.deleteObjects(p2);
+		ClientMtTable1 localParentMt = child.localObject(parentMt);
+		assertEquals(0, parentMt.getTable2Array().size());
+		assertEquals(0, localParentMt.getTable2Array().size());
 
-        child.commitChangesToParent();
+		childMt2.setTable1(localParentMt);
 
-    }
-
-    @Test
-    public void testChangeRel() throws Exception {
-        ObjectContext child = runtime.newContext(clientContext);
-
-        ClientMtTable1 a = child.newObject(ClientMtTable1.class);
-        ClientMtTable2 b = child.newObject(ClientMtTable2.class);
-        child.commitChanges();
+		assertEquals(0, parentMt.getTable2Array().size());
+		assertEquals(1, localParentMt.getTable2Array().size());
 
-        assertEquals(PersistenceState.COMMITTED, a.getPersistenceState());
+		assertEquals(localParentMt.getTable2Array().get(0).getObjectContext(),
+				child);
 
-        a.addToTable2Array(b);
-        assertEquals(PersistenceState.MODIFIED, a.getPersistenceState());
-
-        child.commitChangesToParent();
-        ClientMtTable1 parentA = (ClientMtTable1) clientContext
-                .getGraphManager()
-                .getNode(a.getObjectId());
-        assertEquals(PersistenceState.COMMITTED, a.getPersistenceState());
-        assertEquals(PersistenceState.MODIFIED, parentA.getPersistenceState());
-        assertEquals(1, parentA.getTable2Array().size());
-
-        clientContext.commitChanges();
-        assertEquals(PersistenceState.COMMITTED, parentA.getPersistenceState());
-
-        a.removeFromTable2Array(b);
-        assertEquals(PersistenceState.MODIFIED, a.getPersistenceState());
-
-        child.commitChangesToParent();
-        assertEquals(PersistenceState.COMMITTED, a.getPersistenceState());
-        assertEquals(PersistenceState.MODIFIED, parentA.getPersistenceState());
-        assertEquals(0, parentA.getTable2Array().size());
-    }
-
-    @Test
-    public void testCAY1183() throws Exception {
-        ClientMtTable1 parentMt = clientContext.newObject(ClientMtTable1.class);
-        clientContext.commitChanges();
-
-        ObjectContext child = runtime.newContext(clientContext);
-        ClientMtTable1 childMt = (ClientMtTable1) Cayenne.objectForPK(
-                child,
-                parentMt.getObjectId());
-        childMt.setGlobalAttribute1("1183");
-        ClientMtTable2 childMt2 = child.newObject(ClientMtTable2.class);
-        childMt2.setGlobalAttribute("1183");
-        childMt2.setTable1(childMt);
-
-        child.commitChangesToParent();
-
-        // fetching other relationship... this fails per CAY-1183
-        childMt2.getTable3();
-    }
-    
-    /**
-     * CAY1714
-     */
-    @Test
-    public void testQueriesOnTemporaryObject() throws Exception {
-        ObjectContext clientContext = runtime.newContext((DataChannel) this.clientContext);
-        ClientMtTable1 parentMt = clientContext.newObject(ClientMtTable1.class);
+		child.commitChangesToParent();
+		assertEquals(1, parentMt.getTable2Array().size());
+		assertEquals(parentMt.getTable2Array().get(0).getObjectContext(),
+				clientContext);
+	}
 
-        ObjectContext childContext = runtime.newContext((DataChannel) clientContext);
-        ClientMtTable1 childMt = (ClientMtTable1) Cayenne.objectForPK(childContext, parentMt.getObjectId());
-        childMt.setGlobalAttribute1("1183");
-        ClientMtTable2 childMt2 = childContext.newObject(ClientMtTable2.class);
-        childMt2.setGlobalAttribute("1183");
-        childMt2.setTable1(childMt);
+	@Test
+	public void testCommitChangesToParentOneToMany() throws Exception {
+		ObjectContext child = runtime.newContext(clientContext);
 
-        childContext.commitChangesToParent();
+		ClientMtTable1 master = child.newObject(ClientMtTable1.class);
+		ClientMtTable2 dep = child.newObject(ClientMtTable2.class);
+		master.addToTable2Array(dep);
 
-        assertNull(childMt2.getTable3());
-    }
+		child.commitChangesToParent();
 
-    @Test
-    public void testCAY1194() throws Exception {
-        ClientMtTable1 parentMt = clientContext.newObject(ClientMtTable1.class);
-        ObjectContext child = runtime.newContext(clientContext);
+		ClientMtTable1 masterParent = (ClientMtTable1) clientContext
+				.getGraphManager().getNode(master.getObjectId());
+		ClientMtTable2 depParent = (ClientMtTable2) clientContext
+				.getGraphManager().getNode(dep.getObjectId());
 
-        ClientMtTable2 childMt2 = child.newObject(ClientMtTable2.class);
-        childMt2.setGlobalAttribute("222");
+		assertNotNull(masterParent);
+		assertNotNull(depParent);
 
-        ClientMtTable1 localParentMt = child.localObject(parentMt);
-        assertEquals(0, parentMt.getTable2Array().size());
-        assertEquals(0, localParentMt.getTable2Array().size());
+		assertSame(masterParent, depParent.getTable1());
+		assertTrue(masterParent.getTable2Array().contains(depParent));
 
-        childMt2.setTable1(localParentMt);
+		// check that arc changes got recorded in the parent context
+		GraphDiff diffs = clientContext.internalGraphManager().getDiffs();
 
-        assertEquals(0, parentMt.getTable2Array().size());
-        assertEquals(1, localParentMt.getTable2Array().size());
+		final int[] arcDiffs = new int[1];
+		final int[] newNodes = new int[1];
 
-        assertEquals(localParentMt.getTable2Array().get(0).getObjectContext(), child);
+		diffs.apply(new GraphChangeHandler() {
 
-        child.commitChangesToParent();
-        assertEquals(1, parentMt.getTable2Array().size());
-        assertEquals(parentMt.getTable2Array().get(0).getObjectContext(), clientContext);
-    }
+			public void arcCreated(Object nodeId, Object targetNodeId,
+					Object arcId) {
+				arcDiffs[0]++;
+			}
 
-    @Test
-    public void testCommitChangesToParentOneToMany() throws Exception {
-        ObjectContext child = runtime.newContext(clientContext);
-
-        ClientMtTable1 master = child.newObject(ClientMtTable1.class);
-        ClientMtTable2 dep = child.newObject(ClientMtTable2.class);
-        master.addToTable2Array(dep);
+			public void arcDeleted(Object nodeId, Object targetNodeId,
+					Object arcId) {
+				arcDiffs[0]--;
+			}
 
-        child.commitChangesToParent();
+			public void nodeCreated(Object nodeId) {
+				newNodes[0]++;
+			}
 
-        ClientMtTable1 masterParent = (ClientMtTable1) clientContext
-                .getGraphManager()
-                .getNode(master.getObjectId());
-        ClientMtTable2 depParent = (ClientMtTable2) clientContext
-                .getGraphManager()
-                .getNode(dep.getObjectId());
-
-        assertNotNull(masterParent);
-        assertNotNull(depParent);
-
-        assertSame(masterParent, depParent.getTable1());
-        assertTrue(masterParent.getTable2Array().contains(depParent));
-
-        // check that arc changes got recorded in the parent context
-        GraphDiff diffs = clientContext.internalGraphManager().getDiffs();
-
-        final int[] arcDiffs = new int[1];
-        final int[] newNodes = new int[1];
-
-        diffs.apply(new GraphChangeHandler() {
-
-            public void arcCreated(Object nodeId, Object targetNodeId, Object arcId) {
-                arcDiffs[0]++;
-            }
-
-            public void arcDeleted(Object nodeId, Object targetNodeId, Object arcId) {
-                arcDiffs[0]--;
-            }
-
-            public void nodeCreated(Object nodeId) {
-                newNodes[0]++;
-            }
-
-            public void nodeIdChanged(Object nodeId, Object newId) {
-            }
+			public void nodeIdChanged(Object nodeId, Object newId) {
+			}
 
-            public void nodePropertyChanged(
-                    Object nodeId,
-                    String property,
-                    Object oldValue,
-                    Object newValue) {
-            }
+			public void nodePropertyChanged(Object nodeId, String property,
+					Object oldValue, Object newValue) {
+			}
 
-            public void nodeRemoved(Object nodeId) {
-                newNodes[0]--;
-            }
-        });
+			public void nodeRemoved(Object nodeId) {
+				newNodes[0]--;
+			}
+		});
 
-        assertEquals(2, newNodes[0]);
-        assertEquals(2, arcDiffs[0]);
-    }
+		assertEquals(2, newNodes[0]);
+		assertEquals(2, arcDiffs[0]);
+	}
 
-    @Test
-    public void testCommitChangesToParentOneToOne() throws Exception {
-        ObjectContext child = runtime.newContext(clientContext);
+	@Test
+	public void testCommitChangesToParentOneToOne() throws Exception {
+		ObjectContext child = runtime.newContext(clientContext);
 
-        ClientMtTooneMaster master = child.newObject(ClientMtTooneMaster.class);
-        ClientMtTooneDep dep = child.newObject(ClientMtTooneDep.class);
-        master.setToDependent(dep);
+		ClientMtTooneMaster master = child.newObject(ClientMtTooneMaster.class);
+		ClientMtTooneDep dep = child.newObject(ClientMtTooneDep.class);
+		master.setToDependent(dep);
 
-        child.commitChangesToParent();
+		child.commitChangesToParent();
 
-        ClientMtTooneMaster masterParent = (ClientMtTooneMaster) clientContext
-                .getGraphManager()
-                .getNode(master.getObjectId());
-        ClientMtTooneDep depParent = (ClientMtTooneDep) clientContext
-                .getGraphManager()
-                .getNode(dep.getObjectId());
+		ClientMtTooneMaster masterParent = (ClientMtTooneMaster) clientContext
+				.getGraphManager().getNode(master.getObjectId());
+		ClientMtTooneDep depParent = (ClientMtTooneDep) clientContext
+				.getGraphManager().getNode(dep.getObjectId());
 
-        assertNotNull(masterParent);
-        assertNotNull(depParent);
+		assertNotNull(masterParent);
+		assertNotNull(depParent);
 
-        assertSame(masterParent, depParent.getToMaster());
-        assertSame(depParent, masterParent.getToDependent());
+		assertSame(masterParent, depParent.getToMaster());
+		assertSame(depParent, masterParent.getToDependent());
 
-        // check that arc changes got recorded in the parent context
-        GraphDiff diffs = clientContext.internalGraphManager().getDiffs();
+		// check that arc changes got recorded in the parent context
+		GraphDiff diffs = clientContext.internalGraphManager().getDiffs();
 
-        final int[] arcDiffs = new int[1];
-        final int[] newNodes = new int[1];
+		final int[] arcDiffs = new int[1];
+		final int[] newNodes = new int[1];
 
-        diffs.apply(new GraphChangeHandler() {
+		diffs.apply(new GraphChangeHandler() {
 
-            public void arcCreated(Object nodeId, Object targetNodeId, Object arcId) {
-                arcDiffs[0]++;
-            }
+			public void arcCreated(Object nodeId, Object targetNodeId,
+					Object arcId) {
+				arcDiffs[0]++;
+			}
 
-            public void arcDeleted(Object nodeId, Object targetNodeId, Object arcId) {
-                arcDiffs[0]--;
-            }
+			public void arcDeleted(Object nodeId, Object targetNodeId,
+					Object arcId) {
+				arcDiffs[0]--;
+			}
 
-            public void nodeCreated(Object nodeId) {
-                newNodes[0]++;
-            }
+			public void nodeCreated(Object nodeId) {
+				newNodes[0]++;
+			}
 
-            public void nodeIdChanged(Object nodeId, Object newId) {
-            }
+			public void nodeIdChanged(Object nodeId, Object newId) {
+			}
 
-            public void nodePropertyChanged(
-                    Object nodeId,
-                    String property,
-                    Object oldValue,
-                    Object newValue) {
-            }
+			public void nodePropertyChanged(Object nodeId, String property,
+					Object oldValue, Object newValue) {
+			}
 
-            public void nodeRemoved(Object nodeId) {
-                newNodes[0]--;
-            }
-        });
+			public void nodeRemoved(Object nodeId) {
+				newNodes[0]--;
+			}
+		});
 
-        assertEquals(2, newNodes[0]);
-        assertEquals(2, arcDiffs[0]);
-    }
+		assertEquals(2, newNodes[0]);
+		assertEquals(2, arcDiffs[0]);
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8990e655/cayenne-client/src/test/java/org/apache/cayenne/remote/MockMessage.java
----------------------------------------------------------------------
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/remote/MockMessage.java b/cayenne-client/src/test/java/org/apache/cayenne/remote/MockMessage.java
deleted file mode 100644
index 0ed1de9..0000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/remote/MockMessage.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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.cayenne.remote;
-
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.remote.ClientMessage;
-
-public class MockMessage implements ClientMessage {
-
-    DataChannel lastChannel;
-
-    public MockMessage() {
-
-    }
-
-    public Object dispatch(DataChannel channel) {
-        this.lastChannel = channel;
-        return null;
-    }
-    
-    public DataChannel getLastChannel() {
-        return lastChannel;
-    }
-    
-    /**
-     * Returns a description of the type of message. In this case always "Mock message".
-     */
-    @Override
-    public String toString() {
-        return "Mock message";
-    }
-} 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8990e655/cayenne-client/src/test/java/org/apache/cayenne/remote/NestedObjectContextLocalIT.java
----------------------------------------------------------------------
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/remote/NestedObjectContextLocalIT.java b/cayenne-client/src/test/java/org/apache/cayenne/remote/NestedObjectContextLocalIT.java
index 29eaf61..418841a 100644
--- a/cayenne-client/src/test/java/org/apache/cayenne/remote/NestedObjectContextLocalIT.java
+++ b/cayenne-client/src/test/java/org/apache/cayenne/remote/NestedObjectContextLocalIT.java
@@ -59,7 +59,7 @@ public class NestedObjectContextLocalIT extends RemoteCayenneCase {
     @Test
     public void testLocalCacheStaysLocal() {
 
-        SelectQuery query = new SelectQuery(ClientMtTable1.class);
+        SelectQuery<ClientMtTable1> query = new SelectQuery<ClientMtTable1>(ClientMtTable1.class);
         query.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
 
         BaseContext child1 = (BaseContext) runtime.newContext(clientContext);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8990e655/cayenne-client/src/test/java/org/apache/cayenne/remote/ROPPrefetchToManyMapIT.java
----------------------------------------------------------------------
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/remote/ROPPrefetchToManyMapIT.java b/cayenne-client/src/test/java/org/apache/cayenne/remote/ROPPrefetchToManyMapIT.java
index 0eb0226..07cefec 100644
--- a/cayenne-client/src/test/java/org/apache/cayenne/remote/ROPPrefetchToManyMapIT.java
+++ b/cayenne-client/src/test/java/org/apache/cayenne/remote/ROPPrefetchToManyMapIT.java
@@ -78,7 +78,7 @@ public class ROPPrefetchToManyMapIT extends RemoteCayenneCase {
         
         context.performQuery(new RefreshQuery());
         
-        SelectQuery query = new SelectQuery(ClientMtMapToMany.class);
+        SelectQuery<ClientMtMapToMany> query = new SelectQuery<ClientMtMapToMany>(ClientMtMapToMany.class);
         query.addPrefetch("targets");
         
         final ClientMtMapToMany mapToMany = (ClientMtMapToMany) Cayenne.objectForQuery(context, query);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8990e655/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteIncrementalFaultListIT.java
----------------------------------------------------------------------
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteIncrementalFaultListIT.java b/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteIncrementalFaultListIT.java
index c0faac4..77f15f4 100644
--- a/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteIncrementalFaultListIT.java
+++ b/cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteIncrementalFaultListIT.java
@@ -19,6 +19,10 @@
 
 package org.apache.cayenne.remote;
 
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
 import org.apache.cayenne.CayenneContext;
 import org.apache.cayenne.Persistent;
 import org.apache.cayenne.di.Inject;
@@ -34,247 +38,246 @@ import org.apache.cayenne.unit.di.client.ClientCase;
 import org.apache.cayenne.unit.di.server.UseServerRuntime;
 import org.junit.Test;
 
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
 @UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
 public class RemoteIncrementalFaultListIT extends ClientCase {
 
-    private static final int COUNT = 25;
-
-    @Inject
-    private CayenneContext clientContext;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    private TableHelper tMTTable;
-
-    private RemoteIncrementalFaultList list;
-    private SelectQuery query;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("MT_TABLE2");
-        dbHelper.deleteAll("MT_TABLE1");
-
-        tMTTable = new TableHelper(dbHelper, "MT_TABLE1");
-        tMTTable.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", "SERVER_ATTRIBUTE1");
-    }
-
-    protected void createObjectsDataSet() throws Exception {
-        tMTTable.insert(1, "g1", "s1");
-        tMTTable.insert(2, "g2", "s2");
-        tMTTable.insert(3, "g3", "s3");
-        tMTTable.insert(4, "g4", "s4");
-        tMTTable.insert(5, "g5", "s5");
-        tMTTable.insert(6, "g6", "s6");
-        tMTTable.insert(7, "g7", "s7");
-        tMTTable.insert(8, "g8", "s8");
-        tMTTable.insert(9, "g9", "s9");
-        tMTTable.insert(10, "g10", "s10");
-        tMTTable.insert(11, "g11", "s11");
-        tMTTable.insert(12, "g12", "s12");
-        tMTTable.insert(13, "g13", "s13");
-        tMTTable.insert(14, "g14", "s14");
-        tMTTable.insert(15, "g15", "s15");
-        tMTTable.insert(16, "g16", "s16");
-        tMTTable.insert(17, "g17", "s17");
-        tMTTable.insert(18, "g18", "s18");
-        tMTTable.insert(19, "g19", "s19");
-        tMTTable.insert(20, "g20", "s20");
-        tMTTable.insert(21, "g21", "s21");
-        tMTTable.insert(22, "g22", "s22");
-        tMTTable.insert(23, "g23", "s23");
-        tMTTable.insert(24, "g24", "s24");
-        tMTTable.insert(25, "g25", "s25");
-    }
-
-    private void prepareList(int pageSize) throws Exception {
-
-        createObjectsDataSet();
-
-        query = new SelectQuery(ClientMtTable1.class);
-
-        // make sure total number of objects is not divisable
-        // by the page size, to test the last smaller page
-        query.setPageSize(pageSize);
-        query.addOrdering("db:" + MtTable1.TABLE1_ID_PK_COLUMN, SortOrder.ASCENDING);
-
-        list = new RemoteIncrementalFaultList(clientContext, query);
-    }
-
-    @Test
-    public void testSize() throws Exception {
-        prepareList(6);
-        assertEquals(COUNT, list.size());
-    }
-
-    @Test
-    public void testIteratorPageSize1() throws Exception {
-        doTestIterator(1);
-    }
-
-    @Test
-    public void testIteratorPageSize5() throws Exception {
-        // size divisiable by page size
-        doTestIterator(5);
-    }
-
-    @Test
-    public void testIteratorPageSize6() throws Exception {
-        // size not divisable by page size
-        doTestIterator(6);
-    }
-
-    @Test
-    public void testIteratorPageSize25() throws Exception {
-        // size equals to page size
-        doTestIterator(COUNT);
-    }
-
-    @Test
-    public void testIteratorPageSize26() throws Exception {
-        // size exceeding page size
-        doTestIterator(COUNT + 1);
-    }
-
-    @Test
-    public void testListIterator() throws Exception {
-        prepareList(6);
-        ListIterator<?> it = list.listIterator();
-
-        assertTrue(it.hasNext());
-
-        int counter = 0;
-        while (it.hasNext()) {
-            Object obj = it.next();
-            assertNotNull(obj);
-            assertTrue(obj instanceof Persistent);
-
-            // iterator must be resolved page by page
-            int expectedResolved = list.pageIndex(counter)
-                    * list.getPageSize()
-                    + list.getPageSize();
-            if (expectedResolved > list.size()) {
-                expectedResolved = list.size();
-            }
-
-            assertEquals(list.size() - expectedResolved, list.getUnfetchedObjects());
-
-            counter++;
-        }
-    }
-
-    @Test
-    public void testUnfetchedObjects() throws Exception {
-        prepareList(6);
-        assertEquals(COUNT - 6, list.getUnfetchedObjects());
-        list.get(7);
-        assertEquals(COUNT - 12, list.getUnfetchedObjects());
-        list.resolveAll();
-        assertEquals(0, list.getUnfetchedObjects());
-    }
-
-    @Test
-    public void testPageIndex() throws Exception {
-        prepareList(6);
-        assertEquals(0, list.pageIndex(0));
-        assertEquals(0, list.pageIndex(1));
-        assertEquals(1, list.pageIndex(6));
-
-        try {
-            assertEquals(13, list.pageIndex(82));
-            fail("Element index beyound array size must throw an IndexOutOfBoundsException.");
-        }
-        catch (IndexOutOfBoundsException ex) {
-            // exception expercted
-        }
-    }
-
-    @Test
-    public void testPagesRead1() throws Exception {
-        prepareList(6);
-        assertTrue(list.elements.get(0) instanceof ClientMtTable1);
-        assertSame(RemoteIncrementalFaultList.PLACEHOLDER, list.elements.get(8));
-
-        list.resolveInterval(5, 10);
-        assertTrue(list.elements.get(7) instanceof ClientMtTable1);
-
-        list.resolveAll();
-        assertTrue((list.elements.get(list.size() - 1)) instanceof ClientMtTable1);
-    }
-
-    @Test
-    public void testGet1() throws Exception {
-        prepareList(6);
-        assertTrue(list.elements.get(0) instanceof ClientMtTable1);
-        assertSame(RemoteIncrementalFaultList.PLACEHOLDER, list.elements.get(8));
-
-        Object a = list.get(8);
-
-        assertNotNull(a);
-        assertTrue(a instanceof ClientMtTable1);
-        assertTrue(list.elements.get(8) instanceof ClientMtTable1);
-    }
-
-    @Test
-    public void testIndexOf() throws Exception {
-        prepareList(6);
-
-        Expression qual = ExpressionFactory.matchExp(
-                ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY,
-                "g20");
-        SelectQuery query = new SelectQuery(ClientMtTable1.class, qual);
-        List<?> artists = list.context.performQuery(query);
-
-        assertEquals(1, artists.size());
-
-        ClientMtTable1 row = (ClientMtTable1) artists.get(0);
-        assertEquals(19, list.indexOf(row));
-        assertEquals(-1, list.indexOf(list.context.newObject(ClientMtTable1.class)));
-    }
-
-    @Test
-    public void testLastIndexOf() throws Exception {
-        prepareList(6);
-        Expression qual = ExpressionFactory.matchExp(
-                ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY,
-                "g20");
-        SelectQuery query = new SelectQuery(ClientMtTable1.class, qual);
-        List<?> objects = list.context.performQuery(query);
-
-        assertEquals(1, objects.size());
-
-        ClientMtTable1 row = (ClientMtTable1) objects.get(0);
-        assertEquals(19, list.lastIndexOf(row));
-        assertEquals(-1, list.lastIndexOf(list.context.newObject(ClientMtTable1.class)));
-    }
-
-    private void doTestIterator(int size) throws Exception {
-        prepareList(size);
-        Iterator<?> it = list.iterator();
-
-        assertTrue(it.hasNext());
-
-        int counter = 0;
-        while (it.hasNext()) {
-            Object obj = it.next();
-            assertNotNull(obj);
-            assertTrue(obj instanceof Persistent);
-
-            // iterator must be resolved page by page
-            int expectedResolved = list.pageIndex(counter)
-                    * list.getPageSize()
-                    + list.getPageSize();
-            if (expectedResolved > list.size()) {
-                expectedResolved = list.size();
-            }
-
-            assertEquals(list.size() - expectedResolved, list.getUnfetchedObjects());
-
-            counter++;
-        }
-    }
+	private static final int COUNT = 25;
+
+	@Inject
+	private CayenneContext clientContext;
+
+	@Inject
+	private DBHelper dbHelper;
+
+	private TableHelper tMTTable;
+
+	private RemoteIncrementalFaultList list;
+
+	@Override
+	protected void setUpAfterInjection() throws Exception {
+		dbHelper.deleteAll("MT_TABLE2");
+		dbHelper.deleteAll("MT_TABLE1");
+
+		tMTTable = new TableHelper(dbHelper, "MT_TABLE1");
+		tMTTable.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1",
+				"SERVER_ATTRIBUTE1");
+	}
+
+	protected void createObjectsDataSet() throws Exception {
+		tMTTable.insert(1, "g1", "s1");
+		tMTTable.insert(2, "g2", "s2");
+		tMTTable.insert(3, "g3", "s3");
+		tMTTable.insert(4, "g4", "s4");
+		tMTTable.insert(5, "g5", "s5");
+		tMTTable.insert(6, "g6", "s6");
+		tMTTable.insert(7, "g7", "s7");
+		tMTTable.insert(8, "g8", "s8");
+		tMTTable.insert(9, "g9", "s9");
+		tMTTable.insert(10, "g10", "s10");
+		tMTTable.insert(11, "g11", "s11");
+		tMTTable.insert(12, "g12", "s12");
+		tMTTable.insert(13, "g13", "s13");
+		tMTTable.insert(14, "g14", "s14");
+		tMTTable.insert(15, "g15", "s15");
+		tMTTable.insert(16, "g16", "s16");
+		tMTTable.insert(17, "g17", "s17");
+		tMTTable.insert(18, "g18", "s18");
+		tMTTable.insert(19, "g19", "s19");
+		tMTTable.insert(20, "g20", "s20");
+		tMTTable.insert(21, "g21", "s21");
+		tMTTable.insert(22, "g22", "s22");
+		tMTTable.insert(23, "g23", "s23");
+		tMTTable.insert(24, "g24", "s24");
+		tMTTable.insert(25, "g25", "s25");
+	}
+
+	private void prepareList(int pageSize) throws Exception {
+
+		createObjectsDataSet();
+
+		SelectQuery<ClientMtTable1> query = new SelectQuery<ClientMtTable1>(
+				ClientMtTable1.class);
+
+		// make sure total number of objects is not divisable
+		// by the page size, to test the last smaller page
+		query.setPageSize(pageSize);
+		query.addOrdering("db:" + MtTable1.TABLE1_ID_PK_COLUMN,
+				SortOrder.ASCENDING);
+
+		list = new RemoteIncrementalFaultList(clientContext, query);
+	}
+
+	@Test
+	public void testSize() throws Exception {
+		prepareList(6);
+		assertEquals(COUNT, list.size());
+	}
+
+	@Test
+	public void testIteratorPageSize1() throws Exception {
+		doTestIterator(1);
+	}
+
+	@Test
+	public void testIteratorPageSize5() throws Exception {
+		// size divisiable by page size
+		doTestIterator(5);
+	}
+
+	@Test
+	public void testIteratorPageSize6() throws Exception {
+		// size not divisable by page size
+		doTestIterator(6);
+	}
+
+	@Test
+	public void testIteratorPageSize25() throws Exception {
+		// size equals to page size
+		doTestIterator(COUNT);
+	}
+
+	@Test
+	public void testIteratorPageSize26() throws Exception {
+		// size exceeding page size
+		doTestIterator(COUNT + 1);
+	}
+
+	@Test
+	public void testListIterator() throws Exception {
+		prepareList(6);
+		ListIterator<?> it = list.listIterator();
+
+		assertTrue(it.hasNext());
+
+		int counter = 0;
+		while (it.hasNext()) {
+			Object obj = it.next();
+			assertNotNull(obj);
+			assertTrue(obj instanceof Persistent);
+
+			// iterator must be resolved page by page
+			int expectedResolved = list.pageIndex(counter) * list.getPageSize()
+					+ list.getPageSize();
+			if (expectedResolved > list.size()) {
+				expectedResolved = list.size();
+			}
+
+			assertEquals(list.size() - expectedResolved,
+					list.getUnfetchedObjects());
+
+			counter++;
+		}
+	}
+
+	@Test
+	public void testUnfetchedObjects() throws Exception {
+		prepareList(6);
+		assertEquals(COUNT - 6, list.getUnfetchedObjects());
+		list.get(7);
+		assertEquals(COUNT - 12, list.getUnfetchedObjects());
+		list.resolveAll();
+		assertEquals(0, list.getUnfetchedObjects());
+	}
+
+	@Test
+	public void testPageIndex() throws Exception {
+		prepareList(6);
+		assertEquals(0, list.pageIndex(0));
+		assertEquals(0, list.pageIndex(1));
+		assertEquals(1, list.pageIndex(6));
+
+		try {
+			assertEquals(13, list.pageIndex(82));
+			fail("Element index beyound array size must throw an IndexOutOfBoundsException.");
+		} catch (IndexOutOfBoundsException ex) {
+			// exception expercted
+		}
+	}
+
+	@Test
+	public void testPagesRead1() throws Exception {
+		prepareList(6);
+		assertTrue(list.elements.get(0) instanceof ClientMtTable1);
+		assertSame(RemoteIncrementalFaultList.PLACEHOLDER, list.elements.get(8));
+
+		list.resolveInterval(5, 10);
+		assertTrue(list.elements.get(7) instanceof ClientMtTable1);
+
+		list.resolveAll();
+		assertTrue((list.elements.get(list.size() - 1)) instanceof ClientMtTable1);
+	}
+
+	@Test
+	public void testGet1() throws Exception {
+		prepareList(6);
+		assertTrue(list.elements.get(0) instanceof ClientMtTable1);
+		assertSame(RemoteIncrementalFaultList.PLACEHOLDER, list.elements.get(8));
+
+		Object a = list.get(8);
+
+		assertNotNull(a);
+		assertTrue(a instanceof ClientMtTable1);
+		assertTrue(list.elements.get(8) instanceof ClientMtTable1);
+	}
+
+	@Test
+	public void testIndexOf() throws Exception {
+		prepareList(6);
+
+		Expression qual = ExpressionFactory.matchExp(
+				ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, "g20");
+		SelectQuery<ClientMtTable1> query = new SelectQuery<ClientMtTable1>(
+				ClientMtTable1.class, qual);
+		List<?> artists = list.context.performQuery(query);
+
+		assertEquals(1, artists.size());
+
+		ClientMtTable1 row = (ClientMtTable1) artists.get(0);
+		assertEquals(19, list.indexOf(row));
+		assertEquals(-1,
+				list.indexOf(list.context.newObject(ClientMtTable1.class)));
+	}
+
+	@Test
+	public void testLastIndexOf() throws Exception {
+		prepareList(6);
+		Expression qual = ExpressionFactory.matchExp(
+				ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, "g20");
+		SelectQuery<ClientMtTable1> query = new SelectQuery<ClientMtTable1>(
+				ClientMtTable1.class, qual);
+		List<?> objects = list.context.performQuery(query);
+
+		assertEquals(1, objects.size());
+
+		ClientMtTable1 row = (ClientMtTable1) objects.get(0);
+		assertEquals(19, list.lastIndexOf(row));
+		assertEquals(-1,
+				list.lastIndexOf(list.context.newObject(ClientMtTable1.class)));
+	}
+
+	private void doTestIterator(int size) throws Exception {
+		prepareList(size);
+		Iterator<?> it = list.iterator();
+
+		assertTrue(it.hasNext());
+
+		int counter = 0;
+		while (it.hasNext()) {
+			Object obj = it.next();
+			assertNotNull(obj);
+			assertTrue(obj instanceof Persistent);
+
+			// iterator must be resolved page by page
+			int expectedResolved = list.pageIndex(counter) * list.getPageSize()
+					+ list.getPageSize();
+			if (expectedResolved > list.size()) {
+				expectedResolved = list.size();
+			}
+
+			assertEquals(list.size() - expectedResolved,
+					list.getUnfetchedObjects());
+
+			counter++;
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8990e655/cayenne-client/src/test/java/org/apache/cayenne/remote/ValueInjectorIT.java
----------------------------------------------------------------------
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/remote/ValueInjectorIT.java b/cayenne-client/src/test/java/org/apache/cayenne/remote/ValueInjectorIT.java
index a86b12e..0503ffc 100644
--- a/cayenne-client/src/test/java/org/apache/cayenne/remote/ValueInjectorIT.java
+++ b/cayenne-client/src/test/java/org/apache/cayenne/remote/ValueInjectorIT.java
@@ -22,6 +22,7 @@ import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.access.DataContext;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.remote.service.LocalConnection;
 import org.apache.cayenne.testdo.mt.ClientMtTable1Subclass1;
@@ -66,7 +67,7 @@ public class ValueInjectorIT extends RemoteCayenneCase {
             assertEquals(ee.getGlobalAttribute1(), "sub1");
 
             // check AND
-            entity.setDeclaredQualifier(qualifier.andExp(Expression.fromString("serverAttribute1 = 'sa'")));
+            entity.setDeclaredQualifier(qualifier.andExp(ExpressionFactory.exp("serverAttribute1 = 'sa'")));
             ee = serverContext.newObject(MtTable1Subclass1.class);
             assertEquals(ee.getGlobalAttribute1(), "sub1");
             assertEquals(ee.getServerAttribute1(), "sa");
@@ -86,7 +87,7 @@ public class ValueInjectorIT extends RemoteCayenneCase {
             assertEquals(ee.getGlobalAttribute1(), "sub1");
 
             // check AND
-            entity.setDeclaredQualifier(qualifier.andExp(Expression.fromString("serverAttribute1 = 'sa'")));
+            entity.setDeclaredQualifier(qualifier.andExp(ExpressionFactory.exp("serverAttribute1 = 'sa'")));
             ee = context.newObject(ClientMtTable1Subclass1.class);
             assertEquals(ee.getGlobalAttribute1(), "sub1");
             assertEquals(ee.getServerAttribute1(), "sa");