#include "../src/ptt_key_chord.h" #include static int failures; #define CHECK(value) do { if (!(value)) { std::printf("FAIL line %d: %s\n", __LINE__, #value); failures++; } } while (0) int main() { // Физические CtrlL/WinL и ShiftL/ShiftR на Windows; алгоритм не зависит от платформы. PttKeyChord ctrlWin{162, 91}, shifts{160, 161}; CHECK(!pttChordHeld({}, {})); CHECK(!pttChordHeld(ctrlWin, {162})); CHECK(pttChordHeld(ctrlWin, {162, 91})); CHECK(pttChordHeld(ctrlWin, {162, 91, 65})); CHECK(!pttChordHeld(ctrlWin, {91})); // отпускание любого участника прекращает передачу CHECK(!pttChordHeld(shifts, {160})); CHECK(!pttChordHeld(shifts, {161})); CHECK(pttChordHeld(shifts, {160, 161})); CHECK(!pttChordHeld(ctrlWin, {163, 92})); // правые клавиши не подменяют левые CHECK(pttChordHeld({65, 66}, {65, 66})); // две обычные клавиши CHECK(pttDecodeChord(pttEncodeChord(shifts)) == shifts); CHECK(pttEncodeChord(ctrlWin) == "91,162"); CHECK(pttDecodeChord("0,162").isEmpty()); CHECK(pttDecodeChord("256").isEmpty()); CHECK(pttDecodeChord("Shift+F8").isEmpty()); CHECK(pttDecodeChord("91,invalid").isEmpty()); CHECK(pttDecodeChord("91,162,91") == ctrlWin); PttChordCapture capture; CHECK(!capture.observe({})); CHECK(!capture.observe({160})); CHECK(!capture.observe(shifts)); CHECK(!capture.observe({161})); // отпускание первой клавиши сохраняет полную комбинацию CHECK(capture.observe({})); CHECK(capture.candidate == shifts); capture = {}; CHECK(!capture.observe({65})); CHECK(!capture.observe({66})); CHECK(capture.observe({})); CHECK(capture.candidate == PttKeyChord{66}); // последовательные A/B не превращаются в A+B std::printf("PTT key chords: %s\n", failures ? "FAILED" : "PASSED"); return failures ? 1 : 0; }