GAIO CLUB
#ifndef AIR_CONDITIONER_CONTROLLER_H_
#define AIR_CONDITIONER_CONTROLLER_H_
#define MODE_OFF (0) // モード:オフ
#define MODE_COOLING (1) // モード:冷房
#define MODE_HEATING (2) // モード:暖房
#define COOLING_THRESHOLD (30) // 冷房をつける基準値(単位:℃)
#define HEATING_THRESHOLD (20) // 暖房をつける基準値(単位:℃)
extern int Mode; // エアコンのモード (オフ・冷房・暖房)
extern void AirConditionerController_Init(); // 初期化処理
extern void AirConditionerController_AutoMode(); // 自動運転判定
extern int AirConditionerController_GetMode(); // モード取得
extern int TemperatureSensor_GetTemperature(); // 温度センサ
#endif // AIR_CONDITIONER_CONTROLLER_H_
#include "AirConditionerController.h"
int Mode; /* エアコンの運転モード (オフ・冷房・暖房) */
/* --- 温度センサ --- (モックにする関数) */
extern int TemperatureSensor_GetTemperature();
/* --- 運転モードの初期化処理 --- */
void AirConditionerController_Init()
{
Mode = MODE_OFF;
}
/* --- 運転モードの判定処理 --- */
void AirConditionerController_AutoMode()
{
/* 温度の取得 */
int temperature = TemperatureSensor_GetTemperature();
if (temperature >= COOLING_THRESHOLD) {
Mode = MODE_COOLING; /* 冷房運転モードに設定 */
} else if (temperature <= HEATING_THRESHOLD) {
Mode = MODE_HEATING; /* 暖房運転モードに設定 */
} else {
Mode = MODE_OFF; /* 運転停止モードに設定 */
}
return;
}
/* --- 運転モードの取得 --- */
int AirConditionerController_GetMode()
{
return Mode;
}
// モッククラスの定義
class MockTemperatureSensor {
public:
// int TemperatureSensor_GetTemperature() のモック定義
MOCK_METHOD(int , TemperatureSensor_GetTemperature, ());
} *mockTemperatureSensor;
extern "C" { /* C言語プログラムが呼び出す温度センサ(モック) */
int TemperatureSensor_GetTemperature()
{
return mockTemperatureSensor->TemperatureSensor_GetTemperature();
};
}
// テストフィクスチャクラスの定義
class AirConditionerControllerTest : public Test {
protected:
virtual void SetUp() { // テスト毎の初期処理
// 運転モード(Mode変数)の初期化
AirConditionerController_Init();
// モッククラス変数のアロック
mockTemperatureSensor = new MockTemperatureSensor();
}
virtual void TearDown() { // テスト毎の終了処理
// モッククラス変数の開放
delete mockTemperatureSensor;
}
};
TEST_F(AirConditionerControllerTest, OffModeTest) {
EXPECT_CALL(*mockTemperatureSensor, TemperatureSensor_GetTemperature())
.Times(AtLeast(2)) // 呼び出し回数は2回以上
.WillOnce(Return(29)) // 最初は 29℃ を返す
.WillOnce(Return(21)); // 2回目は 21℃ を返す
AirConditionerController_AutoMode();
EXPECT_EQ(MODE_OFF, AirConditionerController_GetMode());
AirConditionerController_AutoMode();
EXPECT_EQ(MODE_OFF, AirConditionerController_GetMode());
}
TEST_F(AirConditionerControllerTest, HeattingTest) {
EXPECT_CALL(*mockTemperatureSensor, TemperatureSensor_GetTemperature())
.Times(AtLeast(2)) // 呼び出し回数は2回以上
.WillOnce(Return(20)) // 最初は 20℃ を返す
.WillOnce(Return(19)); // 2回目は 19℃ を返す
AirConditionerController_AutoMode();
EXPECT_EQ(MODE_HEATING, AirConditionerController_GetMode());
AirConditionerController_AutoMode();
EXPECT_EQ(MODE_HEATING, AirConditionerController_GetMode());
}
TEST_F(AirConditionerControllerTest, CoolingTest) {
EXPECT_CALL(*mockTemperatureSensor, TemperatureSensor_GetTemperature())
.Times(AtLeast(2)) // 呼び出し回数は2回以上
.WillOnce(Return(30)) // 最初は 30℃ を返す
.WillOnce(Return(31)); // 2回目は 31℃ を返す
AirConditionerController_AutoMode();
EXPECT_EQ(MODE_COOLING, AirConditionerController_GetMode());
AirConditionerController_AutoMode();
EXPECT_EQ(MODE_COOLING, AirConditionerController_GetMode());
}
Running main() from /usr/local/src/googletest-1.14.0/googletest/src/gtest_main.cc
[==========] Running 3 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 3 tests from AirConditionerControllerTest
[ RUN ] AirConditionerControllerTest.OffModeTest
[ OK ] AirConditionerControllerTest.OffModeTest (0 ms)
[ RUN ] AirConditionerControllerTest.HeattingTest
[ OK ] AirConditionerControllerTest.HeattingTest (0 ms)
[ RUN ] AirConditionerControllerTest.CoolingTest
[ OK ] AirConditionerControllerTest.CoolingTest (0 ms)
[----------] 3 tests from AirConditionerControllerTest (0 ms total)
[----------] Global test environment tear-down
[==========] 3 tests from 1 test suite ran. (0 ms total)
[ PASSED ] 3 tests.
浅野 昌尚(あさの まさなお)
ガイオ・テクノロジー株式会社
開発1部 QTXグループ
1980年代から30年以上にわたり汎用構造のCコンパイラ開発に従事し、その間に8ビットマイコンからRISC・VLIW・画像処理プロセッサまで、さまざまなCPU向けのクロスCコンパイラを開発。