/** * Copyright 2011 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.client.wavepanel.render; import static org.mockito.Mockito.mock; import com.google.common.collect.Iterables; import junit.framework.TestCase; import org.waveprotocol.wave.client.account.ProfileManager; import org.waveprotocol.wave.client.account.impl.ProfileManagerImpl; import org.waveprotocol.wave.client.scheduler.testing.FakeTimerService; import org.waveprotocol.wave.client.state.ThreadReadStateMonitor; import org.waveprotocol.wave.client.wavepanel.view.View; import org.waveprotocol.wave.client.wavepanel.view.dom.ModelAsViewProvider; import org.waveprotocol.wave.client.wavepanel.view.fake.FakeRenderer; import org.waveprotocol.wave.model.conversation.Conversation; import org.waveprotocol.wave.model.conversation.ConversationBlip; import org.waveprotocol.wave.model.conversation.ConversationThread; import org.waveprotocol.wave.model.conversation.ObservableConversationView; import org.waveprotocol.wave.model.conversation.testing.FakeConversationView; import org.waveprotocol.wave.model.document.util.XmlStringBuilder; import org.waveprotocol.wave.model.supplement.ObservableSupplementedWave; /** * Tests commutativity between static rendering and dynamic rendering (i.e., * render then update produces the same rendering as update then render). * * @author hearnden@google.com (David Hearnden) */ public final class WaveRendererTest extends TestCase { private FakeTimerService timer; private ObservableConversationView wave; private View rendering; @Override protected void setUp() { ShallowBlipRenderer populator = mock(ShallowBlipRenderer.class); ObservableSupplementedWave supplement = mock(ObservableSupplementedWave.class); ProfileManager profiles = new ProfileManagerImpl(); ThreadReadStateMonitor readMonitor = mock(ThreadReadStateMonitor.class); // Create a wave wave = createWave(); // Render it. FakeRenderer renderer = FakeRenderer.create(wave); ModelAsViewProvider views = renderer; rendering = renderer.render(wave); // Keep it live. ReplyManager replyHandler = new ReplyManager(views); timer = new FakeTimerService(); LiveConversationViewRenderer.create( timer, wave, views, populator, replyHandler, readMonitor, profiles, supplement).init(); } private FakeConversationView createWave() { FakeConversationView wave = FakeConversationView.builder().build(); Conversation c = wave.createRoot(); ConversationBlip b1 = c.getRootThread().appendBlip(); ConversationBlip b2 = c.getRootThread().appendBlip(); write(b1, "First blip"); write(b2, "Second blip"); ConversationThread b1t1 = b1.addReplyThread(5); write(b1t1.appendBlip(), "First reply"); ConversationThread b1t2 = b1.addReplyThread(); write(b1t2.appendBlip(), "Second reply"); return wave; } private static void write(ConversationBlip blip, String msg) { org.waveprotocol.wave.model.document.Document d = blip.getContent(); d.emptyElement(d.getDocumentElement()); d.appendXml(XmlStringBuilder.createFromXmlString("<body><line></line>" + msg + "</body>")); } /** Completely re-renders the wave, producing a new view. */ private View render() { View view = FakeRenderer.create(wave).render(wave); timer.tick(1); // Flush profile rendering. return view; } public void testInitialRendering() { // Just check that nothing crashes during setUp. } public void testLiveRenderingCommutesOnBlipAppend() { ConversationThread root = wave.getRoot().getRootThread(); root.appendBlip(); assertEquals(render().toString(), rendering.toString()); } public void testLiveRenderingCommutesOnBlipInsert() { ConversationThread root = wave.getRoot().getRootThread(); root.insertBlip(Iterables.get(root.getBlips(), 1)); assertEquals(render().toString(), rendering.toString()); } public void testLiveRenderingCommutesOnBlipDelete() { ConversationThread root = wave.getRoot().getRootThread(); root.getFirstBlip().delete(); assertEquals(render().toString(), rendering.toString()); } }