/** * Copyright 2009 Google Inc. * * 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. * */ package org.waveprotocol.wave.model.conversation; import static org.mockito.Matchers.same; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import junit.framework.TestCase; import org.mockito.ArgumentCaptor; import org.waveprotocol.wave.model.adt.BasicValue; import org.waveprotocol.wave.model.adt.ObservableBasicValue; import org.waveprotocol.wave.model.adt.ObservableElementList; import org.waveprotocol.wave.model.document.ObservableMutableDocument; import org.waveprotocol.wave.model.document.util.DefaultDocumentEventRouter; import org.waveprotocol.wave.model.document.util.DocHelper; import org.waveprotocol.wave.model.util.CollectionUtils; /** * @author zdwang@google.com (David Wang) */ public class DocumentBasedManifestThreadTest extends TestCase { /** * Test the delegation is wired up properly */ @SuppressWarnings("unchecked") public void testWiringUp() { // Create mock list and value. ObservableElementList<ObservableManifestBlip, String> blips = mock( ObservableElementList.class, "blips"); BasicValue<String> id = mock(ObservableBasicValue.class, "id"); ObservableBasicValue<Boolean> inlined = mock(ObservableBasicValue.class, "inlined"); ObservableManifestThread.Listener threadListener = mock( ObservableManifestThread.Listener.class, "threadListener"); // Create mock objects to use as return value final ObservableManifestBlip blip = mock(ObservableManifestBlip.class, "blip"); final Iterable<ObservableManifestBlip> iterator = mock(Iterable.class, "iterator"); // Listeners that the manifest thread will add. ArgumentCaptor<ObservableElementList.Listener> blipsListener = ArgumentCaptor.forClass(ObservableElementList.Listener.class); // Create a thread to test. DocumentBasedManifestThread thread = new DocumentBasedManifestThread(blips, id, inlined); thread.addListener(threadListener); verify(blips).addListener(blipsListener.capture()); // Pretend list and value events. blipsListener.getValue().onValueAdded(blip); blipsListener.getValue().onValueRemoved(blip); verify(threadListener).onBlipAdded(same(blip)); verify(threadListener).onBlipRemoved(same(blip)); verify(blip).detachListeners(); when(blips.add("b+1")).thenReturn(blip); when(blips.add(1, "b+2")).thenReturn(blip); when(blips.get(2)).thenReturn(blip); when(blips.getValues()).thenReturn(iterator); when(blips.indexOf(same(blip))).thenReturn(1); when(blips.remove(same(blip))).thenReturn(true); when(blips.size()).thenReturn(2); // Exercise the ManifestThread interface. assertEquals(blip, thread.appendBlip("b+1")); assertEquals(blip, thread.insertBlip(1, "b+2")); assertEquals(blip, thread.getBlip(2)); assertEquals(iterator, thread.getBlips()); assertEquals(1, thread.indexOf(blip)); assertTrue(thread.removeBlip(blip)); assertEquals(2, thread.numBlips()); when(id.get()).thenReturn("cc"); when(inlined.get()).thenReturn(false); assertEquals("cc", thread.getId()); assertFalse(thread.isInline()); // Verify listener can be detached. thread.removeListener(threadListener); blipsListener.getValue().onValueAdded(blip); verifyNoMoreInteractions(threadListener); } /** * Very basic test to see that we can create the object with a document and use it. */ public void testSimpleUsageWithDocument() { ObservableManifestThread thread = buildThreadElement( ConversationTestUtils.createManifestDocument(), "t1"); ManifestBlip blip = thread.appendBlip("b+1"); assertNotNull(blip); assertEquals("b+1", blip.getId()); assertFalse(thread.isInline()); } private <N> ObservableManifestThread buildThreadElement( ObservableMutableDocument<N, ?, ?> document, String id) { return buildThreadElement2(document, id); } private <E> ObservableManifestThread buildThreadElement2( ObservableMutableDocument<? super E, E, ?> document, String id) { E root = DocHelper.getOrCreateFirstTopLevelElement(document, "conversation"); E blip = document.createChildElement(root, "blip", CollectionUtils.immutableMap("id", "b+top")); E container = document.createChildElement(blip, "thread", CollectionUtils.immutableMap("id", id)); return DocumentBasedManifestThread.create(DefaultDocumentEventRouter.create(document), container); } }