Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mouse motion button mask #613

Merged
merged 3 commits into from
May 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
## Features
* @mphe GUT now automatically enables the "Exclude Addons" option when running tests. This means you don't have to keep enabling/disabling this option if GUT does not conform to your warning/error settings.
* @plink-plonk-will Elapsed time is now included in the XML export.
* __Issue__ #612 `InputSender` now sets the `button_mask` property for generated mouse motion events when mouse buttons have been pressed but not released prior to a motion event.

## Bug Fixes
* __Issue__ #601 doubles now get a resource path that makes Godot ignore them when "Exclude Addons" is enabled (res://adddons/gut/not_a_real_file/...).
Expand Down
3 changes: 3 additions & 0 deletions addons/gut/input_sender.gd
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,9 @@ func _new_defaulted_mouse_button_event(position, global_position):
func _new_defaulted_mouse_motion_event(position, global_position):
var event = InputEventMouseMotion.new()
_apply_last_position_and_set_last_position(event, position, global_position)
for key in _pressed_mouse_buttons:
if(_pressed_mouse_buttons[key].pressed):
event.button_mask += key
return event


Expand Down
104 changes: 94 additions & 10 deletions test/unit/test_input_sender.gd
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ class HasInputEvents:

class InputEventsOrder:
extends Control

const RIGHT_ORDER = ["input", "gui_signal", "gui", "unhandled"]

var got_input_in_order: Array = []

func _init() -> void:
Expand Down Expand Up @@ -128,6 +128,7 @@ class TestTheBasics:
assert_gt(parent_item.get_child_count(), 0, 'just making sure there is something to free')
# could not find a way to trigger this by unreferencing
sender._notification(NOTIFICATION_PREDELETE)
await wait_frames(5)
assert_freed(parent_item, 'sender item node parent')


Expand Down Expand Up @@ -424,6 +425,89 @@ class TestMouseMotion:
assert_eq(r.inputs[0].position, Vector2(15, 15), 'position')
assert_eq(r.inputs[0].global_position, Vector2(25, 25), 'global_position')

func test_mouse_motion_sends_left_button_index_when_button_pressed():
var r = autofree(InputTracker.new())
var sender = InputSender.new(r)

sender\
.mouse_left_button_down(Vector2(10, 10))\
.mouse_motion(Vector2(12, 12))

assert_eq(r.inputs[1].button_mask, MOUSE_BUTTON_LEFT)

func test_mouse_motion_sends_right_button_index_when_button_pressed():
var r = autofree(InputTracker.new())
var sender = InputSender.new(r)

sender\
.mouse_right_button_down(Vector2(10, 10))\
.mouse_motion(Vector2(12, 12))

assert_eq(r.inputs[1].button_mask, MOUSE_BUTTON_RIGHT)

func test_mouse_motion_sends_mask_for_all_buttons_when_multiple_pressed():
var r = autofree(InputTracker.new())
var sender = InputSender.new(r)

sender\
.mouse_right_button_down(Vector2(10, 10))\
.mouse_left_button_down(Vector2(10, 10))\
.mouse_motion(Vector2(12, 12))

assert_eq(r.inputs[2].button_mask, MOUSE_BUTTON_RIGHT + MOUSE_BUTTON_LEFT)

func test_mouse_motion_does_not_send_button_when_released():
var r = autofree(InputTracker.new())
var sender = InputSender.new(r)

sender\
.mouse_left_button_down(Vector2(10, 10))\
.mouse_left_button_up(Vector2(10, 10))\
.mouse_motion(Vector2(12, 12))

assert_eq(r.inputs[2].button_mask, 0)

func test_mouse_relative_motion_sends_left_button_index_when_button_pressed():
var r = autofree(InputTracker.new())
var sender = InputSender.new(r)

sender\
.mouse_left_button_down(Vector2(10, 10))\
.mouse_relative_motion(Vector2(12, 12))

assert_eq(r.inputs[1].button_mask, MOUSE_BUTTON_LEFT)

func test_mouse_relative_motion_sends_right_button_index_when_button_pressed():
var r = autofree(InputTracker.new())
var sender = InputSender.new(r)

sender\
.mouse_right_button_down(Vector2(10, 10))\
.mouse_relative_motion(Vector2(12, 12))

assert_eq(r.inputs[1].button_mask, MOUSE_BUTTON_RIGHT)

func test_mouse_relative_motion_sends_mask_for_all_buttons_when_multiple_pressed():
var r = autofree(InputTracker.new())
var sender = InputSender.new(r)

sender\
.mouse_right_button_down(Vector2(10, 10))\
.mouse_left_button_down(Vector2(10, 10))\
.mouse_relative_motion(Vector2(12, 12))

assert_eq(r.inputs[2].button_mask, MOUSE_BUTTON_RIGHT + MOUSE_BUTTON_LEFT)

func test_mouse_relative_motion_does_not_send_button_when_released():
var r = autofree(InputTracker.new())
var sender = InputSender.new(r)

sender\
.mouse_left_button_down(Vector2(10, 10))\
.mouse_left_button_up(Vector2(10, 10))\
.mouse_relative_motion(Vector2(12, 12))

assert_eq(r.inputs[2].button_mask, 0)

class TestSendEvent:
extends "res://addons/gut/test.gd"
Expand All @@ -448,14 +532,14 @@ class TestSendEvent:
var event = InputEventKey.new()
sender.send_event(event)
assert_eq(r.gui_event, event)
func test_send_event_causes_receiver_to_emit_gui_input_signal():
var r = autofree(HasInputEvents.new())
watch_signals(r)
var sender = InputSender.new(r)
var event = InputEventKey.new()
sender.send_event(event)
assert_signal_emitted_with_parameters(r, 'gui_input', [event])

func test_send_event_causes_receiver_to_emit_gui_input_signal():
var r = autofree(HasInputEvents.new())
watch_signals(r)
var sender = InputSender.new(r)
var event = InputEventKey.new()
sender.send_event(event)
assert_signal_emitted_with_parameters(r, 'gui_input', [event])

func test_sends_event_to_unhandled_input():
var r = autofree(HasInputEvents.new())
Expand Down