236 lines
7.3 KiB
C++
236 lines
7.3 KiB
C++
|
/*************************************************************************/
|
||
|
/* test_shortcut.h */
|
||
|
/*************************************************************************/
|
||
|
/* This file is part of: */
|
||
|
/* GODOT ENGINE */
|
||
|
/* https://godotengine.org */
|
||
|
/*************************************************************************/
|
||
|
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
|
||
|
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
|
||
|
/* */
|
||
|
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||
|
/* a copy of this software and associated documentation files (the */
|
||
|
/* "Software"), to deal in the Software without restriction, including */
|
||
|
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||
|
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||
|
/* permit persons to whom the Software is furnished to do so, subject to */
|
||
|
/* the following conditions: */
|
||
|
/* */
|
||
|
/* The above copyright notice and this permission notice shall be */
|
||
|
/* included in all copies or substantial portions of the Software. */
|
||
|
/* */
|
||
|
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||
|
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||
|
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||
|
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||
|
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||
|
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||
|
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||
|
/*************************************************************************/
|
||
|
|
||
|
#ifndef TEST_SHORTCUT_H
|
||
|
#define TEST_SHORTCUT_H
|
||
|
|
||
|
#include "core/input/input_event.h"
|
||
|
#include "core/input/shortcut.h"
|
||
|
#include "core/io/config_file.h"
|
||
|
#include "core/object/ref_counted.h"
|
||
|
#include "core/os/keyboard.h"
|
||
|
#include "core/os/os.h"
|
||
|
|
||
|
#include "tests/test_macros.h"
|
||
|
|
||
|
namespace TestShortcut {
|
||
|
|
||
|
TEST_CASE("[Shortcut] Empty shortcut should have no valid events and text equal to None") {
|
||
|
Shortcut s;
|
||
|
|
||
|
CHECK(s.get_as_text() == "None");
|
||
|
CHECK(s.has_valid_event() == false);
|
||
|
}
|
||
|
|
||
|
TEST_CASE("[Shortcut] Setting and getting an event should result in the same event as the input") {
|
||
|
Ref<InputEventKey> k1;
|
||
|
Ref<InputEventKey> k2;
|
||
|
k1.instantiate();
|
||
|
k2.instantiate();
|
||
|
|
||
|
k1->set_keycode(Key::ENTER);
|
||
|
k2->set_keycode(Key::BACKSPACE);
|
||
|
|
||
|
// Cast to InputEvent so the internal code recognizes the objects.
|
||
|
Ref<InputEvent> e1 = k1;
|
||
|
Ref<InputEvent> e2 = k2;
|
||
|
|
||
|
Array input_array;
|
||
|
input_array.append(e1);
|
||
|
input_array.append(e2);
|
||
|
|
||
|
Shortcut s;
|
||
|
s.set_events(input_array);
|
||
|
|
||
|
// Get result, read it out, check whether it equals the input.
|
||
|
Array result_array = s.get_events();
|
||
|
Ref<InputEventKey> result1 = result_array.front();
|
||
|
Ref<InputEventKey> result2 = result_array.back();
|
||
|
|
||
|
CHECK(result1->get_keycode() == k1->get_keycode());
|
||
|
CHECK(result2->get_keycode() == k2->get_keycode());
|
||
|
}
|
||
|
|
||
|
TEST_CASE("[Shortcut] 'set_events_list' should result in the same events as the input") {
|
||
|
Ref<InputEventKey> k1;
|
||
|
Ref<InputEventKey> k2;
|
||
|
k1.instantiate();
|
||
|
k2.instantiate();
|
||
|
|
||
|
k1->set_keycode(Key::ENTER);
|
||
|
k2->set_keycode(Key::BACKSPACE);
|
||
|
|
||
|
// Cast to InputEvent so the set_events_list() method recognizes the objects.
|
||
|
Ref<InputEvent> e1 = k1;
|
||
|
Ref<InputEvent> e2 = k2;
|
||
|
|
||
|
List<Ref<InputEvent>> list;
|
||
|
list.push_back(e1);
|
||
|
list.push_back(e2);
|
||
|
|
||
|
Shortcut s;
|
||
|
s.set_events_list(&list);
|
||
|
|
||
|
// Get result, read it out, check whether it equals the input.
|
||
|
Array result_array = s.get_events();
|
||
|
Ref<InputEventKey> result1 = result_array.front();
|
||
|
Ref<InputEventKey> result2 = result_array.back();
|
||
|
|
||
|
CHECK(result1->get_keycode() == k1->get_keycode());
|
||
|
CHECK(result2->get_keycode() == k2->get_keycode());
|
||
|
}
|
||
|
|
||
|
TEST_CASE("[Shortcut] 'matches_event' should correctly match the same event") {
|
||
|
Ref<InputEventKey> original; // The one we compare with.
|
||
|
Ref<InputEventKey> similar_but_not_equal; // Same keycode, different event.
|
||
|
Ref<InputEventKey> different; // Different event, different keycode.
|
||
|
Ref<InputEventKey> copy; // Copy of original event.
|
||
|
|
||
|
original.instantiate();
|
||
|
similar_but_not_equal.instantiate();
|
||
|
different.instantiate();
|
||
|
copy.instantiate();
|
||
|
|
||
|
original->set_keycode(Key::ENTER);
|
||
|
similar_but_not_equal->set_keycode(Key::ENTER);
|
||
|
similar_but_not_equal->set_keycode(Key::ESCAPE);
|
||
|
copy = original;
|
||
|
|
||
|
// Only the copy is really the same, so only that one should match.
|
||
|
// The rest should not match.
|
||
|
|
||
|
Ref<InputEvent> e_original = original;
|
||
|
|
||
|
Ref<InputEvent> e_similar_but_not_equal = similar_but_not_equal;
|
||
|
Ref<InputEvent> e_different = different;
|
||
|
Ref<InputEvent> e_copy = copy;
|
||
|
|
||
|
Array a;
|
||
|
a.append(e_original);
|
||
|
Shortcut s;
|
||
|
s.set_events(a);
|
||
|
|
||
|
CHECK(s.matches_event(e_similar_but_not_equal) == false);
|
||
|
CHECK(s.matches_event(e_different) == false);
|
||
|
|
||
|
CHECK(s.matches_event(e_copy) == true);
|
||
|
}
|
||
|
|
||
|
TEST_CASE("[Shortcut] 'get_as_text' text representation should be correct") {
|
||
|
Ref<InputEventKey> same;
|
||
|
// k2 will not go into the shortcut but only be used to compare.
|
||
|
Ref<InputEventKey> different;
|
||
|
|
||
|
same.instantiate();
|
||
|
different.instantiate();
|
||
|
|
||
|
same->set_keycode(Key::ENTER);
|
||
|
different->set_keycode(Key::ESCAPE);
|
||
|
|
||
|
Ref<InputEvent> key_event1 = same;
|
||
|
|
||
|
Array a;
|
||
|
a.append(key_event1);
|
||
|
Shortcut s;
|
||
|
s.set_events(a);
|
||
|
|
||
|
CHECK(s.get_as_text() == same->as_text());
|
||
|
CHECK(s.get_as_text() != different->as_text());
|
||
|
}
|
||
|
|
||
|
TEST_CASE("[Shortcut] Event validity should be correctly checked.") {
|
||
|
Ref<InputEventKey> valid;
|
||
|
// k2 will not go into the shortcut but only be used to compare.
|
||
|
Ref<InputEventKey> invalid = nullptr;
|
||
|
|
||
|
valid.instantiate();
|
||
|
valid->set_keycode(Key::ENTER);
|
||
|
|
||
|
Ref<InputEvent> valid_event = valid;
|
||
|
Ref<InputEvent> invalid_event = invalid;
|
||
|
|
||
|
Array a;
|
||
|
a.append(invalid_event);
|
||
|
a.append(valid_event);
|
||
|
|
||
|
Shortcut s;
|
||
|
s.set_events(a);
|
||
|
|
||
|
CHECK(s.has_valid_event() == true);
|
||
|
|
||
|
Array b;
|
||
|
b.append(invalid_event);
|
||
|
|
||
|
Shortcut shortcut_with_invalid_event;
|
||
|
shortcut_with_invalid_event.set_events(b);
|
||
|
|
||
|
CHECK(shortcut_with_invalid_event.has_valid_event() == false);
|
||
|
}
|
||
|
|
||
|
TEST_CASE("[Shortcut] Equal arrays should be recognized as such.") {
|
||
|
Ref<InputEventKey> k1;
|
||
|
// k2 will not go into the shortcut but only be used to compare.
|
||
|
Ref<InputEventKey> k2;
|
||
|
|
||
|
k1.instantiate();
|
||
|
k2.instantiate();
|
||
|
|
||
|
k1->set_keycode(Key::ENTER);
|
||
|
k2->set_keycode(Key::ESCAPE);
|
||
|
|
||
|
Ref<InputEvent> key_event1 = k1;
|
||
|
Ref<InputEvent> key_event2 = k2;
|
||
|
|
||
|
Array same;
|
||
|
same.append(key_event1);
|
||
|
|
||
|
Array same_as_same;
|
||
|
same_as_same.append(key_event1);
|
||
|
|
||
|
Array different1;
|
||
|
different1.append(key_event2);
|
||
|
|
||
|
Array different2;
|
||
|
different2.append(key_event1);
|
||
|
different2.append(key_event2);
|
||
|
|
||
|
Array different3;
|
||
|
|
||
|
Shortcut s;
|
||
|
|
||
|
CHECK(s.is_event_array_equal(same, same_as_same) == true);
|
||
|
CHECK(s.is_event_array_equal(same, different1) == false);
|
||
|
CHECK(s.is_event_array_equal(same, different2) == false);
|
||
|
CHECK(s.is_event_array_equal(same, different3) == false);
|
||
|
}
|
||
|
} // namespace TestShortcut
|
||
|
|
||
|
#endif // TEST_SHORTCUT_H
|