/* * (C) Copyright 2006-2011 Nuxeo SA (http://nuxeo.com/) and others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Contributors: * Florent Guillaume */ package org.nuxeo.ecm.core.storage.mem; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Test; import org.nuxeo.ecm.core.storage.State; import org.nuxeo.ecm.core.storage.State.ListDiff; import org.nuxeo.ecm.core.storage.State.StateDiff; import org.nuxeo.ecm.core.storage.StateHelper; public class TestMemRepositoryApplyDiff { // always return a List<Serializable> that is Serializable private static final ArrayList<Object> list(Object... strings) { return new ArrayList<>(Arrays.asList(strings)); } private static final StateDiff stateDiff(Serializable... values) { assertTrue(values.length % 2 == 0); StateDiff diff = new StateDiff(); for (int i = 0; i < values.length; i += 2) { diff.put((String) values[i], values[i + 1]); } return diff; } private static final ListDiff listDiff(List<Object> diff, List<Object> rpush) { ListDiff listDiff = new ListDiff(); listDiff.diff = diff; listDiff.rpush = rpush; return listDiff; } private static final ListDiff rpush(Object... values) { return listDiff(null, list(values)); } private static final State state(Serializable... values) { return stateDiff(values); } private static void assertEqualsStrict(String message, Serializable a, Serializable b) { assertTrue(message, StateHelper.equalsStrict(a, b)); } private static void assertApplyDiff(State expected, State state, StateDiff diff) { MemRepository.applyDiff(state, diff); assertEqualsStrict(state.toString(), expected, state); } @Test public void testApplyDiff() { assertApplyDiff(state("A", "B"), // state("A", "B"), // stateDiff()); assertApplyDiff(state("A", "B"), // state(), // stateDiff("A", "B")); assertApplyDiff(state("A", state("B", "D")), // state("A", state("B", "C")), // stateDiff("A", stateDiff("B", "D"))); assertApplyDiff(state("A", state("B", "C", "D", "E")), // state("A", state("B", "C")), // stateDiff("A", stateDiff("D", "E"))); assertApplyDiff(state("A", list("B", "C")), // state("A", list("B")), // stateDiff("A", rpush("C"))); } @Test public void testCopiesValues() { ArrayList<Object> list1 = list("L1"); State state = state("A", list1); ArrayList<Object> list2 = list("L2"); MemRepository.applyDiff(state, (StateDiff) state("A", list2)); // make sure we don't end up with the actual list2 in the new state, but with a copy Serializable list3 = state.get("A"); assertEqualsStrict("Should be equal", list2, list3); assertNotSame(list2, list3); } @Test public void testCopiesListDiffDiff() { ArrayList<Object> list = list(list("L1")); ArrayList<Object> list1 = list("L2"); MemRepository.applyDiff(list, listDiff(list(list1), null)); // diff // make sure we don't end up with the actual list1 in the new list, but with a copy Serializable list2 = (Serializable) list.get(0); assertEqualsStrict("Should be equal", list1, list2); assertNotSame(list1, list2); } @Test public void testCopiesListDiffRpush() { ArrayList<Object> list = list(); ArrayList<Object> list1 = list("L1"); MemRepository.applyDiff(list, listDiff(null, list(list1))); // rpush // make sure we don't end up with the actual list1 in the new list, but with a copy Serializable list2 = (Serializable) list.get(0); assertEqualsStrict("Should be equal", list1, list2); assertNotSame(list1, list2); } }