#include #include #include "input_parser.h" class ParserTest : public QObject { Q_OBJECT private slots: void singleCharacters(); void singleCharactersShouldFail(); void severalCharacters(); void severalCharactersShouldFail(); void singleDigit(); void singleDigitShouldFail(); void severalDigits(); void severalDigitsShouldFail(); void Modifiers(); void functionKeys(); void shouldExitEarlyFunctionKey(); void releaseHeldKeys(); void capitalLiterals(); void abortedCapitalLiterals(); void multipleCapitalLiterals(); void sixtyfourBackspacesBenchmarked(); void sixtyfourAsBenchmarked(); void removeDuplicateSpaces(); void removeDuplicateModifiers(); void removeIncorrectTokensBenchmark(); }; const std::string alphabet = "abcdefghijklmnopqrstuvxyz"; const std::string digits = "0123456789"; void ParserTest::singleCharacters() { for ( const auto letter : alphabet ) { const auto l = std::string( &letter ); const auto t = std::vector( { static_cast( letter ) } ); QCOMPARE( ParseKeyboardInputsToTokens( l ), t ); } } void ParserTest::singleCharactersShouldFail() { for ( const auto letter : alphabet ) { const auto l = std::string( &letter ); const auto t = std::vector( { static_cast( letter + 1 ) } ); QVERIFY( ParseKeyboardInputsToTokens( l ) != t ); } } void ParserTest::severalCharacters() { const auto tokens = ParseKeyboardInputsToTokens( "mad" ); const auto e = std::vector( { Token::KEY_m, Token::KEY_a, Token::KEY_d } ); QCOMPARE( tokens, e ); } void ParserTest::severalCharactersShouldFail() { const auto tokens = ParseKeyboardInputsToTokens( "mad" ); const auto e = std::vector( { Token::KEY_m, Token::KEY_e, Token::KEY_d } ); QVERIFY( tokens != e ); } void ParserTest::singleDigit() { for ( const auto n : digits ) { const auto l = std::string( &n ); const auto t = std::vector( { static_cast( n ) } ); QCOMPARE( ParseKeyboardInputsToTokens( l ), t ); } } void ParserTest::singleDigitShouldFail() { for ( const auto n : digits ) { const auto l = std::string( &n ); const auto t = std::vector( { static_cast( n + 1 ) } ); QVERIFY( ParseKeyboardInputsToTokens( l ) != t ); } } void ParserTest::severalDigits() { const auto t = ParseKeyboardInputsToTokens( "123" ); const auto e = std::vector( { Token::KEY_1, Token::KEY_2, Token::KEY_3 } ); QVERIFY( t == e ); } void ParserTest::severalDigitsShouldFail() { const auto t = ParseKeyboardInputsToTokens( "123" ); const auto e = std::vector( { Token::KEY_1, Token::KEY_3, Token::KEY_2 } ); QVERIFY( t != e ); } void ParserTest::Modifiers() { auto t = ParseKeyboardInputsToTokens( "^" ); auto e = std::vector( { Token::MODIFIER_CTRL } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "*" ); e = std::vector( { Token::MODIFIER_ALT } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( ">" ); e = std::vector( { Token::MODIFIER_SHIFT } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "/" ); e = std::vector( { Token::MODIFIER_ALTGR } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "#" ); e = std::vector( { Token::MODIFIER_SUPER } ); QVERIFY( t == e ); } void ParserTest::functionKeys() { auto t = ParseKeyboardInputsToTokens( "F1" ); auto e = std::vector( { Token::KEY_F1 } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "F2" ); e = std::vector( { Token::KEY_F2 } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "F3" ); e = std::vector( { Token::KEY_F3 } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "F4" ); e = std::vector( { Token::KEY_F4 } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "F5" ); e = std::vector( { Token::KEY_F5 } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "F6" ); e = std::vector( { Token::KEY_F6 } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "F7" ); e = std::vector( { Token::KEY_F7 } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "F8" ); e = std::vector( { Token::KEY_F8 } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "F9" ); e = std::vector( { Token::KEY_F9 } ); 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 ); } void ParserTest::releaseHeldKeys() { auto t = ParseKeyboardInputsToTokens( "a s" ); auto e = std::vector( { Token::KEY_a, Token::TOKEN_NEW_SEQUENCE, Token::KEY_s } ); QVERIFY( t == e ); } void ParserTest::capitalLiterals() { auto t = ParseKeyboardInputsToTokens( "BACKSPACE" ); auto e = std::vector( { Token::KEY_BACKSPACE } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "SPACE" ); e = std::vector( { Token::KEY_SPACE } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "TAB" ); e = std::vector( { Token::KEY_TAB } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "ESC" ); e = std::vector( { Token::KEY_ESC } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "INS" ); e = std::vector( { Token::KEY_INS } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "DEL" ); e = std::vector( { Token::KEY_DEL } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "END" ); e = std::vector( { Token::KEY_END } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "PGDN" ); e = std::vector( { Token::KEY_PGDN } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "PGUP" ); e = std::vector( { Token::KEY_PGUP } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "CAPS" ); e = std::vector( { Token::KEY_CAPS } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "PRNSCRN" ); e = std::vector( { Token::KEY_PRNSCRN } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "PAUSE" ); e = std::vector( { Token::KEY_PAUSE } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "SCRLOCK" ); e = std::vector( { Token::KEY_SCRLOCK } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "LEFTARROW" ); e = std::vector( { Token::KEY_LEFTARROW } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "RIGHTARROW" ); e = std::vector( { Token::KEY_RIGHTARROW } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "UPARROW" ); e = std::vector( { Token::KEY_UPARROW } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "DOWNARROW" ); e = std::vector( { Token::KEY_DOWNARROW } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "KPSLASH" ); e = std::vector( { Token::KEY_KPSLASH } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "KPSTAR" ); e = std::vector( { Token::KEY_KPSTAR } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "KPMINUS" ); e = std::vector( { Token::KEY_KPMINUS } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "KPPLUS" ); e = std::vector( { Token::KEY_KPPLUS } ); QVERIFY( t == e ); } void ParserTest::abortedCapitalLiterals() { auto t = ParseKeyboardInputsToTokens( "aKPPL" ); auto e = std::vector( { Token::KEY_a } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "aKPPLasd" ); e = std::vector( { Token::KEY_a } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "aDOESNTEXIST" ); e = std::vector( { Token::KEY_a } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "aBACKSPACEBACK" ); e = std::vector( { Token::KEY_a, Token::KEY_BACKSPACE } ); QVERIFY( t == e ); } void ParserTest::multipleCapitalLiterals() { auto t = ParseKeyboardInputsToTokens( "BACKSPACEa" ); auto e = std::vector( { Token::KEY_BACKSPACE, Token::KEY_a } ); QCOMPARE( t, e ); t = ParseKeyboardInputsToTokens( "BACKSPACEBACKSPACE" ); e = std::vector( { Token::KEY_BACKSPACE, Token::KEY_BACKSPACE } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "BACKSPACEaBACKSPACE" ); e = std::vector( { Token::KEY_BACKSPACE, Token::KEY_a, Token::KEY_BACKSPACE } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "F1BACKSPACEaBACKSPACE" ); e = std::vector( { Token::KEY_F1, Token::KEY_BACKSPACE, Token::KEY_a, Token::KEY_BACKSPACE } ); QVERIFY( t == e ); t = ParseKeyboardInputsToTokens( "F1BACKSPACEaBACKSPACe" ); e = std::vector( { Token::KEY_F1, Token::KEY_BACKSPACE, Token::KEY_a } ); QVERIFY( t == e ); } void ParserTest::sixtyfourBackspacesBenchmarked() { constexpr auto sixtyfourBackspaces = "BACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKS" "PACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEB" "ACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSP" "ACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBA" "CKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPA" "CEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBAC" "KSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPAC" "EBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACKSPACEBACK" "SPACEBACKSPACEBACKSPACEBACKSPACE"; auto t = ParseKeyboardInputsToTokens( sixtyfourBackspaces ); std::vector e( 64, Token::KEY_BACKSPACE ); QVERIFY( t == e ); QBENCHMARK { auto t = ParseKeyboardInputsToTokens( sixtyfourBackspaces ); } } void ParserTest::sixtyfourAsBenchmarked() { constexpr auto sixtyfourBackspaces = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; auto t = ParseKeyboardInputsToTokens( sixtyfourBackspaces ); std::vector e( 64, Token::KEY_a ); QVERIFY( t == e ); QBENCHMARK { auto t = ParseKeyboardInputsToTokens( sixtyfourBackspaces ); } } void ParserTest::removeDuplicateSpaces() { const auto e = std::vector( { Token::KEY_a, Token::TOKEN_NEW_SEQUENCE, Token::TOKEN_NEW_SEQUENCE, Token::TOKEN_NEW_SEQUENCE, Token::TOKEN_NEW_SEQUENCE, Token::TOKEN_NEW_SEQUENCE, Token::TOKEN_NEW_SEQUENCE, Token::KEY_d } ); const auto t = std::vector( { Token::KEY_a, Token::TOKEN_NEW_SEQUENCE, Token::KEY_d } ); QCOMPARE( removeIncorrectTokens( e ), t ); } void ParserTest::removeDuplicateModifiers() { auto e = std::vector( { Token::KEY_a, Token::MODIFIER_CTRL, Token::KEY_a, Token::MODIFIER_CTRL, Token::TOKEN_NEW_SEQUENCE, Token::MODIFIER_ALT, Token::KEY_TAB, Token::KEY_d } ); auto t = std::vector( { Token::KEY_a, Token::MODIFIER_CTRL, Token::KEY_a, Token::TOKEN_NEW_SEQUENCE, Token::MODIFIER_ALT, Token::KEY_TAB, Token::KEY_d } ); QCOMPARE( removeIncorrectTokens( e ), t ); e = std::vector( { Token::KEY_a, Token::MODIFIER_ALT, Token::KEY_a, Token::MODIFIER_ALT, Token::TOKEN_NEW_SEQUENCE, Token::MODIFIER_ALT, Token::KEY_TAB, Token::KEY_d } ); t = std::vector( { Token::KEY_a, Token::MODIFIER_ALT, Token::KEY_a, Token::TOKEN_NEW_SEQUENCE, Token::MODIFIER_ALT, Token::KEY_TAB, Token::KEY_d } ); QCOMPARE( removeIncorrectTokens( e ), t ); e = std::vector( { Token::KEY_a, Token::MODIFIER_SHIFT, Token::KEY_a, Token::MODIFIER_SHIFT, Token::TOKEN_NEW_SEQUENCE, Token::MODIFIER_ALT, Token::KEY_TAB, Token::KEY_d } ); t = std::vector( { Token::KEY_a, Token::MODIFIER_SHIFT, Token::KEY_a, Token::TOKEN_NEW_SEQUENCE, Token::MODIFIER_ALT, Token::KEY_TAB, Token::KEY_d } ); QCOMPARE( removeIncorrectTokens( e ), t ); e = std::vector( { Token::KEY_a, Token::MODIFIER_ALTGR, Token::KEY_a, Token::MODIFIER_ALTGR, Token::TOKEN_NEW_SEQUENCE, Token::MODIFIER_ALT, Token::KEY_TAB, Token::KEY_d } ); t = std::vector( { Token::KEY_a, Token::MODIFIER_ALTGR, Token::KEY_a, Token::TOKEN_NEW_SEQUENCE, Token::MODIFIER_ALT, Token::KEY_TAB, Token::KEY_d } ); QCOMPARE( removeIncorrectTokens( e ), t ); e = std::vector( { Token::KEY_a, Token::MODIFIER_SUPER, Token::KEY_a, Token::MODIFIER_SUPER, Token::TOKEN_NEW_SEQUENCE, Token::MODIFIER_ALT, Token::KEY_TAB, Token::KEY_d } ); t = std::vector( { Token::KEY_a, Token::MODIFIER_SUPER, Token::KEY_a, Token::TOKEN_NEW_SEQUENCE, Token::MODIFIER_ALT, Token::KEY_TAB, Token::KEY_d } ); QCOMPARE( removeIncorrectTokens( e ), t ); } void ParserTest::removeIncorrectTokensBenchmark() { auto e = std::vector( 100, Token::MODIFIER_SHIFT ); e.at( 0 ) = Token::KEY_a; e.at( 10 ) = Token::TOKEN_NEW_SEQUENCE; e.at( 11 ) = Token::KEY_a; e.at( 95 ) = Token::KEY_a; auto t = std::vector( { Token::KEY_a, Token::MODIFIER_SHIFT, Token::TOKEN_NEW_SEQUENCE, Token::KEY_a, Token::MODIFIER_SHIFT, Token::KEY_a } ); QCOMPARE( removeIncorrectTokens( e ), t ); QBENCHMARK { QCOMPARE( removeIncorrectTokens( e ), t ); } } QTEST_APPLESS_MAIN( ParserTest ) #include "./release/tst_parsertest.moc"