Cocos2D-X cpp-tests 学习笔记 1
TestController
TestController 的构造方法中完成了以下几件事:
- 列表初始化几个成员变量;
- 初始化了 _rootTestList 这是一个 RootTests,并调用 runThisTest() 方法;
- 初始化了一个手机监听器。
其中, RootTests 的 runThisTest() 方法继承自 TestList ,TestList 继承于 TestBase ,而 TestBase 继承自 Ref 。
在
tests/cpp-tests/Classes/BaseTest.h
中定义了以下几个名字里边含有 “Test” 的类,比较容易混淆。
TestBase TestList RootTest(RootTest 在 controller 中定义)
在 TestController 的构造方法中,RootTests 对象调用了 runThisTest() 方法,这个方法是继承自 TestList 的,而 TestList 的该方法又继承于 TestBase ,其中,TestBase 的方法声明为:
virtual void runThisTest() {}
关键字 virtual 代表这个方法被期望于子类实现, TestList 的该方法声明为:
virtual void runThisTest() override;
关键字 override 代表这个方法重写了父类的虚函数。
看一下这个方法的实现:
-
首先,实例化了一个 TestCustomTableView ,看它的定义,发现在 create 方法中传入了这个 TableView 的数据源,即 TestList 。实例化这个 TableView 之后又设置了它的委托,也是 TestList 。再看 TestList 类的声明:
public TestBase, public cocos2d::extension::TableViewDataSource, public cocos2d::extension::TableViewDelegate
同时继承了三个类,其中包括 TableView 的数据源和委托,TestList 也声明了数据源和委托方法,并加入关键字 override 代表这些方法继承自父类。
virtual void tableCellTouched(cocos2d::extension::TableView* table, cocos2d::extension::TableViewCell* cell) override;
virtual cocos2d::extension::TableViewCell* tableCellAtIndex(cocos2d::extension::TableView *table, ssize_t idx) override;
virtual cocos2d::Size tableCellSizeForIndex(cocos2d::extension::TableView *table, ssize_t idx) override;
virtual ssize_t numberOfCellsInTableView(cocos2d::extension::TableView *table) override;
virtual void scrollViewDidScroll(cocos2d::extension::ScrollView* view) override{}
virtual void scrollViewDidZoom(cocos2d::extension::ScrollView* view) override{}
- 查看这几个数据源和委托方法,TableView 使用了 _ChildTestName 和 _testCallbacks ,两个私有数组,而这两个私有数组是在方法 addTest 中填充的。在 RootTests 的构造函数中,addTest 方法被不断调用填充了测试项,并且使用 Lambda 加入了每个测试项的回调函数,这样,我们就看到了在 test-cpp 项目启动之后的那个测试项的表。每个 Lambda 都返回了一个 TestBase 的子类,这个类是通过“继承链”TestBase,TestSuite 继承的 TestBase 。
TestSuite
TestSuite 和 TestList 类似,定义在
tests/cpp-tests/Classes/BaseTest.h
中,并且同样继承于 TestBase 。它与 TestList 的区别通过 “List” 和 “Suite” 能够看出来,TestSuite 代表了一组相似的 test ,而 TestList 是一个 test 表。而且 TestSuite 也没有使用 TableView 来显示自己的测试项,而是通过三个虚函数来实现各个测试项之间的切换:
virtual void restartCurrTest();
virtual void enterNextTest();
virtual void enterPreviousTest();
从 TestBase 继承的 _childTestName 属性和自己的 _testCallbacks 也储存了它的各个测试项名称及回调。
它也实现了 runThisTest() 方法,在这个方法中将自己的第一个测试项场景加入到了导演中。
同时定义并实现了 addTestCase() 方法,用来加入自己的测试项,它的每个测试项都是一个继承自 TestCase 的对象,而 TestCase 继承自 Scene ,即它的每个测试项都是一个场景。
TestCase
TestCase 就是 TestSuite 中每个测试项。
TestCase 继承自 Scene 。
我们看它的成员变量:
protected:
cocos2d::MenuItemImage* _priorTestItem;
cocos2d::MenuItemImage* _restartTestItem;
cocos2d::MenuItemImage* _nextTestItem;
cocos2d::Label* _titleLabel;
cocos2d::Label* _subtitleLabel;
private:
TestSuite* _testSuite;
float _runTime;
std::string _testCaseName;
通过成员变量的名字容易猜到这些变量的用途。
接下来我们只要关注那些继承了 TestCase 的子类的实现,那里边就是 Cocos2D-X 中各种 API 的测试了。