Fix Caps Word capitalization when used with Combos + Auto Shift. (#17549)
This commit is contained in:
		
							parent
							
								
									4eeafbebab
								
							
						
					
					
						commit
						6a0d90f81a
					
				
					 9 changed files with 343 additions and 15 deletions
				
			
		| 
						 | 
				
			
			@ -19,6 +19,14 @@
 | 
			
		|||
#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;
 | 
			
		||||
| 
						 | 
				
			
			@ -39,13 +47,7 @@ TEST_F(CapsWord, AutoShiftKeys) {
 | 
			
		|||
    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_EMPTY_OR_LSFT(driver).Times(AnyNumber());
 | 
			
		||||
    { // Expect: "A, A, space, a".
 | 
			
		||||
        InSequence s;
 | 
			
		||||
        EXPECT_REPORT(driver, (KC_LSFT, KC_A));
 | 
			
		||||
| 
						 | 
				
			
			@ -65,6 +67,46 @@ TEST_F(CapsWord, AutoShiftKeys) {
 | 
			
		|||
    testing::Mock::VerifyAndClearExpectations(&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();
 | 
			
		||||
    testing::Mock::VerifyAndClearExpectations(&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) {
 | 
			
		||||
| 
						 | 
				
			
			@ -73,13 +115,7 @@ TEST_F(CapsWord, RetroShiftKeys) {
 | 
			
		|||
    KeymapKey  key_layertap_b(0, 1, 0, LT(1, KC_B));
 | 
			
		||||
    set_keymap({key_modtap_a, key_layertap_b});
 | 
			
		||||
 | 
			
		||||
    // 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_EMPTY_OR_LSFT(driver).Times(AnyNumber());
 | 
			
		||||
    { // Expect: "B, A, B, A".
 | 
			
		||||
        InSequence s;
 | 
			
		||||
        EXPECT_REPORT(driver, (KC_LSFT, KC_B));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue