diff --git a/src/common/keyboard_layout.cpp b/src/common/keyboard_layout.cpp index 2084aba8e1..0bce4a96a7 100644 --- a/src/common/keyboard_layout.cpp +++ b/src/common/keyboard_layout.cpp @@ -27,7 +27,7 @@ std::vector LayoutMap::GetKeyCodeList(const bool isShortcut) return impl->GetKeyCodeList(isShortcut); } -std::vector LayoutMap::GetKeyNameList(const bool isShortcut) +std::vector> LayoutMap::GetKeyNameList(const bool isShortcut) { return impl->GetKeyNameList(isShortcut); } @@ -305,25 +305,25 @@ std::vector LayoutMap::LayoutMapImpl::GetKeyCodeList(const bool isShortcu return keyCodes; } -std::vector LayoutMap::LayoutMapImpl::GetKeyNameList(const bool isShortcut) +std::vector> LayoutMap::LayoutMapImpl::GetKeyNameList(const bool isShortcut) { - std::vector keyNames; + std::vector> keyNames; std::vector keyCodes = GetKeyCodeList(isShortcut); std::lock_guard lock(keyboardLayoutMap_mutex); // If it is a key list for the shortcut control then we add a "None" key at the start if (isShortcut) { - keyNames.push_back(L"None"); + keyNames.push_back({ 0, L"None" }); for (int i = 1; i < keyCodes.size(); i++) { - keyNames.push_back(keyboardLayoutMap[keyCodes[i]]); + keyNames.push_back({ keyCodes[i], keyboardLayoutMap[keyCodes[i]] }); } } else { for (int i = 0; i < keyCodes.size(); i++) { - keyNames.push_back(keyboardLayoutMap[keyCodes[i]]); + keyNames.push_back({ keyCodes[i], keyboardLayoutMap[keyCodes[i]] }); } } diff --git a/src/common/keyboard_layout.h b/src/common/keyboard_layout.h index 58fe9f5280..4b1504c466 100644 --- a/src/common/keyboard_layout.h +++ b/src/common/keyboard_layout.h @@ -12,7 +12,7 @@ public: void UpdateLayout(); std::wstring GetKeyName(DWORD key); std::vector GetKeyCodeList(const bool isShortcut = false); - std::vector GetKeyNameList(const bool isShortcut = false); + std::vector> GetKeyNameList(const bool isShortcut = false); private: class LayoutMapImpl; diff --git a/src/common/keyboard_layout_impl.h b/src/common/keyboard_layout_impl.h index 9a1b07f2a8..dc1802e537 100644 --- a/src/common/keyboard_layout_impl.h +++ b/src/common/keyboard_layout_impl.h @@ -46,6 +46,6 @@ public: // Function to return the list of key codes in the order for the drop down. It creates it if it doesn't exist std::vector GetKeyCodeList(const bool isShortcut); - // Function to return the list of key name in the order for the drop down based on the key codes - std::vector GetKeyNameList(const bool isShortcut); + // Function to return the list of key name pairs in the order for the drop down based on the key codes + std::vector> GetKeyNameList(const bool isShortcut); }; \ No newline at end of file diff --git a/src/modules/keyboardmanager/common/Helpers.cpp b/src/modules/keyboardmanager/common/Helpers.cpp index 3cbb1a9ba2..3d82ccd95d 100644 --- a/src/modules/keyboardmanager/common/Helpers.cpp +++ b/src/modules/keyboardmanager/common/Helpers.cpp @@ -97,12 +97,15 @@ namespace KeyboardManagerHelper } } - Collections::IVector ToBoxValue(const std::vector& list) + Collections::IVector ToBoxValue(const std::vector>& list) { Collections::IVector boxList = single_threaded_vector(); for (auto& val : list) { - boxList.Append(winrt::box_value(val)); + auto comboBox = ComboBoxItem(); + comboBox.DataContext(winrt::box_value(std::to_wstring(val.first))); + comboBox.Content(winrt::box_value(val.second)); + boxList.Append(winrt::box_value(comboBox)); } return boxList; @@ -324,7 +327,7 @@ namespace KeyboardManagerHelper } // Function to filter the key codes for artificial key codes - DWORD FilterArtificialKeys(const DWORD& key) + int32_t FilterArtificialKeys(const int32_t& key) { switch (key) { @@ -345,57 +348,16 @@ namespace KeyboardManagerHelper } // Function to check if a modifier has been repeated in the previous drop downs - bool CheckRepeatedModifier(std::vector& currentKeys, int selectedKeyIndex, const std::vector& keyCodeList) + bool CheckRepeatedModifier(const std::vector& currentKeys, int selectedKeyCode) { - // check if modifier has already been added before in a previous drop down - int currentDropDownIndex = -1; - - // Find the key index of the current drop down selection so that we skip that index while searching for repeated modifiers + // Count the number of keys that are equal to 'selectedKeyCode' + int numberOfSameType = 0; for (int i = 0; i < currentKeys.size(); i++) { - if (currentKeys[i] == keyCodeList[selectedKeyIndex]) - { - currentDropDownIndex = i; - break; - } + numberOfSameType += KeyboardManagerHelper::GetKeyType(selectedKeyCode) == KeyboardManagerHelper::GetKeyType(currentKeys[i]); } - bool matchPreviousModifier = false; - for (int i = 0; i < currentKeys.size(); i++) - { - // Skip the current drop down - if (i != currentDropDownIndex) - { - // If the key type for the newly added key matches any of the existing keys in the shortcut - if (KeyboardManagerHelper::GetKeyType(keyCodeList[selectedKeyIndex]) == KeyboardManagerHelper::GetKeyType(currentKeys[i])) - { - matchPreviousModifier = true; - break; - } - } - } - - return matchPreviousModifier; - } - - // Function to get the selected key codes from the list of selected indices - std::vector GetKeyCodesFromSelectedIndices(const std::vector& selectedIndices, const std::vector& keyCodeList) - { - std::vector keys; - - for (int i = 0; i < selectedIndices.size(); i++) - { - int selectedKeyIndex = selectedIndices[i]; - if (selectedKeyIndex != -1 && keyCodeList.size() > selectedKeyIndex) - { - // If None is not the selected key - if (keyCodeList[selectedKeyIndex] != 0) - { - keys.push_back(keyCodeList[selectedKeyIndex]); - } - } - } - - return keys; + // If we have at least two keys equal to 'selectedKeyCode' than modifier was repeated + return numberOfSameType > 1; } } diff --git a/src/modules/keyboardmanager/common/Helpers.h b/src/modules/keyboardmanager/common/Helpers.h index 927f765f6f..202b3a3af4 100644 --- a/src/modules/keyboardmanager/common/Helpers.h +++ b/src/modules/keyboardmanager/common/Helpers.h @@ -82,7 +82,7 @@ namespace KeyboardManagerHelper winrt::hstring GetErrorMessage(ErrorType errorType); // Function to return the list of key name in the order for the drop down based on the key codes - winrt::Windows::Foundation::Collections::IVector ToBoxValue(const std::vector& list); + winrt::Windows::Foundation::Collections::IVector ToBoxValue(const std::vector>& list); // Function to set the value of a key event based on the arguments void SetKeyEvent(LPINPUT keyEventArray, int index, DWORD inputType, WORD keyCode, DWORD flags, ULONG_PTR extraInfo); @@ -100,14 +100,11 @@ namespace KeyboardManagerHelper void SetModifierKeyEvents(const Shortcut& shortcutToBeSent, const ModifierKey& winKeyInvoked, LPINPUT keyEventArray, int& index, bool isKeyDown, ULONG_PTR extraInfoFlag, const Shortcut& shortcutToCompare = Shortcut(), const DWORD& keyToBeReleased = NULL); // Function to filter the key codes for artificial key codes - DWORD FilterArtificialKeys(const DWORD& key); + int32_t FilterArtificialKeys(const int32_t& key); // Function to sort a vector of shortcuts based on it's size void SortShortcutVectorBasedOnSize(std::vector& shortcutVector); // Function to check if a modifier has been repeated in the previous drop downs - bool CheckRepeatedModifier(std::vector& currentKeys, int selectedKeyIndex, const std::vector& keyCodeList); - - // Function to get the selected key codes from the list of selected indices - std::vector GetKeyCodesFromSelectedIndices(const std::vector& selectedIndices, const std::vector& keyCodeList); + bool CheckRepeatedModifier(const std::vector& currentKeys, int selectedKeyCodes); } \ No newline at end of file diff --git a/src/modules/keyboardmanager/common/Shortcut.cpp b/src/modules/keyboardmanager/common/Shortcut.cpp index 8ebed5f337..f0f2ad78f6 100644 --- a/src/modules/keyboardmanager/common/Shortcut.cpp +++ b/src/modules/keyboardmanager/common/Shortcut.cpp @@ -18,7 +18,7 @@ Shortcut::Shortcut(const std::wstring& shortcutVK) : } // Constructor to initialize shortcut from a list of keys -Shortcut::Shortcut(const std::vector& keys) +Shortcut::Shortcut(const std::vector& keys) { SetKeyCodes(keys); } @@ -505,12 +505,15 @@ std::vector Shortcut::GetKeyCodes() } // Function to set a shortcut from a vector of key codes -void Shortcut::SetKeyCodes(const std::vector& keys) +void Shortcut::SetKeyCodes(const std::vector& keys) { Reset(); for (int i = 0; i < keys.size(); i++) { - SetKey(keys[i]); + if (keys[i] != -1 && keys[i] != 0) + { + SetKey(keys[i]); + } } } diff --git a/src/modules/keyboardmanager/common/Shortcut.h b/src/modules/keyboardmanager/common/Shortcut.h index a86628c4c2..c4ae23ea0f 100644 --- a/src/modules/keyboardmanager/common/Shortcut.h +++ b/src/modules/keyboardmanager/common/Shortcut.h @@ -28,7 +28,7 @@ public: Shortcut(const std::wstring& shortcutVK); // Constructor to initialize shortcut from a list of keys - Shortcut(const std::vector& keys); + Shortcut(const std::vector& keys); // == operator inline bool operator==(const Shortcut& sc) const @@ -153,7 +153,7 @@ public: std::vector GetKeyCodes(); // Function to set a shortcut from a vector of key codes - void SetKeyCodes(const std::vector& keys); + void SetKeyCodes(const std::vector& keys); // Function to check if all the modifiers in the shortcut have been pressed down bool CheckModifiersKeyboardState(InputInterface& ii) const; diff --git a/src/modules/keyboardmanager/dll/KeyboardEventHandlers.cpp b/src/modules/keyboardmanager/dll/KeyboardEventHandlers.cpp index ca33018b8a..3b767e1f01 100644 --- a/src/modules/keyboardmanager/dll/KeyboardEventHandlers.cpp +++ b/src/modules/keyboardmanager/dll/KeyboardEventHandlers.cpp @@ -481,7 +481,7 @@ namespace KeyboardEventHandlers else { // Check if the keyboard state is clear apart from the target remap key (by creating a temp Shortcut object with the target key) - bool isKeyboardStateClear = Shortcut(std::vector({ KeyboardManagerHelper::FilterArtificialKeys(std::get(it->second.targetShortcut)) })).IsKeyboardStateClearExceptShortcut(ii); + bool isKeyboardStateClear = Shortcut(std::vector({ KeyboardManagerHelper::FilterArtificialKeys(std::get(it->second.targetShortcut)) })).IsKeyboardStateClearExceptShortcut(ii); // If the keyboard state is clear, we release the target key but do not reset the remap state if (isKeyboardStateClear) { diff --git a/src/modules/keyboardmanager/test/BufferValidationTests.cpp b/src/modules/keyboardmanager/test/BufferValidationTests.cpp index 161cf8f8bb..05e841c1d5 100644 --- a/src/modules/keyboardmanager/test/BufferValidationTests.cpp +++ b/src/modules/keyboardmanager/test/BufferValidationTests.cpp @@ -22,7 +22,7 @@ namespace RemappingUITests { int elementRowIndex; int elementColIndex; - int selectedIndexFromDropDown; + int selectedCodeFromDropDown; }; struct ValidateShortcutBufferElementArgs @@ -30,7 +30,7 @@ namespace RemappingUITests int elementRowIndex; int elementColIndex; uint32_t indexOfDropDownLastModified; - std::vector selectedIndicesOnDropDowns; + std::vector selectedCodesOnDropDowns; std::wstring targetAppNameInTextBox; bool isHybridColumn; RemapBufferRow bufferRow; @@ -60,7 +60,7 @@ namespace RemappingUITests // Validate and update the element when -1 i.e. null selection is made on an empty row. ValidateAndUpdateKeyBufferElementArgs args = { 0, 0, -1 }; - KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedIndexFromDropDown, keyboardLayout.GetKeyCodeList(false), remapBuffer); + KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedCodeFromDropDown, remapBuffer); // Assert that the element is validated and buffer is updated Assert::AreEqual(true, error == KeyboardManagerHelper::ErrorType::NoError); @@ -79,9 +79,8 @@ namespace RemappingUITests remapBuffer.push_back(std::make_pair(RemapBufferItem({ NULL, NULL }), std::wstring())); // Validate and update the element when selecting B on an empty row - std::vector keyList = keyboardLayout.GetKeyCodeList(false); - ValidateAndUpdateKeyBufferElementArgs args = { 0, 0, GetDropDownIndexFromDropDownList(0x42, keyList) }; - KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedIndexFromDropDown, keyboardLayout.GetKeyCodeList(false), remapBuffer); + ValidateAndUpdateKeyBufferElementArgs args = { 0, 0, 0x42 }; + KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedCodeFromDropDown, remapBuffer); // Assert that the element is validated and buffer is updated Assert::AreEqual(true, error == KeyboardManagerHelper::ErrorType::NoError); @@ -98,9 +97,8 @@ namespace RemappingUITests remapBuffer.push_back(std::make_pair(RemapBufferItem({ NULL, 0x41 }), std::wstring())); // Validate and update the element when selecting B on a row - std::vector keyList = keyboardLayout.GetKeyCodeList(false); - ValidateAndUpdateKeyBufferElementArgs args = { 0, 0, GetDropDownIndexFromDropDownList(0x42, keyList) }; - KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedIndexFromDropDown, keyboardLayout.GetKeyCodeList(false), remapBuffer); + ValidateAndUpdateKeyBufferElementArgs args = { 0, 0, 0x42 }; + KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedCodeFromDropDown, remapBuffer); // Assert that the element is validated and buffer is updated Assert::AreEqual(true, error == KeyboardManagerHelper::ErrorType::NoError); @@ -114,17 +112,16 @@ namespace RemappingUITests RemapBuffer remapBuffer; // Add a row with Ctrl+A as the target - remapBuffer.push_back(std::make_pair(RemapBufferItem({ NULL, Shortcut(std::vector{ VK_CONTROL, 0x41 }) }), std::wstring())); + remapBuffer.push_back(std::make_pair(RemapBufferItem({ NULL, Shortcut(std::vector{ VK_CONTROL, 0x41 }) }), std::wstring())); // Validate and update the element when selecting B on a row - std::vector keyList = keyboardLayout.GetKeyCodeList(false); - ValidateAndUpdateKeyBufferElementArgs args = { 0, 0, GetDropDownIndexFromDropDownList(0x42, keyList) }; - KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedIndexFromDropDown, keyboardLayout.GetKeyCodeList(false), remapBuffer); + ValidateAndUpdateKeyBufferElementArgs args = { 0, 0, 0x42 }; + KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedCodeFromDropDown, remapBuffer); // Assert that the element is validated and buffer is updated Assert::AreEqual(true, error == KeyboardManagerHelper::ErrorType::NoError); Assert::AreEqual((DWORD)0x42, std::get(remapBuffer[0].first[0])); - Assert::AreEqual(true, Shortcut(std::vector{ VK_CONTROL, 0x41 }) == std::get(remapBuffer[0].first[1])); + Assert::AreEqual(true, Shortcut(std::vector{ VK_CONTROL, 0x41 }) == std::get(remapBuffer[0].first[1])); } // Test if the ValidateAndUpdateKeyBufferElement method is unsuccessful when setting first column to the same value as the right column @@ -136,9 +133,8 @@ namespace RemappingUITests remapBuffer.push_back(std::make_pair(RemapBufferItem({ NULL, 0x41 }), std::wstring())); // Validate and update the element when selecting A on a row - std::vector keyList = keyboardLayout.GetKeyCodeList(false); - ValidateAndUpdateKeyBufferElementArgs args = { 0, 0, GetDropDownIndexFromDropDownList(0x41, keyList) }; - KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedIndexFromDropDown, keyboardLayout.GetKeyCodeList(false), remapBuffer); + ValidateAndUpdateKeyBufferElementArgs args = { 0, 0, 0x41 }; + KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedCodeFromDropDown, remapBuffer); // Assert that the element is invalid and buffer is not updated Assert::AreEqual(true, error == KeyboardManagerHelper::ErrorType::MapToSameKey); @@ -156,9 +152,8 @@ namespace RemappingUITests remapBuffer.push_back(std::make_pair(RemapBufferItem({ NULL, 0x43 }), std::wstring())); // Validate and update the element when selecting A on second row - std::vector keyList = keyboardLayout.GetKeyCodeList(false); - ValidateAndUpdateKeyBufferElementArgs args = { 1, 0, GetDropDownIndexFromDropDownList(0x41, keyList) }; - KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedIndexFromDropDown, keyboardLayout.GetKeyCodeList(false), remapBuffer); + ValidateAndUpdateKeyBufferElementArgs args = { 1, 0, 0x41 }; + KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedCodeFromDropDown, remapBuffer); // Assert that the element is invalid and buffer is not updated Assert::AreEqual(true, error == KeyboardManagerHelper::ErrorType::SameKeyPreviouslyMapped); @@ -173,17 +168,16 @@ namespace RemappingUITests // Add a row from A->B and a row with Ctrl+A as target remapBuffer.push_back(std::make_pair(RemapBufferItem({ 0x41, 0x42 }), std::wstring())); - remapBuffer.push_back(std::make_pair(RemapBufferItem({ NULL, Shortcut(std::vector{ VK_CONTROL, 0x41 }) }), std::wstring())); + remapBuffer.push_back(std::make_pair(RemapBufferItem({ NULL, Shortcut(std::vector{ VK_CONTROL, 0x41 }) }), std::wstring())); // Validate and update the element when selecting A on second row - std::vector keyList = keyboardLayout.GetKeyCodeList(false); - ValidateAndUpdateKeyBufferElementArgs args = { 1, 0, GetDropDownIndexFromDropDownList(0x41, keyList) }; - KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedIndexFromDropDown, keyboardLayout.GetKeyCodeList(false), remapBuffer); + ValidateAndUpdateKeyBufferElementArgs args = { 1, 0, 0x41 }; + KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedCodeFromDropDown, remapBuffer); // Assert that the element is invalid and buffer is not updated Assert::AreEqual(true, error == KeyboardManagerHelper::ErrorType::SameKeyPreviouslyMapped); Assert::AreEqual((DWORD)NULL, std::get(remapBuffer[1].first[0])); - Assert::AreEqual(true, Shortcut(std::vector{ VK_CONTROL, 0x41 }) == std::get(remapBuffer[1].first[1])); + Assert::AreEqual(true, Shortcut(std::vector{ VK_CONTROL, 0x41 }) == std::get(remapBuffer[1].first[1])); } // Test if the ValidateAndUpdateKeyBufferElement method is unsuccessful when setting first column of a key to key row to a conflicting modifier with another row @@ -196,9 +190,8 @@ namespace RemappingUITests remapBuffer.push_back(std::make_pair(RemapBufferItem({ NULL, 0x43 }), std::wstring())); // Validate and update the element when selecting LCtrl on second row - std::vector keyList = keyboardLayout.GetKeyCodeList(false); - ValidateAndUpdateKeyBufferElementArgs args = { 1, 0, GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList) }; - KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedIndexFromDropDown, keyboardLayout.GetKeyCodeList(false), remapBuffer); + ValidateAndUpdateKeyBufferElementArgs args = { 1, 0, VK_LCONTROL }; + KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedCodeFromDropDown, remapBuffer); // Assert that the element is invalid and buffer is not updated Assert::AreEqual(true, error == KeyboardManagerHelper::ErrorType::ConflictingModifierKey); @@ -213,24 +206,21 @@ namespace RemappingUITests // Add a row from Ctrl->B and a row with Ctrl+A as target remapBuffer.push_back(std::make_pair(RemapBufferItem({ VK_CONTROL, 0x42 }), std::wstring())); - remapBuffer.push_back(std::make_pair(RemapBufferItem({ NULL, Shortcut(std::vector{ VK_CONTROL, 0x41 }) }), std::wstring())); + remapBuffer.push_back(std::make_pair(RemapBufferItem({ NULL, Shortcut(std::vector{ VK_CONTROL, 0x41 }) }), std::wstring())); // Validate and update the element when selecting LCtrl on second row - std::vector keyList = keyboardLayout.GetKeyCodeList(false); - ValidateAndUpdateKeyBufferElementArgs args = { 1, 0, GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList) }; - KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedIndexFromDropDown, keyboardLayout.GetKeyCodeList(false), remapBuffer); + ValidateAndUpdateKeyBufferElementArgs args = { 1, 0, VK_LCONTROL }; + KeyboardManagerHelper::ErrorType error = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(args.elementRowIndex, args.elementColIndex, args.selectedCodeFromDropDown, remapBuffer); // Assert that the element is invalid and buffer is not updated Assert::AreEqual(true, error == KeyboardManagerHelper::ErrorType::ConflictingModifierKey); Assert::AreEqual((DWORD)NULL, std::get(remapBuffer[1].first[0])); - Assert::AreEqual(true, Shortcut(std::vector{ VK_CONTROL, 0x41 }) == std::get(remapBuffer[1].first[1])); + Assert::AreEqual(true, Shortcut(std::vector{ VK_CONTROL, 0x41 }) == std::get(remapBuffer[1].first[1])); } // Test if the ValidateShortcutBufferElement method is successful and no drop down action is required on setting a column to null in a new or valid row TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnNoErrorAndNoAction_OnSettingColumnToNullInANewOrValidRow) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when making null-selection (-1 index) on first column of empty shortcut to shortcut row testCases.push_back({ 0, 0, 0, std::vector{ -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); @@ -241,43 +231,43 @@ namespace RemappingUITests // Case 4: Validate the element when making null-selection (-1 index) on second column of empty shortcut to key row testCases.push_back({ 0, 1, 0, std::vector{ -1 }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), NULL }, std::wstring()) }); // Case 5: Validate the element when making null-selection (-1 index) on first dropdown of first column of valid shortcut to shortcut row - testCases.push_back({ 0, 0, 0, std::vector({ -1, GetDropDownIndexFromDropDownList(0x43, keyList) }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector({ -1, 0x43 }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); // Case 6: Validate the element when making null-selection (-1 index) on first dropdown of second column of valid shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector({ -1, GetDropDownIndexFromDropDownList(0x41, keyList) }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector({ -1, 0x41 }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); // Case 7: Validate the element when making null-selection (-1 index) on first dropdown of second column of valid hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector({ -1, GetDropDownIndexFromDropDownList(0x41, keyList) }), std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector({ -1, 0x41 }), std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); // Case 8: Validate the element when making null-selection (-1 index) on second dropdown of first column of valid shortcut to shortcut row - testCases.push_back({ 0, 0, 1, std::vector({ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1 }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector({ VK_CONTROL, -1 }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); // Case 9: Validate the element when making null-selection (-1 index) on second dropdown of second column of valid shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector({ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1 }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector({ VK_CONTROL, -1 }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); // Case 10: Validate the element when making null-selection (-1 index) on second dropdown of second column of valid hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector({ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1 }), std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector({ VK_CONTROL, -1 }), std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); // Case 11: Validate the element when making null-selection (-1 index) on first dropdown of first column of valid 3 key shortcut to shortcut row - testCases.push_back({ 0, 0, 0, std::vector({ -1, GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x44, keyList) }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector({ -1, VK_SHIFT, 0x44 }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); // Case 12: Validate the element when making null-selection (-1 index) on first dropdown of second column of valid 3 key shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector({ -1, GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector({ -1, VK_SHIFT, 0x42 }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); // Case 13: Validate the element when making null-selection (-1 index) on first dropdown of second column of valid hybrid 3 key shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector({ -1, GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }), std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector({ -1, VK_SHIFT, 0x42 }), std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); // Case 14: Validate the element when making null-selection (-1 index) on second dropdown of first column of valid 3 key shortcut to shortcut row - testCases.push_back({ 0, 0, 1, std::vector({ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x44, keyList) }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector({ VK_CONTROL, -1, 0x44 }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); // Case 15: Validate the element when making null-selection (-1 index) on second dropdown of second column of valid 3 key shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector({ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x42, keyList) }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector({ VK_CONTROL, -1, 0x42 }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); // Case 16: Validate the element when making null-selection (-1 index) on second dropdown of second column of valid hybrid 3 key shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector({ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x42, keyList) }), std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector({ VK_CONTROL, -1, 0x42 }), std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); // Case 17: Validate the element when making null-selection (-1 index) on third dropdown of first column of valid 3 key shortcut to shortcut row - testCases.push_back({ 0, 0, 2, std::vector({ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), -1 }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 2, std::vector({ VK_CONTROL, VK_SHIFT, -1 }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); // Case 18: Validate the element when making null-selection (-1 index) on third dropdown of second column of valid 3 key shortcut to shortcut row - testCases.push_back({ 0, 1, 2, std::vector({ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), -1 }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector({ VK_CONTROL, VK_SHIFT, -1 }), std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); // Case 19: Validate the element when making null-selection (-1 index) on third dropdown of second column of valid hybrid 3 key shortcut to shortcut row - testCases.push_back({ 0, 1, 2, std::vector({ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), -1 }), std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector({ VK_CONTROL, VK_SHIFT, -1 }), std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x44 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is valid and no drop down action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::NoError); @@ -288,25 +278,23 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns ShortcutStartWithModifier error and no drop down action is required on setting first drop down to an action key on a non-hybrid control column TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnShortcutStartWithModifierErrorAndNoAction_OnSettingFirstDropDownToActionKeyOnANonHybridColumn) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting A (0x41) on first dropdown of first column of empty shortcut to shortcut row - testCases.push_back({ 0, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(0x41, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector{ 0x41 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 2: Validate the element when selecting A (0x41) on first dropdown of second column of empty shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(0x41, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ 0x41 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 3: Validate the element when selecting A (0x41) on first dropdown of first column of empty shortcut to key row - testCases.push_back({ 0, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(0x41, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), NULL }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector{ 0x41 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), NULL }, std::wstring()) }); // Case 4: Validate the element when selecting A (0x41) on first dropdown of first column of valid shortcut to shortcut row - testCases.push_back({ 0, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(0x41, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector{ 0x41, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid and no drop down action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::ShortcutStartWithModifier); @@ -317,21 +305,19 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns no error and no drop down action is required on setting first drop down to an action key on an empty hybrid control column TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnNoErrorAndNoAction_OnSettingFirstDropDownToActionKeyOnAnEmptyHybridColumn) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting A (0x41) on first dropdown of second column of empty shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(0x41, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ 0x41 }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 2: Validate the element when selecting A (0x41) on first dropdown of second column of empty shortcut to key row - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(0x41, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), NULL }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ 0x41 }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), NULL }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is valid and no drop down action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::NoError); @@ -342,21 +328,19 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns ShortcutNotMoreThanOneActionKey error and no drop down action is required on setting first drop down to an action key on a hybrid control column with full shortcut TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnShortcutNotMoreThanOneActionKeyAndNoAction_OnSettingNonLastDropDownToActionKeyOnAHybridColumnWithFullShortcut) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting A (0x41) on first dropdown of second column of hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(0x41, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ 0x41, 0x43 }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 2: Validate the element when selecting A (0x41) on second dropdown of second column of hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x41, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0x41, 0x42 }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid and no drop down action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::ShortcutNotMoreThanOneActionKey); @@ -367,21 +351,19 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns ShortcutNotMoreThanOneActionKey error and no drop down action is required on setting non first non last drop down to an action key on a non hybrid control column with full shortcut TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnShortcutNotMoreThanOneActionKeyAndNoAction_OnSettingNonFirstNonLastDropDownToActionKeyOnANonHybridColumnWithFullShortcut) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting A (0x41) on second dropdown of first column of shortcut to shortcut row - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x41, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, 0x41, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); // Case 2: Validate the element when selecting A (0x41)on second dropdown of second column of shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x41, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0x41, 0x42 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid and no drop down action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::ShortcutNotMoreThanOneActionKey); @@ -392,29 +374,27 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns no error and no drop down action is required on setting last drop down to an action key on a column with atleast two drop downs TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnNoErrorAndNoAction_OnSettingLastDropDownToActionKeyOnAColumnWithAtleastTwoDropDowns) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting A (0x41) on last dropdown of first column of three key shortcut to shortcut row - testCases.push_back({ 0, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x41, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 2, std::vector{ VK_CONTROL, VK_SHIFT, 0x41 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); // Case 2: Validate the element when selecting A (0x41) on last dropdown of second column of three key shortcut to shortcut row - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x41, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, VK_SHIFT, 0x41 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); // Case 3: Validate the element when selecting A (0x41) on last dropdown of hybrid second column of three key shortcut to shortcut row - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x41, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, VK_SHIFT, 0x41 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 } }, std::wstring()) }); // Case 4: Validate the element when selecting A (0x41) on last dropdown of first column of two key shortcut to shortcut row - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x41, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, 0x41 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 5: Validate the element when selecting A (0x41) on last dropdown of second column of two key shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x41, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0x41 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 6: Validate the element when selecting A (0x41) on last dropdown of hybrid second column of two key shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x41, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0x41 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is valid and no drop down action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::NoError); @@ -425,29 +405,27 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns no error and ClearUnusedDropDowns action is required on setting non first drop down to an action key on a column if all the drop downs after it are empty TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnNoErrorAndClearUnusedDropDownsAction_OnSettingNonFirstDropDownToActionKeyOnAColumnIfAllTheDropDownsAfterItAreEmpty) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting A (0x41) on second dropdown of first column of 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x41, keyList), -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, 0x41, -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 2: Validate the element when selecting A (0x41) on second dropdown of second column of 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x41, keyList), -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0x41, -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 3: Validate the element when selecting A (0x41) on second dropdown of second column of 3 dropdown hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x41, keyList), -1 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0x41, -1 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 4: Validate the element when selecting A (0x41) on second dropdown of first column of empty 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 0, 1, std::vector{ -1, GetDropDownIndexFromDropDownList(0x41, keyList), -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ -1, 0x41, -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 5: Validate the element when selecting A (0x41) on second dropdown of second column of empty 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ -1, GetDropDownIndexFromDropDownList(0x41, keyList), -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ -1, 0x41, -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 6: Validate the element when selecting A (0x41) on second dropdown of second column of empty 3 dropdown hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ -1, GetDropDownIndexFromDropDownList(0x41, keyList), -1 }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ -1, 0x41, -1 }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is valid and ClearUnusedDropDowns action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::NoError); @@ -458,19 +436,17 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns no error and ClearUnusedDropDowns action is required on setting first drop down to an action key on a hybrid column if all the drop downs after it are empty TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnNoErrorAndClearUnusedDropDownsAction_OnSettingFirstDropDownToActionKeyOnAHybridColumnIfAllTheDropDownsAfterItAreEmpty) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting A (0x41) on first dropdown of second column of empty 3 dropdown hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(0x41, keyList), -1, -1 }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ 0x41, -1, -1 }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is valid and ClearUnusedDropDowns action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::NoError); @@ -481,31 +457,31 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns no error and AddDropDown action is required on setting last drop down to a non-repeated modifier key on a column there are less than 3 drop downs TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnNoErrorAndAddDropDownAction_OnSettingLastDropDownToNonRepeatedModifierKeyOnAColumnIfThereAreLessThan3DropDowns) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); + std::vector testCases; // Case 1: Validate the element when selecting Shift (VK_SHIFT) on second dropdown of first column of 2 dropdown shortcut to shortcut row - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, VK_SHIFT }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 2: Validate the element when selecting Shift (VK_SHIFT) on second dropdown of second column of 2 dropdown shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, VK_SHIFT }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 3: Validate the element when selecting Shift (VK_SHIFT) on second dropdown of second column of 2 dropdown hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, VK_SHIFT }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 4: Validate the element when selecting Shift (VK_SHIFT) on first dropdown of first column of 1 dropdown shortcut to shortcut row - testCases.push_back({ 0, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector{ VK_SHIFT }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 5: Validate the element when selecting Shift (VK_SHIFT) on first dropdown of second column of 1 dropdown shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_SHIFT }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 6: Validate the element when selecting Shift (VK_SHIFT) on first dropdown of second column of 1 dropdown hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_SHIFT }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 7: Validate the element when selecting Shift (VK_SHIFT) on first dropdown of second column of 1 dropdown hybrid shortcut to key row with an action key selected - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), 0x44 }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_SHIFT }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), 0x44 }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is valid and AddDropDown action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::NoError); @@ -516,23 +492,23 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns ShortcutCannotHaveRepeatedModifier error and no action is required on setting last drop down to a repeated modifier key on a column there are less than 3 drop downs TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnShortcutCannotHaveRepeatedModifierErrorAndNoAction_OnSettingLastDropDownToRepeatedModifierKeyOnAColumnIfThereAreLessThan3DropDowns) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); + std::vector testCases; // Case 1: Validate the element when selecting LCtrl (VK_LCONTROL) on second dropdown of first column of 2 dropdown shortcut to shortcut row - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, VK_LCONTROL }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 2: Validate the element when selecting LCtrl (VK_LCONTROL) on second dropdown of second column of 2 dropdown hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, VK_LCONTROL }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 3: Validate the element when selecting LCtrl (VK_LCONTROL) on second dropdown of second column of 2 dropdown hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, VK_LCONTROL }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid and no action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::ShortcutCannotHaveRepeatedModifier); @@ -543,35 +519,33 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns ShortcutMaxShortcutSizeOneActionKey error and no action is required on setting last drop down to a non repeated modifier key on a column there 3 or more drop downs TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnShortcutMaxShortcutSizeOneActionKeyErrorAndNoAction_OnSettingLastDropDownToNonRepeatedModifierKeyOnAColumnIfThereAre3OrMoreDropDowns) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting Shift (VK_SHIFT) on last dropdown of first column of 3 dropdown shortcut to shortcut row with middle empty - testCases.push_back({ 0, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 2, std::vector{ VK_CONTROL, -1, VK_SHIFT }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 2: Validate the element when selecting Shift (VK_SHIFT) on last dropdown of second column of 3 dropdown shortcut to shortcut row with middle empty - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, -1, VK_SHIFT }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 3: Validate the element when selecting Shift (VK_SHIFT) on last dropdown of second column of 3 dropdown hybrid shortcut to shortcut row with middle empty - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, -1, VK_SHIFT }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 4: Validate the element when selecting Shift (VK_SHIFT) on last dropdown of first column of 3 dropdown shortcut to shortcut row with first two empty - testCases.push_back({ 0, 0, 2, std::vector{ -1, -1, GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 0, 2, std::vector{ -1, -1, VK_SHIFT }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 5: Validate the element when selecting Shift (VK_SHIFT) on last dropdown of second column of 3 dropdown shortcut to shortcut row with first two empty - testCases.push_back({ 0, 1, 2, std::vector{ -1, -1, GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ -1, -1, VK_SHIFT }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 6: Validate the element when selecting Shift (VK_SHIFT) on last dropdown of second column of 3 dropdown hybrid shortcut to shortcut row with first two empty - testCases.push_back({ 0, 1, 2, std::vector{ -1, -1, GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ -1, -1, VK_SHIFT }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 7: Validate the element when selecting Shift (VK_SHIFT) on last dropdown of first column of 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 2, std::vector{ VK_CONTROL, VK_MENU, VK_SHIFT }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 8: Validate the element when selecting Shift (VK_SHIFT) on last dropdown of second column of 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, VK_MENU, VK_SHIFT }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 9: Validate the element when selecting Shift (VK_SHIFT) on last dropdown of second column of 3 dropdown hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, VK_MENU, VK_SHIFT }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid and no action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::ShortcutMaxShortcutSizeOneActionKey); @@ -582,29 +556,27 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns ShortcutMaxShortcutSizeOneActionKey error and no action is required on setting last drop down to a repeated modifier key on a column there 3 or more drop downs TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnShortcutMaxShortcutSizeOneActionKeyErrorAndNoAction_OnSettingLastDropDownToRepeatedModifierKeyOnAColumnIfThereAre3OrMoreDropDowns) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting Ctrl (VK_CONTROL) on last dropdown of first column of 3 dropdown shortcut to shortcut row with middle empty - testCases.push_back({ 0, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 2, std::vector{ VK_CONTROL, -1, VK_CONTROL }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 2: Validate the element when selecting Ctrl (VK_CONTROL) on last dropdown of second column of 3 dropdown shortcut to shortcut row with middle empty - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, -1, VK_CONTROL }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 3: Validate the element when selecting Ctrl (VK_CONTROL) on last dropdown of second column of 3 dropdown hybrid shortcut to shortcut row with middle empty - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, -1, VK_CONTROL }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 4: Validate the element when selecting Ctrl (VK_CONTROL) on last dropdown of first column of 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 2, std::vector{ VK_CONTROL, VK_MENU, VK_CONTROL }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 5: Validate the element when selecting Ctrl (VK_CONTROL) on last dropdown of second column of 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, VK_MENU, VK_CONTROL }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 6: Validate the element when selecting Ctrl (VK_CONTROL) on last dropdown of second column of 3 dropdown hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, VK_MENU, VK_CONTROL }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid and no action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::ShortcutMaxShortcutSizeOneActionKey); @@ -615,35 +587,33 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns no error and no action is required on setting non-last drop down to a non repeated modifier key on a column TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnNoErrorAndNoAction_OnSettingNonLastDropDownToNonRepeatedModifierKeyOnAColumn) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting Shift (VK_SHIFT) on first dropdown of first column of 2 dropdown shortcut to shortcut row - testCases.push_back({ 0, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector{ VK_CONTROL, VK_SHIFT }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 2: Validate the element when selecting Shift (VK_SHIFT) on first dropdown of second column of 2 dropdown shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_CONTROL, VK_SHIFT }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 3: Validate the element when selecting Shift (VK_SHIFT) on first dropdown of second column of 2 dropdown hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_CONTROL, VK_SHIFT }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 4: Validate the element when selecting Shift (VK_SHIFT) on first dropdown of first column of 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector{ VK_SHIFT, VK_MENU, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 5: Validate the element when selecting Shift (VK_SHIFT) on first dropdown of second column of 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_SHIFT, VK_MENU, 0x42 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 6: Validate the element when selecting Shift (VK_SHIFT) on first dropdown of second column of 3 dropdown hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_SHIFT, VK_MENU, 0x42 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 7: Validate the element when selecting Shift (VK_SHIFT) on second dropdown of first column of 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 8: Validate the element when selecting Shift (VK_SHIFT) on second dropdown of second column of 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 9: Validate the element when selecting Shift (VK_SHIFT) on second dropdown of second column of 3 dropdown hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, VK_SHIFT, 0x42 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is valid and no action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::NoError); @@ -654,35 +624,33 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns ShortcutCannotHaveRepeatedModifier error and no action is required on setting non-last drop down to a repeated modifier key on a column TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnShortcutCannotHaveRepeatedModifierErrorAndNoAction_OnSettingNonLastDropDownToRepeatedModifierKeyOnAColumn) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting Ctrl (VK_CONTROL) on first dropdown of first column of 3 dropdown shortcut to shortcut row with first empty - testCases.push_back({ 0, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector{ VK_CONTROL, VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 2: Validate the element when selecting Ctrl (VK_CONTROL) on first dropdown of second column of 3 dropdown shortcut to shortcut row with first empty - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_CONTROL, VK_CONTROL, 0x42 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 3: Validate the element when selecting Ctrl (VK_CONTROL) on first dropdown of second column of 3 dropdown hybrid shortcut to shortcut row with first empty - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_CONTROL, VK_CONTROL, 0x42 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 4: Validate the element when selecting Alt (VK_MENU) on first dropdown of first column of 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector{ VK_MENU, VK_MENU, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 5: Validate the element when selecting Alt (VK_MENU) on first dropdown of second column of 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_MENU, VK_MENU, 0x42 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 6: Validate the element when selecting Alt (VK_MENU) on first dropdown of second column of 3 dropdown hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_MENU, VK_MENU, 0x42 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 7: Validate the element when selecting Ctrl (VK_CONTROL) on second dropdown of first column of 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 8: Validate the element when selecting Ctrl (VK_CONTROL) on second dropdown of second column of 3 dropdown shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, VK_CONTROL, 0x42 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 9: Validate the element when selecting Ctrl (VK_CONTROL) on second dropdown of second column of 3 dropdown hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, VK_CONTROL, 0x42 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid and no action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::ShortcutCannotHaveRepeatedModifier); @@ -693,21 +661,19 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns ShortcutStartWithModifier error and no action is required on setting first drop down to None on a non-hybrid column with one drop down TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnShortcutStartWithModifierErrorAndNoAction_OnSettingFirstDropDownToNoneOnNonHybridColumnWithOneDropDown) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting None (0) on first dropdown of first column of 1 dropdown shortcut to shortcut row testCases.push_back({ 0, 0, 0, std::vector{ 0 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 2: Validate the element when selecting None (0) on first dropdown of second column of 1 dropdown shortcut to shortcut row testCases.push_back({ 0, 1, 0, std::vector{ 0 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid and no action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::ShortcutStartWithModifier); @@ -718,19 +684,17 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns ShortcutOneActionKey error and no action is required on setting first drop down to None on a hybrid column with one drop down TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnShortcutOneActionKeyErrorAndNoAction_OnSettingFirstDropDownToNoneOnHybridColumnWithOneDropDown) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting None (0) on first dropdown of first column of 1 dropdown hybrid shortcut to shortcut row testCases.push_back({ 0, 1, 0, std::vector{ 0 }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid and no action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::ShortcutOneActionKey); @@ -741,25 +705,23 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns ShortcutAtleast2Keys error and no action is required on setting first drop down to None on a non-hybrid column with two drop down TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnShortcutAtleast2KeysAndNoAction_OnSettingFirstDropDownToNoneOnNonHybridColumnWithTwoDropDowns) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting None (0) on first dropdown of first column of 2 dropdown empty shortcut to shortcut row testCases.push_back({ 0, 0, 0, std::vector{ 0, -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 2: Validate the element when selecting None (0) on first dropdown of second column of 2 dropdown empty shortcut to shortcut row testCases.push_back({ 0, 1, 0, std::vector{ 0, -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 3: Validate the element when selecting None (0) on first dropdown of second column of 2 dropdown valid shortcut to shortcut row - testCases.push_back({ 0, 0, 0, std::vector{ 0, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector{ 0, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 4: Validate the element when selecting None (0) on first dropdown of second column of 2 dropdown valid shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ 0, GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ 0, 0x42 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid and no action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::ShortcutAtleast2Keys); @@ -770,25 +732,23 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns ShortcutOneActionKey error and no action is required on setting second drop down to None on a non-hybrid column with two drop down TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnShortcutOneActionKeyAndNoAction_OnSettingSecondDropDownToNoneOnNonHybridColumnWithTwoDropDowns) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting None (0) on second dropdown of first column of 2 dropdown empty shortcut to shortcut row testCases.push_back({ 0, 0, 1, std::vector{ -1, 0 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 2: Validate the element when selecting None (0) on second dropdown of second column of 2 dropdown empty shortcut to shortcut row testCases.push_back({ 0, 1, 1, std::vector{ -1, 0 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 3: Validate the element when selecting None (0) on second dropdown of second column of 2 dropdown valid shortcut to shortcut row - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), 0 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, 0 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 4: Validate the element when selecting None (0) on second dropdown of second column of 2 dropdown valid shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), 0 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid and no action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::ShortcutOneActionKey); @@ -799,25 +759,23 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns no error and DeleteDropDown action is required on setting drop down to None on a hybrid column with two drop down TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnNoErrorAndDeleteDropDownAction_OnSettingDropDownToNoneOnHybridColumnWithTwoDropDowns) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting None (0) on first dropdown of second column of 2 dropdown empty hybrid shortcut to shortcut row testCases.push_back({ 0, 1, 0, std::vector{ 0, -1 }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 2: Validate the element when selecting None (0) on second dropdown of second column of 2 dropdown empty hybrid shortcut to shortcut row testCases.push_back({ 0, 1, 1, std::vector{ -1, 0 }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 3: Validate the element when selecting None (0) on first dropdown of second column of 2 dropdown valid hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ 0, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ 0, VK_CONTROL }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); // Case 4: Validate the element when selecting None (0) on second dropdown of second column of 2 dropdown valid hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), 0 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x42 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is valid and DeleteDropDown action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::NoError); @@ -828,8 +786,6 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns no error and DeleteDropDown action is required on setting non last drop down to None on a column with three drop down TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnNoErrorAndDeleteDropDownAction_OnSettingNonLastDropDownToNoneOnColumnWithThreeDropDowns) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting None (0) on first dropdown of first column of 3 dropdown empty shortcut to shortcut row testCases.push_back({ 0, 0, 0, std::vector{ 0, -1, -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); @@ -844,25 +800,25 @@ namespace RemappingUITests // Case 6: Validate the element when selecting None (0) on second dropdown of second column of 3 dropdown empty hybrid shortcut to shortcut row testCases.push_back({ 0, 1, 1, std::vector{ -1, 0, -1 }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 7: Validate the element when selecting None (0) on first dropdown of first column of 3 dropdown valid shortcut to shortcut row - testCases.push_back({ 0, 0, 0, std::vector{ 0, GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector{ 0, VK_MENU, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 8: Validate the element when selecting None (0) on first dropdown of second column of 3 dropdown valid shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ 0, GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ 0, VK_MENU, 0x42 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 9: Validate the element when selecting None (0) on first dropdown of second column of 3 dropdown valid hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 0, std::vector{ 0, GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ 0, VK_MENU, 0x42 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 10: Validate the element when selecting None (0) on first dropdown of first column of 3 dropdown valid shortcut to shortcut row - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), 0, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, 0, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 11: Validate the element when selecting None (0) on first dropdown of second column of 3 dropdown valid shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), 0, GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0, 0x42 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 12: Validate the element when selecting None (0) on first dropdown of second column of 3 dropdown valid hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), 0, GetDropDownIndexFromDropDownList(0x42, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0, 0x42 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is valid and DeleteDropDown action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::NoError); @@ -873,8 +829,6 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns ShortcutOneActionKey error and no action is required on setting last drop down to None on a column with three drop down TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnShortcutOneActionKeyErrorAndNoAction_OnSettingLastDropDownToNoneOnColumnWithThreeDropDowns) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting None (0) on first dropdown of first column of 3 dropdown empty shortcut to shortcut row testCases.push_back({ 0, 0, 2, std::vector{ -1, -1, 0 }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); @@ -883,19 +837,19 @@ namespace RemappingUITests // Case 3: Validate the element when selecting None (0) on first dropdown of second column of 3 dropdown empty hybrid shortcut to shortcut row testCases.push_back({ 0, 1, 2, std::vector{ -1, -1, 0 }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), Shortcut() }, std::wstring()) }); // Case 4: Validate the element when selecting None (0) on first dropdown of first column of 3 dropdown valid shortcut to shortcut row - testCases.push_back({ 0, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), 0 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 2, std::vector{ VK_CONTROL, VK_MENU, 0 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 5: Validate the element when selecting None (0) on first dropdown of second column of 3 dropdown valid shortcut to shortcut row - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), 0 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, VK_MENU, 0 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); // Case 6: Validate the element when selecting None (0) on first dropdown of second column of 3 dropdown valid hybrid shortcut to shortcut row - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), 0 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, VK_MENU, 0 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU, 0x43 }, std::vector{ VK_CONTROL, VK_MENU, 0x42 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid and no action is required Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::ShortcutOneActionKey); @@ -906,35 +860,35 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns WinL error on setting a drop down to Win or L on a column resulting in Win+L TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnWinLError_OnSettingDropDownToWinOrLOnColumnResultingInWinL) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); + std::vector testCases; // Case 1: Validate the element when selecting L (0x4C) on second dropdown of first column of LWin+Empty shortcut - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_LWIN, keyList), GetDropDownIndexFromDropDownList(0x4C, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LWIN }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_LWIN, 0x4C }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LWIN }, Shortcut() }, std::wstring()) }); // Case 2: Validate the element when selecting L (0x4C) on second dropdown of second column of LWin+Empty shortcut - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_LWIN, keyList), GetDropDownIndexFromDropDownList(0x4C, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_LWIN } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_LWIN, 0x4C }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_LWIN } }, std::wstring()) }); // Case 3: Validate the element when selecting L (0x4C) on second dropdown of second column of hybrid LWin+Empty shortcut - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_LWIN, keyList), GetDropDownIndexFromDropDownList(0x4C, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_LWIN } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_LWIN, 0x4C }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_LWIN } }, std::wstring()) }); // Case 4: Validate the element when selecting L (0x4C) on second dropdown of first column of Win+Empty shortcut - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(CommonSharedConstants::VK_WIN_BOTH, keyList), GetDropDownIndexFromDropDownList(0x4C, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ CommonSharedConstants::VK_WIN_BOTH }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ CommonSharedConstants::VK_WIN_BOTH, 0x4C }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ CommonSharedConstants::VK_WIN_BOTH }, Shortcut() }, std::wstring()) }); // Case 5: Validate the element when selecting L (0x4C) on second dropdown of second column of Win+Empty shortcut - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(CommonSharedConstants::VK_WIN_BOTH, keyList), GetDropDownIndexFromDropDownList(0x4C, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ CommonSharedConstants::VK_WIN_BOTH } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ CommonSharedConstants::VK_WIN_BOTH, 0x4C }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ CommonSharedConstants::VK_WIN_BOTH } }, std::wstring()) }); // Case 6: Validate the element when selecting L (0x4C) on second dropdown of second column of hybrid Win+Empty shortcut - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(CommonSharedConstants::VK_WIN_BOTH, keyList), GetDropDownIndexFromDropDownList(0x4C, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ CommonSharedConstants::VK_WIN_BOTH } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ CommonSharedConstants::VK_WIN_BOTH, 0x4C }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ CommonSharedConstants::VK_WIN_BOTH } }, std::wstring()) }); // Case 7: Validate the element when selecting LWin (VK_LWIN) on first dropdown of first column of Empty+L shortcut - testCases.push_back({ 0, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_LWIN, keyList), GetDropDownIndexFromDropDownList(0x4C, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x4C }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector{ VK_LWIN, 0x4C }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x4C }, Shortcut() }, std::wstring()) }); // Case 8: Validate the element when selecting LWin (VK_LWIN) on first dropdown of second column of Empty+L shortcut - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_LWIN, keyList), GetDropDownIndexFromDropDownList(0x4C, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ 0x4C } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_LWIN, 0x4C }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ 0x4C } }, std::wstring()) }); // Case 9: Validate the element when selecting LWin (VK_LWIN) on first dropdown of second column of hybrid Empty+L shortcut - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_LWIN, keyList), GetDropDownIndexFromDropDownList(0x4C, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ 0x4C } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_LWIN, 0x4C }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ 0x4C } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::WinL); @@ -944,29 +898,29 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns WinL error on setting a drop down to null or none on a column resulting in Win+L TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnWinLError_OnSettingDropDownToNullOrNoneOnColumnResultingInWinL) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); + std::vector testCases; // Case 1: Validate the element when selecting Null (-1) on second dropdown of first column of LWin + Ctrl + L shortcut - testCases.push_back({ 0, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_LWIN, keyList), -1, GetDropDownIndexFromDropDownList(0x4C, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LWIN, VK_CONTROL, 0x4C }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 0, 2, std::vector{ VK_LWIN, -1, 0x4C }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LWIN, VK_CONTROL, 0x4C }, Shortcut() }, std::wstring()) }); // Case 2: Validate the element when selecting Null (-1) on second dropdown of second column of LWin + Ctrl + L shortcut - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_LWIN, keyList), -1, GetDropDownIndexFromDropDownList(0x4C, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_LWIN, VK_CONTROL, 0x4C } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_LWIN, -1, 0x4C }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_LWIN, VK_CONTROL, 0x4C } }, std::wstring()) }); // Case 3: Validate the element when selecting Null (-1) on second dropdown of second column of hybrid LWin + Ctrl + L shortcut - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_LWIN, keyList), -1, GetDropDownIndexFromDropDownList(0x4C, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_LWIN, VK_CONTROL, 0x4C } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_LWIN, -1, 0x4C }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_LWIN, VK_CONTROL, 0x4C } }, std::wstring()) }); // Case 4: Validate the element when selecting None (0) on second dropdown of first column of LWin + Ctrl + L shortcut - testCases.push_back({ 0, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_LWIN, keyList), 0, GetDropDownIndexFromDropDownList(0x4C, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LWIN, VK_CONTROL, 0x4C }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 0, 2, std::vector{ VK_LWIN, 0, 0x4C }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LWIN, VK_CONTROL, 0x4C }, Shortcut() }, std::wstring()) }); // Case 5: Validate the element when selecting None (0) on second dropdown of second column of LWin + Ctrl + L shortcut - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_LWIN, keyList), 0, GetDropDownIndexFromDropDownList(0x4C, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_LWIN, VK_CONTROL, 0x4C } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_LWIN, 0, 0x4C }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_LWIN, VK_CONTROL, 0x4C } }, std::wstring()) }); // Case 6: Validate the element when selecting None (0) on second dropdown of second column of hybrid LWin + Ctrl + L shortcut - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_LWIN, keyList), 0, GetDropDownIndexFromDropDownList(0x4C, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_LWIN, VK_CONTROL, 0x4C } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_LWIN, 0, 0x4C }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_LWIN, VK_CONTROL, 0x4C } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::WinL); @@ -976,29 +930,29 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns CtrlAltDel error on setting a drop down to Ctrl, Alt or Del on a column resulting in Ctrl+Alt+Del TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnCtrlAltDelError_OnSettingDropDownToCtrlAltOrDelOnColumnResultingInCtrlAltDel) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); + std::vector testCases; // Case 1: Validate the element when selecting Del (VK_DELETE) on third dropdown of first column of Ctrl+Alt+Empty shortcut - testCases.push_back({ 0, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(VK_DELETE, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 0, 2, std::vector{ VK_CONTROL, VK_MENU, VK_DELETE }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_MENU }, Shortcut() }, std::wstring()) }); // Case 2: Validate the element when selecting Del (VK_DELETE) on third dropdown of second column of Ctrl+Alt+Empty shortcut - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(VK_DELETE, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_CONTROL, VK_MENU } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, VK_MENU, VK_DELETE }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_CONTROL, VK_MENU } }, std::wstring()) }); // Case 3: Validate the element when selecting Del (VK_DELETE) on third dropdown of second column of hybrid Ctrl+Alt+Empty shortcut - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(VK_DELETE, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_CONTROL, VK_MENU } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, VK_MENU, VK_DELETE }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_CONTROL, VK_MENU } }, std::wstring()) }); // Case 4: Validate the element when selecting Alt (VK_MENU) on second dropdown of first column of Ctrl+Empty+Del shortcut - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(VK_DELETE, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_DELETE }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, VK_MENU, VK_DELETE }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_DELETE }, Shortcut() }, std::wstring()) }); // Case 5: Validate the element when selecting Alt (VK_MENU) on second dropdown of second column of Ctrl+Empty+Del shortcut - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(VK_DELETE, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_CONTROL, VK_DELETE } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, VK_MENU, VK_DELETE }, std::wstring(), false, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_CONTROL, VK_DELETE } }, std::wstring()) }); // Case 6: Validate the element when selecting Alt (VK_MENU) on second dropdown of second column of hybrid Ctrl+Empty+Del shortcut - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_MENU, keyList), GetDropDownIndexFromDropDownList(VK_DELETE, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_CONTROL, VK_DELETE } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, VK_MENU, VK_DELETE }, std::wstring(), true, std::make_pair(RemapBufferItem{ Shortcut(), std::vector{ VK_CONTROL, VK_DELETE } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::CtrlAltDel); @@ -1008,33 +962,31 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns MapToSameKey error on setting hybrid second column to match first column in a remap keys table TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnMapToSameKeyError_OnSettingHybridSecondColumnToFirstColumnInKeyTable) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1: Validate the element when selecting A (0x41) on first dropdown of empty hybrid second column - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(0x41, keyList), -1, -1 }, std::wstring(), true, std::make_pair(RemapBufferItem{ 0x41, NULL }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ 0x41, -1, -1 }, std::wstring(), true, std::make_pair(RemapBufferItem{ 0x41, NULL }, std::wstring()) }); // Case 2: Validate the element when selecting A (0x41) on second dropdown of empty hybrid second column - testCases.push_back({ 0, 1, 1, std::vector{ -1, GetDropDownIndexFromDropDownList(0x41, keyList), -1 }, std::wstring(), true, std::make_pair(RemapBufferItem{ 0x41, NULL }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ -1, 0x41, -1 }, std::wstring(), true, std::make_pair(RemapBufferItem{ 0x41, NULL }, std::wstring()) }); // Case 3: Validate the element when selecting A (0x41) on third dropdown of empty hybrid second column - testCases.push_back({ 0, 1, 2, std::vector{ -1, -1, GetDropDownIndexFromDropDownList(0x41, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ 0x41, NULL }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ -1, -1, 0x41 }, std::wstring(), true, std::make_pair(RemapBufferItem{ 0x41, NULL }, std::wstring()) }); // Case 4: Validate the element when selecting A (0x41) on first dropdown of hybrid second column with key - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(0x41, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ 0x41, 0x43 }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ 0x41 }, std::wstring(), true, std::make_pair(RemapBufferItem{ 0x41, 0x43 }, std::wstring()) }); // Case 5: Validate the element when selecting Null (-1) on first dropdown of hybrid second column with shortcut - testCases.push_back({ 0, 1, 0, std::vector{ -1, GetDropDownIndexFromDropDownList(0x41, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ 0x41, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ -1, 0x41 }, std::wstring(), true, std::make_pair(RemapBufferItem{ 0x41, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); // Case 6: Validate the element when selecting None (0) on first dropdown of hybrid second column with shortcut - testCases.push_back({ 0, 1, 0, std::vector{ 0, GetDropDownIndexFromDropDownList(0x41, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ 0x41, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ 0, 0x41 }, std::wstring(), true, std::make_pair(RemapBufferItem{ 0x41, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); // Case 7: Validate the element when selecting Null (-1) on second dropdown of hybrid second column with shortcut - testCases.push_back({ 0, 1, 1, std::vector{ -1, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ VK_CONTROL, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ -1, VK_CONTROL }, std::wstring(), true, std::make_pair(RemapBufferItem{ VK_CONTROL, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); // Case 8: Validate the element when selecting None (0) on second dropdown of hybrid second column with shortcut - testCases.push_back({ 0, 1, 1, std::vector{ 0, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ VK_CONTROL, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ 0, VK_CONTROL }, std::wstring(), true, std::make_pair(RemapBufferItem{ VK_CONTROL, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::MapToSameKey); @@ -1044,35 +996,35 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns MapToSameShortcut error on setting one column to match the other and both are valid 3 key shortcuts TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnMapToSameShortcutError_OnSettingOneColumnToTheOtherAndBothAreValid3KeyShortcuts) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); + std::vector testCases; // Case 1 : Validate the element when selecting C (0x43) on third dropdown of first column with Ctrl+Shift+Empty - testCases.push_back({ 0, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT }, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 2, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT }, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); // Case 2 : Validate the element when selecting C (0x43) on third dropdown of second column with Ctrl+Shift+Empty - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT } }, std::wstring()) }); // Case 3 : Validate the element when selecting C (0x43) on third dropdown of second column with hybrid Ctrl+Shift+Empty - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT } }, std::wstring()) }); // Case 4 : Validate the element when selecting Shift (VK_SHIFT) on second dropdown of first column with Ctrl+Empty+C - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); // Case 5 : Validate the element when selecting Shift (VK_SHIFT) on second dropdown of second column with Ctrl+Empty+C - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 6 : Validate the element when selecting Shift (VK_SHIFT) on second dropdown of second column with hybrid Ctrl+Empty+C - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 7 : Validate the element when selecting Shift (VK_SHIFT) on first dropdown of first column with Empty+Ctrl+C - testCases.push_back({ 0, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); // Case 8 : Validate the element when selecting Shift (VK_SHIFT) on first dropdown of second column with Empty+Ctrl+C - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 9 : Validate the element when selecting Shift (VK_SHIFT) on first dropdown of second column with hybrid Empty+Ctrl+C - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::MapToSameShortcut); @@ -1082,77 +1034,75 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns MapToSameShortcut error on setting one column to match the other and both are valid 2 key shortcuts TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnMapToSameShortcutError_OnSettingOneColumnToTheOtherAndBothAreValid2KeyShortcuts) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1 : Validate the element when selecting C (0x43) on third dropdown of first column with Ctrl+Empty+Empty - testCases.push_back({ 0, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 2, std::vector{ VK_CONTROL, -1, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 2 : Validate the element when selecting C (0x43) on third dropdown of second column with Ctrl+Empty+Empty - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, -1, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL } }, std::wstring()) }); // Case 3 : Validate the element when selecting C (0x43) on third dropdown of second column with hybrid Ctrl+Empty+Empty - testCases.push_back({ 0, 1, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL } }, std::wstring()) }); + testCases.push_back({ 0, 1, 2, std::vector{ VK_CONTROL, -1, 0x43 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL } }, std::wstring()) }); // Case 4 : Validate the element when selecting C (0x43) on second dropdown of first column with Ctrl+Empty+Empty - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList), -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, 0x43, -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 5 : Validate the element when selecting C (0x43) on second dropdown of second column with Ctrl+Empty+Empty - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList), -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0x43, -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL } }, std::wstring()) }); // Case 6 : Validate the element when selecting C (0x43) on second dropdown of second column with hybrid Ctrl+Empty+Empty - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList), -1 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0x43, -1 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL } }, std::wstring()) }); // Case 7 : Validate the element when selecting Ctrl (VK_CONTROL) on first dropdown of first column with Empty+Empty+C - testCases.push_back({ 0, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector{ VK_CONTROL, -1, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 8 : Validate the element when selecting Ctrl (VK_CONTROL) on first dropdown of second column with Empty+Empty+C - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_CONTROL, -1, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ 0x43 } }, std::wstring()) }); // Case 9 : Validate the element when selecting Ctrl (VK_CONTROL) on first dropdown of second column with hybrid Empty+Empty+C - testCases.push_back({ 0, 1, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ VK_CONTROL, -1, 0x43 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ 0x43 } }, std::wstring()) }); // Case 10 : Validate the element when selecting Ctrl (VK_CONTROL) on second dropdown of first column with Empty+Empty+C - testCases.push_back({ 0, 0, 1, std::vector{ -1, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ -1, VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 11 : Validate the element when selecting Ctrl (VK_CONTROL) on second dropdown of second column with Empty+Empty+C - testCases.push_back({ 0, 1, 1, std::vector{ -1, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ -1, VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ 0x43 } }, std::wstring()) }); // Case 12 : Validate the element when selecting Ctrl (VK_CONTROL) on second dropdown of second column with hybrid Empty+Empty+C - testCases.push_back({ 0, 1, 1, std::vector{ -1, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ -1, VK_CONTROL, 0x43 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ 0x43 } }, std::wstring()) }); // Case 13 : Validate the element when selecting C (0x43) on second dropdown of first column with Ctrl+A - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x41 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x41 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 14 : Validate the element when selecting C (0x43) on second dropdown of second column with Ctrl+A - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); // Case 15 : Validate the element when selecting C (0x43) on second dropdown of second column with hybrid Ctrl+A - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0x43 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x41 } }, std::wstring()) }); // Case 16 : Validate the element when selecting Ctrl (VK_CONTROL) on first dropdown of first column with Alt+C - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_MENU, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_MENU, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 17 : Validate the element when selecting Ctrl (VK_CONTROL) on first dropdown of second column with Alt+C - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_MENU, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_MENU, 0x43 } }, std::wstring()) }); // Case 18 : Validate the element when selecting Ctrl (VK_CONTROL) on first dropdown of second column with hybrid Alt+C - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_MENU, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0x43 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_MENU, 0x43 } }, std::wstring()) }); // Case 19 : Validate the element when selecting Null (-1) on second dropdown of first column with Ctrl+Shift+C - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, -1, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 20 : Validate the element when selecting Null (-1) on second dropdown of second column with Ctrl+Shift+C - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, -1, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); // Case 21 : Validate the element when selecting Null (-1) on second dropdown of second column with hybrid Ctrl+Shift+C - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, -1, 0x43 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); // Case 22 : Validate the element when selecting None (0) on second dropdown of first column with Ctrl+Shift+C - testCases.push_back({ 0, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), 0, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 1, std::vector{ VK_CONTROL, 0, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 23 : Validate the element when selecting None (0) on second dropdown of second column with Ctrl+Shift+C - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), 0, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); // Case 24 : Validate the element when selecting None (0) on second dropdown of second column with hybrid Ctrl+Shift+C - testCases.push_back({ 0, 1, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), 0, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 1, std::vector{ VK_CONTROL, 0, 0x43 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 } }, std::wstring()) }); // Case 25 : Validate the element when selecting Null (-1) on first dropdown of first column with Shift+Ctrl+C - testCases.push_back({ 0, 0, 0, std::vector{ -1, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector{ -1, VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 26 : Validate the element when selecting Null (-1) on first dropdown of second column with Shift+Ctrl+C - testCases.push_back({ 0, 1, 0, std::vector{ -1, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_SHIFT, VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ -1, VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_SHIFT, VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 27 : Validate the element when selecting Null (-1) on first dropdown of second column with hybrid Shift+Ctrl+C - testCases.push_back({ 0, 1, 0, std::vector{ -1, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_SHIFT, VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ -1, VK_CONTROL, 0x43 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_SHIFT, VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 28 : Validate the element when selecting None (0) on first dropdown of first column with Shift+Ctrl+C - testCases.push_back({ 0, 0, 0, std::vector{ 0, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 0, 0, std::vector{ 0, VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, std::vector{ VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 29 : Validate the element when selecting None (0) on first dropdown of second column with Shift+Ctrl+C - testCases.push_back({ 0, 1, 0, std::vector{ 0, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_SHIFT, VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ 0, VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_SHIFT, VK_CONTROL, 0x43 } }, std::wstring()) }); // Case 30 : Validate the element when selecting None (0) on first dropdown of second column with hybrid Shift+Ctrl+C - testCases.push_back({ 0, 1, 0, std::vector{ 0, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_SHIFT, VK_CONTROL, 0x43 } }, std::wstring()) }); + testCases.push_back({ 0, 1, 0, std::vector{ 0, VK_CONTROL, 0x43 }, std::wstring(), true, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, std::vector{ VK_SHIFT, VK_CONTROL, 0x43 } }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::MapToSameShortcut); @@ -1162,25 +1112,23 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns SameShortcutPreviouslyMapped error on setting first column to match first column in another row with same target app and both are valid 3 key shortcuts TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnSameShortcutPreviouslyMappedError_OnSettingFirstColumnToFirstColumnInAnotherRowWithSameTargetAppAndBothAreValid3KeyShortcuts) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1 : Validate the element when selecting C (0x43) on third dropdown of first column with Ctrl+Shift+Empty - testCases.push_back({ 1, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 2, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT }, Shortcut() }, std::wstring()) }); // Case 2 : Validate the element when selecting Shift (VK_SHIFT) on second dropdown of first column with Ctrl+Empty+C - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, std::wstring()) }); // Case 3 : Validate the element when selecting Shift (VK_SHIFT) on first dropdown of first column with Empty+Ctrl+C - testCases.push_back({ 1, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 0, std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; // Ctrl+Shift+C remapped - remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, std::wstring())); + remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, std::wstring())); remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::SameShortcutPreviouslyMapped); @@ -1190,25 +1138,25 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns no error on setting first column to match first column in another row with different target app and both are valid 3 key shortcuts TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnNoError_OnSettingFirstColumnToFirstColumnInAnotherRowWithDifferentTargetAppAndBothAreValid3KeyShortcuts) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); + std::vector testCases; // Case 1 : Validate the element when selecting C (0x43) on third dropdown of first column with Ctrl+Shift+Empty for testApp2 - testCases.push_back({ 1, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 2, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT }, Shortcut() }, testApp2) }); // Case 2 : Validate the element when selecting Shift (VK_SHIFT) on second dropdown of first column with Ctrl+Empty+C for testApp2 - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, testApp2) }); // Case 3 : Validate the element when selecting Shift (VK_SHIFT) on first dropdown of first column with Empty+Ctrl+C for testApp2 - testCases.push_back({ 1, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 0, std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, testApp2) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; // Ctrl+Shift+C remapped for testApp1 - remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, testApp1)); + remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, testApp1)); remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is valid Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::NoError); @@ -1218,25 +1166,23 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns ConflictingModifierShortcut error on setting first column to conflict with first column in another row with same target app and both are valid 3 key shortcuts TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnConflictingModifierShortcutError_OnSettingFirstColumnToConflictWithFirstColumnInAnotherRowWithSameTargetAppAndBothAreValid3KeyShortcuts) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1 : Validate the element when selecting C (0x43) on third dropdown of first column with LCtrl+Shift+Empty - testCases.push_back({ 1, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, VK_SHIFT }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 2, std::vector{ VK_LCONTROL, VK_SHIFT, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, VK_SHIFT }, Shortcut() }, std::wstring()) }); // Case 2 : Validate the element when selecting Shift (VK_SHIFT) on second dropdown of first column with LCtrl+Empty+C - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_LCONTROL, VK_SHIFT, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, 0x43 }, Shortcut() }, std::wstring()) }); // Case 3 : Validate the element when selecting LShift (VK_LSHIFT) on first dropdown of first column with Empty+Ctrl+C - testCases.push_back({ 1, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_LSHIFT, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 0, std::vector{ VK_LSHIFT, VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; // Ctrl+Shift+C remapped - remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, std::wstring())); + remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, std::wstring())); remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::ConflictingModifierShortcut); @@ -1246,25 +1192,23 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns no error on setting first column to conflict with first column in another row with different target app and both are valid 3 key shortcuts TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnNoError_OnSettingFirstColumnToConflictWithFirstColumnInAnotherRowWithDifferentTargetAppAndBothAreValid3KeyShortcuts) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1 : Validate the element when selecting C (0x43) on third dropdown of first column with LCtrl+Shift+Empty for testApp2 - testCases.push_back({ 1, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, VK_SHIFT }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 2, std::vector{ VK_LCONTROL, VK_SHIFT, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, VK_SHIFT }, Shortcut() }, testApp2) }); // Case 2 : Validate the element when selecting Shift (VK_SHIFT) on second dropdown of first column with LCtrl+Empty+C for testApp2 - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_LCONTROL, VK_SHIFT, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, 0x43 }, Shortcut() }, testApp2) }); // Case 3 : Validate the element when selecting LShift (VK_LSHIFT) on first dropdown of first column with Empty+Ctrl+C for testApp2 - testCases.push_back({ 1, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_LSHIFT, keyList), GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 0, std::vector{ VK_LSHIFT, VK_CONTROL, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, testApp2) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; // Ctrl+Shift+C remapped for testApp1 - remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, testApp1)); + remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, testApp1)); remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is valid Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::NoError); @@ -1274,39 +1218,37 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns SameShortcutPreviouslyMapped error on setting first column to match first column in another row with same target app and both are valid 2 key shortcuts TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnSameShortcutPreviouslyMappedError_OnSettingFirstColumnToFirstColumnInAnotherRowWithSameTargetAppAndBothAreValid2KeyShortcuts) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1 : Validate the element when selecting C (0x43) on second dropdown of first column with Ctrl+Empty - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, Shortcut() }, std::wstring()) }); // Case 2 : Validate the element when selecting C (0x43) on third dropdown of first column with Ctrl+Empty+Empty - testCases.push_back({ 1, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 2, std::vector{ VK_CONTROL, -1, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, Shortcut() }, std::wstring()) }); // Case 3 : Validate the element when selecting C (0x43) on second dropdown of first column with Ctrl+Empty+Empty - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList), -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_CONTROL, 0x43, -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, Shortcut() }, std::wstring()) }); // Case 4 : Validate the element when selecting Ctrl (VK_CONTROL) on first dropdown of first column with Empty+C - testCases.push_back({ 1, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 0, std::vector{ VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, std::wstring()) }); // Case 5 : Validate the element when selecting Ctrl (VK_CONTROL) on first dropdown of first column with Empty+Empty+C - testCases.push_back({ 1, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 0, std::vector{ VK_CONTROL, -1, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, std::wstring()) }); // Case 6 : Validate the element when selecting Ctrl (VK_CONTROL) on second dropdown of first column with Empty+Empty+C - testCases.push_back({ 1, 0, 1, std::vector{ -1, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 1, std::vector{ -1, VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, std::wstring()) }); // Case 7 : Validate the element when selecting Null (-1) on second dropdown of first column with Ctrl+Shift+C - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_CONTROL, -1, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, std::wstring()) }); // Case 8 : Validate the element when selecting Null (-1) on first dropdown of first column with Shift+Ctrl+C - testCases.push_back({ 1, 0, 0, std::vector{ -1, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 0, std::vector{ -1, VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, Shortcut() }, std::wstring()) }); // Case 9 : Validate the element when selecting None (0) on second dropdown of first column with Ctrl+Shift+C - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), 0, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_CONTROL, 0, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, std::wstring()) }); // Case 10 : Validate the element when selecting None (0) on first dropdown of first column with Shift+Ctrl+C - testCases.push_back({ 1, 0, 0, std::vector{ 0, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 0, std::vector{ 0, VK_CONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, Shortcut() }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; // Ctrl+C remapped - remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, std::wstring())); + remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, std::wstring())); remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::SameShortcutPreviouslyMapped); @@ -1316,39 +1258,37 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns no error on setting first column to match first column in another row with different target app and both are valid 2 key shortcuts TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnNoError_OnSettingFirstColumnToFirstColumnInAnotherRowWithDifferentTargetAppAndBothAreValid2KeyShortcuts) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1 : Validate the element when selecting C (0x43) on second dropdown of first column with Ctrl+Empty for testApp2 - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_CONTROL, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, Shortcut() }, testApp2) }); // Case 2 : Validate the element when selecting C (0x43) on third dropdown of first column with Ctrl+Empty+Empty for testApp2 - testCases.push_back({ 1, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 2, std::vector{ VK_CONTROL, -1, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, Shortcut() }, testApp2) }); // Case 3 : Validate the element when selecting C (0x43) on second dropdown of first column with Ctrl+Empty+Empty for testApp2 - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList), -1 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_CONTROL, 0x43, -1 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL }, Shortcut() }, testApp2) }); // Case 4 : Validate the element when selecting Ctrl (VK_CONTROL) on first dropdown of first column with Empty+C for testApp2 - testCases.push_back({ 1, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 0, std::vector{ VK_CONTROL, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, testApp2) }); // Case 5 : Validate the element when selecting Ctrl (VK_CONTROL) on first dropdown of first column with Empty+Empty+C for testApp2 - testCases.push_back({ 1, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 0, std::vector{ VK_CONTROL, -1, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, testApp2) }); // Case 6 : Validate the element when selecting Ctrl (VK_CONTROL) on second dropdown of first column with Empty+Empty+C for testApp2 - testCases.push_back({ 1, 0, 1, std::vector{ -1, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 1, std::vector{ -1, VK_CONTROL, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, testApp2) }); // Case 7 : Validate the element when selecting Null (-1) on second dropdown of first column with Ctrl+Shift+C for testApp2 - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_CONTROL, -1, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, testApp2) }); // Case 8 : Validate the element when selecting Null (-1) on first dropdown of first column with Shift+Ctrl+C for testApp2 - testCases.push_back({ 1, 0, 0, std::vector{ -1, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 0, std::vector{ -1, VK_CONTROL, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, Shortcut() }, testApp2) }); // Case 9 : Validate the element when selecting None (0) on second dropdown of first column with Ctrl+Shift+C for testApp2 - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), 0, GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_CONTROL, 0, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, VK_SHIFT, 0x43 }, Shortcut() }, testApp2) }); // Case 10 : Validate the element when selecting None (0) on first dropdown of first column with Shift+Ctrl+C for testApp2 - testCases.push_back({ 1, 0, 0, std::vector{ 0, GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 0, std::vector{ 0, VK_CONTROL, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_CONTROL, 0x43 }, Shortcut() }, testApp2) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; // Ctrl+C remapped for testApp1 - remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, testApp1)); + remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, testApp1)); remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is valid Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::NoError); @@ -1358,39 +1298,37 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns ConflictingModifierShortcut error on setting first column to conflict with first column in another row with same target app and both are valid 2 key shortcuts TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnConflictingModifierShortcutError_OnSettingFirstColumnToConflictWithFirstColumnInAnotherRowWithSameTargetAppAndBothAreValid2KeyShortcuts) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1 : Validate the element when selecting C (0x43) on second dropdown of first column with LCtrl+Empty - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_LCONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL }, Shortcut() }, std::wstring()) }); // Case 2 : Validate the element when selecting C (0x43) on third dropdown of first column with LCtrl+Empty+Empty - testCases.push_back({ 1, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 2, std::vector{ VK_LCONTROL, -1, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL }, Shortcut() }, std::wstring()) }); // Case 3 : Validate the element when selecting C (0x43) on second dropdown of first column with LCtrl+Empty+Empty - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList), -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_LCONTROL, 0x43, -1 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL }, Shortcut() }, std::wstring()) }); // Case 4 : Validate the element when selecting LCtrl (VK_LCONTROL) on first dropdown of first column with Empty+C - testCases.push_back({ 1, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 0, std::vector{ VK_LCONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, std::wstring()) }); // Case 5 : Validate the element when selecting LCtrl (VK_LCONTROL) on first dropdown of first column with Empty+Empty+C - testCases.push_back({ 1, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 0, std::vector{ VK_LCONTROL, -1, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, std::wstring()) }); // Case 6 : Validate the element when selecting LCtrl (VK_LCONTROL) on second dropdown of first column with Empty+Empty+C - testCases.push_back({ 1, 0, 1, std::vector{ -1, GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 1, std::vector{ -1, VK_LCONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, std::wstring()) }); // Case 7 : Validate the element when selecting Null (-1) on second dropdown of first column with LCtrl+Shift+C - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, VK_SHIFT, 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_LCONTROL, -1, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, VK_SHIFT, 0x43 }, Shortcut() }, std::wstring()) }); // Case 8 : Validate the element when selecting Null (-1) on first dropdown of first column with Shift+LCtrl+C - testCases.push_back({ 1, 0, 0, std::vector{ -1, GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_LCONTROL, 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 0, std::vector{ -1, VK_LCONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_LCONTROL, 0x43 }, Shortcut() }, std::wstring()) }); // Case 9 : Validate the element when selecting None (0) on second dropdown of first column with LCtrl+Shift+C - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), 0, GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, VK_SHIFT, 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_LCONTROL, 0, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, VK_SHIFT, 0x43 }, Shortcut() }, std::wstring()) }); // Case 10 : Validate the element when selecting None (0) on first dropdown of first column with Shift+LCtrl+C - testCases.push_back({ 1, 0, 0, std::vector{ 0, GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_LCONTROL, 0x43 }, Shortcut() }, std::wstring()) }); + testCases.push_back({ 1, 0, 0, std::vector{ 0, VK_LCONTROL, 0x43 }, std::wstring(), false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_LCONTROL, 0x43 }, Shortcut() }, std::wstring()) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; // Ctrl+C remapped - remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, std::wstring())); + remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, std::wstring())); remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is invalid Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::ConflictingModifierShortcut); @@ -1400,39 +1338,37 @@ namespace RemappingUITests // Test if the ValidateShortcutBufferElement method returns no error on setting first column to conflict with first column in another row with different target app and both are valid 2 key shortcuts TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnNoError_OnSettingFirstColumnToConflictWithFirstColumnInAnotherRowWithDifferentTargetAppAndBothAreValid2KeyShortcuts) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - std::vector testCases; // Case 1 : Validate the element when selecting C (0x43) on second dropdown of first column with LCtrl+Empty for testApp2 - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_LCONTROL, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL }, Shortcut() }, testApp2) }); // Case 2 : Validate the element when selecting C (0x43) on third dropdown of first column with LCtrl+Empty+Empty for testApp2 - testCases.push_back({ 1, 0, 2, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 2, std::vector{ VK_LCONTROL, -1, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL }, Shortcut() }, testApp2) }); // Case 3 : Validate the element when selecting C (0x43) on second dropdown of first column with LCtrl+Empty+Empty for testApp2 - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList), -1 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_LCONTROL, 0x43, -1 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL }, Shortcut() }, testApp2) }); // Case 4 : Validate the element when selecting LCtrl (VK_LCONTROL) on first dropdown of first column with Empty+C for testApp2 - testCases.push_back({ 1, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 0, std::vector{ VK_LCONTROL, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, testApp2) }); // Case 5 : Validate the element when selecting LCtrl (VK_LCONTROL) on first dropdown of first column with Empty+Empty+C for testApp2 - testCases.push_back({ 1, 0, 0, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 0, std::vector{ VK_LCONTROL, -1, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, testApp2) }); // Case 6 : Validate the element when selecting LCtrl (VK_LCONTROL) on second dropdown of first column with Empty+Empty+C for testApp2 - testCases.push_back({ 1, 0, 1, std::vector{ -1, GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 1, std::vector{ -1, VK_LCONTROL, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ 0x43 }, Shortcut() }, testApp2) }); // Case 7 : Validate the element when selecting Null (-1) on second dropdown of first column with LCtrl+Shift+C for testApp2 - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), -1, GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, VK_SHIFT, 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_LCONTROL, -1, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, VK_SHIFT, 0x43 }, Shortcut() }, testApp2) }); // Case 8 : Validate the element when selecting Null (-1) on first dropdown of first column with Shift+LCtrl+C for testApp2 - testCases.push_back({ 1, 0, 0, std::vector{ -1, GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_LCONTROL, 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 0, std::vector{ -1, VK_LCONTROL, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_LCONTROL, 0x43 }, Shortcut() }, testApp2) }); // Case 9 : Validate the element when selecting None (0) on second dropdown of first column with LCtrl+Shift+C for testApp2 - testCases.push_back({ 1, 0, 1, std::vector{ GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), 0, GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, VK_SHIFT, 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 1, std::vector{ VK_LCONTROL, 0, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_LCONTROL, VK_SHIFT, 0x43 }, Shortcut() }, testApp2) }); // Case 10 : Validate the element when selecting None (0) on first dropdown of first column with Shift+LCtrl+C for testApp2 - testCases.push_back({ 1, 0, 0, std::vector{ 0, GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), GetDropDownIndexFromDropDownList(0x43, keyList) }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_LCONTROL, 0x43 }, Shortcut() }, testApp2) }); + testCases.push_back({ 1, 0, 0, std::vector{ 0, VK_LCONTROL, 0x43 }, testApp2, false, std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, VK_LCONTROL, 0x43 }, Shortcut() }, testApp2) }); - RunTestCases(testCases, [this, &keyList](const ValidateShortcutBufferElementArgs& testCase) { + RunTestCases(testCases, [this](const ValidateShortcutBufferElementArgs& testCase) { // Arrange RemapBuffer remapBuffer; // Ctrl+C remapped for testApp1 - remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, testApp1)); + remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_CONTROL, 0x43 }, Shortcut() }, testApp1)); remapBuffer.push_back(testCase.bufferRow); // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedIndicesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(testCase.elementRowIndex, testCase.elementColIndex, testCase.indexOfDropDownLastModified, testCase.selectedCodesOnDropDowns, testCase.targetAppNameInTextBox, testCase.isHybridColumn, remapBuffer, true); // Assert that the element is valid Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::NoError); @@ -1442,18 +1378,16 @@ namespace RemappingUITests // Return error on Disable as second modifier key or action key TEST_METHOD (ValidateShortcutBufferElement_ShouldReturnDisableAsActionKeyError_OnSettingSecondDropdownAsDisable) { - std::vector keyList = keyboardLayout.GetKeyCodeList(true); - keyList.insert(keyList.begin(), CommonSharedConstants::VK_DISABLED); // Arrange RemapBuffer remapBuffer; - remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, CommonSharedConstants::VK_DISABLED }, Shortcut() }, testApp1)); - std::vector selectedIndices = { - GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), - GetDropDownIndexFromDropDownList(CommonSharedConstants::VK_DISABLED, keyList) + remapBuffer.push_back(std::make_pair(RemapBufferItem{ std::vector{ VK_SHIFT, CommonSharedConstants::VK_DISABLED }, Shortcut() }, testApp1)); + std::vector selectedCodes = { + VK_SHIFT, + CommonSharedConstants::VK_DISABLED }; // Act - std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(0, 1, 1, selectedIndices, testApp1, true, keyList, remapBuffer, true); + std::pair result = BufferValidationHelpers::ValidateShortcutBufferElement(0, 1, 1, selectedCodes, testApp1, true, remapBuffer, true); // Assert Assert::AreEqual(true, result.first == KeyboardManagerHelper::ErrorType::ShortcutDisableAsActionKey); diff --git a/src/modules/keyboardmanager/test/KeyboardManagerHelperTests.cpp b/src/modules/keyboardmanager/test/KeyboardManagerHelperTests.cpp index c52ce7151c..468962731d 100644 --- a/src/modules/keyboardmanager/test/KeyboardManagerHelperTests.cpp +++ b/src/modules/keyboardmanager/test/KeyboardManagerHelperTests.cpp @@ -104,11 +104,10 @@ namespace KeyboardManagerCommonTests TEST_METHOD (CheckRepeatedModifier_ShouldReturnTrue_OnPassingSameModifierRepeated) { // Arrange - std::vector keyList = LayoutMap().GetKeyCodeList(true); - std::vector keys = { VK_CONTROL, VK_CONTROL, 0x41 }; + std::vector keys = { VK_CONTROL, VK_CONTROL, 0x41 }; // Act - bool result = KeyboardManagerHelper::CheckRepeatedModifier(keys, TestHelpers::GetDropDownIndexFromDropDownList(VK_CONTROL, keyList), keyList); + bool result = KeyboardManagerHelper::CheckRepeatedModifier(keys, VK_CONTROL); // Assert Assert::IsTrue(result); @@ -118,11 +117,10 @@ namespace KeyboardManagerCommonTests TEST_METHOD (CheckRepeatedModifier_ShouldReturnTrue_OnPassingConflictingModifierRepeated) { // Arrange - std::vector keyList = LayoutMap().GetKeyCodeList(true); - std::vector keys = { VK_CONTROL, VK_LCONTROL, 0x41 }; + std::vector keys = { VK_CONTROL, VK_LCONTROL, 0x41 }; // Act - bool result = KeyboardManagerHelper::CheckRepeatedModifier(keys, TestHelpers::GetDropDownIndexFromDropDownList(VK_LCONTROL, keyList), keyList); + bool result = KeyboardManagerHelper::CheckRepeatedModifier(keys, VK_LCONTROL); // Assert Assert::IsTrue(result); @@ -132,42 +130,13 @@ namespace KeyboardManagerCommonTests TEST_METHOD (CheckRepeatedModifier_ShouldReturnFalse_OnPassingDifferentModifiers) { // Arrange - std::vector keyList = LayoutMap().GetKeyCodeList(true); - std::vector keys = { VK_CONTROL, VK_SHIFT, 0x41 }; + std::vector keys = { VK_CONTROL, VK_SHIFT, 0x41 }; // Act - bool result = KeyboardManagerHelper::CheckRepeatedModifier(keys, TestHelpers::GetDropDownIndexFromDropDownList(VK_SHIFT, keyList), keyList); + bool result = KeyboardManagerHelper::CheckRepeatedModifier(keys, VK_SHIFT); // Assert Assert::IsFalse(result); } - - // Test if the GetKeyCodesFromSelectedIndices method ignores -1 and 0 from argument in return value - TEST_METHOD (GetKeyCodesFromSelectedIndices_ShouldIgnoreMinus1And0_OnPassingArgumentWithMinus1Or0) - { - // Arrange - std::vector keyList = LayoutMap().GetKeyCodeList(true); - std::vector indices = { -1, 0, -1, 0 }; - - // Act - auto result = KeyboardManagerHelper::GetKeyCodesFromSelectedIndices(indices, keyList); - - // Assert - Assert::IsTrue(result.empty()); - } - - // Test if the GetKeyCodesFromSelectedIndices method returns vector with key codes from vector with indices as per key code list - TEST_METHOD (GetKeyCodesFromSelectedIndices_ShouldReturnVectorWithKeyCodes_OnPassingVectorWithIndicesAsPerKeyCodeList) - { - // Arrange - std::vector keyList = LayoutMap().GetKeyCodeList(true); - std::vector indices = { TestHelpers::GetDropDownIndexFromDropDownList(0x41, keyList), TestHelpers::GetDropDownIndexFromDropDownList(0x42, keyList) }; - - // Act - auto result = KeyboardManagerHelper::GetKeyCodesFromSelectedIndices(indices, keyList); - - // Assert - Assert::IsTrue(result == std::vector{ 0x41, 0x42 }); - } }; } diff --git a/src/modules/keyboardmanager/test/ShortcutTests.cpp b/src/modules/keyboardmanager/test/ShortcutTests.cpp index c82763436c..591d3aa444 100644 --- a/src/modules/keyboardmanager/test/ShortcutTests.cpp +++ b/src/modules/keyboardmanager/test/ShortcutTests.cpp @@ -79,8 +79,8 @@ namespace KeyboardManagerCommonTests TEST_METHOD (DoKeysOverlap_ShouldReturnNoError_OnPassingInvalidShortcutForOneOfTheArguments) { // Arrange - Shortcut s1(std::vector{ NULL }); - Shortcut s2(std::vector{ VK_CONTROL, 0x41 }); + Shortcut s1(std::vector{ NULL }); + Shortcut s2(std::vector{ VK_CONTROL, 0x41 }); // Act auto result = Shortcut::DoKeysOverlap(s1, s2); @@ -93,7 +93,7 @@ namespace KeyboardManagerCommonTests TEST_METHOD (DoKeysOverlap_ShouldReturnSameShortcutPreviouslyMapped_OnPassingSameShortcutForBothArguments) { // Arrange - Shortcut s1(std::vector{ VK_CONTROL, 0x41 }); + Shortcut s1(std::vector{ VK_CONTROL, 0x41 }); Shortcut s2 = s1; // Act @@ -107,8 +107,8 @@ namespace KeyboardManagerCommonTests TEST_METHOD (DoKeysOverlap_ShouldReturnNoError_OnPassingShortcutsWithDifferentActionKeys) { // Arrange - Shortcut s1(std::vector{ VK_CONTROL, 0x42 }); - Shortcut s2(std::vector{ VK_CONTROL, 0x41 }); + Shortcut s1(std::vector{ VK_CONTROL, 0x42 }); + Shortcut s2(std::vector{ VK_CONTROL, 0x41 }); // Act auto result = Shortcut::DoKeysOverlap(s1, s2); @@ -121,8 +121,8 @@ namespace KeyboardManagerCommonTests TEST_METHOD (DoKeysOverlap_ShouldReturnNoError_OnPassingShortcutsWithDifferentModifiers) { // Arrange - Shortcut s1(std::vector{ VK_CONTROL, 0x42 }); - Shortcut s2(std::vector{ VK_SHIFT, 0x42 }); + Shortcut s1(std::vector{ VK_CONTROL, 0x42 }); + Shortcut s2(std::vector{ VK_SHIFT, 0x42 }); // Act auto result = Shortcut::DoKeysOverlap(s1, s2); @@ -135,8 +135,8 @@ namespace KeyboardManagerCommonTests TEST_METHOD (DoKeysOverlap_ShouldReturnConflictingModifierShortcut_OnPassingShortcutsWithLeftModifierAndCommonModifierOfSameType) { // Arrange - Shortcut s1(std::vector{ VK_LCONTROL, 0x42 }); - Shortcut s2(std::vector{ VK_CONTROL, 0x42 }); + Shortcut s1(std::vector{ VK_LCONTROL, 0x42 }); + Shortcut s2(std::vector{ VK_CONTROL, 0x42 }); // Act auto result = Shortcut::DoKeysOverlap(s1, s2); @@ -149,8 +149,8 @@ namespace KeyboardManagerCommonTests TEST_METHOD (DoKeysOverlap_ShouldReturnConflictingModifierShortcut_OnPassingShortcutsWithRightModifierAndCommonModifierOfSameType) { // Arrange - Shortcut s1(std::vector{ VK_RCONTROL, 0x42 }); - Shortcut s2(std::vector{ VK_CONTROL, 0x42 }); + Shortcut s1(std::vector{ VK_RCONTROL, 0x42 }); + Shortcut s2(std::vector{ VK_CONTROL, 0x42 }); // Act auto result = Shortcut::DoKeysOverlap(s1, s2); @@ -163,8 +163,8 @@ namespace KeyboardManagerCommonTests TEST_METHOD (DoKeysOverlap_ShouldReturnConflictingModifierShortcut_OnPassingShortcutsWithLeftModifierAndRightModifierOfSameType) { // Arrange - Shortcut s1(std::vector{ VK_LCONTROL, 0x42 }); - Shortcut s2(std::vector{ VK_RCONTROL, 0x42 }); + Shortcut s1(std::vector{ VK_LCONTROL, 0x42 }); + Shortcut s2(std::vector{ VK_RCONTROL, 0x42 }); // Act auto result = Shortcut::DoKeysOverlap(s1, s2); diff --git a/src/modules/keyboardmanager/test/TestHelpers.cpp b/src/modules/keyboardmanager/test/TestHelpers.cpp index 6d42906b58..501280be59 100644 --- a/src/modules/keyboardmanager/test/TestHelpers.cpp +++ b/src/modules/keyboardmanager/test/TestHelpers.cpp @@ -22,10 +22,4 @@ namespace TestHelpers state.SetActivatedApp(maxLengthString); state.SetActivatedApp(KeyboardManagerConstants::NoActivatedApp); } - - // Function to return the index of the given key code from the drop down key list - int GetDropDownIndexFromDropDownList(DWORD key, const std::vector& keyList) - { - return (int)std::distance(keyList.begin(), std::find(keyList.begin(), keyList.end(), key)); - } } diff --git a/src/modules/keyboardmanager/ui/BufferValidationHelpers.cpp b/src/modules/keyboardmanager/ui/BufferValidationHelpers.cpp index 34d600e691..ab73775195 100644 --- a/src/modules/keyboardmanager/ui/BufferValidationHelpers.cpp +++ b/src/modules/keyboardmanager/ui/BufferValidationHelpers.cpp @@ -2,21 +2,22 @@ #include "BufferValidationHelpers.h" #include #include +#include namespace BufferValidationHelpers { // Function to validate and update an element of the key remap buffer when the selection has changed - KeyboardManagerHelper::ErrorType ValidateAndUpdateKeyBufferElement(int rowIndex, int colIndex, int selectedKeyIndex, const std::vector& keyCodeList, RemapBuffer& remapBuffer) + KeyboardManagerHelper::ErrorType ValidateAndUpdateKeyBufferElement(int rowIndex, int colIndex, int selectedKeyCode, RemapBuffer& remapBuffer) { KeyboardManagerHelper::ErrorType errorType = KeyboardManagerHelper::ErrorType::NoError; // Check if the element was not found or the index exceeds the known keys - if (selectedKeyIndex != -1 && keyCodeList.size() > selectedKeyIndex) + if (selectedKeyCode != -1) { // Check if the value being set is the same as the other column if (remapBuffer[rowIndex].first[std::abs(int(colIndex) - 1)].index() == 0) { - if (std::get(remapBuffer[rowIndex].first[std::abs(int(colIndex) - 1)]) == keyCodeList[selectedKeyIndex]) + if (std::get(remapBuffer[rowIndex].first[std::abs(int(colIndex) - 1)]) == selectedKeyCode) { errorType = KeyboardManagerHelper::ErrorType::MapToSameKey; } @@ -33,7 +34,7 @@ namespace BufferValidationHelpers { if (remapBuffer[i].first[colIndex].index() == 0) { - KeyboardManagerHelper::ErrorType result = KeyboardManagerHelper::DoKeysOverlap(std::get(remapBuffer[i].first[colIndex]), keyCodeList[selectedKeyIndex]); + KeyboardManagerHelper::ErrorType result = KeyboardManagerHelper::DoKeysOverlap(std::get(remapBuffer[i].first[colIndex]), selectedKeyCode); if (result != KeyboardManagerHelper::ErrorType::NoError) { errorType = result; @@ -49,7 +50,7 @@ namespace BufferValidationHelpers // If there is no error, set the buffer if (errorType == KeyboardManagerHelper::ErrorType::NoError) { - remapBuffer[rowIndex].first[colIndex] = keyCodeList[selectedKeyIndex]; + remapBuffer[rowIndex].first[colIndex] = selectedKeyCode; } else { @@ -66,18 +67,17 @@ namespace BufferValidationHelpers } // Function to validate an element of the shortcut remap buffer when the selection has changed - std::pair ValidateShortcutBufferElement(int rowIndex, int colIndex, uint32_t dropDownIndex, const std::vector& selectedIndices, std::wstring appName, bool isHybridControl, const std::vector& keyCodeList, const RemapBuffer& remapBuffer, bool dropDownFound) + std::pair ValidateShortcutBufferElement(int rowIndex, int colIndex, uint32_t dropDownIndex, const std::vector& selectedCodes, std::wstring appName, bool isHybridControl, const RemapBuffer& remapBuffer, bool dropDownFound) { BufferValidationHelpers::DropDownAction dropDownAction = BufferValidationHelpers::DropDownAction::NoAction; KeyboardManagerHelper::ErrorType errorType = KeyboardManagerHelper::ErrorType::NoError; - size_t dropDownCount = selectedIndices.size(); - std::vector selectedKeyCodes = KeyboardManagerHelper::GetKeyCodesFromSelectedIndices(selectedIndices, keyCodeList); - int selectedKeyIndex = dropDownFound ? selectedIndices[dropDownIndex] : -1; + size_t dropDownCount = selectedCodes.size(); + DWORD selectedKeyCode = dropDownFound ? selectedCodes[dropDownIndex] : -1; - if (selectedKeyIndex != -1 && keyCodeList.size() > selectedKeyIndex && dropDownFound) + if (selectedKeyCode != -1 && dropDownFound) { // If only 1 drop down and action key is chosen: Warn that a modifier must be chosen (if the drop down is not for a hybrid scenario) - if (dropDownCount == 1 && !KeyboardManagerHelper::IsModifierKey(keyCodeList[selectedKeyIndex]) && !isHybridControl) + if (dropDownCount == 1 && !KeyboardManagerHelper::IsModifierKey(selectedKeyCode) && !isHybridControl) { // warn and reset the drop down errorType = KeyboardManagerHelper::ErrorType::ShortcutStartWithModifier; @@ -86,10 +86,10 @@ namespace BufferValidationHelpers else if (dropDownIndex == dropDownCount - 1) { // If last drop down and a modifier is selected: add a new drop down (max drop down count should be enforced) - if (KeyboardManagerHelper::IsModifierKey(keyCodeList[selectedKeyIndex]) && dropDownCount < KeyboardManagerConstants::MaxShortcutSize) + if (KeyboardManagerHelper::IsModifierKey(selectedKeyCode) && dropDownCount < KeyboardManagerConstants::MaxShortcutSize) { // If it matched any of the previous modifiers then reset that drop down - if (KeyboardManagerHelper::CheckRepeatedModifier(selectedKeyCodes, selectedKeyIndex, keyCodeList)) + if (KeyboardManagerHelper::CheckRepeatedModifier(selectedCodes, selectedKeyCode)) { // warn and reset the drop down errorType = KeyboardManagerHelper::ErrorType::ShortcutCannotHaveRepeatedModifier; @@ -101,13 +101,13 @@ namespace BufferValidationHelpers } } // If last drop down and a modifier is selected but there are already max drop downs: warn the user - else if (KeyboardManagerHelper::IsModifierKey(keyCodeList[selectedKeyIndex]) && dropDownCount >= KeyboardManagerConstants::MaxShortcutSize) + else if (KeyboardManagerHelper::IsModifierKey(selectedKeyCode) && dropDownCount >= KeyboardManagerConstants::MaxShortcutSize) { // warn and reset the drop down errorType = KeyboardManagerHelper::ErrorType::ShortcutMaxShortcutSizeOneActionKey; } // If None is selected but it's the last index: warn - else if (keyCodeList[selectedKeyIndex] == 0) + else if (selectedKeyCode == 0) { // If it is a hybrid control and there are 2 drop downs then deletion is allowed if (isHybridControl && dropDownCount == KeyboardManagerConstants::MinShortcutSize) @@ -123,7 +123,7 @@ namespace BufferValidationHelpers } } // Disable can not be selected if one modifier key has already been selected - else if (keyCodeList[selectedKeyIndex] == CommonSharedConstants::VK_DISABLED && dropDownIndex) + else if (selectedKeyCode == CommonSharedConstants::VK_DISABLED && dropDownIndex) { errorType = KeyboardManagerHelper::ErrorType::ShortcutDisableAsActionKey; } @@ -132,10 +132,10 @@ namespace BufferValidationHelpers // If it is not the last drop down else { - if (KeyboardManagerHelper::IsModifierKey(keyCodeList[selectedKeyIndex])) + if (KeyboardManagerHelper::IsModifierKey(selectedKeyCode)) { // If it matched any of the previous modifiers then reset that drop down - if (KeyboardManagerHelper::CheckRepeatedModifier(selectedKeyCodes, selectedKeyIndex, keyCodeList)) + if (KeyboardManagerHelper::CheckRepeatedModifier(selectedCodes, selectedKeyCode)) { // warn and reset the drop down errorType = KeyboardManagerHelper::ErrorType::ShortcutCannotHaveRepeatedModifier; @@ -143,13 +143,13 @@ namespace BufferValidationHelpers // If not, the modifier key will be set } // If None is selected and there are more than 2 drop downs - else if (keyCodeList[selectedKeyIndex] == 0 && dropDownCount > KeyboardManagerConstants::MinShortcutSize) + else if (selectedKeyCode == 0 && dropDownCount > KeyboardManagerConstants::MinShortcutSize) { // set delete drop down flag dropDownAction = BufferValidationHelpers::DropDownAction::DeleteDropDown; // do not delete the drop down now since there may be some other error which would cause the drop down to be invalid after removal } - else if (keyCodeList[selectedKeyIndex] == 0 && dropDownCount <= KeyboardManagerConstants::MinShortcutSize) + else if (selectedKeyCode == 0 && dropDownCount <= KeyboardManagerConstants::MinShortcutSize) { // If it is a hybrid control and there are 2 drop downs then deletion is allowed if (isHybridControl && dropDownCount == KeyboardManagerConstants::MinShortcutSize) @@ -165,7 +165,7 @@ namespace BufferValidationHelpers } } // Allow selection of VK_DISABLE only in first dropdown - else if (keyCodeList[selectedKeyIndex] == CommonSharedConstants::VK_DISABLED && dropDownIndex) + else if (selectedKeyCode == CommonSharedConstants::VK_DISABLED && dropDownIndex) { errorType = KeyboardManagerHelper::ErrorType::ShortcutDisableAsActionKey; } @@ -175,7 +175,7 @@ namespace BufferValidationHelpers bool isClear = true; for (int i = dropDownIndex + 1; i < (int)dropDownCount; i++) { - if (selectedIndices[i] != -1) + if (selectedCodes[i] != -1) { isClear = false; break; @@ -205,14 +205,14 @@ namespace BufferValidationHelpers if (errorType == KeyboardManagerHelper::ErrorType::NoError) { KeyShortcutUnion tempShortcut; - if (isHybridControl && selectedKeyCodes.size() == 1) + if (isHybridControl && KeyDropDownControl::GetNumberOfSelectedKeys(selectedCodes) == 1) { - tempShortcut = selectedKeyCodes[0]; + tempShortcut = *std::find_if(selectedCodes.begin(), selectedCodes.end(), [](int32_t a) { return a != -1 && a != 0; }); } else { tempShortcut = Shortcut(); - std::get(tempShortcut).SetKeyCodes(selectedKeyCodes); + std::get(tempShortcut).SetKeyCodes(selectedCodes); } // Convert app name to lower case diff --git a/src/modules/keyboardmanager/ui/BufferValidationHelpers.h b/src/modules/keyboardmanager/ui/BufferValidationHelpers.h index c8f5cae450..3c28a292ee 100644 --- a/src/modules/keyboardmanager/ui/BufferValidationHelpers.h +++ b/src/modules/keyboardmanager/ui/BufferValidationHelpers.h @@ -15,8 +15,8 @@ namespace BufferValidationHelpers }; // Function to validate and update an element of the key remap buffer when the selection has changed - KeyboardManagerHelper::ErrorType ValidateAndUpdateKeyBufferElement(int rowIndex, int colIndex, int selectedKeyIndex, const std::vector& keyCodeList, RemapBuffer& remapBuffer); + KeyboardManagerHelper::ErrorType ValidateAndUpdateKeyBufferElement(int rowIndex, int colIndex, int selectedKeyCode, RemapBuffer& remapBuffer); // Function to validate an element of the shortcut remap buffer when the selection has changed - std::pair ValidateShortcutBufferElement(int rowIndex, int colIndex, uint32_t dropDownIndex, const std::vector& selectedIndices, std::wstring appName, bool isHybridControl, const std::vector& keyCodeList, const RemapBuffer& remapBuffer, bool dropDownFound); + std::pair ValidateShortcutBufferElement(int rowIndex, int colIndex, uint32_t dropDownIndex, const std::vector& selectedCodes, std::wstring appName, bool isHybridControl, const RemapBuffer& remapBuffer, bool dropDownFound); } diff --git a/src/modules/keyboardmanager/ui/KeyDropDownControl.cpp b/src/modules/keyboardmanager/ui/KeyDropDownControl.cpp index ff4eae2260..971271778e 100644 --- a/src/modules/keyboardmanager/ui/KeyDropDownControl.cpp +++ b/src/modules/keyboardmanager/ui/KeyDropDownControl.cpp @@ -5,29 +5,34 @@ #include "BufferValidationHelpers.h" #include #include +#include // Initialized to null KeyboardManagerState* KeyDropDownControl::keyboardManagerState = nullptr; -// Get keys code list depending if Disable is in dropdown -std::vector KeyDropDownControl::GetKeyCodeList(bool isShortcut, bool renderDisable) +// Get selected value of dropdown or -1 if nothing is selected +DWORD KeyDropDownControl::GetSelectedValue(ComboBox comboBox) { - auto list = keyboardManagerState->keyboardMap.GetKeyCodeList(isShortcut); - if (renderDisable) - { - list.insert(list.begin(), CommonSharedConstants::VK_DISABLED); - } + auto dataContext = comboBox.SelectedValue(); + if (!dataContext) + return -1; - return list; + auto value = winrt::unbox_value(dataContext); + return stoi(std::wstring(value)); +} + +void KeyDropDownControl::SetSelectedValue(std::wstring value) +{ + this->dropDown.as().SelectedValue(winrt::box_value(value)); } // Get keys name list depending if Disable is in dropdown -std::vector KeyDropDownControl::GetKeyNameList(bool isShortcut, bool renderDisable) +std::vector> KeyDropDownControl::GetKeyList(bool isShortcut, bool renderDisable) { auto list = keyboardManagerState->keyboardMap.GetKeyNameList(isShortcut); if (renderDisable) { - list.insert(list.begin(), keyboardManagerState->keyboardMap.GetKeyName(CommonSharedConstants::VK_DISABLED)); + list.insert(list.begin(), { CommonSharedConstants::VK_DISABLED, keyboardManagerState->keyboardMap.GetKeyName(CommonSharedConstants::VK_DISABLED) }); } return list; @@ -51,8 +56,9 @@ void KeyDropDownControl::SetDefaultProperties(bool isShortcut, bool renderDisabl dropDown.as().MaxDropDownHeight(KeyboardManagerConstants::TableDropDownHeight); // Initialise layout attribute previousLayout = GetKeyboardLayout(0); - keyCodeList = GetKeyCodeList(isShortcut, renderDisable); - dropDown.as().ItemsSource(KeyboardManagerHelper::ToBoxValue(GetKeyNameList(isShortcut, renderDisable))); + dropDown.as().SelectedValuePath(L"DataContext"); + dropDown.as().ItemsSource(KeyboardManagerHelper::ToBoxValue(GetKeyList(isShortcut, renderDisable))); + // drop down open handler - to reload the items with the latest layout dropDown.as().DropDownOpened([&, isShortcut](winrt::Windows::Foundation::IInspectable const& sender, auto args) { ComboBox currentDropDown = sender.as(); @@ -82,8 +88,7 @@ void KeyDropDownControl::CheckAndUpdateKeyboardLayout(ComboBox currentDropDown, // Check if the layout has changed if (previousLayout != layout) { - keyCodeList = GetKeyCodeList(isShortcut, renderDisable); - currentDropDown.ItemsSource(KeyboardManagerHelper::ToBoxValue(GetKeyNameList(isShortcut, renderDisable))); + currentDropDown.ItemsSource(KeyboardManagerHelper::ToBoxValue(GetKeyList(isShortcut, renderDisable))); previousLayout = layout; } } @@ -94,7 +99,8 @@ void KeyDropDownControl::SetSelectionHandler(Grid& table, StackPanel singleKeyCo // drop down selection handler auto onSelectionChange = [&, table, singleKeyControl, colIndex](winrt::Windows::Foundation::IInspectable const& sender) { ComboBox currentDropDown = sender.as(); - int selectedKeyIndex = currentDropDown.SelectedIndex(); + int selectedKeyCode = GetSelectedValue(currentDropDown); + // Get row index of the single key control uint32_t controlIndex; bool indexFound = table.Children().IndexOf(singleKeyControl, controlIndex); @@ -104,7 +110,7 @@ void KeyDropDownControl::SetSelectionHandler(Grid& table, StackPanel singleKeyCo int rowIndex = table.GetRow(singleKeyControl) - 1; // Validate current remap selection - KeyboardManagerHelper::ErrorType errorType = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(rowIndex, colIndex, selectedKeyIndex, keyCodeList, singleKeyRemapBuffer); + KeyboardManagerHelper::ErrorType errorType = BufferValidationHelpers::ValidateAndUpdateKeyBufferElement(rowIndex, colIndex, selectedKeyCode, singleKeyRemapBuffer); // If there is an error set the warning flyout if (errorType != KeyboardManagerHelper::ErrorType::NoError) @@ -132,7 +138,6 @@ void KeyDropDownControl::SetSelectionHandler(Grid& table, StackPanel singleKeyCo std::pair KeyDropDownControl::ValidateShortcutSelection(Grid table, StackPanel shortcutControl, StackPanel parent, int colIndex, RemapBuffer& shortcutRemapBuffer, std::vector>& keyDropDownControlObjects, TextBox targetApp, bool isHybridControl, bool isSingleKeyWindow) { ComboBox currentDropDown = dropDown.as(); - int selectedKeyIndex = currentDropDown.SelectedIndex(); uint32_t dropDownIndex = -1; bool dropDownFound = parent.Children().IndexOf(currentDropDown, dropDownIndex); // Get row index of the single key control @@ -146,7 +151,7 @@ std::pair KeyDropDownControl::ValidateSho // GetRow will give the row index including the table header rowIndex = table.GetRow(shortcutControl) - 1; - std::vector selectedIndices = GetSelectedIndicesFromStackPanel(parent); + std::vector selectedCodes = GetSelectedCodesFromStackPanel(parent); std::wstring appName; if (targetApp != nullptr) @@ -155,7 +160,7 @@ std::pair KeyDropDownControl::ValidateSho } // Validate shortcut element - validationResult = BufferValidationHelpers::ValidateShortcutBufferElement(rowIndex, colIndex, dropDownIndex, selectedIndices, appName, isHybridControl, keyCodeList, shortcutRemapBuffer, dropDownFound); + validationResult = BufferValidationHelpers::ValidateShortcutBufferElement(rowIndex, colIndex, dropDownIndex, selectedCodes, appName, isHybridControl, shortcutRemapBuffer, dropDownFound); // Add or clear unused drop downs if (validationResult.second == BufferValidationHelpers::DropDownAction::AddDropDown) @@ -229,7 +234,7 @@ void KeyDropDownControl::SetSelectionHandler(Grid& table, StackPanel shortcutCon } // Reset the buffer based on the new selected drop down items. Use static key code list since the KeyDropDownControl object might be deleted - std::vector selectedKeyCodes = KeyboardManagerHelper::GetKeyCodesFromSelectedIndices(GetSelectedIndicesFromStackPanel(parent), GetKeyCodeList(true, colIndex == 1)); + std::vector selectedKeyCodes = GetSelectedCodesFromStackPanel(parent); if (!isHybridControl) { std::get(shortcutRemapBuffer[validationResult.second].first[colIndex]).SetKeyCodes(selectedKeyCodes); @@ -237,7 +242,7 @@ void KeyDropDownControl::SetSelectionHandler(Grid& table, StackPanel shortcutCon else { // If exactly one key is selected consider it to be a key remap - if (selectedKeyCodes.size() == 1) + if (GetNumberOfSelectedKeys(selectedKeyCodes) == 1) { shortcutRemapBuffer[validationResult.second].first[colIndex] = selectedKeyCodes[0]; } @@ -294,12 +299,6 @@ void KeyDropDownControl::SetSelectionHandler(Grid& table, StackPanel shortcutCon }); } -// Function to set the selected index of the drop down -void KeyDropDownControl::SetSelectedIndex(int32_t index) -{ - dropDown.as().SelectedIndex(index); -} - // Function to return the combo box element of the drop down ComboBox KeyDropDownControl::GetComboBox() { @@ -319,18 +318,18 @@ void KeyDropDownControl::AddDropDown(Grid table, StackPanel shortcutControl, Sta } // Function to get the list of key codes from the shortcut combo box stack panel -std::vector KeyDropDownControl::GetSelectedIndicesFromStackPanel(StackPanel parent) +std::vector KeyDropDownControl::GetSelectedCodesFromStackPanel(StackPanel parent) { - std::vector selectedIndices; + std::vector selectedKeyCodes; // Get selected indices for each drop down for (int i = 0; i < (int)parent.Children().Size(); i++) { ComboBox ItDropDown = parent.Children().GetAt(i).as(); - selectedIndices.push_back(ItDropDown.SelectedIndex()); + selectedKeyCodes.push_back(GetSelectedValue(ItDropDown)); } - return selectedIndices; + return selectedKeyCodes; } // Function for validating the selection of shortcuts for all the associated drop downs @@ -340,9 +339,9 @@ void KeyDropDownControl::ValidateShortcutFromDropDownList(Grid table, StackPanel for (int i = 0; i < keyDropDownControlObjects.size(); i++) { // Check for errors only if the current selection is a valid shortcut - std::vector selectedKeyCodes = KeyboardManagerHelper::GetKeyCodesFromSelectedIndices(keyDropDownControlObjects[i]->GetSelectedIndicesFromStackPanel(parent), GetKeyCodeList(true, colIndex == 1)); + std::vector selectedKeyCodes = GetSelectedCodesFromStackPanel(parent); KeyShortcutUnion currentShortcut; - if (selectedKeyCodes.size() == 1 && isHybridControl) + if (GetNumberOfSelectedKeys(selectedKeyCodes) == 1 && isHybridControl) { currentShortcut = selectedKeyCodes[0]; } @@ -354,7 +353,7 @@ void KeyDropDownControl::ValidateShortcutFromDropDownList(Grid table, StackPanel } // If the key/shortcut is valid and that drop down is not empty - if (((currentShortcut.index() == 0 && std::get(currentShortcut) != NULL) || (currentShortcut.index() == 1 && std::get(currentShortcut).IsValidShortcut())) && keyDropDownControlObjects[i]->GetComboBox().SelectedIndex() != -1) + if (((currentShortcut.index() == 0 && std::get(currentShortcut) != NULL) || (currentShortcut.index() == 1 && std::get(currentShortcut).IsValidShortcut())) && GetSelectedValue(keyDropDownControlObjects[i]->GetComboBox()) != -1) { keyDropDownControlObjects[i]->ValidateShortcutSelection(table, shortcutControl, parent, colIndex, shortcutRemapBuffer, keyDropDownControlObjects, targetApp, isHybridControl, isSingleKeyWindow); } @@ -376,9 +375,7 @@ void KeyDropDownControl::AddShortcutToControl(Shortcut shortcut, Grid table, Sta parent.Children().Clear(); // Remove references to the old drop down objects to destroy them keyDropDownControlObjects.clear(); - std::vector shortcutKeyCodes = shortcut.GetKeyCodes(); - std::vector keyCodeList = GetKeyCodeList(true, colIndex == 1); if (shortcutKeyCodes.size() != 0) { bool ignoreWarning = false; @@ -393,17 +390,19 @@ void KeyDropDownControl::AddShortcutToControl(Shortcut shortcut, Grid table, Sta for (int i = 0; i < shortcutKeyCodes.size(); i++) { - // New drop down gets added automatically when the SelectedIndex is set + // New drop down gets added automatically when the SelectedValue(key code) is set if (i < (int)parent.Children().Size()) { ComboBox currentDropDown = parent.Children().GetAt(i).as(); - auto it = std::find(keyCodeList.begin(), keyCodeList.end(), shortcutKeyCodes[i]); - if (it != keyCodeList.end()) - { - currentDropDown.SelectedIndex((int32_t)std::distance(keyCodeList.begin(), it)); - } + currentDropDown.SelectedValue(winrt::box_value(std::to_wstring(shortcutKeyCodes[i]))); } } } parent.UpdateLayout(); } + +// Get number of selected keys. Do not count -1 and 0 values as they stand for Not selected and None +int KeyDropDownControl::GetNumberOfSelectedKeys(std::vector keyCodes) +{ + return (int)std::count_if(keyCodes.begin(), keyCodes.end(), [](int32_t a) { return a != -1 && a != 0; }); +} \ No newline at end of file diff --git a/src/modules/keyboardmanager/ui/KeyDropDownControl.h b/src/modules/keyboardmanager/ui/KeyDropDownControl.h index c7a9b24fba..03b9d2f1b7 100644 --- a/src/modules/keyboardmanager/ui/KeyDropDownControl.h +++ b/src/modules/keyboardmanager/ui/KeyDropDownControl.h @@ -33,8 +33,6 @@ private: winrt::Windows::Foundation::IInspectable dropDown; // Stores the previous layout HKL previousLayout = 0; - // Stores the key code list - std::vector keyCodeList; // Stores the flyout warning message winrt::Windows::Foundation::IInspectable warningMessage; // Stores the flyout attached to the current drop down @@ -48,6 +46,9 @@ private: // Function to check if the layout has changed and accordingly update the drop down list void CheckAndUpdateKeyboardLayout(ComboBox currentDropDown, bool isShortcut, bool renderDisable); + // Get selected value of dropdown or -1 if nothing is selected + static DWORD GetSelectedValue(ComboBox comboBox); + // Function to set accessible name for combobox static void SetAccessibleNameForComboBox(ComboBox dropDown, int index); public: @@ -70,9 +71,6 @@ public: // Function to set selection handler for shortcut drop down. Needs to be called after the constructor since the shortcutControl StackPanel is null if called in the constructor void SetSelectionHandler(winrt::Windows::UI::Xaml::Controls::Grid& table, winrt::Windows::UI::Xaml::Controls::StackPanel shortcutControl, winrt::Windows::UI::Xaml::Controls::StackPanel parent, int colIndex, RemapBuffer& shortcutRemapBuffer, std::vector>& keyDropDownControlObjects, winrt::Windows::UI::Xaml::Controls::TextBox& targetApp, bool isHybridControl, bool isSingleKeyWindow); - // Function to set the selected index of the drop down - void SetSelectedIndex(int32_t index); - // Function to return the combo box element of the drop down ComboBox GetComboBox(); @@ -80,7 +78,7 @@ public: static void AddDropDown(winrt::Windows::UI::Xaml::Controls::Grid table, winrt::Windows::UI::Xaml::Controls::StackPanel shortcutControl, winrt::Windows::UI::Xaml::Controls::StackPanel parent, const int colIndex, RemapBuffer& shortcutRemapBuffer, std::vector>& keyDropDownControlObjects, winrt::Windows::UI::Xaml::Controls::TextBox targetApp, bool isHybridControl, bool isSingleKeyWindow, bool ignoreWarning = false); // Function to get the list of key codes from the shortcut combo box stack panel - static std::vector GetSelectedIndicesFromStackPanel(StackPanel parent); + static std::vector GetSelectedCodesFromStackPanel(StackPanel parent); // Function for validating the selection of shortcuts for all the associated drop downs static void ValidateShortcutFromDropDownList(Grid table, StackPanel shortcutControl, StackPanel parent, int colIndex, RemapBuffer& shortcutRemapBuffer, std::vector>& keyDropDownControlObjects, TextBox targetApp, bool isHybridControl, bool isSingleKeyWindow); @@ -88,12 +86,15 @@ public: // Function to set the warning message void SetDropDownError(winrt::Windows::UI::Xaml::Controls::ComboBox currentDropDown, winrt::hstring message); + // Set selected Value + void SetSelectedValue(std::wstring value); + // Function to add a shortcut to the UI control as combo boxes static void AddShortcutToControl(Shortcut shortcut, Grid table, StackPanel parent, KeyboardManagerState& keyboardManagerState, const int colIndex, std::vector>& keyDropDownControlObjects, RemapBuffer& remapBuffer, StackPanel controlLayout, TextBox targetApp, bool isHybridControl, bool isSingleKeyWindow); - // Get keys code list depending if Disable is in dropdown - static std::vector GetKeyCodeList(bool isShortcut, bool renderDisable); - // Get keys name list depending if Disable is in dropdown - static std::vector GetKeyNameList(bool isShortcut, bool renderDisable); + static std::vector> GetKeyList(bool isShortcut, bool renderDisable); + + // Get number of selected keys. Do not count -1 and 0 values as they stand for Not selected and None + static int GetNumberOfSelectedKeys(std::vector keys); }; diff --git a/src/modules/keyboardmanager/ui/ShortcutControl.cpp b/src/modules/keyboardmanager/ui/ShortcutControl.cpp index b4782752fd..ca2e18ccec 100644 --- a/src/modules/keyboardmanager/ui/ShortcutControl.cpp +++ b/src/modules/keyboardmanager/ui/ShortcutControl.cpp @@ -133,9 +133,10 @@ void ShortcutControl::AddNewShortcutControlRow(Grid& parent, std::vectorgetShortcutControl(), keyboardRemapControlObjects[rowIndex][1]->shortcutDropDownStackPanel.as(), 1, ShortcutControl::shortcutRemapBuffer, keyboardRemapControlObjects[rowIndex][1]->keyDropDownControlObjects, targetAppTextBox, true, false); // Reset the buffer based on the selected drop down items - std::get(shortcutRemapBuffer[rowIndex].first[0]).SetKeyCodes(KeyboardManagerHelper::GetKeyCodesFromSelectedIndices(KeyDropDownControl::GetSelectedIndicesFromStackPanel(keyboardRemapControlObjects[rowIndex][0]->shortcutDropDownStackPanel.as()), KeyDropDownControl::GetKeyCodeList(true, false))); + std::get(shortcutRemapBuffer[rowIndex].first[0]).SetKeyCodes(KeyDropDownControl::GetSelectedCodesFromStackPanel(keyboardRemapControlObjects[rowIndex][0]->shortcutDropDownStackPanel.as())); // second column is a hybrid column - std::vector selectedKeyCodes = KeyboardManagerHelper::GetKeyCodesFromSelectedIndices(KeyDropDownControl::GetSelectedIndicesFromStackPanel(keyboardRemapControlObjects[rowIndex][1]->shortcutDropDownStackPanel.as()), KeyDropDownControl::GetKeyCodeList(true, true)); + + std::vector selectedKeyCodes = KeyDropDownControl::GetSelectedCodesFromStackPanel(keyboardRemapControlObjects[rowIndex][1]->shortcutDropDownStackPanel.as()); // If exactly one key is selected consider it to be a key remap if (selectedKeyCodes.size() == 1) @@ -244,12 +245,7 @@ void ShortcutControl::AddNewShortcutControlRow(Grid& parent, std::vector shortcutListKeyCodes = KeyDropDownControl::GetKeyCodeList(true, true); - auto it = std::find(shortcutListKeyCodes.begin(), shortcutListKeyCodes.end(), std::get(newKeys)); - if (it != shortcutListKeyCodes.end()) - { - keyboardRemapControlObjects[keyboardRemapControlObjects.size() - 1][1]->keyDropDownControlObjects[0]->SetSelectedIndex((int32_t)std::distance(shortcutListKeyCodes.begin(), it)); - } + keyboardRemapControlObjects[keyboardRemapControlObjects.size() - 1][1]->keyDropDownControlObjects[0]->SetSelectedValue(std::to_wstring(std::get(newKeys))); } else { diff --git a/src/modules/keyboardmanager/ui/SingleKeyRemapControl.cpp b/src/modules/keyboardmanager/ui/SingleKeyRemapControl.cpp index 2cdf31d201..30cf8acb22 100644 --- a/src/modules/keyboardmanager/ui/SingleKeyRemapControl.cpp +++ b/src/modules/keyboardmanager/ui/SingleKeyRemapControl.cpp @@ -106,20 +106,10 @@ void SingleKeyRemapControl::AddNewControlKeyRemapRow(Grid& parent, std::vector(newKey) == NULL) && !(newKey.index() == 1 && !std::get(newKey).IsValidShortcut())) { singleKeyRemapBuffer.push_back(std::make_pair(RemapBufferItem{ originalKey, newKey }, L"")); - std::vector keyCodes = keyboardManagerState->keyboardMap.GetKeyCodeList(); - std::vector shortcutListKeyCodes = KeyDropDownControl::GetKeyCodeList(true, true); - auto it = std::find(keyCodes.begin(), keyCodes.end(), originalKey); - if (it != keyCodes.end()) - { - keyboardRemapControlObjects[keyboardRemapControlObjects.size() - 1][0]->keyDropDownControlObjects[0]->SetSelectedIndex((int32_t)std::distance(keyCodes.begin(), it)); - } + keyboardRemapControlObjects[keyboardRemapControlObjects.size() - 1][0]->keyDropDownControlObjects[0]->SetSelectedValue(std::to_wstring(originalKey)); if (newKey.index() == 0) { - it = std::find(shortcutListKeyCodes.begin(), shortcutListKeyCodes.end(), std::get(newKey)); - if (it != shortcutListKeyCodes.end()) - { - keyboardRemapControlObjects[keyboardRemapControlObjects.size() - 1][1]->keyDropDownControlObjects[0]->SetSelectedIndex((int32_t)std::distance(shortcutListKeyCodes.begin(), it)); - } + keyboardRemapControlObjects[keyboardRemapControlObjects.size() - 1][1]->keyDropDownControlObjects[0]->SetSelectedValue(std::to_wstring(std::get(newKey))); } else { @@ -234,11 +224,7 @@ void SingleKeyRemapControl::createDetectKeyWindow(winrt::Windows::Foundation::II std::vector keyCodeList = keyboardManagerState.keyboardMap.GetKeyCodeList(); // Update the drop down list with the new language to ensure that the correct key is displayed linkedRemapDropDown.ItemsSource(KeyboardManagerHelper::ToBoxValue(keyboardManagerState.keyboardMap.GetKeyNameList())); - auto it = std::find(keyCodeList.begin(), keyCodeList.end(), detectedKey); - if (it != keyCodeList.end()) - { - linkedRemapDropDown.SelectedIndex((int32_t)std::distance(keyCodeList.begin(), it)); - } + linkedRemapDropDown.SelectedValue(winrt::box_value(std::to_wstring(detectedKey))); } // Hide the type key UI detectRemapKeyBox.Hide();