diff --git a/repos/os/run/event_filter.run b/repos/os/run/event_filter.run
index 05fed67533..a860b3278b 100644
--- a/repos/os/run/event_filter.run
+++ b/repos/os/run/event_filter.run
@@ -483,6 +483,68 @@ append config {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -508,4 +570,11 @@ build_boot_image $boot_modules
append qemu_args " -nographic "
run_genode_until {.*child "test-event_filter" exited with exit value 0.*} 60
-
+grep_output {mapped event}
+unify_output {\t} { }
+compare_output_to {
+[init -> event_filter] Unremapped event #0 PRESS KEY_UNKNOWN 65534 key count: 1
+[init -> event_filter] Remapped event #0 PRESS KEY_A 65534 key count: 1
+[init -> event_filter] Unremapped event #1 RELEASE KEY_UNKNOWN key count: 0
+[init -> event_filter] Remapped event #1 RELEASE KEY_A key count: 0
+}
diff --git a/repos/os/src/test/event_filter/main.cc b/repos/os/src/test/event_filter/main.cc
index 279367b70d..2d896fcc61 100644
--- a/repos/os/src/test/event_filter/main.cc
+++ b/repos/os/src/test/event_filter/main.cc
@@ -335,6 +335,8 @@ struct Test::Main : Input_from_filter::Event_handler
_input_from_filter.input_expected(step.type() == "expect_press" ||
step.type() == "expect_release" ||
+ step.type() == "not_expect_press" ||
+ step.type() == "not_expect_release" ||
step.type() == "expect_char" ||
step.type() == "expect_motion" ||
step.type() == "expect_wheel");
@@ -396,6 +398,7 @@ struct Test::Main : Input_from_filter::Event_handler
}
if (step.type() == "expect_press" || step.type() == "expect_release"
+ || step.type() == "not_expect_press" || step.type() == "not_expect_release"
|| step.type() == "expect_char" || step.type() == "expect_motion"
|| step.type() == "expect_wheel")
return;
@@ -424,6 +427,7 @@ struct Test::Main : Input_from_filter::Event_handler
Xml_node const step = _curr_step_xml();
bool step_succeeded = false;
+ bool step_failed = false;
ev.handle_press([&] (Input::Keycode key, Codepoint codepoint) {
@@ -438,12 +442,30 @@ struct Test::Main : Input_from_filter::Event_handler
&& ((!step.has_attribute("char") && !step.has_attribute("codepoint")) ||
codepoint_of_step(step).value == codepoint.value))
step_succeeded = true;
+
+ if (step.type() == "not_expect_press") {
+ if (step.attribute_value("code", Value()) == Input::key_name(key)
+ && ((!step.has_attribute("char") && !step.has_attribute("codepoint")) ||
+ codepoint_of_step(step).value == codepoint.value))
+ step_failed = true;
+ else
+ step_succeeded = true;
+ }
});
ev.handle_release([&] (Input::Keycode key) {
if (step.type() == "expect_release"
&& step.attribute_value("code", Value()) == Input::key_name(key))
- step_succeeded = true; });
+ step_succeeded = true;
+
+ if (step.type() == "not_expect_release") {
+ if (step.attribute_value("code", Value()) == Input::key_name(key))
+ step_failed = true;
+ else
+ step_succeeded = true;
+ }
+
+ });
ev.handle_wheel([&] (int x, int y) {
if (step.type() == "expect_wheel"
@@ -463,6 +485,11 @@ struct Test::Main : Input_from_filter::Event_handler
&& (!step.has_attribute("ay") || step.attribute_value("ay", 0L) == y))
step_succeeded = true; });
+ if (step_failed) {
+ error("got unexpected event: ", step);
+ throw Exception();
+ }
+
if (step_succeeded) {
_advance_step();
_execute_curr_step();