// Copyright 2012 Google Inc. All Rights Reserved. // // 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 com.google.collide.client.filehistory; import com.google.collide.client.AppContext; import com.google.collide.client.testing.MockAppContext; import com.google.collide.dto.Revision.RevisionType; import com.google.collide.dto.client.DtoClientImpls.RevisionImpl; import com.google.gwt.junit.client.GWTTestCase; import java.util.Date; /** * */ public class TimelineTest extends GWTTestCase{ Timeline timeline; AppContext context; @Override public String getModuleName() { return "com.google.collide.client.TestCode"; } @Override public void gwtSetUp() throws Exception{ super.gwtSetUp(); context = new MockAppContext(); timeline = new MockTimeline(new MockFileHistory(context), new FileHistory.View(context.getResources()).timelineView, context); FileHistoryApi api = new FileHistoryApi(context, null, timeline, null); timeline.setApi(api); RevisionImpl revision = RevisionImpl.make(); revision.setNodeId("12345"); revision.setTimestamp(Long.toString(new Date().getTime())); revision.setRevisionType(RevisionType.AUTO_SAVE); revision.setHasUnresolvedConflicts(false); revision.setIsFinalResolution(false); revision.setPreviousNodesSkipped(0); // Add 4 fake timeline nodes TimelineNode node = new TimelineNode( new TimelineNode.View(context.getResources()), 0, revision, timeline); timeline.nodes.add(node); node = new TimelineNode( new TimelineNode.View(context.getResources()), 1, revision, timeline); timeline.nodes.add(node); node = new TimelineNode( new TimelineNode.View(context.getResources()), 2, revision, timeline); timeline.nodes.add(node); node = new TimelineNode( new TimelineNode.View(context.getResources()), 3, revision, timeline); timeline.nodes.add(node); node = new TimelineNode( new TimelineNode.View(context.getResources()), 4, revision, timeline); timeline.nodes.add(node); timeline.numNodes = 5; timeline.setActiveRange(timeline.nodes.get(0), timeline.nodes.get(4)); } /** * Test that you can't drag a range line past the left edge */ public void testDragLeftPastEdge() { timeline.moveRange(-MockTimeline.TIMELINE_INTERVAL); assertEquals(timeline.tempLeftRange, timeline.nodes.get(0)); assertEquals(timeline.tempRightRange, timeline.nodes.get(4)); } /** * Test that you can't drag a range line past the right edge */ public void testDragRightPastEdge() { timeline.moveRange(MockTimeline.TIMELINE_INTERVAL); assertEquals(timeline.tempLeftRange, timeline.nodes.get(0)); assertEquals(timeline.tempRightRange, timeline.nodes.get(4)); } /** * Test that you can't drag the left side of the timeline past the left edge */ public void testResizeLeftPastEdges() { timeline.moveRangeEdge(timeline.nodes.get(0), -MockTimeline.TIMELINE_INTERVAL); assertEquals(timeline.tempLeftRange, timeline.nodes.get(0)); assertEquals(timeline.tempRightRange, timeline.nodes.get(4)); } /** * Test that you can't drag the right side of the timeline past the right edge */ public void testResizeRightPastEdges() { timeline.moveRangeEdge(timeline.nodes.get(3), MockTimeline.TIMELINE_INTERVAL); assertEquals(timeline.tempLeftRange, timeline.nodes.get(0)); assertEquals(timeline.tempRightRange, timeline.nodes.get(4)); } /** * Test that you can't resize the range line smaller than length of 1 */ public void testResize() { // Don't allow dragging the left edge to the right or the right // edge to the left if length = 1 timeline.setActiveRange(timeline.nodes.get(1), timeline.nodes.get(2)); timeline.moveRangeEdge(timeline.nodes.get(1), MockTimeline.TIMELINE_INTERVAL); assertEquals(timeline.tempLeftRange, timeline.nodes.get(1)); assertEquals(timeline.tempRightRange, timeline.nodes.get(2)); mouseUp(); timeline.setActiveRange(timeline.nodes.get(1), timeline.nodes.get(2)); timeline.moveRangeEdge(timeline.nodes.get(2), -MockTimeline.TIMELINE_INTERVAL); assertEquals(timeline.tempLeftRange, timeline.nodes.get(1)); assertEquals(timeline.tempRightRange, timeline.nodes.get(2)); } /** * Test snap-to resizing features */ public void testSnapToResizeLeft() { // Move more than 2/3 the way to the next node, should increment timeline.moveRangeEdge(timeline.nodes.get(0), 3 * MockTimeline.TIMELINE_INTERVAL/4); assertEquals(timeline.tempLeftRange, timeline.nodes.get(1)); assertEquals(timeline.tempRightRange, timeline.nodes.get(4)); // Move less than 2/3 the way to the next node, should not increment timeline.moveRangeEdge(timeline.nodes.get(0), 1); assertEquals(timeline.tempLeftRange, timeline.nodes.get(1)); assertEquals(timeline.tempRightRange, timeline.nodes.get(4)); // Move less than 2/3 the way to the next node, should not increment timeline.moveRangeEdge(timeline.nodes.get(0), MockTimeline.TIMELINE_INTERVAL/3); timeline.moveRangeEdge(timeline.nodes.get(0), MockTimeline.TIMELINE_INTERVAL/4); assertEquals(timeline.tempLeftRange, timeline.nodes.get(1)); assertEquals(timeline.tempRightRange, timeline.nodes.get(4)); resetSnapRange(3, 4); // Move more than 2/3 the way to the next node, should decrement timeline.moveRangeEdge(timeline.nodes.get(3), -( 3 * MockTimeline.TIMELINE_INTERVAL/4)); assertEquals(timeline.tempLeftRange, timeline.nodes.get(2)); assertEquals(timeline.tempRightRange, timeline.nodes.get(4)); resetSnapRange(2, 4); // Move less than 2/3 the way to the next node, should not decrement timeline.moveRangeEdge(timeline.nodes.get(2), -1); assertEquals(timeline.tempLeftRange, timeline.nodes.get(2)); assertEquals(timeline.tempRightRange, timeline.nodes.get(4)); mouseUp(); // Move less than 2/3 the way to the next node, should not decrement timeline.moveRangeEdge(timeline.nodes.get(1), -MockTimeline.TIMELINE_INTERVAL/3); timeline.moveRangeEdge(timeline.nodes.get(1), -MockTimeline.TIMELINE_INTERVAL/4); assertEquals(timeline.tempLeftRange, timeline.nodes.get(2)); assertEquals(timeline.tempRightRange, timeline.nodes.get(4)); } /** * Test snap-to resizing features */ public void testSnapToResizeRight() { // Move more than 2/3 the way to the next node, should decrement timeline.moveRangeEdge(timeline.nodes.get(4), -3 * MockTimeline.TIMELINE_INTERVAL/4); assertEquals(timeline.tempLeftRange, timeline.nodes.get(0)); assertEquals(timeline.tempRightRange, timeline.nodes.get(3)); // Move less than 2/3 the way to the next node, should not decrement timeline.moveRangeEdge(timeline.nodes.get(4), -1); assertEquals(timeline.tempLeftRange, timeline.nodes.get(0)); assertEquals(timeline.tempRightRange, timeline.nodes.get(3)); // Move less than 2/3 the way to the next node, should not decrement timeline.moveRangeEdge(timeline.nodes.get(4), -MockTimeline.TIMELINE_INTERVAL/3); timeline.moveRangeEdge(timeline.nodes.get(4), -MockTimeline.TIMELINE_INTERVAL/4); assertEquals(timeline.tempLeftRange, timeline.nodes.get(0)); assertEquals(timeline.tempRightRange, timeline.nodes.get(3)); resetSnapRange(0, 1); // Move more than 2/3 the way to the next node, should increment timeline.moveRangeEdge(timeline.nodes.get(1), 3 * MockTimeline.TIMELINE_INTERVAL/4); assertEquals(timeline.tempLeftRange, timeline.nodes.get(0)); assertEquals(timeline.tempRightRange, timeline.nodes.get(2)); resetSnapRange(0, 2); // Move less than 2/3 the way to the next node, should not increment timeline.moveRangeEdge(timeline.nodes.get(1), 1); assertEquals(timeline.tempLeftRange, timeline.nodes.get(0)); assertEquals(timeline.tempRightRange, timeline.nodes.get(2)); mouseUp(); // Move less than 2/3 the way to the next node, should not increment timeline.moveRangeEdge(timeline.nodes.get(3), MockTimeline.TIMELINE_INTERVAL/3); timeline.moveRangeEdge(timeline.nodes.get(3), MockTimeline.TIMELINE_INTERVAL/4); assertEquals(timeline.tempLeftRange, timeline.nodes.get(0)); assertEquals(timeline.tempRightRange, timeline.nodes.get(2)); } /** * Test snap-to dragging features */ public void testSnapToDrag() { timeline.setActiveRange(timeline.nodes.get(1), timeline.nodes.get(2)); // Move more than 2/3 the way to the next node, should increment timeline.moveRange(3 * MockTimeline.TIMELINE_INTERVAL/4); assertEquals(timeline.tempLeftRange, timeline.nodes.get(2)); assertEquals(timeline.tempRightRange, timeline.nodes.get(3)); resetSnapRange(1, 2); // Move more than 2/3 the way to the next node, should increment timeline.moveRange(((int) ((2.0/3.0) * MockTimeline.TIMELINE_INTERVAL)) + 1); assertEquals(timeline.tempLeftRange, timeline.nodes.get(2)); assertEquals(timeline.tempRightRange, timeline.nodes.get(3)); resetSnapRange(1, 2); // Move less than 2/3 the way to the next node, should not increment timeline.moveRange(1); assertEquals(timeline.tempLeftRange, timeline.nodes.get(1)); assertEquals(timeline.tempRightRange, timeline.nodes.get(2)); resetSnapRange(1, 2); // Move less than 2/3 the way to the next node, should not increment timeline.moveRange(MockTimeline.TIMELINE_INTERVAL/3); timeline.moveRange(MockTimeline.TIMELINE_INTERVAL/4); assertEquals(timeline.tempLeftRange, timeline.nodes.get(1)); assertEquals(timeline.tempRightRange, timeline.nodes.get(2)); resetSnapRange(1, 2); // Move more than 2/3 the way to the next node, should increment timeline.moveRange(-(3 * MockTimeline.TIMELINE_INTERVAL/4)); assertEquals(timeline.tempLeftRange, timeline.nodes.get(0)); assertEquals(timeline.tempRightRange, timeline.nodes.get(1)); resetSnapRange(1, 2); // Move less than 2/3 the way to the next node, should not increment timeline.moveRange(-1); assertEquals(timeline.tempLeftRange, timeline.nodes.get(1)); assertEquals(timeline.tempRightRange, timeline.nodes.get(2)); resetSnapRange(1, 2); // Move less than 2/3 the way to the next node, should not increment timeline.moveRange(-MockTimeline.TIMELINE_INTERVAL/3); timeline.moveRange(-MockTimeline.TIMELINE_INTERVAL/4); assertEquals(timeline.tempLeftRange, timeline.nodes.get(1)); assertEquals(timeline.tempRightRange, timeline.nodes.get(2)); } public void resetSnapRange(int left, int right) { timeline.setActiveRange(timeline.nodes.get(left), timeline.nodes.get(right)); mouseUp(); } public void mouseUp() { timeline.setCurrentDragX(0); timeline.resetCatchUp(); timeline.resetLeftRange(); timeline.resetRightRange(); } }