Port Redial tests to ktest. Add a couple ktest features to support that

pull/969/head
Jesse Vincent 4 years ago
parent b767a25e7f
commit cd2698d701
No known key found for this signature in database
GPG Key ID: CC228463465E40BC

@ -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(
", ",
(

@ -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

@ -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 <http://www.gnu.org/licenses/>.
*/
#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<uint8_t> expected_keycodes_ = {};
std::unique_ptr<State> 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
Loading…
Cancel
Save