TestController
TestController 的構(gòu)造方法中完成了以下幾件事:
- 列表初始化幾個成員變量;
- 初始化了 _rootTestList 這是一個 RootTests,并調(diào)用 runThisTest() 方法;
- 初始化了一個手機(jī)監(jiān)聽器。
其中, RootTests 的 runThisTest() 方法繼承自 TestList ,TestList 繼承于 TestBase ,而 TestBase 繼承自 Ref 。
在
tests/cpp-tests/Classes/BaseTest.h
中定義了以下幾個名字里邊含有 “Test” 的類,比較容易混淆。
TestBase TestList RootTest(RootTest 在 controller 中定義)
在 TestController 的構(gòu)造方法中,RootTests 對象調(diào)用了 runThisTest() 方法,這個方法是繼承自 TestList 的,而 TestList 的該方法又繼承于 TestBase ,其中,TestBase 的方法聲明為:
virtual void runThisTest() {}
關(guān)鍵字 virtual 代表這個方法被期望于子類實(shí)現(xiàn), TestList 的該方法聲明為:
virtual void runThisTest() override;
關(guān)鍵字 override 代表這個方法重寫了父類的虛函數(shù)。
看一下這個方法的實(shí)現(xiàn):
-
首先,實(shí)例化了一個 TestCustomTableView ,看它的定義,發(fā)現(xiàn)在 create 方法中傳入了這個 TableView 的數(shù)據(jù)源,即 TestList 。實(shí)例化這個 TableView 之后又設(shè)置了它的委托,也是 TestList 。再看 TestList 類的聲明:
public TestBase, public cocos2d::extension::TableViewDataSource, public cocos2d::extension::TableViewDelegate
同時繼承了三個類,其中包括 TableView 的數(shù)據(jù)源和委托,TestList 也聲明了數(shù)據(jù)源和委托方法,并加入關(guān)鍵字 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{}
- 查看這幾個數(shù)據(jù)源和委托方法,TableView 使用了 _ChildTestName 和 _testCallbacks ,兩個私有數(shù)組,而這兩個私有數(shù)組是在方法 addTest 中填充的。在 RootTests 的構(gòu)造函數(shù)中,addTest 方法被不斷調(diào)用填充了測試項(xiàng),并且使用 Lambda 加入了每個測試項(xiàng)的回調(diào)函數(shù),這樣,我們就看到了在 test-cpp 項(xiàng)目啟動之后的那個測試項(xiàng)的表。每個 Lambda 都返回了一個 TestBase 的子類,這個類是通過“繼承鏈”TestBase,TestSuite 繼承的 TestBase 。
TestSuite
TestSuite 和 TestList 類似,定義在
tests/cpp-tests/Classes/BaseTest.h
中,并且同樣繼承于 TestBase 。它與 TestList 的區(qū)別通過 “List” 和 “Suite” 能夠看出來,TestSuite 代表了一組相似的 test ,而 TestList 是一個 test 表。而且 TestSuite 也沒有使用 TableView 來顯示自己的測試項(xiàng),而是通過三個虛函數(shù)來實(shí)現(xiàn)各個測試項(xiàng)之間的切換:
virtual void restartCurrTest();
virtual void enterNextTest();
virtual void enterPreviousTest();
從 TestBase 繼承的 _childTestName 屬性和自己的 _testCallbacks 也儲存了它的各個測試項(xiàng)名稱及回調(diào)。
它也實(shí)現(xiàn)了 runThisTest() 方法,在這個方法中將自己的第一個測試項(xiàng)場景加入到了導(dǎo)演中。
同時定義并實(shí)現(xiàn)了 addTestCase() 方法,用來加入自己的測試項(xiàng),它的每個測試項(xiàng)都是一個繼承自 TestCase 的對象,而 TestCase 繼承自 Scene ,即它的每個測試項(xiàng)都是一個場景。
TestCase
TestCase 就是 TestSuite 中每個測試項(xiàng)。
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;
通過成員變量的名字容易猜到這些變量的用途。
接下來我們只要關(guān)注那些繼承了 TestCase 的子類的實(shí)現(xiàn),那里邊就是 Cocos2D-X 中各種 API 的測試了。