1. 程式人生 > >JavaScript實現ZLOGO子集: 測試用例

JavaScript實現ZLOGO子集: 測試用例

續前文JavaScript實現ZLOGO子集: 前進+轉向. 在新增新功能之前, 先新增測試用例, 以應對日益複雜的程式碼.

選擇使用QUnit編寫執行測試用例. 暫時對比較複雜和I/O無關的部分進行測試.

一是程式碼分析部分: Antlr通過生成的分析器和定製的監聽器, 對原始程式碼進行分析和生成指令序列的部分. 下面是對迴圈進行測試的一個用例:

QUnit.test( "分析_迴圈_前進1", function( assert ) {
  assert.deepEqual(
    分析("開始\n迴圈2次\n前進50\n到此為止\n結束\n").返回指令序列(),
    [
{名稱: 常量_指令名_前進, 引數: 50}, {名稱: 常量_指令名_前進, 引數: 50}], "迴圈2次通過!" ); });

"生成路徑表"將指令序列轉換成路點序列(經過的轉折點), 其中一個測試用例如下:

QUnit.test( "生成路徑表_前進_左轉_前進", function( assert ) {
  assert.deepEqual(
    生成路徑表([{名稱: 常量_指令名_前進, 引數: 50},
              {名稱: 常量_指令名_轉向, 引數: 90},
              {名稱: 常量_指令名_前進, 引數: 50
}], 初始前進角度), [{起點: 路點0, 終點: 路點1, 長度: 50}, {起點: 路點1, 終點: 路點2, 長度: 50}], "通過!" ); });

新增測試的過程中, 再次感受程式碼封裝的重要性. 在測試目標介面中, DOM操作都需避免(比如document, window).

雖然已經添加了多層迴圈的程式碼分析部分測試用例, 但在實現時, 感覺需要語法樹以便於支援更復雜的語法. 另外在現在的程式碼裡, 已經開始需要拆分模組("定製監聽器"比較雜亂).

下面需要調研語法樹相關的JS庫, 比如: ajaxorg/treehugger

另外, 發現TypeScript也可以利用Antlr:

Creating ANTLR Applications in TypeScript - Dangl.Blog();