001/**
002 * Copyright (c) 2008-2014 Ardor Labs, Inc.
003 *
004 * This file is part of Ardor3D.
005 *
006 * Ardor3D is free software: you can redistribute it and/or modify it 
007 * under the terms of its license which may be found in the accompanying
008 * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
009 */
010
011package com.ardor3d.input.swt;
012
013import static org.easymock.EasyMock.expect;
014import static org.easymock.EasyMock.createMock;
015import static org.easymock.EasyMock.replay;
016import static org.easymock.EasyMock.verify;
017import static org.junit.Assert.assertEquals;
018import static org.junit.Assert.assertFalse;
019import static org.junit.Assert.assertTrue;
020
021import java.util.Iterator;
022
023import org.eclipse.swt.events.MouseEvent;
024import org.eclipse.swt.graphics.Point;
025import org.eclipse.swt.widgets.Event;
026import org.junit.After;
027import org.junit.Before;
028import org.junit.Test;
029
030import com.ardor3d.framework.swt.SwtCanvas;
031import com.ardor3d.input.ButtonState;
032import com.ardor3d.input.MouseButton;
033import com.ardor3d.input.MouseState;
034
035public class TestSwtMouseWrapper {
036    SwtMouseWrapper wrapper;
037
038    SwtCanvas control;
039
040    MouseEvent e1, e2;
041
042    Object[] mocks;
043
044    @Before
045    public void setup() throws Exception {
046        control = createMock("control", SwtCanvas.class);
047
048        wrapper = new SwtMouseWrapper(control);
049        final Event event = new Event();
050        event.widget = control;
051
052        e1 = new MouseEvent(event);
053        e2 = new MouseEvent(event);
054
055        mocks = new Object[] { control };
056    }
057
058    @After
059    public void verifyMocks() throws Exception {
060        verify(mocks);
061    }
062
063    @Test
064    public void testMove1() throws Exception {
065        control.addMouseListener(wrapper);
066        control.addMouseMoveListener(wrapper);
067        control.addMouseWheelListener(wrapper);
068
069        expect(control.getSize()).andReturn(new Point(100, 100)).atLeastOnce();
070
071        replay(mocks);
072
073        wrapper.init();
074
075        setXY(e1, 2, 0);
076
077        wrapper.mouseMove(e1);
078
079        MouseState state = wrapper.getEvents().next();
080
081        assertFalse("no more events", wrapper.getEvents().hasNext());
082
083        assertEquals("x", 2, state.getX());
084        assertEquals("dx", 0, state.getDx());
085        assertEquals("y", 100, state.getY());
086        assertEquals("dy", 0, state.getDy());
087
088        for (final ButtonState bs : state.getButtonStates().values()) {
089            assertEquals("up", ButtonState.UP, bs);
090        }
091
092        setXY(e1, 4, 0);
093
094        wrapper.mouseMove(e1);
095
096        state = wrapper.getEvents().next();
097
098        assertFalse("no more events", wrapper.getEvents().hasNext());
099
100        assertEquals("x", 4, state.getX());
101        assertEquals("dx", 2, state.getDx());
102        assertEquals("y", 100, state.getY());
103        assertEquals("dy", 0, state.getDy());
104
105        for (final ButtonState bs : state.getButtonStates().values()) {
106            assertEquals("up", ButtonState.UP, bs);
107        }
108
109        setXY(e1, 2, 4);
110
111        wrapper.mouseMove(e1);
112
113        state = wrapper.getEvents().next();
114
115        assertFalse("no more events", wrapper.getEvents().hasNext());
116
117        assertEquals("x", 2, state.getX());
118        assertEquals("dx", -2, state.getDx());
119        assertEquals("y", 96, state.getY());
120        assertEquals("dy", -4, state.getDy());
121
122        for (final ButtonState bs : state.getButtonStates().values()) {
123            assertEquals("up", ButtonState.UP, bs);
124        }
125    }
126
127    @Test
128    public void testButtons() throws Exception {
129        control.addMouseListener(wrapper);
130        control.addMouseMoveListener(wrapper);
131        control.addMouseWheelListener(wrapper);
132
133        expect(control.getSize()).andReturn(new Point(100, 100)).atLeastOnce();
134
135        replay(mocks);
136
137        wrapper.init();
138
139        // mouse down, then drag
140        setWithButtons(e1, 0, 0, 1);
141        wrapper.mouseDown(e1);
142
143        setXY(e2, 2, 4);
144        wrapper.mouseMove(e2);
145
146        final Iterator<MouseState> events = wrapper.getEvents();
147
148        MouseState s1 = events.next();
149        final MouseState s2 = events.next();
150
151        assertFalse("more events", events.hasNext());
152        assertFalse("more events", wrapper.getEvents().hasNext());
153
154        assertEquals("x", 0, s1.getX());
155        assertEquals("dx", 0, s1.getDx());
156        assertEquals("y", 100, s1.getY());
157        assertEquals("dy", 0, s1.getDy());
158        assertTrue("left down", s1.getButtonState(MouseButton.LEFT) == ButtonState.DOWN);
159        assertFalse("right down", s1.getButtonState(MouseButton.RIGHT) == ButtonState.DOWN);
160
161        assertEquals("x", 2, s2.getX());
162        assertEquals("dx", 2, s2.getDx());
163        assertEquals("y", 96, s2.getY());
164        assertEquals("dy", -4, s2.getDy());
165        assertTrue("left down", s2.getButtonState(MouseButton.LEFT) == ButtonState.DOWN);
166        assertFalse("right down", s2.getButtonState(MouseButton.RIGHT) == ButtonState.DOWN);
167
168        // press right button
169        setWithButtons(e1, 2, 4, 3);
170        wrapper.mouseDown(e1);
171
172        s1 = wrapper.getEvents().next();
173
174        assertFalse("more events", wrapper.getEvents().hasNext());
175
176        assertEquals("x", 2, s1.getX());
177        assertEquals("dx", 0, s1.getDx());
178        assertEquals("y", 96, s1.getY());
179        assertEquals("dy", 0, s1.getDy());
180        assertTrue("left down", s1.getButtonState(MouseButton.LEFT) == ButtonState.DOWN);
181        assertTrue("right down", s1.getButtonState(MouseButton.RIGHT) == ButtonState.DOWN);
182
183        // release left button
184        setWithButtons(e1, 3, 5, 1);
185        wrapper.mouseUp(e1);
186
187        s1 = wrapper.getEvents().next();
188
189        // Because we moved the mouse, there should not be a click count for the left button release...
190        assertTrue("clicked", s1.getClickCount(MouseButton.LEFT) == 0);
191
192        assertFalse("more events", wrapper.getEvents().hasNext());
193
194        assertEquals("x", 3, s1.getX());
195        assertEquals("dx", 1, s1.getDx());
196        assertEquals("y", 95, s1.getY());
197        assertEquals("dy", -1, s1.getDy());
198        assertFalse("left down", s1.getButtonState(MouseButton.LEFT) == ButtonState.DOWN);
199        assertTrue("right down", s1.getButtonState(MouseButton.RIGHT) == ButtonState.DOWN);
200
201        // release right button
202        setWithButtons(e1, 3, 5, 3);
203        wrapper.mouseUp(e1);
204
205        // We expect two state, one with a clickcount of 1,
206        s1 = wrapper.getEvents().next();
207
208        assertTrue("clicked", s1.getClickCount(MouseButton.RIGHT) == 1);
209
210        // and then the same state, but with clickcount of 0
211        s1 = wrapper.getEvents().next();
212
213        assertFalse("more events", wrapper.getEvents().hasNext());
214
215        assertEquals("x", 3, s1.getX());
216        assertEquals("dx", 0, s1.getDx());
217        assertEquals("y", 95, s1.getY());
218        assertEquals("dy", 0, s1.getDy());
219        assertFalse("left down", s1.getButtonState(MouseButton.LEFT) == ButtonState.DOWN);
220        assertFalse("right down", s1.getButtonState(MouseButton.RIGHT) == ButtonState.DOWN);
221
222    }
223
224    private void setWithButtons(final MouseEvent event, final int x, final int y, final int button) {
225        event.x = x;
226        event.y = y;
227        event.button = button;
228    }
229
230    private void setXY(final MouseEvent event, final int x, final int y) {
231        event.x = x;
232        event.y = y;
233    }
234
235}