ついでにプロジェクト依存関係を設定しておくと便利です。
Counterのテスト項目は、初期値が0か/increment()で+1されるか/decrement()で-1されるかの3つ。
#include "pch.h"
#include "CppUnitTest.h"
#include "CounterLib/CounterLib.h" // 追加
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace CounterTest {
TEST_CLASS(CounterTest) {
public:
// 各テストの開始直前に行う
TEST_METHOD_INITIALIZE(method_setup) {
counter_ = new CounterLib::Counter();
Assert::IsNotNull(counter_);
}
// 各テストの終了直後に行う
TEST_METHOD_CLEANUP(method_teardown) {
delete counter_;
}
// ここからテスト
// 初期状態でのカウント値は0
TEST_METHOD(constructor) {
Assert::AreEqual(0, counter_->get());
}
// incrementのたびにカウント値が+1される
TEST_METHOD(increment) {
for ( int i = 0; i < 10; ++i ) {
Assert::AreEqual(i, counter_->get());
counter_->increment();
}
}
// decrementのたびにカウント値が-1される
TEST_METHOD(decrement) {
for ( int i = 0; i < 10; ++i ) {
Assert::AreEqual(-i, counter_->get());
counter_->decrement();
}
}
private:
CounterLib::Counter* counter_;
};
}
テストの書き方と実行は「Visual Studio 11: C++ Unit Test Framework」をご覧ください。ちゃんと動くCounterなら、テスト結果はAll-Greenになるはずです。
今後クラスやメソッドの追加/変更のたびにCounterTestにテストを追加し、ちゃんと動くことを確認するクセをつけておくことをオススメします。
できあがり
さてと、ViewとModelをつなぎましょうか。CounterAppのプロジェクトプロパティを編集し、CounterLibのヘッダとライブラリを設定します。CounterTestの設定とまったく同じです。
MainPage.xaml.hに2行追加:
#pragma once
#include "Common\LayoutAwarePage.h" // 生成されたヘッダーによって要求されます
#include "MainPage.g.h"
#include "CounterLib/CounterLib.h" // 追加
...
public ref class MainPage sealed
{
...
private:
void btnInc_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
void btnDec_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
CounterLib::Counter counter_; // 追加
};
}
MainPage.xaml.cppにある、ふやす/へらすボタンのイベントハンドラ: btnInc_Click/btnDec_Click は以下のとおり:
void CounterApp::MainPage::btnInc_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
counter_.increment();
txtCount->Text = counter_.get().ToString();
}
void CounterApp::MainPage::btnDec_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
counter_.decrement();
txtCount->Text = counter_.get().ToString();
}
これで完成、お疲れ様でした。
...まだデータバインディングをやってないんですよね。データバインディングを使えばイベントハンドラの多くが不要となり、ViewとModelとの結合/依存関係をより薄くできるので「Viewのお化粧をデザイナさんに任す」といったことがやりやすくなります。次回はデータバインディングに絡んだオハナシを書けるかな...。
