]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Add a test fixture
authorFred Sundvik <fsundvik@gmail.com>
Sun, 18 Jun 2017 20:49:38 +0000 (23:49 +0300)
committerFred Sundvik <fsundvik@gmail.com>
Sun, 18 Jun 2017 20:49:38 +0000 (23:49 +0300)
It only initializes QMK once, and clears the matrix after each test.

build_full_test.mk
tests/basic/test.cpp
tests/test_common/matrix.c
tests/test_common/test_fixture.cpp [new file with mode: 0644]
tests/test_common/test_fixture.h [new file with mode: 0644]
tests/test_common/test_matrix.h

index 67c1ca5e585c8aa694b3919d1954f588ee4b6e29..bfd89174de640af74bb676b71e8344563fc1fdc3 100644 (file)
@@ -23,7 +23,8 @@ $(TEST)_SRC= \
        $(QUANTUM_SRC) \
        tests/test_common/matrix.c \
        tests/test_common/test_driver.cpp \
-       tests/test_common/keyboard_report_util.cpp
+       tests/test_common/keyboard_report_util.cpp \
+       tests/test_common/test_fixture.cpp
 $(TEST)_DEFS=$(TMK_COMMON_DEFS)
 $(TEST)_CONFIG=$(TEST_PATH)/config.h
 VPATH+=$(TOP_DIR)/tests/test_common
index 398063fcaa981ebdc56631a5fd268a79b27cd2ed..26a09585ca046053994e8fce5c52d6fb4dee0ad9 100644 (file)
 #include "gmock/gmock.h"
 
 #include "quantum.h"
-#include "keyboard.h"
 #include "test_driver.h"
 #include "test_matrix.h"
 #include "keyboard_report_util.h"
+#include "test_fixture.h"
 
 using testing::_;
 using testing::Return;
@@ -33,35 +33,28 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        },
 };
 
-TEST(KeyPress, SendKeyboardIsNotCalledWhenNoKeyIsPressed) {
+class KeyPress : public TestFixture {};
+
+TEST_F(KeyPress, SendKeyboardIsNotCalledWhenNoKeyIsPressed) {
     TestDriver driver;
-    EXPECT_CALL(driver, send_keyboard_mock(_));
-    keyboard_init();
     EXPECT_CALL(driver, keyboard_leds_mock()).WillRepeatedly(Return(0));
     EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
     keyboard_task();
 }
 
-TEST(KeyPress, CorrectKeyIsReportedWhenPressed) {
+TEST_F(KeyPress, CorrectKeyIsReportedWhenPressed) {
     TestDriver driver;
-    EXPECT_CALL(driver, send_keyboard_mock(_));
-    keyboard_init();
     press_key(0, 0);
     EXPECT_CALL(driver, keyboard_leds_mock()).WillRepeatedly(Return(0));
     EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A)));
     keyboard_task();
 }
 
-TEST(KeyPress, CorrectKeysAreReportedWhenTwoKeysArePressed) {
+TEST_F(KeyPress, CorrectKeysAreReportedWhenTwoKeysArePressed) {
     TestDriver driver;
-    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
-    keyboard_init();
     press_key(1, 0);
     press_key(0, 1);
     EXPECT_CALL(driver, keyboard_leds_mock()).WillRepeatedly(Return(0));
-    //TODO: This is a left-over from the previous test and need to be fixed
-    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
-    keyboard_task();
     //Note that QMK only processes one key at a time
     EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_B)));
     keyboard_task();
index 5ab5bac6c91da76533451d09b6dd00011366e862..0d9fa68b04639d86ce354d58953e8de773931380 100644 (file)
@@ -22,7 +22,7 @@
 static matrix_row_t matrix[MATRIX_ROWS] = {};
 
 void matrix_init(void) {
-    memset(matrix, 0, sizeof(matrix));
+    clear_all_keys();
     matrix_init_quantum();
 }
 
@@ -54,3 +54,7 @@ void press_key(uint8_t col, uint8_t row) {
 void release_key(uint8_t col, uint8_t row) {
     matrix[row] &= ~(1 << col);
 }
+
+void clear_all_keys(void) {
+    memset(matrix, 0, sizeof(matrix));
+}
diff --git a/tests/test_common/test_fixture.cpp b/tests/test_common/test_fixture.cpp
new file mode 100644 (file)
index 0000000..aff518d
--- /dev/null
@@ -0,0 +1,38 @@
+#include "test_fixture.h"
+#include "gmock/gmock.h"
+#include "test_driver.h"
+#include "test_matrix.h"
+#include "keyboard.h"
+
+using testing::_;
+using testing::AnyNumber;
+using testing::Return;
+using testing::Between;
+
+void TestFixture::SetUpTestCase() {
+    TestDriver driver;
+    EXPECT_CALL(driver, send_keyboard_mock(_));
+    keyboard_init();
+}
+
+void TestFixture::TearDownTestCase() {
+}
+
+TestFixture::TestFixture() {
+}
+
+TestFixture::~TestFixture() {
+    TestDriver driver;
+    clear_all_keys();
+    // Run for a while to make sure all keys are completely released
+    // Should probably wait until tapping term etc, has timed out
+    EXPECT_CALL(driver, send_keyboard_mock(_)).Times(AnyNumber());
+    EXPECT_CALL(driver, keyboard_leds_mock()).WillRepeatedly(Return(0));
+    for (int i=0; i<100; i++) {
+        keyboard_task();
+    }
+    testing::Mock::VerifyAndClearExpectations(&driver); 
+    // Verify that the matrix really is cleared
+    EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(Between(0, 1));
+    EXPECT_CALL(driver, keyboard_leds_mock()).WillRepeatedly(Return(0));
+}
\ No newline at end of file
diff --git a/tests/test_common/test_fixture.h b/tests/test_common/test_fixture.h
new file mode 100644 (file)
index 0000000..a775a42
--- /dev/null
@@ -0,0 +1,28 @@
+/* Copyright 2017 Fred Sundvik
+ *
+ * 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, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+ #pragma once
+
+#include "gtest/gtest.h"
+
+class TestFixture : public testing::Test {
+public:
+    TestFixture();
+    ~TestFixture();
+    static void SetUpTestCase();
+    static void TearDownTestCase();
+
+};
\ No newline at end of file
index afc65c556b65e0cb8d26e3f8731774083c5aa459..174fc4f227d10f9eac4a4b2597796f0bc351a533 100644 (file)
@@ -23,6 +23,7 @@ extern "C" {
 
 void press_key(uint8_t col, uint8_t row);
 void release_key(uint8_t col, uint8_t row);
+void clear_all_keys(void);
 
 #ifdef __cplusplus
 }