From c6a6bbd2d69caaf2e2e09acebec3ed2bf41379bf Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 14 Mar 2026 15:34:37 +0400 Subject: [PATCH 1/7] refactor test autorun --- .eslintrc | 2 +- src/ace_test.js | 4 +-- src/anchor_test.js | 4 +-- src/autocomplete/inline_test.js | 5 +-- src/autocomplete/popup_test.js | 5 +-- src/autocomplete_test.js | 4 +-- src/background_tokenizer_test.js | 4 +-- src/commands/command_manager_test.js | 4 +-- src/config_test.js | 4 +-- src/document_test.js | 4 +-- src/edit_session_test.js | 5 +-- src/editor_change_document_test.js | 5 +-- src/editor_commands_test.js | 5 +-- src/editor_highlight_selected_word_test.js | 5 +-- src/editor_navigation_test.js | 5 +-- src/editor_options_test.js | 5 +-- src/editor_text_edit_test.js | 5 +-- src/ext/beautify_test.js | 4 +-- src/ext/code_lens_test.js | 5 +-- src/ext/command_bar_test.js | 6 +--- src/ext/diff/diff_test.js | 4 +-- src/ext/diff_test.js | 4 +-- src/ext/emmet_test.js | 4 +-- src/ext/error_marker_test.js | 4 +-- src/ext/hardwrap_test.js | 4 +-- src/ext/inline_autocomplete_test.js | 5 +-- src/ext/simple_tokenizer_test.js | 5 --- src/ext/static_highlight_test.js | 4 +-- src/ext/whitespace_test.js | 4 +-- src/ext/whitespaces_in_selection_test.js | 4 +-- src/incremental_search_test.js | 4 +-- src/keyboard/emacs_test.js | 5 +-- src/keyboard/gutter_handler_test.js | 5 +-- src/keyboard/keybinding_test.js | 4 +-- src/keyboard/sublime_test.js | 5 +-- src/keyboard/textinput_test.js | 4 +-- src/keyboard/vim_ace_test.js | 4 +-- src/keyboard/vim_test.js | 5 +-- src/layer/gutter_test.js | 9 ++--- src/layer/text_markers_test.js | 5 +-- src/layer/text_test.js | 5 +-- src/lib/event_emitter_test.js | 4 +-- src/marker_group_test.js | 4 +-- src/mode/ada_test.js | 4 +-- src/mode/behaviour/behaviour_test.js | 5 +-- src/mode/coldfusion_test.js | 4 +-- src/mode/css_test.js | 4 +-- src/mode/folding/basic_test.js | 3 +- src/mode/folding/coffee_test.js | 3 +- src/mode/folding/cstyle_test.js | 3 +- src/mode/folding/drools_test.js | 3 +- src/mode/folding/fold_mode_test.js | 3 +- src/mode/folding/html_test.js | 3 +- src/mode/folding/javascript_test.js | 3 +- src/mode/folding/latex_test.js | 2 +- src/mode/folding/lua_test.js | 2 +- src/mode/folding/nunjucks_test.js | 3 +- src/mode/folding/php_test.js | 2 +- src/mode/folding/pythonic_test.js | 3 +- src/mode/folding/ruby_test.js | 3 +- src/mode/folding/vbscript_test.js | 3 +- src/mode/folding/xml_test.js | 3 +- src/mode/folding/yaml_test.js | 3 +- src/mode/html_test.js | 4 +-- src/mode/javascript_test.js | 4 +-- src/mode/logiql_test.js | 4 +-- src/mode/odin_test.js | 4 +-- src/mode/php_test.js | 4 +-- src/mode/plain_text_test.js | 4 +-- src/mode/python_test.js | 4 +-- src/mode/ruby_test.js | 4 +-- src/mode/text_test.js | 4 +-- src/mode/vbscript_test.js | 4 +-- src/mode/xml_test.js | 4 +-- src/mouse/default_gutter_handler_test.js | 5 +-- src/mouse/mouse_handler_test.js | 5 +-- src/multi_select_test.js | 5 +-- src/occur_test.js | 4 +-- src/placeholder_test.js | 5 +-- src/range_list_test.js | 4 +-- src/range_test.js | 4 +-- src/scrollbar_test.js | 5 +-- src/search_test.js | 4 +-- src/selection_test.js | 4 +-- src/snippets_test.js | 5 +-- src/test/all.js | 1 - src/test/benchmark.js | 4 +-- src/test/mockdom_test.js | 5 +-- src/test/run.js | 39 ++++++++++++++++++++++ src/test/util.js | 10 ------ src/token_iterator_test.js | 8 +---- src/tokenizer_test.js | 8 +---- src/tooltip_test.js | 4 +-- src/undomanager_test.js | 5 +-- src/virtual_renderer_test.js | 5 +-- 95 files changed, 132 insertions(+), 308 deletions(-) create mode 100644 src/test/run.js delete mode 100644 src/test/util.js diff --git a/.eslintrc b/.eslintrc index 33ee973e296..71fbeaf3fc2 100644 --- a/.eslintrc +++ b/.eslintrc @@ -157,7 +157,7 @@ // allow async/await in tests only overrides: [ { - files: ["**/*_test.js"], + files: ["**/*_test.js", "src/test/run.js"], parserOptions: { ecmaVersion: 2022, }, diff --git a/src/ace_test.js b/src/ace_test.js index 5261a6b70ac..65175e6c05f 100644 --- a/src/ace_test.js +++ b/src/ace_test.js @@ -185,6 +185,4 @@ function sendText(textarea, text) { } -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); diff --git a/src/anchor_test.js b/src/anchor_test.js index 4f9a2ecbcd0..7674cc7729f 100644 --- a/src/anchor_test.js +++ b/src/anchor_test.js @@ -182,6 +182,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); diff --git a/src/autocomplete/inline_test.js b/src/autocomplete/inline_test.js index e99dcb5d2ff..fdc3a04d9f2 100644 --- a/src/autocomplete/inline_test.js +++ b/src/autocomplete/inline_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("../test/mockdom"); } @@ -368,6 +367,4 @@ module.exports = { } }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/autocomplete/popup_test.js b/src/autocomplete/popup_test.js index e2974a4cd30..d1a2f96ee53 100644 --- a/src/autocomplete/popup_test.js +++ b/src/autocomplete/popup_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("../test/mockdom"); } @@ -207,6 +206,4 @@ module.exports = { tearDown: tearDown }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/autocomplete_test.js b/src/autocomplete_test.js index 284f237fdea..29532b06714 100644 --- a/src/autocomplete_test.js +++ b/src/autocomplete_test.js @@ -1632,6 +1632,4 @@ module.exports = { }, }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); diff --git a/src/background_tokenizer_test.js b/src/background_tokenizer_test.js index d3d83628367..6bbca441f49 100644 --- a/src/background_tokenizer_test.js +++ b/src/background_tokenizer_test.js @@ -111,6 +111,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); diff --git a/src/commands/command_manager_test.js b/src/commands/command_manager_test.js index 68719ab1adc..ec7ba56e2d8 100644 --- a/src/commands/command_manager_test.js +++ b/src/commands/command_manager_test.js @@ -170,6 +170,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/config_test.js b/src/config_test.js index 0b658a53bc3..729ab770cff 100644 --- a/src/config_test.js +++ b/src/config_test.js @@ -138,6 +138,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); diff --git a/src/document_test.js b/src/document_test.js index 0599a93254a..245eeac9bb3 100644 --- a/src/document_test.js +++ b/src/document_test.js @@ -351,6 +351,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/edit_session_test.js b/src/edit_session_test.js index 5cc8f390201..05b105ab32a 100644 --- a/src/edit_session_test.js +++ b/src/edit_session_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("./test/mockdom"); } @@ -1357,6 +1356,4 @@ module.exports = { } }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/editor_change_document_test.js b/src/editor_change_document_test.js index 667e91606da..f83d078379b 100644 --- a/src/editor_change_document_test.js +++ b/src/editor_change_document_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("./test/mockdom"); } @@ -149,6 +148,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/editor_commands_test.js b/src/editor_commands_test.js index e231c269f5b..56a5027ebef 100644 --- a/src/editor_commands_test.js +++ b/src/editor_commands_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("./test/mockdom"); } @@ -589,6 +588,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/editor_highlight_selected_word_test.js b/src/editor_highlight_selected_word_test.js index 970a6a142c7..7afd670bc1c 100644 --- a/src/editor_highlight_selected_word_test.js +++ b/src/editor_highlight_selected_word_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("./test/mockdom"); } @@ -184,6 +183,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/editor_navigation_test.js b/src/editor_navigation_test.js index 3e34a1d2302..3395dfbea0b 100644 --- a/src/editor_navigation_test.js +++ b/src/editor_navigation_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("./test/mockdom"); } @@ -225,6 +224,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/editor_options_test.js b/src/editor_options_test.js index 6862a6c39c6..59185ef540e 100644 --- a/src/editor_options_test.js +++ b/src/editor_options_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("./test/mockdom"); } @@ -91,6 +90,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/editor_text_edit_test.js b/src/editor_text_edit_test.js index aa0a5a8a613..f620c13f5b6 100644 --- a/src/editor_text_edit_test.js +++ b/src/editor_text_edit_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("./test/mockdom"); } @@ -526,6 +525,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/ext/beautify_test.js b/src/ext/beautify_test.js index 376d330f481..c10ec1d63ce 100644 --- a/src/ext/beautify_test.js +++ b/src/ext/beautify_test.js @@ -416,6 +416,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/ext/code_lens_test.js b/src/ext/code_lens_test.js index 758becc524f..3b9d57b551f 100644 --- a/src/ext/code_lens_test.js +++ b/src/ext/code_lens_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("../test/mockdom"); } @@ -210,6 +209,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/ext/command_bar_test.js b/src/ext/command_bar_test.js index 58cadc42714..5fc5f71af72 100644 --- a/src/ext/command_bar_test.js +++ b/src/ext/command_bar_test.js @@ -1,6 +1,4 @@ -/* global Promise */ if (typeof process !== "undefined") { - require("amd-loader"); require("../test/mockdom"); } @@ -664,6 +662,4 @@ module.exports = { } }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/ext/diff/diff_test.js b/src/ext/diff/diff_test.js index 803a57ebd44..dec88f971e1 100644 --- a/src/ext/diff/diff_test.js +++ b/src/ext/diff/diff_test.js @@ -503,6 +503,4 @@ function assertDecoratorsPlacement(editor, inlineDiff) { assert.equal(findPointFillStyle(imgB, yB), decoA.colors.light.insert); } -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../../test/run")(module); \ No newline at end of file diff --git a/src/ext/diff_test.js b/src/ext/diff_test.js index 51d4627b3e2..a1edc0735a4 100644 --- a/src/ext/diff_test.js +++ b/src/ext/diff_test.js @@ -33,6 +33,4 @@ module.exports = { } }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/ext/emmet_test.js b/src/ext/emmet_test.js index 03eeb4551f0..ec6ba4a3cb9 100644 --- a/src/ext/emmet_test.js +++ b/src/ext/emmet_test.js @@ -41,6 +41,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/ext/error_marker_test.js b/src/ext/error_marker_test.js index 6c22d21bc26..0340164af80 100644 --- a/src/ext/error_marker_test.js +++ b/src/ext/error_marker_test.js @@ -70,6 +70,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/ext/hardwrap_test.js b/src/ext/hardwrap_test.js index 1972d3b3e64..d9d92db5bb5 100644 --- a/src/ext/hardwrap_test.js +++ b/src/ext/hardwrap_test.js @@ -81,6 +81,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/ext/inline_autocomplete_test.js b/src/ext/inline_autocomplete_test.js index a8fc38992be..f5dac561472 100644 --- a/src/ext/inline_autocomplete_test.js +++ b/src/ext/inline_autocomplete_test.js @@ -1,6 +1,5 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("../test/mockdom"); } @@ -448,6 +447,4 @@ module.exports = { } }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/ext/simple_tokenizer_test.js b/src/ext/simple_tokenizer_test.js index d60183ce16b..b737f2b8160 100644 --- a/src/ext/simple_tokenizer_test.js +++ b/src/ext/simple_tokenizer_test.js @@ -1,10 +1,5 @@ "use strict"; -const isNodeEnvironment = require("../test/util").isNodeEnvironment; -if (!isNodeEnvironment()) { - require("amd-loader"); -} - const assert = require("../test/assertions"); const tokenize = require("./simple_tokenizer").tokenize; diff --git a/src/ext/static_highlight_test.js b/src/ext/static_highlight_test.js index 8b1afab9715..3049ececf21 100644 --- a/src/ext/static_highlight_test.js +++ b/src/ext/static_highlight_test.js @@ -117,6 +117,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/ext/whitespace_test.js b/src/ext/whitespace_test.js index 52dab32bca0..26f62858629 100644 --- a/src/ext/whitespace_test.js +++ b/src/ext/whitespace_test.js @@ -199,6 +199,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/ext/whitespaces_in_selection_test.js b/src/ext/whitespaces_in_selection_test.js index d5940041535..47552c5a56e 100644 --- a/src/ext/whitespaces_in_selection_test.js +++ b/src/ext/whitespaces_in_selection_test.js @@ -49,6 +49,4 @@ module.exports = { } }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} \ No newline at end of file +require("../test/run")(module); \ No newline at end of file diff --git a/src/incremental_search_test.js b/src/incremental_search_test.js index deb295bcb83..d7efd33d66e 100644 --- a/src/incremental_search_test.js +++ b/src/incremental_search_test.js @@ -172,6 +172,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/keyboard/emacs_test.js b/src/keyboard/emacs_test.js index 419fc3e4793..f724cb165f1 100644 --- a/src/keyboard/emacs_test.js +++ b/src/keyboard/emacs_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("../test/mockdom"); } @@ -147,6 +146,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/keyboard/gutter_handler_test.js b/src/keyboard/gutter_handler_test.js index 053177f98eb..4ea5b033f43 100644 --- a/src/keyboard/gutter_handler_test.js +++ b/src/keyboard/gutter_handler_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("../test/mockdom"); } @@ -468,6 +467,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/keyboard/keybinding_test.js b/src/keyboard/keybinding_test.js index 475f64ece71..47d9873e104 100644 --- a/src/keyboard/keybinding_test.js +++ b/src/keyboard/keybinding_test.js @@ -28,6 +28,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/keyboard/sublime_test.js b/src/keyboard/sublime_test.js index 9971586735c..10343ff4973 100644 --- a/src/keyboard/sublime_test.js +++ b/src/keyboard/sublime_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("../test/mockdom"); } @@ -38,6 +37,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/keyboard/textinput_test.js b/src/keyboard/textinput_test.js index 0ccd008989b..b4af590ac09 100644 --- a/src/keyboard/textinput_test.js +++ b/src/keyboard/textinput_test.js @@ -806,6 +806,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/keyboard/vim_ace_test.js b/src/keyboard/vim_ace_test.js index dcf9f75de59..ef7c7f9a15a 100644 --- a/src/keyboard/vim_ace_test.js +++ b/src/keyboard/vim_ace_test.js @@ -362,6 +362,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/keyboard/vim_test.js b/src/keyboard/vim_test.js index 73b3e9ca49a..d64ff0e378e 100644 --- a/src/keyboard/vim_test.js +++ b/src/keyboard/vim_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("../test/mockdom"); } @@ -6038,6 +6037,4 @@ var typeKey = function() { }(); -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/layer/gutter_test.js b/src/layer/gutter_test.js index 99d767c4d0b..cafc1791489 100644 --- a/src/layer/gutter_test.js +++ b/src/layer/gutter_test.js @@ -1,12 +1,11 @@ +"use strict"; + if (typeof process !== "undefined") { - require("amd-loader"); require("../test/mockdom"); } var keys = require("../lib/keys"); -("use strict"); - require("../multi_select"); require("../theme/textmate"); var Editor = require("../editor").Editor; @@ -215,6 +214,4 @@ module.exports = { } }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/layer/text_markers_test.js b/src/layer/text_markers_test.js index 811aaf8a6b4..ddb73c99fb0 100644 --- a/src/layer/text_markers_test.js +++ b/src/layer/text_markers_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("../test/mockdom"); } @@ -236,6 +235,4 @@ module.exports = { }, }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} \ No newline at end of file +require("../test/run")(module); \ No newline at end of file diff --git a/src/layer/text_test.js b/src/layer/text_test.js index 6f4f58ac3b5..dd957321c31 100644 --- a/src/layer/text_test.js +++ b/src/layer/text_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("../test/mockdom"); } @@ -91,6 +90,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/lib/event_emitter_test.js b/src/lib/event_emitter_test.js index 5e3be3ca9c7..74cc9efba66 100644 --- a/src/lib/event_emitter_test.js +++ b/src/lib/event_emitter_test.js @@ -24,6 +24,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/marker_group_test.js b/src/marker_group_test.js index 6d893d45381..f87cb27169e 100644 --- a/src/marker_group_test.js +++ b/src/marker_group_test.js @@ -151,6 +151,4 @@ module.exports = { } }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/mode/ada_test.js b/src/mode/ada_test.js index d7e56f1faa4..5734d5ebbb5 100644 --- a/src/mode/ada_test.js +++ b/src/mode/ada_test.js @@ -25,6 +25,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/mode/behaviour/behaviour_test.js b/src/mode/behaviour/behaviour_test.js index 98ff41e6691..44cca9c4763 100644 --- a/src/mode/behaviour/behaviour_test.js +++ b/src/mode/behaviour/behaviour_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("../../test/mockdom"); } @@ -503,6 +502,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../../test/run")(module); \ No newline at end of file diff --git a/src/mode/coldfusion_test.js b/src/mode/coldfusion_test.js index 26e71b48e67..9178c9b9b51 100644 --- a/src/mode/coldfusion_test.js +++ b/src/mode/coldfusion_test.js @@ -26,6 +26,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/mode/css_test.js b/src/mode/css_test.js index 63af54c296e..032a7fd3d0a 100644 --- a/src/mode/css_test.js +++ b/src/mode/css_test.js @@ -37,6 +37,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/mode/folding/basic_test.js b/src/mode/folding/basic_test.js index be152807835..992ad543f37 100644 --- a/src/mode/folding/basic_test.js +++ b/src/mode/folding/basic_test.js @@ -90,5 +90,4 @@ module.exports = { } }; -if (typeof module !== "undefined" && module === require.main) - require("asyncjs").test.testcase(module.exports).exec(); +require("../../test/run")(module); diff --git a/src/mode/folding/coffee_test.js b/src/mode/folding/coffee_test.js index a7c51bdfc3a..d872776cfba 100644 --- a/src/mode/folding/coffee_test.js +++ b/src/mode/folding/coffee_test.js @@ -62,5 +62,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) - require("asyncjs").test.testcase(module.exports).exec(); +require("../../test/run")(module); diff --git a/src/mode/folding/cstyle_test.js b/src/mode/folding/cstyle_test.js index 4f10a84dedc..743c3cc75f5 100644 --- a/src/mode/folding/cstyle_test.js +++ b/src/mode/folding/cstyle_test.js @@ -70,5 +70,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) - require("asyncjs").test.testcase(module.exports).exec(); +require("../../test/run")(module); diff --git a/src/mode/folding/drools_test.js b/src/mode/folding/drools_test.js index d73653f3cf2..bc2e43999ac 100644 --- a/src/mode/folding/drools_test.js +++ b/src/mode/folding/drools_test.js @@ -63,5 +63,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) - require("asyncjs").test.testcase(module.exports).exec(); +require("../../test/run")(module); diff --git a/src/mode/folding/fold_mode_test.js b/src/mode/folding/fold_mode_test.js index c5e06aa3eab..84c914ae5c7 100644 --- a/src/mode/folding/fold_mode_test.js +++ b/src/mode/folding/fold_mode_test.js @@ -37,5 +37,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) - require("asyncjs").test.testcase(module.exports).exec(); +require("../../test/run")(module); diff --git a/src/mode/folding/html_test.js b/src/mode/folding/html_test.js index 5f484a171ad..1ea57363dfb 100644 --- a/src/mode/folding/html_test.js +++ b/src/mode/folding/html_test.js @@ -147,5 +147,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) - require("asyncjs").test.testcase(module.exports).exec(); +require("../../test/run")(module); diff --git a/src/mode/folding/javascript_test.js b/src/mode/folding/javascript_test.js index 5c36ad3172d..78b68112288 100644 --- a/src/mode/folding/javascript_test.js +++ b/src/mode/folding/javascript_test.js @@ -56,5 +56,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) - require("asyncjs").test.testcase(module.exports).exec(); +require("../../test/run")(module); diff --git a/src/mode/folding/latex_test.js b/src/mode/folding/latex_test.js index 0a32b1b12b2..d0f3f70fcb7 100644 --- a/src/mode/folding/latex_test.js +++ b/src/mode/folding/latex_test.js @@ -26,4 +26,4 @@ module.exports = { } }; -if (typeof module !== "undefined" && module === require.main) require("asyncjs").test.testcase(module.exports).exec(); +require("../../test/run")(module); diff --git a/src/mode/folding/lua_test.js b/src/mode/folding/lua_test.js index 63c50dcbc65..e10d6f7e855 100644 --- a/src/mode/folding/lua_test.js +++ b/src/mode/folding/lua_test.js @@ -32,4 +32,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) require("asyncjs").test.testcase(module.exports).exec(); +require("../../test/run")(module); diff --git a/src/mode/folding/nunjucks_test.js b/src/mode/folding/nunjucks_test.js index 14e44359bc7..923e3e3c7d9 100644 --- a/src/mode/folding/nunjucks_test.js +++ b/src/mode/folding/nunjucks_test.js @@ -59,5 +59,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) - require("asyncjs").test.testcase(module.exports).exec(); \ No newline at end of file +require("../../test/run")(module); \ No newline at end of file diff --git a/src/mode/folding/php_test.js b/src/mode/folding/php_test.js index ac003b76cc7..6851da70717 100644 --- a/src/mode/folding/php_test.js +++ b/src/mode/folding/php_test.js @@ -97,4 +97,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) require("asyncjs").test.testcase(module.exports).exec(); +require("../../test/run")(module); diff --git a/src/mode/folding/pythonic_test.js b/src/mode/folding/pythonic_test.js index 4a65476110b..d212fa93af1 100644 --- a/src/mode/folding/pythonic_test.js +++ b/src/mode/folding/pythonic_test.js @@ -80,5 +80,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) - require("asyncjs").test.testcase(module.exports).exec(); +require("../../test/run")(module); diff --git a/src/mode/folding/ruby_test.js b/src/mode/folding/ruby_test.js index 7b74125af84..1c88d6d817f 100644 --- a/src/mode/folding/ruby_test.js +++ b/src/mode/folding/ruby_test.js @@ -242,5 +242,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) - require("asyncjs").test.testcase(module.exports).exec(); +require("../../test/run")(module); diff --git a/src/mode/folding/vbscript_test.js b/src/mode/folding/vbscript_test.js index 14945579c4a..6876383d966 100644 --- a/src/mode/folding/vbscript_test.js +++ b/src/mode/folding/vbscript_test.js @@ -51,5 +51,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) - require("asyncjs").test.testcase(module.exports).exec(); +require("../../test/run")(module); diff --git a/src/mode/folding/xml_test.js b/src/mode/folding/xml_test.js index 5171312d4ba..b25936cc597 100644 --- a/src/mode/folding/xml_test.js +++ b/src/mode/folding/xml_test.js @@ -100,5 +100,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) - require("asyncjs").test.testcase(module.exports).exec(); +require("../../test/run")(module); diff --git a/src/mode/folding/yaml_test.js b/src/mode/folding/yaml_test.js index febdefd2b5f..d71e50a7191 100644 --- a/src/mode/folding/yaml_test.js +++ b/src/mode/folding/yaml_test.js @@ -78,5 +78,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) - require("asyncjs").test.testcase(module.exports).exec(); +require("../../test/run")(module); diff --git a/src/mode/html_test.js b/src/mode/html_test.js index 0b6a1acb8f4..792908d070a 100644 --- a/src/mode/html_test.js +++ b/src/mode/html_test.js @@ -26,6 +26,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/mode/javascript_test.js b/src/mode/javascript_test.js index fe26cde8d39..f7335723198 100644 --- a/src/mode/javascript_test.js +++ b/src/mode/javascript_test.js @@ -164,6 +164,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/mode/logiql_test.js b/src/mode/logiql_test.js index 5e45d4ea5bb..37c8b14fdf6 100644 --- a/src/mode/logiql_test.js +++ b/src/mode/logiql_test.js @@ -57,6 +57,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/mode/odin_test.js b/src/mode/odin_test.js index f40b6c3e41c..f4626e91d76 100644 --- a/src/mode/odin_test.js +++ b/src/mode/odin_test.js @@ -43,6 +43,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/mode/php_test.js b/src/mode/php_test.js index c44c2bc63f8..a2a44deadc3 100644 --- a/src/mode/php_test.js +++ b/src/mode/php_test.js @@ -24,6 +24,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/mode/plain_text_test.js b/src/mode/plain_text_test.js index bdf06155432..376bae99c4f 100644 --- a/src/mode/plain_text_test.js +++ b/src/mode/plain_text_test.js @@ -15,6 +15,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/mode/python_test.js b/src/mode/python_test.js index ab97905d0ca..1578cfd931f 100644 --- a/src/mode/python_test.js +++ b/src/mode/python_test.js @@ -38,6 +38,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/mode/ruby_test.js b/src/mode/ruby_test.js index fa5b4092cf9..709ad8c94d0 100644 --- a/src/mode/ruby_test.js +++ b/src/mode/ruby_test.js @@ -164,6 +164,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/mode/text_test.js b/src/mode/text_test.js index e29742de6f4..18ae0f1451c 100644 --- a/src/mode/text_test.js +++ b/src/mode/text_test.js @@ -23,6 +23,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/mode/vbscript_test.js b/src/mode/vbscript_test.js index e1058a7da3c..aec60e40dcc 100644 --- a/src/mode/vbscript_test.js +++ b/src/mode/vbscript_test.js @@ -318,6 +318,4 @@ }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/mode/xml_test.js b/src/mode/xml_test.js index fb5fe3dc70a..cee0f92ecc4 100644 --- a/src/mode/xml_test.js +++ b/src/mode/xml_test.js @@ -34,6 +34,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/mouse/default_gutter_handler_test.js b/src/mouse/default_gutter_handler_test.js index f9f85140151..f27d9c6c9bf 100644 --- a/src/mouse/default_gutter_handler_test.js +++ b/src/mouse/default_gutter_handler_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("../test/mockdom"); } @@ -486,6 +485,4 @@ module.exports = { } }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/mouse/mouse_handler_test.js b/src/mouse/mouse_handler_test.js index 00401c6f6ee..bdbd662e0da 100644 --- a/src/mouse/mouse_handler_test.js +++ b/src/mouse/mouse_handler_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("../test/mockdom"); } @@ -309,6 +308,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/multi_select_test.js b/src/multi_select_test.js index 8e1f1331b58..2fcf24e8e0f 100644 --- a/src/multi_select_test.js +++ b/src/multi_select_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("./test/mockdom"); } @@ -357,6 +356,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/occur_test.js b/src/occur_test.js index 66b576341ca..14e4e0362a9 100644 --- a/src/occur_test.js +++ b/src/occur_test.js @@ -113,6 +113,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/placeholder_test.js b/src/placeholder_test.js index 5d6d83a60e0..3523b715d41 100644 --- a/src/placeholder_test.js +++ b/src/placeholder_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("./test/mockdom"); } @@ -122,6 +121,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/range_list_test.js b/src/range_list_test.js index bd370573ecd..f0f6c3f1aaf 100644 --- a/src/range_list_test.js +++ b/src/range_list_test.js @@ -141,6 +141,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/range_test.js b/src/range_test.js index 625a9d9426e..41c7b082798 100644 --- a/src/range_test.js +++ b/src/range_test.js @@ -150,6 +150,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/scrollbar_test.js b/src/scrollbar_test.js index 364f8604533..c225a90b912 100644 --- a/src/scrollbar_test.js +++ b/src/scrollbar_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("./test/mockdom"); } @@ -135,6 +134,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/search_test.js b/src/search_test.js index 1e08f9c214a..ba7ffa6a6d0 100644 --- a/src/search_test.js +++ b/src/search_test.js @@ -717,6 +717,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/selection_test.js b/src/selection_test.js index dd4e4f05ead..9cd4ba34455 100644 --- a/src/selection_test.js +++ b/src/selection_test.js @@ -554,6 +554,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/snippets_test.js b/src/snippets_test.js index 9caacd95cb7..b93300ee48c 100644 --- a/src/snippets_test.js +++ b/src/snippets_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("./test/mockdom"); } @@ -400,6 +399,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/test/all.js b/src/test/all.js index 0d7c35f730c..2e7271fe04a 100644 --- a/src/test/all.js +++ b/src/test/all.js @@ -1,5 +1,4 @@ "use strict"; -require("amd-loader"); var test = require("asyncjs").test; test.walkTestCases(__dirname + "/..").exec(); diff --git a/src/test/benchmark.js b/src/test/benchmark.js index c5054c12fd5..f40fcf4bc23 100644 --- a/src/test/benchmark.js +++ b/src/test/benchmark.js @@ -37,6 +37,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/test/mockdom_test.js b/src/test/mockdom_test.js index a1c44070046..d8f22227346 100644 --- a/src/test/mockdom_test.js +++ b/src/test/mockdom_test.js @@ -1,7 +1,6 @@ /*global CustomEvent*/ if (typeof process !== "undefined") { - require("amd-loader"); require("./mockdom"); } @@ -108,6 +107,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("../test/run")(module); \ No newline at end of file diff --git a/src/test/run.js b/src/test/run.js new file mode 100644 index 00000000000..14f1cf04f2c --- /dev/null +++ b/src/test/run.js @@ -0,0 +1,39 @@ + + +module.exports = function(testModule) { + if (testModule === require.main) { + require("asyncjs").test.testcase(testModule.exports).exec(); + } + else if (typeof global == "object" && global.describe && (global.it || global.test)) { + if (!global.it) global.it = global.test; + global.describe("# file: " + testModule.id, function() { + for (let i in testModule.exports) { + if (/^test/.test(i)) { + let fn = testModule.exports[i]; + if (fn.length > 0) { + global.it(i, async function() { + var done; + var p = new Promise(function(resolve) { + done = resolve; + }); + await fn.call(testModule.exports, done); + return p; + }); + } else { + global.it(i, testModule.exports[i].bind(testModule.exports)); + } + } if (/^!test/.test(i)) { + global.it.skip(i, testModule.exports[i].bind(testModule.exports)); + } else if (i == "setUp") { + global.beforeEach(testModule.exports[i].bind(testModule.exports)); + } else if (i == "tearDown") { + global.afterEach(testModule.exports[i].bind(testModule.exports)); + } else if (i == "setUpSuite") { + global.before(testModule.exports[i].bind(testModule.exports)); + } else if (i == "tearDownSuite") { + global.after(testModule.exports[i].bind(testModule.exports)); + } + } + }); + } +}; \ No newline at end of file diff --git a/src/test/util.js b/src/test/util.js deleted file mode 100644 index d5d5f379887..00000000000 --- a/src/test/util.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @returns {boolean} true if it's a Node.js environment, false otherwise - */ -function isNodeEnvironment() { - return typeof process !== "undefined"; -} - -module.exports = { - isNodeEnvironment -}; \ No newline at end of file diff --git a/src/token_iterator_test.js b/src/token_iterator_test.js index 581ec014fb8..7229ca872ec 100644 --- a/src/token_iterator_test.js +++ b/src/token_iterator_test.js @@ -1,7 +1,3 @@ -if (typeof process !== "undefined") { - require("amd-loader"); - } - "use strict"; var EditSession = require("./edit_session").EditSession; @@ -175,6 +171,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/tokenizer_test.js b/src/tokenizer_test.js index c5abf76b368..8cdc3dff8da 100644 --- a/src/tokenizer_test.js +++ b/src/tokenizer_test.js @@ -1,7 +1,3 @@ -if (typeof process !== "undefined") { - require("amd-loader"); - } - "use strict"; var Tokenizer = require("./tokenizer").Tokenizer; @@ -60,6 +56,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/tooltip_test.js b/src/tooltip_test.js index 4c1410e90b6..a672d3ce3f8 100644 --- a/src/tooltip_test.js +++ b/src/tooltip_test.js @@ -184,6 +184,4 @@ function mouse(type, pos, properties) { } -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/undomanager_test.js b/src/undomanager_test.js index e4f00b01f27..64be83ab06e 100644 --- a/src/undomanager_test.js +++ b/src/undomanager_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("./test/mockdom"); } @@ -436,6 +435,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file diff --git a/src/virtual_renderer_test.js b/src/virtual_renderer_test.js index 1da33e36529..99c293b650e 100644 --- a/src/virtual_renderer_test.js +++ b/src/virtual_renderer_test.js @@ -1,5 +1,4 @@ if (typeof process !== "undefined") { - require("amd-loader"); require("./test/mockdom"); } @@ -560,6 +559,4 @@ module.exports = { }; -if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec(); -} +require("./test/run")(module); \ No newline at end of file From 60fb34bb15729e1206896b4821521d478d01b5d6 Mon Sep 17 00:00:00 2001 From: nightwing Date: Mon, 16 Mar 2026 22:15:43 +0400 Subject: [PATCH 2/7] fix tests that rely on timeout between setup and test --- src/ext/command_bar_test.js | 3 ++- src/scrollbar_test.js | 2 ++ src/virtual_renderer_test.js | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ext/command_bar_test.js b/src/ext/command_bar_test.js index 5fc5f71af72..64bae173d2a 100644 --- a/src/ext/command_bar_test.js +++ b/src/ext/command_bar_test.js @@ -585,7 +585,8 @@ module.exports = { tooltipVisibilityCheck(true); commandBarTooltip.detach(); }, - "test: does not display if the tooltip does not fit into the screen": function() { + "test: does not display if the tooltip does not fit into the screen": async function() { + await lang.sleep(0); createTooltip(); var testString = "a".repeat(100) + diff --git a/src/scrollbar_test.js b/src/scrollbar_test.js index c225a90b912..9ad9ec85330 100644 --- a/src/scrollbar_test.js +++ b/src/scrollbar_test.js @@ -50,6 +50,8 @@ module.exports = { editor.setOptions({ customScrollbar: true }); + // TODO remove this when onresize doesn't recreate custom scrollbar + renderer.$loop._flush(); }, tearDown: function () { editor && editor.destroy(); diff --git a/src/virtual_renderer_test.js b/src/virtual_renderer_test.js index 99c293b650e..fbf7589407f 100644 --- a/src/virtual_renderer_test.js +++ b/src/virtual_renderer_test.js @@ -481,6 +481,8 @@ module.exports = { done(); }, "test: scroll cursor into view": function() { + editor.renderer.$loop._flush(); + function X(n) { return "X".repeat(n); } From e794bb5f793bfaddf5501ce14cd2b2662913802f Mon Sep 17 00:00:00 2001 From: nightwing Date: Mon, 16 Mar 2026 22:18:32 +0400 Subject: [PATCH 3/7] fix diff editor throwing errors after being destroyed --- src/ext/diff/base_diff_view.js | 9 +++++---- src/ext/diff/inline_diff_view.js | 7 ++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/ext/diff/base_diff_view.js b/src/ext/diff/base_diff_view.js index 319e1443fba..991e1a7dda2 100644 --- a/src/ext/diff/base_diff_view.js +++ b/src/ext/diff/base_diff_view.js @@ -435,13 +435,14 @@ class BaseDiffView { */ $initWidgets(editor) { var session = editor.session; + if (!session) return; if (!session.widgetManager) { session.widgetManager = new LineWidgets(session); session.widgetManager.attach(editor); } - editor.session.lineWidgets = []; - editor.session.widgetManager.lineWidgets = []; - editor.session.$resetRowCache(0); + session.lineWidgets = []; + session.widgetManager.lineWidgets = []; + session.$resetRowCache(0); } /** @@ -598,7 +599,7 @@ class BaseDiffView { if (this.savedOptionsB &&this.savedOptionsB.customScrollbar) { this.$resetDecorators(this.editorB.renderer); } - + clearTimeout(this.$onInputTimer); } $removeLineWidgets(session) { diff --git a/src/ext/diff/inline_diff_view.js b/src/ext/diff/inline_diff_view.js index 9548fc9a903..e3cb1984e51 100644 --- a/src/ext/diff/inline_diff_view.js +++ b/src/ext/diff/inline_diff_view.js @@ -140,7 +140,7 @@ class InlineDiffView extends BaseDiffView { selectEditor(editor) { if (editor == this.activeEditor) { - this.otherEditor.selection.clearSelection(); + this.otherEditor.selection && this.otherEditor.selection.clearSelection(); this.activeEditor.textInput.setHost(this.activeEditor); this.activeEditor.setStyle("ace_diff_other", false); this.cursorLayer.element.remove(); @@ -153,7 +153,7 @@ class InlineDiffView extends BaseDiffView { this.activeEditor.renderer.$markerBack.element.classList.remove("ace_hidden_marker-layer"); this.removeBracketHighlight(this.otherEditor); } else { - this.activeEditor.selection.clearSelection(); + this.activeEditor.selection && this.activeEditor.selection.clearSelection(); this.activeEditor.textInput.setHost(this.otherEditor); this.activeEditor.setStyle("ace_diff_other"); this.activeEditor.renderer.$cursorLayer.element.parentNode.appendChild( @@ -174,7 +174,7 @@ class InlineDiffView extends BaseDiffView { removeBracketHighlight(editor) { var session = editor.session; - if (session.$bracketHighlight) { + if (session && session.$bracketHighlight) { session.$bracketHighlight.markerIds.forEach(function(id) { session.removeMarker(id); }); @@ -312,6 +312,7 @@ class InlineDiffView extends BaseDiffView { } $detachSessionHandlers(editor, marker) { + if (!editor.session) return; editor.session.removeMarker(marker.id); editor.selection.off("changeCursor", this.onSelect); editor.selection.off("changeSelection", this.onSelect); From ec09ab80f12eee12d59ba38898986c87ed417305 Mon Sep 17 00:00:00 2001 From: nightwing Date: Mon, 16 Mar 2026 22:33:20 +0400 Subject: [PATCH 4/7] workaround for tests that break mocha --- src/ext/static_highlight_test.js | 17 ++++++++++++----- src/mode/_test/highlight_rules_test.js | 25 +++++++++++++++++++------ 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/ext/static_highlight_test.js b/src/ext/static_highlight_test.js index 3049ececf21..0c5c004fb33 100644 --- a/src/ext/static_highlight_test.js +++ b/src/ext/static_highlight_test.js @@ -12,11 +12,18 @@ var config = require("../config"); module.exports = { timeout: 10000, - "test loading in node": function() { - require("../test/mockdom").unload(); - if (typeof process != "undefined") - assert.equal(typeof window, "undefined"); - require("../ace"); + "test loading in node": function(done) { + if (typeof process === "undefined") { + return done(); + } + var req = require; + req("child_process").execFile(process.execPath, ["-p", "require('../ace').version"], { + cwd: __dirname + }, function(err, stdout, stderr) { + assert.ok(!err, "Failed to load ace in node: " + err); + assert.equal(stdout.trim(), config.version); + done(); + }); }, "test simple snippet": function() { diff --git a/src/mode/_test/highlight_rules_test.js b/src/mode/_test/highlight_rules_test.js index e0db6898877..0e32b090ad3 100755 --- a/src/mode/_test/highlight_rules_test.js +++ b/src/mode/_test/highlight_rules_test.js @@ -28,7 +28,7 @@ function modeList() { function checkModes() { var snippets = {}; modeList().forEach(function(modeName, i) { - console.log(padNumber(i+1, 3) + ") check: \u001b[33m" + modeName + "\u001b[0m"); + silent || console.log(padNumber(i+1, 3) + ") check: \u001b[33m" + modeName + "\u001b[0m"); try { var Mode = require("../" + modeName).Mode; } catch(e) { @@ -145,7 +145,7 @@ function checkModes() { editor.setSession(session); editor.execCommand("insertstring", "("); if (editor.getValue() != "()") - return console.log("() not paired in " + modeName); + return silent || console.log("() not paired in " + modeName); editor.execCommand("insertstring", "("); if (editor.getValue() != "(())") die("(()) not paired in " + modeName); @@ -211,7 +211,7 @@ function generateTestData(names, force) { console.warn("Can't load mode :" + modeName, p, e); return; } - console.log(modeName); + silent || console.log(modeName); var tokenizer = new Mode().getTokenizer(); var state = "start"; @@ -247,10 +247,10 @@ function test(startAt) { for (var i = Math.max(0, startAt||0); i < modes.length; i++) testMode(modes[i], i); - console.log("\u001b[32m" + "all ok" + "\u001b[0m"); + silent || console.log("\u001b[32m" + "all ok" + "\u001b[0m"); } function testMode(modeName, i) { - console.log(padNumber(i+1, 3) + ") testing: \u001b[33m" + modeName + "\u001b[0m"); + silent || console.log(padNumber(i+1, 3) + ") testing: \u001b[33m" + modeName + "\u001b[0m"); var text = fs.readFileSync(cwd + "tokens_" + modeName + ".json", "utf8"); var data = JSON.parse(text); @@ -344,9 +344,22 @@ function checkBacktracking(tokenizer) { } // cli +var silent = false; var arg = process.argv[2]; var RECHECK = process.argv.indexOf("--recheck") !== -1; -if (!arg) { +if (global.describe && global.it) { + silent = true; + global.describe("check modes", function() { + if (this.timeout) this.timeout(20000); + global.it("should check modes", function() { + checkModes(); + }); + global.it("should test modes", function() { + test(); + }); + }); +} +else if (!arg) { test(); checkModes(); } else if (/--?g(en)?/.test(arg)) From 1f990f2f0e43c223ea9a9dff3e79d7125c3326a4 Mon Sep 17 00:00:00 2001 From: nightwing Date: Mon, 16 Mar 2026 22:45:24 +0400 Subject: [PATCH 5/7] keep test list in a separate file --- src/test/all_browser.js | 90 +--------------------------------- src/test/test_list.js | 93 ++++++++++++++++++++++++++++++++++++ src/test/update_test_list.js | 17 ++----- 3 files changed, 99 insertions(+), 101 deletions(-) create mode 100644 src/test/test_list.js diff --git a/src/test/all_browser.js b/src/test/all_browser.js index 2e143f2c213..426c9437dab 100644 --- a/src/test/all_browser.js +++ b/src/test/all_browser.js @@ -19,95 +19,7 @@ var createElement = document.createElement.bind(document); var createTextNode = document.createTextNode.bind(document); var buildDom = eval("(" + buildDom.toString().replace(/document\./g, "") + ")"); -var testNames = [ - "ace/ace_test", - "ace/anchor_test", - "ace/autocomplete/inline_test", - "ace/autocomplete/popup_test", - "ace/autocomplete_test", - "ace/background_tokenizer_test", - "ace/commands/command_manager_test", - "ace/config_test", - "ace/document_test", - "ace/edit_session_test", - "ace/editor_change_document_test", - "ace/editor_commands_test", - "ace/editor_highlight_selected_word_test", - "ace/editor_navigation_test", - "ace/editor_options_test", - "ace/editor_text_edit_test", - "ace/ext/beautify_test", - "ace/ext/code_lens_test", - "ace/ext/command_bar_test", - "ace/ext/diff/diff_test", - "ace/ext/emmet_test", - "ace/ext/error_marker_test", - "ace/ext/hardwrap_test", - "ace/ext/inline_autocomplete_test", - "ace/ext/simple_tokenizer_test", - "ace/ext/static_highlight_test", - "ace/ext/whitespace_test", - "ace/incremental_search_test", - "ace/keyboard/emacs_test", - "ace/keyboard/gutter_handler_test", - "ace/keyboard/keybinding_test", - "ace/keyboard/sublime_test", - "ace/keyboard/textinput_test", - "ace/keyboard/vim_ace_test", - "ace/keyboard/vim_test", - "ace/layer/gutter_test", - "ace/layer/text_test", - "ace/lib/event_emitter_test", - "ace/marker_group_test", - "ace/mode/_test/highlight_rules_test", - "ace/mode/ada_test", - "ace/mode/behaviour/behaviour_test", - "ace/mode/coldfusion_test", - "ace/mode/css_test", - "ace/mode/folding/basic_test", - "ace/mode/folding/coffee_test", - "ace/mode/folding/cstyle_test", - "ace/mode/folding/drools_test", - "ace/mode/folding/fold_mode_test", - "ace/mode/folding/html_test", - "ace/mode/folding/javascript_test", - "ace/mode/folding/latex_test", - "ace/mode/folding/lua_test", - "ace/mode/folding/php_test", - "ace/mode/folding/pythonic_test", - "ace/mode/folding/ruby_test", - "ace/mode/folding/vbscript_test", - "ace/mode/folding/xml_test", - "ace/mode/folding/yaml_test", - "ace/mode/html_test", - "ace/mode/javascript_test", - "ace/mode/logiql_test", - "ace/mode/odin_test", - "ace/mode/php_test", - "ace/mode/plain_text_test", - "ace/mode/python_test", - "ace/mode/ruby_test", - "ace/mode/text_test", - "ace/mode/vbscript_test", - "ace/mode/xml_test", - "ace/mouse/default_gutter_handler_test", - "ace/mouse/mouse_handler_test", - "ace/multi_select_test", - "ace/occur_test", - "ace/placeholder_test", - "ace/range_list_test", - "ace/range_test", - "ace/scrollbar_test", - "ace/search_test", - "ace/selection_test", - "ace/snippets_test", - "ace/test/mockdom_test", - "ace/token_iterator_test", - "ace/tokenizer_test", - "ace/tooltip_test", - "ace/undomanager_test", - "ace/virtual_renderer_test" -]; +var testNames = require("./test_list"); var html = [ useMockdom diff --git a/src/test/test_list.js b/src/test/test_list.js new file mode 100644 index 00000000000..b95ead4ca0b --- /dev/null +++ b/src/test/test_list.js @@ -0,0 +1,93 @@ +module.exports = [ + "ace/ace_test", + "ace/anchor_test", + "ace/autocomplete/inline_test", + "ace/autocomplete/popup_test", + "ace/autocomplete_test", + "ace/background_tokenizer_test", + "ace/commands/command_manager_test", + "ace/config_test", + "ace/document_test", + "ace/edit_session_test", + "ace/editor_change_document_test", + "ace/editor_commands_test", + "ace/editor_highlight_selected_word_test", + "ace/editor_navigation_test", + "ace/editor_options_test", + "ace/editor_text_edit_test", + "ace/ext/beautify_test", + "ace/ext/code_lens_test", + "ace/ext/command_bar_test", + "ace/ext/diff/diff_test", + "ace/ext/diff_test", + "ace/ext/emmet_test", + "ace/ext/error_marker_test", + "ace/ext/hardwrap_test", + "ace/ext/inline_autocomplete_test", + "ace/ext/simple_tokenizer_test", + "ace/ext/static_highlight_test", + "ace/ext/whitespace_test", + "ace/ext/whitespaces_in_selection_test", + "ace/incremental_search_test", + "ace/keyboard/emacs_test", + "ace/keyboard/gutter_handler_test", + "ace/keyboard/keybinding_test", + "ace/keyboard/sublime_test", + "ace/keyboard/textinput_test", + "ace/keyboard/vim_ace_test", + "ace/keyboard/vim_test", + "ace/layer/gutter_test", + "ace/layer/text_markers_test", + "ace/layer/text_test", + "ace/lib/event_emitter_test", + "ace/marker_group_test", + "ace/mode/_test/highlight_rules_test", + "ace/mode/ada_test", + "ace/mode/behaviour/behaviour_test", + "ace/mode/coldfusion_test", + "ace/mode/css_test", + "ace/mode/folding/basic_test", + "ace/mode/folding/coffee_test", + "ace/mode/folding/cstyle_test", + "ace/mode/folding/drools_test", + "ace/mode/folding/fold_mode_test", + "ace/mode/folding/html_test", + "ace/mode/folding/javascript_test", + "ace/mode/folding/latex_test", + "ace/mode/folding/lua_test", + "ace/mode/folding/nunjucks_test", + "ace/mode/folding/php_test", + "ace/mode/folding/pythonic_test", + "ace/mode/folding/ruby_test", + "ace/mode/folding/vbscript_test", + "ace/mode/folding/xml_test", + "ace/mode/folding/yaml_test", + "ace/mode/html_test", + "ace/mode/javascript_test", + "ace/mode/logiql_test", + "ace/mode/odin_test", + "ace/mode/php_test", + "ace/mode/plain_text_test", + "ace/mode/python_test", + "ace/mode/ruby_test", + "ace/mode/text_test", + "ace/mode/vbscript_test", + "ace/mode/xml_test", + "ace/mouse/default_gutter_handler_test", + "ace/mouse/mouse_handler_test", + "ace/multi_select_test", + "ace/occur_test", + "ace/placeholder_test", + "ace/range_list_test", + "ace/range_test", + "ace/scrollbar_test", + "ace/search_test", + "ace/selection_test", + "ace/snippets_test", + "ace/test/mockdom_test", + "ace/token_iterator_test", + "ace/tokenizer_test", + "ace/tooltip_test", + "ace/undomanager_test", + "ace/virtual_renderer_test" +]; \ No newline at end of file diff --git a/src/test/update_test_list.js b/src/test/update_test_list.js index f1513b2049e..a5b263b32d0 100644 --- a/src/test/update_test_list.js +++ b/src/test/update_test_list.js @@ -13,19 +13,12 @@ var testFiles = stdout if (testFiles.length === 0) { console.log("No matching test files found."); - process.exit(0); + process.exit(1); } -// Read the all_browser.js file -var allBrowserFilePath = __dirname + "/all_browser.js"; -var data = fs.readFileSync(allBrowserFilePath, "utf8"); - -// Replace the testNames array with the new list -var updatedData = data.replace( - /var testNames = \[[^\]]*?\];/, - `var testNames = [\n "${testFiles.join('",\n "')}"\n];` -); +var testListFilePath = __dirname + "/test_list.js"; +var data = `module.exports = [\n "${testFiles.join('",\n "')}"\n];`; // Write the updated content back to the file -fs.writeFileSync(allBrowserFilePath, updatedData, "utf8"); -console.log("Updated testNames array in all_browser.js successfully."); +fs.writeFileSync(testListFilePath, data, "utf8"); +console.log(`Updated testNames array in ${testListFilePath} successfully.`); From ff01e8d8d3bb0d7df151b1fcc1db0a4cb7efebe4 Mon Sep 17 00:00:00 2001 From: nightwing Date: Mon, 16 Mar 2026 22:53:52 +0400 Subject: [PATCH 6/7] use mocha for tests --- .github/workflows/nodejs.yml | 16 +++++++--------- package.json | 8 +++++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 50d9f943b0a..4a29ac1ea62 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -25,16 +25,14 @@ jobs: - uses: actions/checkout@v2 - name: Fetch the master branch run: git fetch origin HEAD:refs/remotes/origin/HEAD --depth 1 - - name: Fetch the master branch - run: git diff --name-only origin/HEAD --no-renames --diff-filter=ACMR - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - run: npm i - - run: npm run cover - # run linter - - run: | + - run: npm run cover-json + - run: | + # eslint set -x; git status; git checkout HEAD -- package.json; @@ -51,22 +49,22 @@ jobs: node node_modules/eslint/bin/eslint $jsChanges; fi fi - # check types - - run: | + - run: | + # check types set -x; npx tsc -v; npm run update-types; git diff --color --exit-code ./ace*d.ts; npm run typecheck; node_modules/.bin/tsc --noImplicitAny --strict --noUnusedLocals --noImplicitReturns --noUnusedParameters --noImplicitThis ace.d.ts; - - run: | + - run: | + # test-npm-package set -x; ./tool/test-npm-package.sh # upload to codecov - uses: codecov/codecov-action@v3 with: token: d8edca4b-8e97-41e5-b54e-34c7cf3b2d47 - file: ./coverage/coverage.json flags: unittests name: codecov-umbrella fail_ci_if_error: true diff --git a/package.json b/package.json index 04555e4a19d..32b7ea027c6 100644 --- a/package.json +++ b/package.json @@ -17,9 +17,10 @@ "amd-loader": "~0.0.4", "architect-build": "https://github.com/c9/architect-build/tarball/43a6fdeffe", "asyncjs": "~0.0.12", + "c8": "^11.0.0", "dryice": "0.4.11", "eslint": "^8.20.0", - "istanbul": "^0.4.5", + "mocha": "^11.7.5", "standard-version": "^9.3.2", "typescript": "5.9.2" }, @@ -40,8 +41,9 @@ ], "scripts": { "start": "node static.js", - "test": "node src/test/all.js", - "cover": "istanbul cover src/test/all.js", + "test": "mocha \"./src/**/*_test.js\" --exit -p --color", + "cover": "c8 --reporter=lcov --reporter=text-summary npm run test", + "cover-json": "c8 --reporter=json npm run test", "lint": "eslint \"src/**/*.js\" \"*.js\"", "fix": "npm run lint -- --fix", "typecheck": "tsc -p tsconfig.json", From 3872f1d8d542fb208d4fa6a0df90c030a1fa4553 Mon Sep 17 00:00:00 2001 From: nightwing Date: Mon, 9 Mar 2026 12:01:36 +0400 Subject: [PATCH 7/7] x # Conflicts: # src/test/all_browser.js --- src/background_tokenizer_test.js | 6 +- src/test/all_browser.js | 258 ++++++++++++++++++++++++------- src/test/tests.html | 20 +++ src/tooltip_test.js | 1 + 4 files changed, 229 insertions(+), 56 deletions(-) diff --git a/src/background_tokenizer_test.js b/src/background_tokenizer_test.js index 6bbca441f49..d9b3108f3f6 100644 --- a/src/background_tokenizer_test.js +++ b/src/background_tokenizer_test.js @@ -25,7 +25,7 @@ module.exports = { "*/", "var juhu" ]); - doc.setMode("./mode/javascript"); + doc.setMode(new JavaScriptMode); forceTokenize(doc); testStates(doc, ["comment1", "start", "no_regex"]); @@ -49,7 +49,7 @@ module.exports = { "juhu", "*/" ]); - doc.setMode("./mode/javascript"); + doc.setMode(new JavaScriptMode); var updateEvent = null; doc.bgTokenizer.on("update", function(e) { @@ -92,7 +92,7 @@ module.exports = { "kinners]]--", "" ]); - doc.setMode("./mode/lua"); + doc.setMode(new LuaMode); forceTokenize(doc); var string = "bracketedString,2,start"; var comment = "bracketedComment,2,start"; diff --git a/src/test/all_browser.js b/src/test/all_browser.js index 426c9437dab..377d5572e77 100644 --- a/src/test/all_browser.js +++ b/src/test/all_browser.js @@ -1,27 +1,33 @@ "use strict"; require("ace/lib/fixoldbrowsers"); + var mockdom = require("../test/mockdom"); -var AsyncTest = require("asyncjs").test; -var async = require("asyncjs"); var buildDom = require("../lib/dom").buildDom; var escapeRegExp = require("ace/lib/lang").escapeRegExp; var useMockdom = location.search.indexOf("mock=1") != -1; var forceShow = location.search.indexOf("show=1") != -1; -var passed = 0; -var failed = 0; -var log = document.getElementById("log"); +var documentElement = document.documentElement; +var log = buildDom(["div", {id: "log"}], documentElement); // change buildDom to use real document in mockdom var createElement = document.createElement.bind(document); var createTextNode = document.createTextNode.bind(document); var buildDom = eval("(" + buildDom.toString().replace(/document\./g, "") + ")"); +window.onerror = function name(...params) { + console.error(">>>>>>>>>>>>>>", ...params) +} +window.addEventListener('unhandledrejection', (event) => { + console.error("Unhandled promise rejection:", event.promise, event.reason); +}); + var testNames = require("./test_list"); var html = [ + ["div", {ref: "summary"}], useMockdom ? ["a", {href: normalizeHref(location.search.replace('mock=1', '')) + location.hash}, "do not use mockdom"] : ["a", {href: normalizeHref(location.search + '&mock=1') + location.hash}, "use mockdom"], @@ -36,18 +42,24 @@ var html = [ for (var i in testNames) { html.push(testLink(testNames[i]), ["br"]); } - +function testHref(suiteName, name) { + var href = '?' + suiteName + (useMockdom ? "&mock=1" : ""); + if (name) href += "#" + escapeRegExp(name.replace(/^test\s*/, "")); + return href; +} function testLink(name) { - return ["a", {href:'?' + name + (useMockdom ? "&mock=1" : "")}, name.replace(/^ace\//, "")]; + return ["a", {href: testHref(name)}, name.replace(/^ace\//, "") + ".js"]; } function normalizeHref(str) { return str.replace(/([?&])&+/g, "$1"); } -var nav = buildDom(["div", {style: "position:absolute;right:0;top:0"}, html], document.body); +var refs = {}; +var nav = buildDom(["div", {id: "sidebar"}, html], documentElement, refs); if (forceShow) { + // @ts-ignore require(["ace/virtual_renderer", "ace/test/mockrenderer"], function(real, mock) { var VirtualRenderer = real.VirtualRenderer; mock.MockRenderer = function() { @@ -79,68 +91,208 @@ if (location.search) { var filter = decodeURIComponent(location.hash.substr(1)); window.onhashchange = function() { location.reload(); }; -require(selectedTests, function() { - var tests = selectedTests.map(function(x) { +// @ts-ignore +require(selectedTests, async function() { + var testSuites = selectedTests.map(function(x) { var module = require(x); module.href = x; return module; }); - async.list(tests) - .expand(function(test) { - if (filter) { - Object.keys(test).forEach(function(method) { - if (method.match(/^>?test/) && !method.match(filter)) - test[method] = undefined; - }); - } - return AsyncTest.testcase(test); - }, AsyncTest.TestGenerator) - .run() - .each(function(test, next) { - if (test.index == 1 && test.context.href) { - var href = test.context.href; - buildDom(["div", {}, testLink(href)], log); - } - + var failed = 0; + var passed = 0; + var skipped = 0; + var reporter = { + beforeEach: function(test) { + if (!test.name) return; var messageHeader = "[" + test.index + "/" + test.count + "]"; - - var node = buildDom(["div", {class: test.passed ? "passed" : "failed"}, - ["a", {href: "#" + escapeRegExp(test.name.replace(/^test\s*/, ""))}, messageHeader], + var node = buildDom(["div", {class: test.skip ? "skipped" : "waiting"}, + ["a", {href: testHref(test.testSuite.href, test.name)}, messageHeader], " ", - (test.suiteName ? test.suiteName + ": " : ""), test.name, - (test.passed ? " OK" : " FAIL") + ["span", (test.skip ? " SKIP" : " ...")], ], log); - - if (!test.passed) { - if (test.err.stack) - var err = test.err.stack; - else - var err = test.err; - - console.error(node.textContent); - console.error(err); - buildDom(["pre", {class: "error"}, err + ""], node); + test.reportNode = node; + console.log(messageHeader + test.name); + }, + afterEach: function(test) { + if (!log.parentElement) { + documentElement.appendChild(log) + debugger + } + if (!test.name) return; + if (test.skip) { + skipped++ + return; + } else if (test.passed) { + passed++; } else { - console.log(node.textContent); + failed++; } + + test.reportNode.className = test.passed ? "passed" : "failed"; + test.reportNode.lastChild.remove() + buildDom(["span", (test.passed ? " OK" : " FAIL") + " " + test.time + "ms"], test.reportNode) + if (test.error && test.error != true) + buildDom(["pre", {class: "error"}, test.error + ""], log); + if (test.error) console.log(test.fn); - next(); - }) - .each(function(test) { - if (test.passed) - passed += 1; - else - failed += 1; - }) - .end(function() { + refs.summary.innerText = "Passed: " + passed + ", Failed: " + failed + ", Skipped: " + skipped; + }, + before: function(testSuite) { + var counter = " [" + testSuite.index + "/" + testSuite.count + "]"; + var href = testSuite.href; + buildDom(["div", {}, testLink(href), counter], log); + console.log(href, counter); + }, + after: function(test) { + + }, + done: function() { + if (!log.parentElement) { + documentElement.appendChild(log) + debugger + } var node = buildDom(["div", {class: "summary"}, ["br"], "Summary:", ["br"], ["br"], - "Total number of tests: " + (passed + failed), ["br"], + "Total number of tests: " + (passed + failed + skipped), ["br"], (passed && [null, "Passed tests: " + passed, ["br"]]), + (passed && [null, "Passed tests: " + skipped, ["br"]]), (failed && [null, "Failed tests: " + failed]) ], log); console.log(node.innerText); + } + }; + + var stepIndex = 0 + async function runStep() { + try { + var step = steps[stepIndex++]; + if (!step) return; + if (step.type == "before") { + reporter.before(step.testSuite); + } + try { + if (step.fn) await runTimed(step) + } finally { + if (step.type == "after") { + reporter.after(step.testSuite); + } else if (step.type == "done") { + reporter.done(); + } + } + } finally { + if (!step) return; + setTimeout(runStep,0); + } + } + async function runTimed(step, callback) { + var fn = step.fn; + var testSuite = step.testSuite; + + var resolve; + var result = new Promise(function(resolve_, reject_) { + resolve = resolve_; }); + result.name = step.name; + + var doneCalled = false; + var done = function(error) { + if (doneCalled) return; + if (error) step.error = error; + step.passed = !step.error; + clearTimeout(timeoutId); + step.time = Date.now() - t; + doneCalled = true; + resolve(); + reporter.afterEach(step); + }; + var timeout = testSuite.timeout || 3000; + var interactiveTimeStep = 100; + var remainingTime = timeout; + var timeoutId = setTimeout(function wait() { + remainingTime -= interactiveTimeStep; + if (remainingTime > 0) { + timeoutId = setTimeout(wait, Math.min(interactiveTimeStep, remainingTime)) + } else { + done(new Error("Source did not respond after " + timeout + "ms!")) + } + }, Math.min(interactiveTimeStep, remainingTime)); + + var t = Date.now(); + step.passed = false; + reporter.beforeEach(step); + var callFailed = true; + try { + (fn.length ? fn.call(testSuite, done) : fn.call(testSuite)); + callFailed = false; + } finally { + if (!fn.length) + done(callFailed) + return result; + } + } + +var currentStep +var waitForStepCallback; +var watchdog +async function runAll() { + watchdog = setInterval(() => { + if (!currentStep) return; + currentStep.interactiveTime = (currentStep.interactiveTime || 0) + 50; + if (currentStep.interactiveTime >= currentStep.timeout) { + if (currentStep.error == undefined) + currentStep.error = new Error("Source did not respond after " + (currentStep.timeout || 0) + "ms!"); + waitForStepCallback() + } + }, 50); + while (currentStep = steps.shift()) { + currentStep.timeout = (currentStep?.testSuite.timeout || 3000); + var waitForStep = new Promise(resolve => { waitForStepCallback = resolve }); + setTimeout(runOne, 0); + await waitForStep + } + clearInterval(watchdog); +} +async function runOne() { + debugger + waitForStepCallback() +} + + var steps = []; + for (var i = 0; i < testSuites.length; i++) { + var testSuite = testSuites[i]; + testSuite.index = i + 1; + testSuite.count = testSuites.length; + + var testArray = []; + Object.keys(testSuite).forEach(name => { + if (!name.match(/^>?test/)) + return; + var test = {name, testSuite, fn: testSuite[name]}; + if (filter && !test.name.match(filter)) { + test.skip = true; + } + testArray.push(test); + }) + + if (!testArray.length) continue; + + steps.push({type: "before", testSuite, fn: testSuite.setUpSuite}) + for (var j = 0; j < testArray.length; j++) { + var test = testArray[j]; + test.index = j + 1; + test.count = testArray.length; + steps.push({type: "beforeEach", testSuite, fn: testSuite.setUp}); + steps.push(test); + steps.push({type: "afterEach", testSuite, fn: testSuite.tearDown}); + } + steps.push({type: "after", testSuite, fn: testSuite.tearDownSuite}); + } + + steps.push({type: "done"}) + + runStep(); + + // runAll() }); diff --git a/src/test/tests.html b/src/test/tests.html index c67f2bc81f7..2f384283d53 100644 --- a/src/test/tests.html +++ b/src/test/tests.html @@ -17,6 +17,26 @@ #log pre.error { color: black; } + #log .skipped { + color: lightblue; + } + #sidebar { + height: 100vh; + overflow: auto; + position: absolute; + right:0; + top:0 + } + + #log { + height: 100vh; + overflow: auto; + position: absolute; + left:0; + + right:30em; + top:0 + } diff --git a/src/tooltip_test.js b/src/tooltip_test.js index a672d3ce3f8..7dc0ba978fc 100644 --- a/src/tooltip_test.js +++ b/src/tooltip_test.js @@ -13,6 +13,7 @@ var dom = require("./lib/dom"); var lang = require("./lib/lang"); var editor, docTooltip; + module.exports = { setUp: function() { docTooltip = new HoverTooltip();