@Test
public void testNoAction() {

	Replicator replicator;
	MockReplicationSource source;
	MockReplicationDestination destination;
	MockTransactionSnapshotLoader snapshotLoader;
	MockSystemTimeLoader timeLoader;
	ReplicationState initialState;
	ReplicationState finalState;
	
	// Build initial replication state.
	initialState = new ReplicationState(
			200,
			200,
			Arrays.asList(new Long[]{110L, 112L}),
			Arrays.asList(new Long[]{}),
			buildDate("2009-10-11 12:13:14"),
			0);
	
	// Build the mocks.
	source = new MockReplicationSource();
	destination = new MockReplicationDestination(initialState);
	snapshotLoader = new MockTransactionSnapshotLoader();
	timeLoader = new MockSystemTimeLoader();
	
	// Instantiate the new replicator.
	replicator = new Replicator(source, destination, snapshotLoader, timeLoader, 1, 0, 0);
	
	// We want the snapshot loader to return the same snapshot to simulate no database changes.
	snapshotLoader.getSnapshots().add(new TransactionSnapshot("100:200:110,112"));
	// But we want the clock time to have progressed.
	timeLoader.getTimes().add(buildDate("2009-10-11 12:13:15"));
	timeLoader.getTimes().add(buildDate("2009-10-11 12:13:15"));
	timeLoader.getTimes().add(buildDate("2009-10-11 12:13:15"));
	
	// Launch the replication process.
	replicator.replicate();
	
	// Verify that the final state does not match the initial state, but that the only
	// difference is the time and increment sequence number.
	finalState = destination.getCurrentState();
	Assert.assertFalse("Final state should not match initial state.", finalState.equals(initialState));
	finalState.setTimestamp(initialState.getTimestamp());
	finalState.setSequenceNumber(finalState.getSequenceNumber() - 1);
	Assert.assertTrue("Final state should match initial state after updating timestamp.",
			finalState.equals(initialState));
	
	// Verify that no changes were replicated.
	Assert.assertTrue("No changes should have been replicated.", source.getPredicatesList().size() == 0);
}