#pragma once
#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);
Ref<InputEvent> e1 = k1;
Ref<InputEvent> e2 = k2;
Array input_array = { e1, e2 };
Shortcut s;
s.set_events(input_array);
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);
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);
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;
Ref<InputEventKey> similar_but_not_equal;
Ref<InputEventKey> different;
Ref<InputEventKey> copy;
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;
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 = { 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;
Ref<InputEventKey> different;
same.instantiate();
different.instantiate();
same->set_keycode(Key::ENTER);
different->set_keycode(Key::ESCAPE);
Ref<InputEvent> key_event1 = same;
Array a = { 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;
Ref<InputEventKey> invalid = nullptr;
valid.instantiate();
valid->set_keycode(Key::ENTER);
Ref<InputEvent> valid_event = valid;
Ref<InputEvent> invalid_event = invalid;
Array a = { invalid_event, valid_event };
Shortcut s;
s.set_events(a);
CHECK(s.has_valid_event() == true);
Array b = { 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;
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 = { key_event2 };
Array different2 = { key_event1, 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);
}
}