From cd2698d701c82179417bf306bfebfde0681c89f0 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Tue, 10 Nov 2020 18:36:24 -0800 Subject: [PATCH] Port Redial tests to ktest. Add a couple ktest features to support that --- testing/bin/ktest-to-cxx | 23 ++- tests/plugins/Redial/basic/test.ktest | 74 ++++++++ tests/plugins/Redial/basic/test/testcase.cpp | 170 ------------------- 3 files changed, 94 insertions(+), 173 deletions(-) create mode 100644 tests/plugins/Redial/basic/test.ktest delete mode 100644 tests/plugins/Redial/basic/test/testcase.cpp 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