diff --git a/testing/bin/ktest-to-cxx b/testing/bin/ktest-to-cxx
index 182187e1..4f7a0976 100644
--- a/testing/bin/ktest-to-cxx
+++ b/testing/bin/ktest-to-cxx
@@ -112,12 +112,17 @@ sub load_from_text {
my $content = shift;
unless ( defined $named_switches->{$content} ) {
die
-"Attempt to press undefined switch $content on line $line_num";
+"Attempt to release undefined switch $content on line $line_num";
}
return { switch => $content };
},
expect => sub {
my $content = shift;
+ if ( $content =~ /^no keyboard-report/) {
+ return {
+ report_type => 'keyboard',
+ count => 0 };
+ }
if ( $content =~ /^keyboard-report\s+(.*)$/ ) {
my $report_data = $1;
my @keys = split( /,?\s+/, $report_data );
@@ -125,6 +130,7 @@ sub load_from_text {
@keys = ();
}
return {
+ count => 1, # We expect one report here
report_type => 'keyboard',
keys => [@keys]
};
@@ -135,7 +141,7 @@ sub load_from_text {
},
run => sub {
my $content = shift;
- if ( $content =~ /^(\d+)\s+(\w+)$/ ) {
+ if ( $content =~ /^(\d+)\s*(\w*?)$/ ) {
my $count = $1;
my $unit = $2;
if ( $unit =~ /cycle/ ) {
@@ -216,7 +222,7 @@ sub generate_start_new_test {
}
sub generate_end_test {
if ($reports_expected) {
- generate_check_expected_reports();
+ generate_check_expected_reports();
}
outdent();
cxx("} // TEST_F");
@@ -296,7 +302,18 @@ sub generate_release {
sub generate_expect_report {
my $report = shift;
+ if (! $report->{data}->{report_type} || $report->{data}->{report_type} ne 'keyboard') {
+ die "Don't know how to work with expectaions of reports other than 'keyboard' reports at line #".$report->{line_num}."\n";
+
+ }
$reports_expected++;
+
+ if ($report->{data}->{count} == 0) {
+ cxx_comment($report->{comment});
+ cxx_comment("We don't expect any report here, and have told the tests to check that");
+ return;
+ }
+
my $codes = join(
", ",
(
diff --git a/tests/plugins/Redial/basic/test.ktest b/tests/plugins/Redial/basic/test.ktest
new file mode 100644
index 00000000..72592fed
--- /dev/null
+++ b/tests/plugins/Redial/basic/test.ktest
@@ -0,0 +1,74 @@
+VERSION 1
+
+KEYSWITCH Redial 0 9
+KEYSWITCH A 2 1
+KEYSWITCH X 3 2
+
+NAME Redial with no prior keypress
+
+RUN 10 ms
+
+PRESS Redial
+
+RUN 25ms
+
+RELEASE Redial
+
+RUN 10 ms
+
+EXPECT no keyboard-reports # There should be no HID report without a prior keypress"
+
+
+NAME RedialFirstKey
+
+RUN 10 ms
+PRESS A
+
+RUN 1 cycle
+EXPECT keyboard-report Key_A # Report should contain only an A
+
+RUN 25 ms
+RELEASE A
+
+RUN 1 cycle
+EXPECT keyboard-report empty # Report should be empty
+
+RUN 10ms
+PRESS Redial
+
+RUN 1 cycle
+EXPECT keyboard-report Key_A # Report should contain only an A
+
+RUN 25 ms
+RELEASE Redial
+
+RUN 1 cycle
+EXPECT keyboard-report empty # keyboard report should be empty
+
+
+
+NAME Redial next key
+
+RUN 10 ms
+PRESS X
+
+RUN 1 cycle
+EXPECT keyboard-report Key_X # Report should contain only an X
+
+RUN 25 ms
+RELEASE X
+
+RUN 1 cycle
+EXPECT keyboard-report empty # keyboard report should be empty
+
+RUN 10 ms
+PRESS Redial
+
+RUN 1 cycle
+EXPECT keyboard-report Key_X # Report should contain only an X
+
+RUN 25 ms
+RELEASE Redial
+
+RUN 1 cycle
+EXPECT keyboard-report empty # keyboard report should be empty
diff --git a/tests/plugins/Redial/basic/test/testcase.cpp b/tests/plugins/Redial/basic/test/testcase.cpp
deleted file mode 100644
index 279b9607..00000000
--- a/tests/plugins/Redial/basic/test/testcase.cpp
+++ /dev/null
@@ -1,170 +0,0 @@
-/* -*- mode: c++ -*-
- * Copyright (C) 2020 Keyboard.io, Inc.
- *
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, version 3.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program. If not, see .
- */
-
-#include "testing/setup-googletest.h"
-
-SETUP_GOOGLETEST();
-
-namespace kaleidoscope {
-namespace testing {
-namespace {
-
-constexpr KeyAddr key_addr_Redial{0, 9};
-constexpr KeyAddr key_addr_A{2, 1};
-constexpr KeyAddr key_addr_X{3, 2};
-
-class RedialBasic : public VirtualDeviceTest {
- protected:
- std::set expected_keycodes_ = {};
- std::unique_ptr state_ = nullptr;
-};
-
-TEST_F(RedialBasic, RedialFirst) {
-
- // Press redial key
- sim_.Press(key_addr_Redial);
-
- state_ = RunCycle();
-
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 0)
- << "There should be no HID report for a redial key without anything pressed first";
-
- // Release redial key
- sim_.Release(key_addr_Redial);
- sim_.RunCycle();
-}
-
-TEST_F(RedialBasic, RedialFirstKey) {
-
- // Press `A`
- sim_.Press(key_addr_A);
- state_ = RunCycle();
-
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 1)
- << "There should be one report after letter key press";
-
- expected_keycodes_.insert(Key_A.getKeyCode());
- EXPECT_THAT(state_->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes_))
- << "The report should include only `A`";
-
- // Release `A`
- sim_.Release(key_addr_A);
- state_ = RunCycle();
-
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 1)
- << "There should be one report after letter key release";
-
- expected_keycodes_.erase(Key_A.getKeyCode());
- EXPECT_THAT(state_->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes_))
- << "The report should be empty";
-
- sim_.RunCycle();
-
- // Press redial key
- sim_.Press(key_addr_Redial);
-
- state_ = RunCycle();
-
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 1)
- << "There should now be a redial-key report";
-
- expected_keycodes_.insert(Key_A.getKeyCode());
- EXPECT_THAT(state_->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes_))
- << "The report should include only `A`";
-
- // Release redial key
- sim_.Release(key_addr_Redial);
- state_ = RunCycle();
-
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 1)
- << "There should be one report after redial-key release";
-
- expected_keycodes_.erase(Key_A.getKeyCode());
- EXPECT_THAT(state_->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes_))
- << "The report should be empty";
-
- sim_.RunCycle();
-
- state_ = RunCycle();
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 0);
-}
-
-TEST_F(RedialBasic, RedialNextKey) {
-
- // Press `X`
- sim_.Press(key_addr_X);
- state_ = RunCycle();
-
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 1)
- << "There should be one report after letter key press";
-
- expected_keycodes_.insert(Key_X.getKeyCode());
- EXPECT_THAT(state_->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes_))
- << "The report should include only `X`";
-
- // Release `X`
- sim_.Release(key_addr_X);
- state_ = RunCycle();
-
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 1)
- << "There should be one report after letter key release";
-
- expected_keycodes_.erase(Key_X.getKeyCode());
- EXPECT_THAT(state_->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes_))
- << "The report should be empty";
-
- sim_.RunCycle();
-
- // Press redial key
- sim_.Press(key_addr_Redial);
-
- state_ = RunCycle();
-
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 1)
- << "There should now be a redial-key report";
-
- expected_keycodes_.insert(Key_X.getKeyCode());
- EXPECT_THAT(state_->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes_))
- << "The report should include only `X`";
-
- // Release redial key
- sim_.Release(key_addr_Redial);
- state_ = RunCycle();
-
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 1)
- << "There should be one report after redial-key release";
-
- expected_keycodes_.erase(Key_X.getKeyCode());
- EXPECT_THAT(state_->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes_))
- << "The report should be empty";
-
- sim_.RunCycle();
-
- state_ = RunCycle();
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 0);
-}
-
-} // namespace
-} // namespace testing
-} // namespace kaleidoscope