// BoundedCounterTest.cpp
#include "pch.h"
#include "CppUnitTest.h"
#include "CounterLib/CounterLib.h" // 追加
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace BoundedCounterTest {
TEST_CLASS(BoundedCounterTest) {
public:
// 各テストの開始直前に行う
TEST_METHOD_INITIALIZE(method_setup) {
counter_ = new CounterLib::BoundedCounter(0,4);
Assert::IsNotNull(counter_);
}
// 各テストの終了直後に行う
TEST_METHOD_CLEANUP(method_teardown) {
delete counter_;
}
// 初期状態でのカウント値は2
TEST_METHOD(constructor) {
Assert::AreEqual(2, counter_->get());
}
// incrementのたびにカウント値が+1される(上限4)
TEST_METHOD(increment) {
Assert::AreEqual(2, counter_->get());
Assert::IsTrue(counter_->can_increment());
Assert::IsTrue(counter_->can_decrement());
counter_->increment();
Assert::AreEqual(3, counter_->get());
Assert::IsTrue(counter_->can_increment());
Assert::IsTrue(counter_->can_decrement());
counter_->increment();
Assert::AreEqual(4, counter_->get());
Assert::IsFalse(counter_->can_increment());
Assert::IsTrue(counter_->can_decrement());
}
// decrementのたびにカウント値が-1される
TEST_METHOD(decrement) {
Assert::AreEqual(2, counter_->get());
Assert::IsTrue(counter_->can_increment());
Assert::IsTrue(counter_->can_decrement());
counter_->decrement();
Assert::AreEqual(1, counter_->get());
Assert::IsTrue(counter_->can_increment());
Assert::IsTrue(counter_->can_decrement());
counter_->decrement();
Assert::AreEqual(0, counter_->get());
Assert::IsTrue(counter_->can_increment());
Assert::IsFalse(counter_->can_decrement());
}
private:
CounterLib::Counter* counter_;
};
}
ViewとModelの分離
ViewとModel間にViewModelを仲介させることで、一方の変更が他方に及ぼす影響を小さく抑えようという目論見です。特にView(=UI)は使い勝手に大きく関わるため、好き勝手にいじれることが望まれます。現時点のView、すなわちMainPage.xamlのコード・ビハインド:MainPage.xaml.cppを再掲します:
// MainPage.xaml.cpp (step-0)
// MainPage クラスの実装
...
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();
}
ご覧のとおり、MainPage(View)がCoutner(Model)を直接駆動しています。この部分は本来UIデザインには関係のない部分です。コード・ビハインドによる実装は極力少なくしたい。データ・バインディングを使ってコード・ビハインド部を減らします。
このコードでのViewとModelとの関わりは:
- Model→View:Modelが持つデータ(カウント値)を、Viewにあるコントロール(TextBlock)に表示する。
- View→model:Viewにあるコントロール(Button)の操作に応じてModelが持つデータ(カウント値)を更新する。
この2つをViewとModelの仲介役:CounterViewModelにやってもらいます。
