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 代表這個方法被期望于子類實現(xiàn)箩祥, TestList 的該方法聲明為:
virtual void runThisTest() override;
關(guān)鍵字 override 代表這個方法重寫了父類的虛函數(shù)院崇。
看一下這個方法的實現(xiàn):
-
首先,實例化了一個 TestCustomTableView 袍祖,看它的定義底瓣,發(fā)現(xiàn)在 create 方法中傳入了這個 TableView 的數(shù)據(jù)源,即 TestList 蕉陋。實例化這個 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)用填充了測試項杠氢,并且使用 Lambda 加入了每個測試項的回調(diào)函數(shù)站刑,這樣,我們就看到了在 test-cpp 項目啟動之后的那個測試項的表鼻百。每個 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 來顯示自己的測試項卫旱,而是通過三個虛函數(shù)來實現(xiàn)各個測試項之間的切換:
virtual void restartCurrTest();
virtual void enterNextTest();
virtual void enterPreviousTest();
從 TestBase 繼承的 _childTestName 屬性和自己的 _testCallbacks 也儲存了它的各個測試項名稱及回調(diào)人灼。
它也實現(xiàn)了 runThisTest() 方法,在這個方法中將自己的第一個測試項場景加入到了導(dǎo)演中顾翼。
同時定義并實現(xiàn)了 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;
通過成員變量的名字容易猜到這些變量的用途。
接下來我們只要關(guān)注那些繼承了 TestCase 的子類的實現(xiàn)砾隅,那里邊就是 Cocos2D-X 中各種 API 的測試了误阻。