diff --git a/tests/issues/941/test.ktest b/tests/issues/941/test.ktest
new file mode 100644
index 00000000..11f29651
--- /dev/null
+++ b/tests/issues/941/test.ktest
@@ -0,0 +1,63 @@
+TYPE Issue941
+NAME one keypress per cycle
+
+KEYSWITCH A 2 1
+KEYSWITCH S 2 2
+KEYSWITCH D 2 3
+
+RUN 10 ms
+
+PRESS A
+RUN 1 cycle
+EXPECT keyboard-report Key_A # Report should contain only `A`
+
+RUN 10 ms
+
+PRESS S
+RUN 1 cycle
+EXPECT keyboard-report Key_A, Key_S # Report should contain 'A' and 'S'
+
+RUN 25 ms
+
+RELEASE A
+
+RUN 1 cycle
+EXPECT keyboard-report Key_S # Report should contain only 'S'
+
+RELEASE S
+RUN 1 cycle
+EXPECT keyboard-report empty # Report should be empty
+
+RUN 10 ms
+
+# TODO : this should be another test cycle "Simultaneous keypresses"
+# NAME Simultaneous keypresses
+
+
+# Press three keys in one scan cycle:
+
+RUN 10 ms
+
+PRESS A
+PRESS S
+PRESS D
+
+# This test is expected to fail if Kaleidoscope becomes event-driven;
+# instead, there will be three reports here: the first will contain `D`, the
+# second will add `S`, and the third will add `A` (I could have that wrong;
+# it should be in keyscan order).
+
+RUN 1 cycle
+EXPECT keyboard-report Key_A, Key_S # Report should contain `A` and `S`
+EXPECT keyboard-report Key_A, Key_S, Key_D # Report should contain `A` , `S`, and `D`
+
+# Release all three in one scan cycle:
+
+RUN 25 ms
+
+RELEASE A
+RELEASE S
+RELEASE D
+
+RUN 1 cycles
+EXPECT keyboard-report empty # Report should be empty
diff --git a/tests/issues/941/test/testcase.cpp b/tests/issues/941/test/testcase.cpp
deleted file mode 100644
index 691b2034..00000000
--- a/tests/issues/941/test/testcase.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-/* -*- mode: c++ -*-
- * Copyright (C) 2020 Keyboard.io, Inc.
- *
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, version 3.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program. If not, see .
- */
-
-#include "testing/setup-googletest.h"
-
-SETUP_GOOGLETEST();
-
-namespace kaleidoscope {
-namespace testing {
-namespace {
-
-constexpr KeyAddr key_addr_A{2, 1};
-constexpr KeyAddr key_addr_S{2, 2};
-constexpr KeyAddr key_addr_D{2, 3};
-
-using ::testing::IsEmpty;
-
-class Issue941 : public VirtualDeviceTest {};
-
-TEST_F(Issue941, OneKeypressPerCycle) {
-
- std::unique_ptr state{nullptr};
- std::set expected_keycodes{};
-
- // Press `A`
- sim_.Press(key_addr_A);
- expected_keycodes.insert(Key_A.getKeyCode());
-
- state = VirtualDeviceTest::RunCycle();
-
- // Press `S`
- sim_.Press(key_addr_S);
- expected_keycodes.insert(Key_S.getKeyCode());
-
- state = VirtualDeviceTest::RunCycle();
-
- ASSERT_EQ(state->HIDReports()->Keyboard().size(), 1);
- EXPECT_THAT(
- state->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes)
- );
-
- // Release `A`
- sim_.Release(key_addr_A);
- expected_keycodes.erase(Key_A.getKeyCode());
-
- // Release `S`
- sim_.Release(key_addr_S);
- expected_keycodes.erase(Key_S.getKeyCode());
-
- // Run one cycle with two keys toggled off
- state = VirtualDeviceTest::RunCycle();
-
- ASSERT_EQ(state->HIDReports()->Keyboard().size(), 1);
- EXPECT_THAT(
- state->HIDReports()->Keyboard(0).ActiveKeycodes(),
- IsEmpty()
- );
-}
-
-TEST_F(Issue941, SimultaneousKeypresses) {
-
- std::unique_ptr state{nullptr};
- std::set expected_keycodes{};
-
- // Press `A`
- sim_.Press(key_addr_A);
- expected_keycodes.insert(Key_A.getKeyCode());
-
- // state = VirtualDeviceTest::RunCycle();
-
- // Press `S`
- sim_.Press(key_addr_S);
- expected_keycodes.insert(Key_S.getKeyCode());
-
- // Press `D`
- sim_.Press(key_addr_D);
- expected_keycodes.insert(Key_D.getKeyCode());
-
- // Run one cycle with two keys toggled on
- state = VirtualDeviceTest::RunCycle();
-
- EXPECT_THAT(state->HIDReports()->Keyboard().size(), ::testing::Ge(1));
- int n = state->HIDReports()->Keyboard().size();
- EXPECT_THAT(
- state->HIDReports()->Keyboard(n - 1).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes)
- );
-
- // Release `A`
- sim_.Release(key_addr_A);
- expected_keycodes.erase(Key_A.getKeyCode());
-
- // Release `S`
- sim_.Release(key_addr_S);
- expected_keycodes.erase(Key_S.getKeyCode());
-
- // Release `D`
- sim_.Release(key_addr_D);
- expected_keycodes.erase(Key_D.getKeyCode());
-
- // Run one cycle with two keys toggled off
- state = VirtualDeviceTest::RunCycle();
-
- EXPECT_THAT(
- state->HIDReports()->Keyboard(0).ActiveKeycodes(),
- IsEmpty()
- );
-}
-
-} // namespace
-} // namespace testing
-} // namespace kaleidoscope