From dd94877ec6d2ee5c4cdb0e71287abd76585b0268 Mon Sep 17 00:00:00 2001 From: Isaac Elenbaas Date: Sun, 24 Sep 2023 22:45:49 -0400 Subject: Improve test invocation, fix Retro Shift bugs, and add Auto+Retro Shift test cases (#15889) --- tests/caps_word/auto_shift/config.h | 21 +++ tests/caps_word/auto_shift/retro_shift/config.h | 22 ++++ tests/caps_word/auto_shift/retro_shift/test.mk | 18 +++ .../retro_shift/test_caps_word_retroshift.cpp | 141 +++++++++++++++++++++ tests/caps_word/auto_shift/test.mk | 18 +++ .../auto_shift/test_caps_word_autoshift.cpp | 66 ++++++++++ tests/caps_word/caps_word_autoshift/config.h | 22 ---- tests/caps_word/caps_word_autoshift/test.mk | 18 --- .../test_caps_word_autoshift.cpp | 137 -------------------- tests/caps_word/caps_word_unicodemap/config.h | 20 --- tests/caps_word/caps_word_unicodemap/test.mk | 18 --- .../test_caps_word_unicodemap.cpp | 121 ------------------ tests/caps_word/unicodemap/config.h | 20 +++ tests/caps_word/unicodemap/test.mk | 18 +++ .../unicodemap/test_caps_word_unicodemap.cpp | 121 ++++++++++++++++++ 15 files changed, 445 insertions(+), 336 deletions(-) create mode 100644 tests/caps_word/auto_shift/config.h create mode 100644 tests/caps_word/auto_shift/retro_shift/config.h create mode 100644 tests/caps_word/auto_shift/retro_shift/test.mk create mode 100644 tests/caps_word/auto_shift/retro_shift/test_caps_word_retroshift.cpp create mode 100644 tests/caps_word/auto_shift/test.mk create mode 100644 tests/caps_word/auto_shift/test_caps_word_autoshift.cpp delete mode 100644 tests/caps_word/caps_word_autoshift/config.h delete mode 100644 tests/caps_word/caps_word_autoshift/test.mk delete mode 100644 tests/caps_word/caps_word_autoshift/test_caps_word_autoshift.cpp delete mode 100644 tests/caps_word/caps_word_unicodemap/config.h delete mode 100644 tests/caps_word/caps_word_unicodemap/test.mk delete mode 100644 tests/caps_word/caps_word_unicodemap/test_caps_word_unicodemap.cpp create mode 100644 tests/caps_word/unicodemap/config.h create mode 100644 tests/caps_word/unicodemap/test.mk create mode 100644 tests/caps_word/unicodemap/test_caps_word_unicodemap.cpp (limited to 'tests/caps_word') diff --git a/tests/caps_word/auto_shift/config.h b/tests/caps_word/auto_shift/config.h new file mode 100644 index 0000000000..aff389100e --- /dev/null +++ b/tests/caps_word/auto_shift/config.h @@ -0,0 +1,21 @@ +// Copyright 2022 Google LLC +// +// 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, either version 2 of the License, or +// (at your option) any later version. +// +// 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 . + +#pragma once + +#include "test_common.h" + +#define TAPPING_TERM 200 +#define AUTO_SHIFT_TIMEOUT 150 diff --git a/tests/caps_word/auto_shift/retro_shift/config.h b/tests/caps_word/auto_shift/retro_shift/config.h new file mode 100644 index 0000000000..b80f53b9dd --- /dev/null +++ b/tests/caps_word/auto_shift/retro_shift/config.h @@ -0,0 +1,22 @@ +// Copyright 2022 Google LLC +// +// 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, either version 2 of the License, or +// (at your option) any later version. +// +// 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 . + +#pragma once + +#include "test_common.h" + +#define TAPPING_TERM 200 +#define AUTO_SHIFT_TIMEOUT 150 +#define RETRO_SHIFT 500 diff --git a/tests/caps_word/auto_shift/retro_shift/test.mk b/tests/caps_word/auto_shift/retro_shift/test.mk new file mode 100644 index 0000000000..7f717d7fc1 --- /dev/null +++ b/tests/caps_word/auto_shift/retro_shift/test.mk @@ -0,0 +1,18 @@ +# Copyright 2022 Google LLC +# +# 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, either version 2 of the License, or +# (at your option) any later version. +# +# 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 . + +CAPS_WORD_ENABLE = yes +AUTO_SHIFT_ENABLE = yes + diff --git a/tests/caps_word/auto_shift/retro_shift/test_caps_word_retroshift.cpp b/tests/caps_word/auto_shift/retro_shift/test_caps_word_retroshift.cpp new file mode 100644 index 0000000000..03a7a61a73 --- /dev/null +++ b/tests/caps_word/auto_shift/retro_shift/test_caps_word_retroshift.cpp @@ -0,0 +1,141 @@ +// Copyright 2022 Google LLC +// +// 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, either version 2 of the License, or +// (at your option) any later version. +// +// 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 "keyboard_report_util.hpp" +#include "keycode.h" +#include "test_common.hpp" +#include "test_fixture.hpp" +#include "test_keymap_key.hpp" + +// Allow reports with no keys or only KC_LSFT. +// clang-format off +#define EXPECT_EMPTY_OR_LSFT(driver) \ + EXPECT_CALL(driver, send_keyboard_mock(AnyOf( \ + KeyboardReport(), \ + KeyboardReport(KC_LSFT)))) +// clang-format on + +bool get_auto_shifted_key(uint16_t keycode, keyrecord_t *record) { + return true; +} + +using ::testing::_; +using ::testing::AnyNumber; +using ::testing::AnyOf; +using ::testing::InSequence; + +class CapsWord : public TestFixture { + public: + void SetUp() override { + caps_word_off(); + } +}; + +// Tests that with Auto Shift, letter keys are shifted by Caps Word +// regardless of whether they are released before AUTO_SHIFT_TIMEOUT. +TEST_F(CapsWord, AutoShiftKeys) { + TestDriver driver; + KeymapKey key_a(0, 0, 0, KC_A); + KeymapKey key_spc(0, 1, 0, KC_SPC); + set_keymap({key_a, key_spc}); + + EXPECT_EMPTY_OR_LSFT(driver).Times(AnyNumber()); + { // Expect: "A, A, space, a". + InSequence s; + EXPECT_REPORT(driver, (KC_LSFT, KC_A)); + EXPECT_REPORT(driver, (KC_LSFT, KC_A)); + EXPECT_REPORT(driver, (KC_SPC)); + EXPECT_REPORT(driver, (KC_A)); + } + + // Turn on Caps Word and type "A (quick tap), A (long press), space, A". + caps_word_on(); + + tap_key(key_a); // Tap A quickly. + tap_key(key_a, AUTO_SHIFT_TIMEOUT + 1); // Long press A. + tap_key(key_spc); + tap_key(key_a); + + VERIFY_AND_CLEAR(driver); +} + +// Test Caps Word + Auto Shift where keys A and B are rolled. +TEST_F(CapsWord, AutoShiftRolledShiftedKeys) { + TestDriver driver; + KeymapKey key_a(0, 0, 0, KC_A); + KeymapKey key_b(0, 0, 1, KC_B); + set_keymap({key_a, key_b}); + + EXPECT_EMPTY_OR_LSFT(driver).Times(AnyNumber()); + { // Expect: "A, B, A, B". + InSequence s; + EXPECT_REPORT(driver, (KC_LSFT, KC_A)); + EXPECT_REPORT(driver, (KC_LSFT, KC_B)); + EXPECT_REPORT(driver, (KC_LSFT, KC_A)); + EXPECT_REPORT(driver, (KC_LSFT, KC_B)); + } + + caps_word_on(); + + key_a.press(); // Overlapping taps: A down, B down, A up, B up. + run_one_scan_loop(); + key_b.press(); + run_one_scan_loop(); + key_a.release(); + run_one_scan_loop(); + key_b.release(); + run_one_scan_loop(); + + key_a.press(); // Nested taps: A down, B down, B up, A up. + run_one_scan_loop(); + key_b.press(); + run_one_scan_loop(); + key_b.release(); + run_one_scan_loop(); + key_a.release(); + run_one_scan_loop(); + + caps_word_off(); + VERIFY_AND_CLEAR(driver); +} + +// Tests that with tap-hold keys with Retro Shift, letter keys are shifted by +// Caps Word regardless of whether they are retroshifted. +TEST_F(CapsWord, RetroShiftKeys) { + TestDriver driver; + KeymapKey key_modtap_a(0, 0, 0, LCTL_T(KC_A)); + KeymapKey key_layertap_b(0, 1, 0, LT(1, KC_B)); + set_keymap({key_modtap_a, key_layertap_b}); + + EXPECT_EMPTY_OR_LSFT(driver).Times(AnyNumber()); + { // Expect: "B, A, B, A". + InSequence s; + EXPECT_REPORT(driver, (KC_LSFT, KC_B)); + EXPECT_REPORT(driver, (KC_LSFT, KC_A)); + EXPECT_REPORT(driver, (KC_LSFT, KC_B)); + EXPECT_REPORT(driver, (KC_LSFT, KC_A)); + } + + // Turn on Caps Word and type "B, A (long press), B (long press), A". + caps_word_on(); + + tap_key(key_layertap_b); // Tap B quickly. + tap_key(key_modtap_a, TAPPING_TERM + 1); // Long press A. + tap_key(key_layertap_b, TAPPING_TERM + 1); // Long press B. + tap_key(key_modtap_a); // Tap A quickly. + + EXPECT_EQ(is_caps_word_on(), true); + VERIFY_AND_CLEAR(driver); +} diff --git a/tests/caps_word/auto_shift/test.mk b/tests/caps_word/auto_shift/test.mk new file mode 100644 index 0000000000..7f717d7fc1 --- /dev/null +++ b/tests/caps_word/auto_shift/test.mk @@ -0,0 +1,18 @@ +# Copyright 2022 Google LLC +# +# 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, either version 2 of the License, or +# (at your option) any later version. +# +# 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 . + +CAPS_WORD_ENABLE = yes +AUTO_SHIFT_ENABLE = yes + diff --git a/tests/caps_word/auto_shift/test_caps_word_autoshift.cpp b/tests/caps_word/auto_shift/test_caps_word_autoshift.cpp new file mode 100644 index 0000000000..849b993525 --- /dev/null +++ b/tests/caps_word/auto_shift/test_caps_word_autoshift.cpp @@ -0,0 +1,66 @@ +// Copyright 2022 Google LLC +// +// 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, either version 2 of the License, or +// (at your option) any later version. +// +// 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 "keyboard_report_util.hpp" +#include "keycode.h" +#include "test_common.hpp" +#include "test_fixture.hpp" +#include "test_keymap_key.hpp" + +using ::testing::_; +using ::testing::AnyNumber; +using ::testing::AnyOf; +using ::testing::InSequence; + +class CapsWord : public TestFixture { + public: + void SetUp() override { + caps_word_off(); + } +}; + +// Tests that with Auto Shift, letter keys are shifted by Caps Word +// regardless of whether they are released before AUTO_SHIFT_TIMEOUT. +TEST_F(CapsWord, AutoShiftKeys) { + TestDriver driver; + KeymapKey key_a(0, 0, 0, KC_A); + KeymapKey key_spc(0, 1, 0, KC_SPC); + set_keymap({key_a, key_spc}); + + // Allow any number of reports with no keys or only KC_LSFT. + // clang-format off + EXPECT_CALL(driver, send_keyboard_mock(AnyOf( + KeyboardReport(), + KeyboardReport(KC_LSFT)))) + .Times(AnyNumber()); + // clang-format on + { // Expect: "A, A, space, a". + InSequence s; + EXPECT_REPORT(driver, (KC_LSFT, KC_A)); + EXPECT_REPORT(driver, (KC_LSFT, KC_A)); + EXPECT_REPORT(driver, (KC_SPC)); + EXPECT_REPORT(driver, (KC_A)); + } + + // Turn on Caps Word and type "A (quick tap), A (long press), space, A". + caps_word_on(); + + tap_key(key_a); // Tap A quickly. + tap_key(key_a, AUTO_SHIFT_TIMEOUT + 1); // Long press A. + tap_key(key_spc); + tap_key(key_a); + + testing::Mock::VerifyAndClearExpectations(&driver); +} diff --git a/tests/caps_word/caps_word_autoshift/config.h b/tests/caps_word/caps_word_autoshift/config.h deleted file mode 100644 index b80f53b9dd..0000000000 --- a/tests/caps_word/caps_word_autoshift/config.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2022 Google LLC -// -// 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, either version 2 of the License, or -// (at your option) any later version. -// -// 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 . - -#pragma once - -#include "test_common.h" - -#define TAPPING_TERM 200 -#define AUTO_SHIFT_TIMEOUT 150 -#define RETRO_SHIFT 500 diff --git a/tests/caps_word/caps_word_autoshift/test.mk b/tests/caps_word/caps_word_autoshift/test.mk deleted file mode 100644 index 7f717d7fc1..0000000000 --- a/tests/caps_word/caps_word_autoshift/test.mk +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2022 Google LLC -# -# 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, either version 2 of the License, or -# (at your option) any later version. -# -# 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 . - -CAPS_WORD_ENABLE = yes -AUTO_SHIFT_ENABLE = yes - diff --git a/tests/caps_word/caps_word_autoshift/test_caps_word_autoshift.cpp b/tests/caps_word/caps_word_autoshift/test_caps_word_autoshift.cpp deleted file mode 100644 index 01b1a78a5f..0000000000 --- a/tests/caps_word/caps_word_autoshift/test_caps_word_autoshift.cpp +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2022 Google LLC -// -// 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, either version 2 of the License, or -// (at your option) any later version. -// -// 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 "keyboard_report_util.hpp" -#include "keycode.h" -#include "test_common.hpp" -#include "test_fixture.hpp" -#include "test_keymap_key.hpp" - -// Allow reports with no keys or only KC_LSFT. -// clang-format off -#define EXPECT_EMPTY_OR_LSFT(driver) \ - EXPECT_CALL(driver, send_keyboard_mock(AnyOf( \ - KeyboardReport(), \ - KeyboardReport(KC_LSFT)))) -// clang-format on - -using ::testing::_; -using ::testing::AnyNumber; -using ::testing::AnyOf; -using ::testing::InSequence; - -class CapsWord : public TestFixture { - public: - void SetUp() override { - caps_word_off(); - } -}; - -// Tests that with Auto Shift, letter keys are shifted by Caps Word -// regardless of whether they are released before AUTO_SHIFT_TIMEOUT. -TEST_F(CapsWord, AutoShiftKeys) { - TestDriver driver; - KeymapKey key_a(0, 0, 0, KC_A); - KeymapKey key_spc(0, 1, 0, KC_SPC); - set_keymap({key_a, key_spc}); - - EXPECT_EMPTY_OR_LSFT(driver).Times(AnyNumber()); - { // Expect: "A, A, space, a". - InSequence s; - EXPECT_REPORT(driver, (KC_LSFT, KC_A)); - EXPECT_REPORT(driver, (KC_LSFT, KC_A)); - EXPECT_REPORT(driver, (KC_SPC)); - EXPECT_REPORT(driver, (KC_A)); - } - - // Turn on Caps Word and type "A (quick tap), A (long press), space, A". - caps_word_on(); - - tap_key(key_a); // Tap A quickly. - tap_key(key_a, AUTO_SHIFT_TIMEOUT + 1); // Long press A. - tap_key(key_spc); - tap_key(key_a); - - VERIFY_AND_CLEAR(driver); -} - -// Test Caps Word + Auto Shift where keys A and B are rolled. -TEST_F(CapsWord, AutoShiftRolledShiftedKeys) { - TestDriver driver; - KeymapKey key_a(0, 0, 0, KC_A); - KeymapKey key_b(0, 0, 1, KC_B); - set_keymap({key_a, key_b}); - - EXPECT_EMPTY_OR_LSFT(driver).Times(AnyNumber()); - { // Expect: "A, B, A, B". - InSequence s; - EXPECT_REPORT(driver, (KC_LSFT, KC_A)); - EXPECT_REPORT(driver, (KC_LSFT, KC_B)); - EXPECT_REPORT(driver, (KC_LSFT, KC_A)); - EXPECT_REPORT(driver, (KC_LSFT, KC_B)); - } - - caps_word_on(); - - key_a.press(); // Overlapping taps: A down, B down, A up, B up. - run_one_scan_loop(); - key_b.press(); - run_one_scan_loop(); - key_a.release(); - run_one_scan_loop(); - key_b.release(); - run_one_scan_loop(); - - key_a.press(); // Nested taps: A down, B down, B up, A up. - run_one_scan_loop(); - key_b.press(); - run_one_scan_loop(); - key_b.release(); - run_one_scan_loop(); - key_a.release(); - run_one_scan_loop(); - - caps_word_off(); - VERIFY_AND_CLEAR(driver); -} - -// Tests that with tap-hold keys with Retro Shift, letter keys are shifted by -// Caps Word regardless of whether they are retroshifted. -TEST_F(CapsWord, RetroShiftKeys) { - TestDriver driver; - KeymapKey key_modtap_a(0, 0, 0, LCTL_T(KC_A)); - KeymapKey key_layertap_b(0, 1, 0, LT(1, KC_B)); - set_keymap({key_modtap_a, key_layertap_b}); - - EXPECT_EMPTY_OR_LSFT(driver).Times(AnyNumber()); - { // Expect: "B, A, B, A". - InSequence s; - EXPECT_REPORT(driver, (KC_LSFT, KC_B)); - EXPECT_REPORT(driver, (KC_LSFT, KC_A)); - EXPECT_REPORT(driver, (KC_LSFT, KC_B)); - EXPECT_REPORT(driver, (KC_LSFT, KC_A)); - } - - // Turn on Caps Word and type "B, A (long press), B (long press), A". - caps_word_on(); - - tap_key(key_layertap_b); // Tap B quickly. - tap_key(key_modtap_a, TAPPING_TERM + 1); // Long press A. - tap_key(key_layertap_b, TAPPING_TERM + 1); // Long press B. - tap_key(key_modtap_a); // Tap A quickly. - - EXPECT_EQ(is_caps_word_on(), true); - VERIFY_AND_CLEAR(driver); -} diff --git a/tests/caps_word/caps_word_unicodemap/config.h b/tests/caps_word/caps_word_unicodemap/config.h deleted file mode 100644 index 0f770337b1..0000000000 --- a/tests/caps_word/caps_word_unicodemap/config.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2022 Google LLC -// -// 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, either version 2 of the License, or -// (at your option) any later version. -// -// 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 . - -#pragma once - -#include "test_common.h" - -#define UNICODE_SELECTED_MODES UNICODE_MODE_LINUX diff --git a/tests/caps_word/caps_word_unicodemap/test.mk b/tests/caps_word/caps_word_unicodemap/test.mk deleted file mode 100644 index 92bcba762c..0000000000 --- a/tests/caps_word/caps_word_unicodemap/test.mk +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2022 Google LLC -# -# 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, either version 2 of the License, or -# (at your option) any later version. -# -# 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 . - -CAPS_WORD_ENABLE = yes -UNICODEMAP_ENABLE = yes - diff --git a/tests/caps_word/caps_word_unicodemap/test_caps_word_unicodemap.cpp b/tests/caps_word/caps_word_unicodemap/test_caps_word_unicodemap.cpp deleted file mode 100644 index 21e5493526..0000000000 --- a/tests/caps_word/caps_word_unicodemap/test_caps_word_unicodemap.cpp +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2022 Google LLC -// -// 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, either version 2 of the License, or -// (at your option) any later version. -// -// 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 "keyboard_report_util.hpp" -#include "keycode.h" -#include "test_common.hpp" -#include "test_fixture.hpp" -#include "test_keymap_key.hpp" - -using ::testing::_; -using ::testing::AnyNumber; -using ::testing::AnyOf; -using ::testing::InSequence; - -extern "C" { -enum unicode_names { - ENDASH, - EMDASH, - DELTA_LOWERCASE, - DELTA_UPPERCASE, -}; - -const uint32_t unicode_map[] PROGMEM = { - [ENDASH] = 0x2013, - [EMDASH] = 0x2014, - [DELTA_LOWERCASE] = 0x03b4, - [DELTA_UPPERCASE] = 0x0394, -}; - -#define U_DASH UP(ENDASH, EMDASH) -#define U_DELTA UP(DELTA_LOWERCASE, DELTA_UPPERCASE) - -bool caps_word_press_user(uint16_t keycode) { - switch (keycode) { - // Keycodes that continue Caps Word, with shift applied. - case U_DELTA: - add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to next key. - return true; - - // Keycodes that continue Caps Word, without shifting. - case U_DASH: - return true; - - default: - return false; // Deactivate Caps Word. - } -} -} // extern "C" - -class CapsWord : public TestFixture { - public: - void SetUp() override { - caps_word_off(); - } -}; - -// Tests that typing U_DELTA while Caps Word is on sends the uppercase Delta. -TEST_F(CapsWord, ShiftedUnicodeMapKey) { - TestDriver driver; - KeymapKey key_delta(0, 0, 0, U_DELTA); - KeymapKey key_spc(0, 1, 0, KC_SPC); - set_keymap({key_delta, key_spc}); - - // Allow any number of reports with no keys or only KC_LSFT and KC_LCTL. - // clang-format off - EXPECT_CALL(driver, send_keyboard_mock(AnyOf( - KeyboardReport(), - KeyboardReport(KC_LSFT), - KeyboardReport(KC_LCTL, KC_LSFT)))) - .Times(AnyNumber()); - // clang-format on - { // Expect: "Uppercase Delta, space, lowercase delta". - InSequence s; - EXPECT_UNICODE(driver, unicode_map[DELTA_UPPERCASE]); - EXPECT_REPORT(driver, (KC_SPC)); - EXPECT_UNICODE(driver, unicode_map[DELTA_LOWERCASE]); - } - - // Turn on Caps Word and tap "delta, space, delta". - caps_word_on(); - tap_keys(key_delta, key_spc, key_delta); - - EXPECT_EQ(is_caps_word_on(), false); - VERIFY_AND_CLEAR(driver); -} - -// Tests typing U_ENDASH while Caps Word is on. -TEST_F(CapsWord, UnshiftedUnicodeMapKey) { - TestDriver driver; - KeymapKey key_dash(0, 0, 0, U_DASH); - set_keymap({key_dash}); - - // Allow any number of reports with no keys or only KC_LSFT and KC_LCTL. - // clang-format off - EXPECT_CALL(driver, send_keyboard_mock(AnyOf( - KeyboardReport(), - KeyboardReport(KC_LSFT), - KeyboardReport(KC_LCTL, KC_LSFT)))) - .Times(AnyNumber()); - // clang-format on - EXPECT_UNICODE(driver, unicode_map[ENDASH]); - - // Turn on Caps Word and tap U_DASH key. - caps_word_on(); - tap_key(key_dash); - - EXPECT_EQ(is_caps_word_on(), true); - VERIFY_AND_CLEAR(driver); -} diff --git a/tests/caps_word/unicodemap/config.h b/tests/caps_word/unicodemap/config.h new file mode 100644 index 0000000000..0f770337b1 --- /dev/null +++ b/tests/caps_word/unicodemap/config.h @@ -0,0 +1,20 @@ +// Copyright 2022 Google LLC +// +// 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, either version 2 of the License, or +// (at your option) any later version. +// +// 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 . + +#pragma once + +#include "test_common.h" + +#define UNICODE_SELECTED_MODES UNICODE_MODE_LINUX diff --git a/tests/caps_word/unicodemap/test.mk b/tests/caps_word/unicodemap/test.mk new file mode 100644 index 0000000000..92bcba762c --- /dev/null +++ b/tests/caps_word/unicodemap/test.mk @@ -0,0 +1,18 @@ +# Copyright 2022 Google LLC +# +# 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, either version 2 of the License, or +# (at your option) any later version. +# +# 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 . + +CAPS_WORD_ENABLE = yes +UNICODEMAP_ENABLE = yes + diff --git a/tests/caps_word/unicodemap/test_caps_word_unicodemap.cpp b/tests/caps_word/unicodemap/test_caps_word_unicodemap.cpp new file mode 100644 index 0000000000..21e5493526 --- /dev/null +++ b/tests/caps_word/unicodemap/test_caps_word_unicodemap.cpp @@ -0,0 +1,121 @@ +// Copyright 2022 Google LLC +// +// 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, either version 2 of the License, or +// (at your option) any later version. +// +// 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 "keyboard_report_util.hpp" +#include "keycode.h" +#include "test_common.hpp" +#include "test_fixture.hpp" +#include "test_keymap_key.hpp" + +using ::testing::_; +using ::testing::AnyNumber; +using ::testing::AnyOf; +using ::testing::InSequence; + +extern "C" { +enum unicode_names { + ENDASH, + EMDASH, + DELTA_LOWERCASE, + DELTA_UPPERCASE, +}; + +const uint32_t unicode_map[] PROGMEM = { + [ENDASH] = 0x2013, + [EMDASH] = 0x2014, + [DELTA_LOWERCASE] = 0x03b4, + [DELTA_UPPERCASE] = 0x0394, +}; + +#define U_DASH UP(ENDASH, EMDASH) +#define U_DELTA UP(DELTA_LOWERCASE, DELTA_UPPERCASE) + +bool caps_word_press_user(uint16_t keycode) { + switch (keycode) { + // Keycodes that continue Caps Word, with shift applied. + case U_DELTA: + add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to next key. + return true; + + // Keycodes that continue Caps Word, without shifting. + case U_DASH: + return true; + + default: + return false; // Deactivate Caps Word. + } +} +} // extern "C" + +class CapsWord : public TestFixture { + public: + void SetUp() override { + caps_word_off(); + } +}; + +// Tests that typing U_DELTA while Caps Word is on sends the uppercase Delta. +TEST_F(CapsWord, ShiftedUnicodeMapKey) { + TestDriver driver; + KeymapKey key_delta(0, 0, 0, U_DELTA); + KeymapKey key_spc(0, 1, 0, KC_SPC); + set_keymap({key_delta, key_spc}); + + // Allow any number of reports with no keys or only KC_LSFT and KC_LCTL. + // clang-format off + EXPECT_CALL(driver, send_keyboard_mock(AnyOf( + KeyboardReport(), + KeyboardReport(KC_LSFT), + KeyboardReport(KC_LCTL, KC_LSFT)))) + .Times(AnyNumber()); + // clang-format on + { // Expect: "Uppercase Delta, space, lowercase delta". + InSequence s; + EXPECT_UNICODE(driver, unicode_map[DELTA_UPPERCASE]); + EXPECT_REPORT(driver, (KC_SPC)); + EXPECT_UNICODE(driver, unicode_map[DELTA_LOWERCASE]); + } + + // Turn on Caps Word and tap "delta, space, delta". + caps_word_on(); + tap_keys(key_delta, key_spc, key_delta); + + EXPECT_EQ(is_caps_word_on(), false); + VERIFY_AND_CLEAR(driver); +} + +// Tests typing U_ENDASH while Caps Word is on. +TEST_F(CapsWord, UnshiftedUnicodeMapKey) { + TestDriver driver; + KeymapKey key_dash(0, 0, 0, U_DASH); + set_keymap({key_dash}); + + // Allow any number of reports with no keys or only KC_LSFT and KC_LCTL. + // clang-format off + EXPECT_CALL(driver, send_keyboard_mock(AnyOf( + KeyboardReport(), + KeyboardReport(KC_LSFT), + KeyboardReport(KC_LCTL, KC_LSFT)))) + .Times(AnyNumber()); + // clang-format on + EXPECT_UNICODE(driver, unicode_map[ENDASH]); + + // Turn on Caps Word and tap U_DASH key. + caps_word_on(); + tap_key(key_dash); + + EXPECT_EQ(is_caps_word_on(), true); + VERIFY_AND_CLEAR(driver); +} -- cgit v1.2.3