Skip to content

Commit 06a2b72

Browse files
committed
Add com.jme3.input coverage tests
1 parent ebe10ba commit 06a2b72

5 files changed

Lines changed: 543 additions & 0 deletions

File tree

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
package com.jme3.input;
2+
3+
import com.jme3.input.controls.JoyAxisTrigger;
4+
import com.jme3.input.controls.JoyButtonTrigger;
5+
import com.jme3.input.controls.Trigger;
6+
import org.junit.jupiter.api.Test;
7+
import org.mockito.ArgumentCaptor;
8+
9+
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
import static org.junit.jupiter.api.Assertions.assertFalse;
11+
import static org.junit.jupiter.api.Assertions.assertNull;
12+
import static org.junit.jupiter.api.Assertions.assertSame;
13+
import static org.junit.jupiter.api.Assertions.assertThrows;
14+
import static org.junit.jupiter.api.Assertions.assertTrue;
15+
import static org.mockito.ArgumentMatchers.eq;
16+
import static org.mockito.Mockito.mock;
17+
import static org.mockito.Mockito.verify;
18+
19+
class DefaultJoystickTest {
20+
21+
@Test
22+
void storesAxesAndButtonsAsReadOnlyLogicalCollections() {
23+
TestJoystick joystick = new TestJoystick(mock(InputManager.class), mock(JoyInput.class), 3, "Gamepad");
24+
DefaultJoystickAxis xAxis = new DefaultJoystickAxis(null, joystick, 0, "X Axis",
25+
JoystickAxis.X_AXIS, true, false, 0.1f);
26+
DefaultJoystickButton fire = new DefaultJoystickButton(null, joystick, 1, "Fire",
27+
JoystickButton.BUTTON_1);
28+
29+
joystick.addTestAxis(xAxis);
30+
joystick.addTestButton(fire);
31+
32+
assertSame(xAxis, joystick.getAxis(JoystickAxis.X_AXIS));
33+
assertNull(joystick.getAxis(JoystickAxis.Y_AXIS));
34+
assertSame(fire, joystick.getButton(JoystickButton.BUTTON_1));
35+
assertNull(joystick.getButton(JoystickButton.BUTTON_2));
36+
assertEquals(1, joystick.getAxisCount());
37+
assertEquals(1, joystick.getButtonCount());
38+
assertThrows(UnsupportedOperationException.class, () -> joystick.getAxes().clear());
39+
assertThrows(UnsupportedOperationException.class, () -> joystick.getButtons().clear());
40+
assertEquals("Joystick[name=Gamepad, id=3, buttons=1, axes=1]", joystick.toString());
41+
}
42+
43+
@Test
44+
void rumbleDelegatesToJoyInput() {
45+
JoyInput joyInput = mock(JoyInput.class);
46+
TestJoystick joystick = new TestJoystick(mock(InputManager.class), joyInput, 7, "Wheel");
47+
48+
joystick.rumble(0.75f);
49+
50+
verify(joyInput).setJoyRumble(7, 0.75f);
51+
}
52+
53+
@Test
54+
void defaultAxisExposesStateAndAssignsPositiveAndNegativeTriggers() {
55+
InputManager inputManager = mock(InputManager.class);
56+
TestJoystick joystick = new TestJoystick(inputManager, mock(JoyInput.class), 2, "Arcade Stick");
57+
DefaultJoystickAxis axis = new DefaultJoystickAxis(inputManager, joystick, 4, "Throttle",
58+
"throttle", true, false, 0.2f);
59+
60+
axis.setDeadZone(0.35f);
61+
axis.assignAxis("Throttle+", "Throttle-");
62+
63+
assertSame(joystick, axis.getJoystick());
64+
assertEquals("Throttle", axis.getName());
65+
assertEquals("throttle", axis.getLogicalId());
66+
assertEquals(4, axis.getAxisId());
67+
assertTrue(axis.isAnalog());
68+
assertFalse(axis.isRelative());
69+
assertEquals(0.35f, axis.getDeadZone());
70+
assertEquals(0f, axis.getJitterThreshold());
71+
assertEquals("JoystickAxis[name=Throttle, parent=Arcade Stick, id=4, logicalId=throttle, "
72+
+ "isAnalog=true, isRelative=false, deadZone=0.35, jitterThreshold=0.0]", axis.toString());
73+
74+
ArgumentCaptor<Trigger[]> positive = ArgumentCaptor.forClass(Trigger[].class);
75+
ArgumentCaptor<Trigger[]> negative = ArgumentCaptor.forClass(Trigger[].class);
76+
verify(inputManager).addMapping(eq("Throttle+"), positive.capture());
77+
verify(inputManager).addMapping(eq("Throttle-"), negative.capture());
78+
JoyAxisTrigger positiveTrigger = (JoyAxisTrigger) positive.getValue()[0];
79+
JoyAxisTrigger negativeTrigger = (JoyAxisTrigger) negative.getValue()[0];
80+
assertEquals(2, positiveTrigger.getJoyId());
81+
assertEquals(4, positiveTrigger.getAxisId());
82+
assertFalse(positiveTrigger.isNegative());
83+
assertTrue(negativeTrigger.isNegative());
84+
}
85+
86+
@Test
87+
void defaultAxisWithUnknownIndexDoesNotAssignMappings() {
88+
InputManager inputManager = mock(InputManager.class);
89+
TestJoystick joystick = new TestJoystick(inputManager, mock(JoyInput.class), 2, "Unknown");
90+
DefaultJoystickAxis axis = new DefaultJoystickAxis(inputManager, joystick, -1, "Unknown",
91+
"unknown", false, true, 0f);
92+
93+
axis.assignAxis("Positive", "Negative");
94+
95+
org.mockito.Mockito.verifyNoInteractions(inputManager);
96+
}
97+
98+
@Test
99+
void defaultButtonExposesStateAndAssignsTrigger() {
100+
InputManager inputManager = mock(InputManager.class);
101+
TestJoystick joystick = new TestJoystick(inputManager, mock(JoyInput.class), 5, "Pad");
102+
DefaultJoystickButton button = new DefaultJoystickButton(inputManager, joystick, 6, "Start",
103+
JoystickButton.BUTTON_XBOX_START);
104+
105+
button.assignButton("Pause");
106+
107+
assertSame(joystick, button.getJoystick());
108+
assertEquals("Start", button.getName());
109+
assertEquals(JoystickButton.BUTTON_XBOX_START, button.getLogicalId());
110+
assertEquals(6, button.getButtonId());
111+
assertEquals("JoystickButton[name=Start, parent=Pad, id=6, logicalId=9]", button.toString());
112+
113+
ArgumentCaptor<Trigger[]> triggers = ArgumentCaptor.forClass(Trigger[].class);
114+
verify(inputManager).addMapping(eq("Pause"), triggers.capture());
115+
JoyButtonTrigger trigger = (JoyButtonTrigger) triggers.getValue()[0];
116+
assertEquals(5, trigger.getJoyId());
117+
assertEquals(6, trigger.getAxisId());
118+
}
119+
120+
private static final class TestJoystick extends AbstractJoystick {
121+
private TestJoystick(InputManager inputManager, JoyInput joyInput, int joyId, String name) {
122+
super(inputManager, joyInput, joyId, name);
123+
}
124+
125+
void addTestAxis(JoystickAxis axis) {
126+
addAxis(axis);
127+
}
128+
129+
void addTestButton(JoystickButton button) {
130+
addButton(button);
131+
}
132+
133+
@Override
134+
public JoystickAxis getXAxis() {
135+
return getAxis(JoystickAxis.X_AXIS);
136+
}
137+
138+
@Override
139+
public JoystickAxis getYAxis() {
140+
return getAxis(JoystickAxis.Y_AXIS);
141+
}
142+
143+
@Override
144+
public JoystickAxis getPovXAxis() {
145+
return getAxis(JoystickAxis.POV_X);
146+
}
147+
148+
@Override
149+
public JoystickAxis getPovYAxis() {
150+
return getAxis(JoystickAxis.POV_Y);
151+
}
152+
}
153+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.jme3.input;
2+
3+
import com.jme3.input.event.JoyAxisEvent;
4+
import com.jme3.input.event.JoyButtonEvent;
5+
import com.jme3.input.event.KeyInputEvent;
6+
import com.jme3.input.event.MouseButtonEvent;
7+
import com.jme3.input.event.MouseMotionEvent;
8+
import com.jme3.input.event.TouchEvent;
9+
import org.junit.jupiter.api.Test;
10+
11+
import static org.junit.jupiter.api.Assertions.assertEquals;
12+
import static org.junit.jupiter.api.Assertions.assertNull;
13+
14+
class InputUtilityTest {
15+
16+
@Test
17+
void keyNamesReturnStableNamesForRepresentativeKeyGroups() {
18+
new KeyNames();
19+
20+
assertEquals("Unknown", KeyNames.getName(KeyInput.KEY_UNKNOWN));
21+
assertEquals("0", KeyNames.getName(KeyInput.KEY_0));
22+
assertEquals("A", KeyNames.getName(KeyInput.KEY_A));
23+
assertEquals("F12", KeyNames.getName(KeyInput.KEY_F12));
24+
assertEquals("Numpad Enter", KeyNames.getName(KeyInput.KEY_NUMPADENTER));
25+
assertEquals("Left Ctrl", KeyNames.getName(KeyInput.KEY_LCONTROL));
26+
assertEquals("Esc", KeyNames.getName(KeyInput.KEY_ESCAPE));
27+
assertEquals("Page Down", KeyNames.getName(KeyInput.KEY_PGDN));
28+
assertEquals("Kana", KeyNames.getName(KeyInput.KEY_KANA));
29+
assertNull(KeyNames.getName(KeyInput.KEY_LAST));
30+
}
31+
32+
@Test
33+
void rawInputListenerAdapterAcceptsAllCallbacksAsNoOps() {
34+
RawInputListener listener = new RawInputListenerAdapter() {
35+
};
36+
37+
listener.beginInput();
38+
listener.onJoyAxisEvent((JoyAxisEvent) null);
39+
listener.onJoyButtonEvent((JoyButtonEvent) null);
40+
listener.onMouseMotionEvent((MouseMotionEvent) null);
41+
listener.onMouseButtonEvent((MouseButtonEvent) null);
42+
listener.onKeyEvent((KeyInputEvent) null);
43+
listener.onTouchEvent((TouchEvent) null);
44+
listener.endInput();
45+
}
46+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.jme3.input;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.util.Map;
6+
import java.util.Properties;
7+
8+
import static org.junit.jupiter.api.Assertions.assertEquals;
9+
import static org.junit.jupiter.api.Assertions.assertThrows;
10+
import static org.mockito.Mockito.mock;
11+
import static org.mockito.Mockito.when;
12+
13+
class JoystickCompatibilityMappingsTest {
14+
15+
@Test
16+
void remapsSpecificAxisButtonAndGenericComponents() {
17+
String stick = "Codex Test Stick";
18+
JoystickCompatibilityMappings.addAxisMapping(stick, "x_raw", JoystickAxis.X_AXIS);
19+
JoystickCompatibilityMappings.addButtonMapping(stick, "0_raw", JoystickButton.BUTTON_XBOX_A);
20+
JoystickCompatibilityMappings.addMapping(stick, "misc_raw", "misc");
21+
22+
assertEquals(JoystickAxis.X_AXIS, JoystickCompatibilityMappings.remapAxis(" " + stick + " ", "x_raw"));
23+
assertEquals(JoystickButton.BUTTON_XBOX_A, JoystickCompatibilityMappings.remapButton(stick, "0_raw"));
24+
assertEquals("misc", JoystickCompatibilityMappings.remapComponent(stick, "misc_raw"));
25+
assertEquals("unmapped", JoystickCompatibilityMappings.remapAxis(stick, "unmapped"));
26+
assertEquals("unmapped", JoystickCompatibilityMappings.remapButton(stick, "unmapped"));
27+
assertEquals("unmapped", JoystickCompatibilityMappings.remapComponent(stick, "unmapped"));
28+
}
29+
30+
@Test
31+
void returnsUnmodifiableMappingViews() {
32+
String stick = "Codex Test Mapping View";
33+
JoystickCompatibilityMappings.addMapping(stick, "raw", "logical");
34+
JoystickCompatibilityMappings.addButtonMapping(stick, "buttonRaw", "buttonLogical");
35+
36+
Map<String, String> componentMappings = JoystickCompatibilityMappings.getJoystickMappings(stick);
37+
Map<String, String> buttonMappings = JoystickCompatibilityMappings.getJoystickButtonMappings(stick);
38+
39+
assertEquals("logical", componentMappings.get("raw"));
40+
assertEquals("buttonLogical", buttonMappings.get("buttonRaw"));
41+
assertThrows(UnsupportedOperationException.class, () -> componentMappings.put("other", "value"));
42+
assertThrows(UnsupportedOperationException.class, () -> buttonMappings.put("other", "value"));
43+
assertEquals(0, JoystickCompatibilityMappings.getJoystickMappings("No Such Stick").size());
44+
}
45+
46+
@Test
47+
void addMappingsParsesTypedEntriesRangesAndNameRegex() {
48+
Properties properties = new Properties();
49+
properties.setProperty("axis.Codex Regex Stick.x", "left_x [-1.0, 1.0]");
50+
properties.setProperty("button.Codex Regex Stick.trigger", "fire");
51+
properties.setProperty("Codex Regex Stick.misc", "menu");
52+
properties.setProperty("Codex Regex Stick.regex", "Codex Regex Stick \\(rev \\d+\\)");
53+
54+
JoystickCompatibilityMappings.addMappings(properties);
55+
56+
String physicalName = "Codex Regex Stick (rev 42)";
57+
assertEquals("left_x", JoystickCompatibilityMappings.remapAxis(physicalName, "x"));
58+
assertEquals("fire", JoystickCompatibilityMappings.remapButton(physicalName, "trigger"));
59+
assertEquals("menu", JoystickCompatibilityMappings.remapComponent(physicalName, "misc"));
60+
}
61+
62+
@Test
63+
void remapAxisRangeUsesConfiguredRangeAndCachesMissingMappings() {
64+
String stick = "Codex Test Axis Range";
65+
JoystickCompatibilityMappings.addAxisMapping(stick, "slider", "slider", new float[]{0f, 1f});
66+
JoystickAxis mappedAxis = axis(stick, "slider");
67+
JoystickAxis unmappedAxis = axis(stick, "unknown");
68+
69+
assertEquals(0.25f, JoystickCompatibilityMappings.remapAxisRange(mappedAxis, -0.5f));
70+
assertEquals(0.75f, JoystickCompatibilityMappings.remapAxisRange(mappedAxis, 0.5f));
71+
assertEquals(0.4f, JoystickCompatibilityMappings.remapAxisRange(unmappedAxis, 0.4f));
72+
assertEquals(-0.6f, JoystickCompatibilityMappings.remapAxisRange(unmappedAxis, -0.6f));
73+
}
74+
75+
@Test
76+
void rejectsInvalidAxisRange() {
77+
assertThrows(IllegalArgumentException.class,
78+
() -> JoystickCompatibilityMappings.addAxisMapping("Bad Range", "axis", "axis", new float[]{0f}));
79+
}
80+
81+
private static JoystickAxis axis(String joystickName, String axisName) {
82+
Joystick joystick = mock(Joystick.class);
83+
when(joystick.getName()).thenReturn(joystickName);
84+
85+
JoystickAxis axis = mock(JoystickAxis.class);
86+
when(axis.getJoystick()).thenReturn(joystick);
87+
when(axis.getName()).thenReturn(axisName);
88+
return axis;
89+
}
90+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.jme3.input.controls;
2+
3+
import com.jme3.input.KeyInput;
4+
import com.jme3.input.MouseInput;
5+
import org.junit.jupiter.api.Test;
6+
7+
import static org.junit.jupiter.api.Assertions.assertEquals;
8+
import static org.junit.jupiter.api.Assertions.assertFalse;
9+
import static org.junit.jupiter.api.Assertions.assertThrows;
10+
import static org.junit.jupiter.api.Assertions.assertTrue;
11+
12+
class InputTriggerTest {
13+
14+
@Test
15+
void keyTriggerUsesLowByteHashAndReadableName() {
16+
KeyTrigger trigger = new KeyTrigger(KeyInput.KEY_SPACE);
17+
18+
assertEquals(KeyInput.KEY_SPACE, trigger.getKeyCode());
19+
assertEquals("KeyCode " + KeyInput.KEY_SPACE, trigger.getName());
20+
assertEquals(KeyInput.KEY_SPACE & 0xff, trigger.triggerHashCode());
21+
}
22+
23+
@Test
24+
void mouseAxisTriggerNamesKnownAxesAndEncodesDirection() {
25+
MouseAxisTrigger xPositive = new MouseAxisTrigger(MouseInput.AXIS_X, false);
26+
MouseAxisTrigger wheelNegative = new MouseAxisTrigger(MouseInput.AXIS_WHEEL, true);
27+
28+
assertEquals(MouseInput.AXIS_X, xPositive.getMouseAxis());
29+
assertFalse(xPositive.isNegative());
30+
assertEquals("Mouse X Axis Positive", xPositive.getName());
31+
assertEquals("Mouse Wheel Negative", wheelNegative.getName());
32+
assertEquals(512 | MouseInput.AXIS_X, xPositive.triggerHashCode());
33+
assertEquals(768 | MouseInput.AXIS_WHEEL, wheelNegative.triggerHashCode());
34+
assertThrows(IllegalArgumentException.class, () -> new MouseAxisTrigger(9, false));
35+
}
36+
37+
@Test
38+
void mouseButtonTriggerUsesButtonHashAndName() {
39+
MouseButtonTrigger trigger = new MouseButtonTrigger(MouseInput.BUTTON_RIGHT);
40+
41+
assertEquals(MouseInput.BUTTON_RIGHT, trigger.getMouseButton());
42+
assertEquals("Mouse Button " + MouseInput.BUTTON_RIGHT, trigger.getName());
43+
assertEquals(256 | MouseInput.BUTTON_RIGHT, trigger.triggerHashCode());
44+
}
45+
46+
@Test
47+
void joystickAxisTriggerEncodesJoystickAxisAndSign() {
48+
JoyAxisTrigger positive = new JoyAxisTrigger(2, 3, false);
49+
JoyAxisTrigger negative = new JoyAxisTrigger(2, 3, true);
50+
51+
assertEquals(2, positive.getJoyId());
52+
assertEquals(3, positive.getAxisId());
53+
assertFalse(positive.isNegative());
54+
assertTrue(negative.isNegative());
55+
assertEquals("JoyAxis[joyId=2, axisId=3, neg=false]", positive.getName());
56+
assertEquals((2048 * 2) | 1024 | 3, positive.triggerHashCode());
57+
assertEquals((2048 * 2) | 1280 | 3, negative.triggerHashCode());
58+
}
59+
60+
@Test
61+
void joystickButtonTriggerEncodesJoystickAndButton() {
62+
JoyButtonTrigger trigger = new JoyButtonTrigger(4, 7);
63+
64+
assertEquals(4, trigger.getJoyId());
65+
assertEquals(7, trigger.getAxisId());
66+
assertEquals("JoyButton[joyId=4, axisId=7]", trigger.getName());
67+
assertEquals((2048 * 4) | 1536 | 7, trigger.triggerHashCode());
68+
}
69+
70+
@Test
71+
void touchTriggerDistinguishesZeroFromNonZeroKeyCodes() {
72+
TouchTrigger zero = new TouchTrigger(0);
73+
TouchTrigger key = new TouchTrigger(KeyInput.KEY_RETURN);
74+
75+
assertEquals("TouchInput KeyCode 0", zero.getName());
76+
assertEquals("TouchInput", key.getName());
77+
assertEquals(0, zero.getKeyCode());
78+
assertEquals(KeyInput.KEY_RETURN, key.getKeyCode());
79+
assertEquals(TouchTrigger.touchHash(0), zero.triggerHashCode());
80+
assertEquals(TouchTrigger.touchHash(KeyInput.KEY_RETURN), key.triggerHashCode());
81+
}
82+
}

0 commit comments

Comments
 (0)