diff --git a/src/keyboard_input/input_parser.cpp b/src/keyboard_input/input_parser.cpp index da4692f..fce3d02 100644 --- a/src/keyboard_input/input_parser.cpp +++ b/src/keyboard_input/input_parser.cpp @@ -61,7 +61,7 @@ std::vector ParseKeyboardInputsToTokens( const std::string inputs ) { std::vector tokens{}; - for ( auto ch = inputs.begin(); ch != inputs.end(); ++ch ) + for ( auto ch = inputs.begin(), end = inputs.end(); ch != end; ++ch ) { if ( const auto c = getNumberOrLetter( *ch ); c.has_value() ) { @@ -84,6 +84,10 @@ std::vector ParseKeyboardInputsToTokens( const std::string inputs ) if ( *ch == 'F' ) { ++ch; + if ( ch == end ) + { + break; + } const auto token = getFunctionNumber( *ch ); if ( token.has_value() ) { diff --git a/test/keyboard_input/tst_parsertest.cpp b/test/keyboard_input/tst_parsertest.cpp index 7c73dce..ce6215f 100644 --- a/test/keyboard_input/tst_parsertest.cpp +++ b/test/keyboard_input/tst_parsertest.cpp @@ -24,6 +24,8 @@ private slots: void Modifiers(); void functionKeys(); + + void shouldExitEarlyFunctionKey(); }; const std::string alphabet = "abcdefghijklmnopqrstuvxyz"; @@ -164,6 +166,25 @@ void ParserTest::functionKeys() QVERIFY( t == e ); } +void ParserTest::shouldExitEarlyFunctionKey() +{ + auto t = ParseKeyboardInputsToTokens( "asF" ); + auto e = std::vector( { Token::KEY_a, Token::KEY_s } ); + QVERIFY( t == e ); + + t = ParseKeyboardInputsToTokens( "asFs" ); + e = std::vector( { Token::KEY_a, Token::KEY_s } ); + QVERIFY( t == e ); + + t = ParseKeyboardInputsToTokens( "F" ); + e = std::vector( {} ); + QVERIFY( t == e ); + + t = ParseKeyboardInputsToTokens( "Fsdfg" ); + e = std::vector( {} ); + QVERIFY( t == e ); +} + QTEST_APPLESS_MAIN( ParserTest ) #include "tst_parsertest.moc"