/* * Copyright 2012 Daniel Kurka * * 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.googlecode.mgwt.dom.client.recognizer.swipe; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HasHandlers; import com.google.gwtmockito.GwtMockitoTestRunner; import com.googlecode.mgwt.dom.client.recognizer.EventPropagator; import com.googlecode.mgwt.dom.client.recognizer.swipe.SwipeEvent.DIRECTION; import com.googlecode.mgwt.helper.TouchTestUtil; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; @RunWith(GwtMockitoTestRunner.class) public class SwipeRecognizerTest { @Mock HasHandlers hasHandlers; @Mock EventPropagator eventPropagator; @Captor ArgumentCaptor<GwtEvent<?>> eventCaptor; @Captor ArgumentCaptor<HasHandlers> hasHandlersCaptor; private SwipeRecognizer swipeRecognizer; @Before public void setUp() throws Exception { swipeRecognizer = new SwipeRecognizer(hasHandlers) { @Override EventPropagator getEventPropagator() { return eventPropagator; } }; } @Test public void testSwipeRecognizerHasHandlers() { try { new SwipeRecognizer(null); Assert.fail("expected exception did not occur"); } catch (IllegalArgumentException ignored) { } } @Test public void testSwipeRecognizerHasHandlersInt() { try { new SwipeRecognizer(hasHandlers, -1); Assert.fail("expected exception did not occur"); } catch (IllegalArgumentException ignored) { } } @Test public void testSwipeRecognizerHasHandlersInt1() { try { new SwipeRecognizer(hasHandlers, 2); Assert.fail("expected exception did not occur"); } catch (IllegalArgumentException ignored) { } } @Test public void testSwipeRecognizerHasHandlersIntInt() { try { new SwipeRecognizer(hasHandlers, 20, -1); Assert.fail("expected exception did not occur"); } catch (IllegalArgumentException ignored) { } } @Test public void testSimpleHorizontalSwipe() { swipeRecognizer.onTouchStart(TouchTestUtil.createTouchStartEvent(0, 0)); boolean first = true; int i = 1; for (i = 1; i < 60; i++) { swipeRecognizer.onTouchMove(TouchTestUtil.createTouchMoveEvent(i, 0)); if (i >= swipeRecognizer.getThreshold()) { verify(eventPropagator).fireEvent(eq(hasHandlers), eventCaptor.capture()); reset(eventPropagator); GwtEvent<?> event = eventCaptor.getValue(); if (first) { first = false; if (!(event instanceof SwipeStartEvent)) { Assert.fail("swipe start event was not fired"); } SwipeStartEvent swipeStartEvent = (SwipeStartEvent) event; Assert.assertEquals(DIRECTION.LEFT_TO_RIGHT, swipeStartEvent.getDirection()); Assert.assertEquals(swipeRecognizer.getThreshold(), swipeStartEvent.getDistance()); } else { if (!(event instanceof SwipeMoveEvent)) { Assert.fail("swipe move event was not fired"); } SwipeMoveEvent swipeMoveEvent = (SwipeMoveEvent) event; Assert.assertEquals(DIRECTION.LEFT_TO_RIGHT, swipeMoveEvent.getDirection()); Assert.assertEquals(i, swipeMoveEvent.getDistance()); if (swipeMoveEvent.getDistance() > swipeRecognizer.getMinDistance()) { Assert.assertTrue(swipeMoveEvent.isDistanceReached()); } else { Assert.assertFalse(swipeMoveEvent.isDistanceReached()); } } } } swipeRecognizer.onTouchEnd(TouchTestUtil.createTouchEndEvent()); verify(eventPropagator).fireEvent(eq(hasHandlers), eventCaptor.capture()); GwtEvent<?> event = eventCaptor.getValue(); if (!(event instanceof SwipeEndEvent)) { Assert.fail("swipe end event was not fired"); } SwipeEndEvent swipeEndEvent = (SwipeEndEvent) event; Assert.assertEquals(DIRECTION.LEFT_TO_RIGHT, swipeEndEvent.getDirection()); Assert.assertEquals(i - 1, swipeEndEvent.getDistance()); Assert.assertTrue(swipeEndEvent.isDistanceReached()); } @Test public void testSimpleHorizontalSwipe2Times() { swipeRecognizer.onTouchStart(TouchTestUtil.createTouchStartEvent(0, 0)); boolean first = true; int i = 1; for (i = 1; i < 60; i++) { swipeRecognizer.onTouchMove(TouchTestUtil.createTouchMoveEvent(i, 0)); if (i >= swipeRecognizer.getThreshold()) { verify(eventPropagator).fireEvent(eq(hasHandlers), eventCaptor.capture()); reset(eventPropagator); GwtEvent<?> event = eventCaptor.getValue(); if (first) { first = false; if (!(event instanceof SwipeStartEvent)) { Assert.fail("swipe start event was not fired"); } SwipeStartEvent swipeStartEvent = (SwipeStartEvent) event; Assert.assertEquals(DIRECTION.LEFT_TO_RIGHT, swipeStartEvent.getDirection()); Assert.assertEquals(swipeRecognizer.getThreshold(), swipeStartEvent.getDistance()); } else { if (!(event instanceof SwipeMoveEvent)) { Assert.fail("swipe move event was not fired"); } SwipeMoveEvent swipeMoveEvent = (SwipeMoveEvent) event; Assert.assertEquals(DIRECTION.LEFT_TO_RIGHT, swipeMoveEvent.getDirection()); Assert.assertEquals(i, swipeMoveEvent.getDistance()); if (swipeMoveEvent.getDistance() > swipeRecognizer.getMinDistance()) { Assert.assertTrue(swipeMoveEvent.isDistanceReached()); } else { Assert.assertFalse(swipeMoveEvent.isDistanceReached()); } } } } swipeRecognizer.onTouchEnd(TouchTestUtil.createTouchEndEvent()); verify(eventPropagator).fireEvent(eq(hasHandlers), eventCaptor.capture()); GwtEvent<?> event = eventCaptor.getValue(); if (!(event instanceof SwipeEndEvent)) { Assert.fail("swipe end event was not fired"); } SwipeEndEvent swipeEndEvent = (SwipeEndEvent) event; Assert.assertEquals(DIRECTION.LEFT_TO_RIGHT, swipeEndEvent.getDirection()); Assert.assertEquals(i - 1, swipeEndEvent.getDistance()); Assert.assertTrue(swipeEndEvent.isDistanceReached()); // second time reset(eventPropagator); swipeRecognizer.onTouchStart(TouchTestUtil.createTouchStartEvent(0, 0)); first = true; for (i = 1; i < 60; i++) { swipeRecognizer.onTouchMove(TouchTestUtil.createTouchMoveEvent(i, 0)); if (i >= swipeRecognizer.getThreshold()) { verify(eventPropagator).fireEvent(eq(hasHandlers), eventCaptor.capture()); reset(eventPropagator); event = eventCaptor.getValue(); if (first) { first = false; if (!(event instanceof SwipeStartEvent)) { Assert.fail("swipe start event was not fired"); } SwipeStartEvent swipeStartEvent = (SwipeStartEvent) event; Assert.assertEquals(DIRECTION.LEFT_TO_RIGHT, swipeStartEvent.getDirection()); Assert.assertEquals(swipeRecognizer.getThreshold(), swipeStartEvent.getDistance()); } else { if (!(event instanceof SwipeMoveEvent)) { Assert.fail("swipe move event was not fired"); } SwipeMoveEvent swipeMoveEvent = (SwipeMoveEvent) event; Assert.assertEquals(DIRECTION.LEFT_TO_RIGHT, swipeMoveEvent.getDirection()); Assert.assertEquals(i, swipeMoveEvent.getDistance()); if (swipeMoveEvent.getDistance() > swipeRecognizer.getMinDistance()) { Assert.assertTrue(swipeMoveEvent.isDistanceReached()); } else { Assert.assertFalse(swipeMoveEvent.isDistanceReached()); } } } } swipeRecognizer.onTouchEnd(TouchTestUtil.createTouchEndEvent()); verify(eventPropagator).fireEvent(eq(hasHandlers), eventCaptor.capture()); event = eventCaptor.getValue(); if (!(event instanceof SwipeEndEvent)) { Assert.fail("swipe end event was not fired"); } swipeEndEvent = (SwipeEndEvent) event; Assert.assertEquals(DIRECTION.LEFT_TO_RIGHT, swipeEndEvent.getDirection()); Assert.assertEquals(i - 1, swipeEndEvent.getDistance()); Assert.assertTrue(swipeEndEvent.isDistanceReached()); } @Test public void testSimpleVerticalSwipe() { swipeRecognizer.onTouchStart(TouchTestUtil.createTouchStartEvent(0, 0)); boolean first = true; int i = 1; for (i = 1; i < 60; i++) { swipeRecognizer.onTouchMove(TouchTestUtil.createTouchMoveEvent(0, i)); if (i >= swipeRecognizer.getThreshold()) { verify(eventPropagator).fireEvent(eq(hasHandlers), eventCaptor.capture()); reset(eventPropagator); GwtEvent<?> event = eventCaptor.getValue(); if (first) { first = false; if (!(event instanceof SwipeStartEvent)) { Assert.fail("swipe start event was not fired"); } SwipeStartEvent swipeStartEvent = (SwipeStartEvent) event; Assert.assertEquals(DIRECTION.TOP_TO_BOTTOM, swipeStartEvent.getDirection()); Assert.assertEquals(swipeRecognizer.getThreshold(), swipeStartEvent.getDistance()); } else { if (!(event instanceof SwipeMoveEvent)) { Assert.fail("swipe move event was not fired"); } SwipeMoveEvent swipeMoveEvent = (SwipeMoveEvent) event; Assert.assertEquals(DIRECTION.TOP_TO_BOTTOM, swipeMoveEvent.getDirection()); Assert.assertEquals(i, swipeMoveEvent.getDistance()); if (swipeMoveEvent.getDistance() > swipeRecognizer.getMinDistance()) { Assert.assertTrue(swipeMoveEvent.isDistanceReached()); } else { Assert.assertFalse(swipeMoveEvent.isDistanceReached()); } } } } swipeRecognizer.onTouchEnd(TouchTestUtil.createTouchEndEvent()); verify(eventPropagator).fireEvent(eq(hasHandlers), eventCaptor.capture()); GwtEvent<?> event = eventCaptor.getValue(); if (!(event instanceof SwipeEndEvent)) { Assert.fail("swipe end event was not fired"); } SwipeEndEvent swipeEndEvent = (SwipeEndEvent) event; Assert.assertEquals(DIRECTION.TOP_TO_BOTTOM, swipeEndEvent.getDirection()); Assert.assertEquals(i - 1, swipeEndEvent.getDistance()); Assert.assertTrue(swipeEndEvent.isDistanceReached()); } @Test public void testSimpleVerticalSwipeAfterRandomInput() { swipeRecognizer.onTouchStart(TouchTestUtil.createTouchStartEvent(0, 0)); swipeRecognizer.onTouchMove(TouchTestUtil.createTouchMoveEvent(1, 1)); swipeRecognizer.onTouchEnd(TouchTestUtil.createTouchEndEvent()); swipeRecognizer.onTouchStart(TouchTestUtil.createTouchStartEvent(0, 0)); boolean first = true; int i = 1; for (i = 1; i < 60; i++) { swipeRecognizer.onTouchMove(TouchTestUtil.createTouchMoveEvent(0, i)); if (i >= swipeRecognizer.getThreshold()) { verify(eventPropagator).fireEvent(eq(hasHandlers), eventCaptor.capture()); reset(eventPropagator); GwtEvent<?> event = eventCaptor.getValue(); if (first) { first = false; if (!(event instanceof SwipeStartEvent)) { Assert.fail("swipe start event was not fired"); } SwipeStartEvent swipeStartEvent = (SwipeStartEvent) event; Assert.assertEquals(DIRECTION.TOP_TO_BOTTOM, swipeStartEvent.getDirection()); Assert.assertEquals(swipeRecognizer.getThreshold(), swipeStartEvent.getDistance()); } else { if (!(event instanceof SwipeMoveEvent)) { Assert.fail("swipe move event was not fired"); } SwipeMoveEvent swipeMoveEvent = (SwipeMoveEvent) event; Assert.assertEquals(DIRECTION.TOP_TO_BOTTOM, swipeMoveEvent.getDirection()); Assert.assertEquals(i, swipeMoveEvent.getDistance()); if (swipeMoveEvent.getDistance() > swipeRecognizer.getMinDistance()) { Assert.assertTrue(swipeMoveEvent.isDistanceReached()); } else { Assert.assertFalse(swipeMoveEvent.isDistanceReached()); } } } } swipeRecognizer.onTouchEnd(TouchTestUtil.createTouchEndEvent()); verify(eventPropagator).fireEvent(eq(hasHandlers), eventCaptor.capture()); GwtEvent<?> event = eventCaptor.getValue(); if (!(event instanceof SwipeEndEvent)) { Assert.fail("swipe end event was not fired"); } SwipeEndEvent swipeEndEvent = (SwipeEndEvent) event; Assert.assertEquals(DIRECTION.TOP_TO_BOTTOM, swipeEndEvent.getDirection()); Assert.assertEquals(i - 1, swipeEndEvent.getDistance()); Assert.assertTrue(swipeEndEvent.isDistanceReached()); } }