diff --git a/build_full_test.mk b/build_full_test.mk
index 43e2a20a7d..5f9bbe5e64 100644
--- a/build_full_test.mk
+++ b/build_full_test.mk
@@ -17,7 +17,12 @@
TEST_PATH=tests/$(TEST)
-$(TEST)_SRC=$(TEST_PATH)/test.c $(TMK_COMMON_SRC) $(QUANTUM_SRC) tests/test_common/matrix.c
+$(TEST)_SRC= \
+ $(TEST_PATH)/test.cpp \
+ $(TMK_COMMON_SRC) \
+ $(QUANTUM_SRC) \
+ tests/test_common/matrix.c \
+ tests/test_common/test_driver.cpp
$(TEST)_DEFS=$(TMK_COMMON_DEFS)
$(TEST)_CONFIG=$(TEST_PATH)/config.h
VPATH+=$(TOP_DIR)/tests/test_common
diff --git a/tests/basic/test.cpp b/tests/basic/test.cpp
new file mode 100644
index 0000000000..ce9a0cd726
--- /dev/null
+++ b/tests/basic/test.cpp
@@ -0,0 +1,50 @@
+/* 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 .
+ */
+
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+
+#include "quantum.h"
+#include "keyboard.h"
+#include "test_driver.h"
+#include "test_matrix.h"
+
+using testing::_;
+using testing::Return;
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = {
+ {KC_A, KC_B},
+ {KC_C, KC_D}
+ },
+};
+
+TEST(Basic, SendKeyboardIsNotCalledWhenNoKeyIsPressed) {
+ keyboard_init();
+ TestDriver driver;
+ EXPECT_CALL(driver, keyboard_leds_mock()).WillRepeatedly(Return(0));
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
+ keyboard_task();
+}
+
+TEST(Basic, SendKeyboardIsCalledWhenAKeyIsPressed) {
+ keyboard_init();
+ TestDriver driver;
+ press_key(0, 0);
+ EXPECT_CALL(driver, keyboard_leds_mock()).WillRepeatedly(Return(0));
+ EXPECT_CALL(driver, send_keyboard_mock(_));
+ keyboard_task();
+}
diff --git a/tests/test_common/matrix.c b/tests/test_common/matrix.c
index 940f28f35b..85556e2c48 100644
--- a/tests/test_common/matrix.c
+++ b/tests/test_common/matrix.c
@@ -16,6 +16,9 @@
#include "matrix.h"
+#include "test_matrix.h"
+
+static matrix_row_t matrix[MATRIX_ROWS] = {};
void matrix_init(void) {
matrix_init_quantum();
@@ -27,7 +30,7 @@ uint8_t matrix_scan(void) {
}
matrix_row_t matrix_get_row(uint8_t row) {
- return 0;
+ return matrix[row];
}
void matrix_print(void) {
@@ -41,3 +44,11 @@ void matrix_init_kb(void) {
void matrix_scan_kb(void) {
}
+
+void press_key(uint8_t col, uint8_t row) {
+ matrix[row] |= 1 << col;
+}
+
+void release_key(uint8_t col, uint8_t row) {
+ matrix[row] &= ~(1 << col);
+}
diff --git a/tests/test_common/test_driver.cpp b/tests/test_common/test_driver.cpp
new file mode 100644
index 0000000000..7c67f57763
--- /dev/null
+++ b/tests/test_common/test_driver.cpp
@@ -0,0 +1,58 @@
+/* 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 .
+ */
+
+#include "test_driver.h"
+
+TestDriver* TestDriver::m_this = nullptr;
+
+TestDriver::TestDriver()
+ : m_driver{
+ &TestDriver::keyboard_leds,
+ &TestDriver::send_keyboard,
+ &TestDriver::send_mouse,
+ &TestDriver::send_system,
+ &TestDriver::send_consumer
+ }
+{
+
+ host_set_driver(&m_driver);
+ m_this = this;
+}
+
+TestDriver::~TestDriver() {
+ m_this = nullptr;
+}
+
+uint8_t TestDriver::keyboard_leds(void) {
+ return m_this->keyboard_leds_mock();
+}
+
+void TestDriver::send_keyboard(report_keyboard_t* report) {
+ m_this->send_keyboard_mock(report);
+
+}
+
+void TestDriver::send_mouse(report_mouse_t* report) {
+ m_this->send_mouse_mock(report);
+}
+
+void TestDriver::send_system(uint16_t data) {
+ m_this->send_system_mock(data);
+}
+
+void TestDriver::send_consumer(uint16_t data) {
+ m_this->send_consumer_mock(data);
+}
diff --git a/tests/test_common/test_driver.h b/tests/test_common/test_driver.h
new file mode 100644
index 0000000000..d5b8318847
--- /dev/null
+++ b/tests/test_common/test_driver.h
@@ -0,0 +1,45 @@
+/* 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 .
+ */
+
+#ifndef TESTS_TEST_COMMON_TEST_DRIVER_H_
+#define TESTS_TEST_COMMON_TEST_DRIVER_H_
+
+#include "gmock/gmock.h"
+#include
+#include "host.h"
+
+
+class TestDriver {
+public:
+ TestDriver();
+ ~TestDriver();
+ MOCK_METHOD0(keyboard_leds_mock, uint8_t ());
+ MOCK_METHOD1(send_keyboard_mock, void (report_keyboard_t*));
+ MOCK_METHOD1(send_mouse_mock, void (report_mouse_t*));
+ MOCK_METHOD1(send_system_mock, void (uint16_t));
+ MOCK_METHOD1(send_consumer_mock, void (uint16_t));
+private:
+ static uint8_t keyboard_leds(void);
+ static void send_keyboard(report_keyboard_t *report);
+ static void send_mouse(report_mouse_t* report);
+ static void send_system(uint16_t data);
+ static void send_consumer(uint16_t data);
+ host_driver_t m_driver;
+ static TestDriver* m_this;
+};
+
+
+#endif /* TESTS_TEST_COMMON_TEST_DRIVER_H_ */
diff --git a/tests/basic/test.c b/tests/test_common/test_matrix.h
similarity index 70%
rename from tests/basic/test.c
rename to tests/test_common/test_matrix.h
index 2afb4d6a96..afc65c556b 100644
--- a/tests/basic/test.c
+++ b/tests/test_common/test_matrix.h
@@ -14,11 +14,18 @@
* along with this program. If not, see .
*/
-#include "quantum.h"
+#ifndef TESTS_TEST_COMMON_TEST_MATRIX_H_
+#define TESTS_TEST_COMMON_TEST_MATRIX_H_
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [0] = {
- {KC_A, KC_B},
- {KC_C, KC_D}
- },
-};
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void press_key(uint8_t col, uint8_t row);
+void release_key(uint8_t col, uint8_t row);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* TESTS_TEST_COMMON_TEST_MATRIX_H_ */