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}