kokopu-react 3.1.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.yml +1 -1
- package/CHANGELOG.md +10 -0
- package/dist/lib/chessboard/BoardProperties.js.map +1 -1
- package/dist/lib/chessboard/Chessboard.css +13 -13
- package/dist/lib/chessboard/Chessboard.d.ts +27 -2
- package/dist/lib/chessboard/Chessboard.js +36 -17
- package/dist/lib/chessboard/Chessboard.js.map +1 -1
- package/dist/lib/chessboard/ChessboardImpl.js.map +1 -1
- package/dist/lib/chessboard/Draggable.js.map +1 -1
- package/dist/lib/chessboard/Motion.js.map +1 -1
- package/dist/lib/chessboard/colorsets.js.map +1 -1
- package/dist/lib/chessboard/piecesets.js.map +1 -1
- package/dist/lib/errorbox/ErrorBox.css +18 -18
- package/dist/lib/errorbox/ErrorBox.js.map +1 -1
- package/dist/lib/errorbox/parsing.js.map +1 -1
- package/dist/lib/exception.js.map +1 -1
- package/dist/lib/i18n.d.ts +1 -0
- package/dist/lib/i18n.js +1 -0
- package/dist/lib/i18n.js.map +1 -1
- package/dist/lib/icons/AnnotationSymbolShape.css +6 -6
- package/dist/lib/icons/AnnotationSymbolShape.js.map +1 -1
- package/dist/lib/icons/ArrowMarkerIcon.js.map +1 -1
- package/dist/lib/icons/ArrowTip.js.map +1 -1
- package/dist/lib/icons/ChessPieceIcon.js.map +1 -1
- package/dist/lib/icons/SquareMarkerIcon.js.map +1 -1
- package/dist/lib/icons/TextMarkerIcon.js.map +1 -1
- package/dist/lib/icons/arrow.css +1 -1
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +1 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/movetext/Movetext.css +27 -27
- package/dist/lib/movetext/Movetext.js.map +1 -1
- package/dist/lib/movetext/MovetextImpl.js.map +1 -1
- package/dist/lib/movetext/fonts.css +7 -7
- package/dist/lib/movetext/htmlFilter.js.map +1 -1
- package/dist/lib/movetext/moveFormatter.js.map +1 -1
- package/dist/lib/navigationboard/NavigationBoard.d.ts +68 -1
- package/dist/lib/navigationboard/NavigationBoard.js +141 -13
- package/dist/lib/navigationboard/NavigationBoard.js.map +1 -1
- package/dist/lib/navigationboard/NavigationButton.d.ts +66 -0
- package/dist/lib/navigationboard/NavigationButton.js +67 -0
- package/dist/lib/navigationboard/NavigationButton.js.map +1 -0
- package/dist/lib/navigationboard/NavigationField.css +7 -7
- package/dist/lib/navigationboard/NavigationField.js.map +1 -1
- package/dist/lib/navigationboard/NavigationToolbar.css +16 -13
- package/dist/lib/navigationboard/NavigationToolbar.d.ts +10 -10
- package/dist/lib/navigationboard/NavigationToolbar.js +61 -79
- package/dist/lib/navigationboard/NavigationToolbar.js.map +1 -1
- package/dist/lib/navigationboard/iconPaths.d.ts +29 -0
- package/dist/lib/navigationboard/iconPaths.js +91 -0
- package/dist/lib/navigationboard/iconPaths.js.map +1 -0
- package/dist/lib/sanitization.js.map +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/util.js.map +1 -1
- package/doc_src/demo/PageChessboardBase.tsx +115 -115
- package/doc_src/demo/PageChessboardInteraction.tsx +303 -303
- package/doc_src/demo/PageChessboardMove.tsx +173 -173
- package/doc_src/demo/PageChessboardSmallScreens.tsx +94 -94
- package/doc_src/demo/PageMovetextBase.tsx +180 -180
- package/doc_src/demo/PageMovetextInteraction.tsx +123 -123
- package/doc_src/demo/PageNavigationBoardBase.tsx +144 -137
- package/doc_src/demo/PageNavigationBoardUncontrolledVsControlled.tsx +69 -69
- package/doc_src/demo/decs.d.ts +4 -4
- package/doc_src/demo/demo.css +12 -12
- package/doc_src/demo/util.ts +1 -1
- package/doc_src/examples/NavigationBoard.md +1 -1
- package/doc_src/theming/LogoRenderer.js +13 -13
- package/doc_src/theming/theming.css +5 -5
- package/package.json +95 -95
- package/scripts/doc.styleguide.config.js +131 -131
- package/scripts/doc.tsconfig.json +5 -5
- package/scripts/docker-compose.yml +1 -1
- package/scripts/test-graphic.tsconfig.json +5 -5
- package/scripts/test-graphic.webpack.config.js +57 -57
- package/scripts/test-headless.webpack.config.js +29 -29
- package/src/chessboard/BoardProperties.ts +68 -68
- package/src/chessboard/Chessboard.css +13 -13
- package/src/chessboard/Chessboard.tsx +436 -380
- package/src/chessboard/ChessboardImpl.tsx +557 -557
- package/src/chessboard/Draggable.tsx +185 -185
- package/src/chessboard/Motion.tsx +67 -67
- package/src/chessboard/colorsets.ts +66 -66
- package/src/chessboard/piecesets.ts +84 -84
- package/src/decs.d.ts +2 -2
- package/src/errorbox/ErrorBox.css +18 -18
- package/src/errorbox/ErrorBox.tsx +75 -75
- package/src/errorbox/parsing.tsx +95 -95
- package/src/exception.ts +17 -17
- package/src/i18n.ts +1 -0
- package/src/icons/AnnotationSymbolShape.css +6 -6
- package/src/icons/AnnotationSymbolShape.tsx +31 -31
- package/src/icons/ArrowMarkerIcon.tsx +34 -34
- package/src/icons/ArrowTip.tsx +14 -14
- package/src/icons/ChessPieceIcon.tsx +45 -45
- package/src/icons/SquareMarkerIcon.tsx +20 -20
- package/src/icons/TextMarkerIcon.tsx +29 -29
- package/src/icons/arrow.css +1 -1
- package/src/index.ts +3 -2
- package/src/movetext/Movetext.css +27 -27
- package/src/movetext/Movetext.tsx +158 -158
- package/src/movetext/MovetextImpl.tsx +345 -345
- package/src/movetext/fonts.css +7 -7
- package/src/movetext/htmlFilter.tsx +129 -129
- package/src/movetext/moveFormatter.tsx +37 -37
- package/src/navigationboard/NavigationBoard.tsx +386 -180
- package/src/navigationboard/NavigationButton.ts +114 -0
- package/src/navigationboard/NavigationField.css +7 -7
- package/src/navigationboard/NavigationField.tsx +90 -90
- package/src/navigationboard/NavigationToolbar.css +16 -13
- package/src/navigationboard/NavigationToolbar.tsx +98 -112
- package/src/navigationboard/iconPaths.ts +98 -0
- package/src/sanitization.ts +17 -17
- package/src/types.ts +116 -116
- package/src/util.ts +11 -11
- package/test/01_types.js +167 -167
- package/test/02_chessboard_util.js +191 -115
- package/test/03_error_box_graphic.js +16 -16
- package/test/04_icons_graphic.js +32 -32
- package/test/05_chessboard_graphic.js +60 -60
- package/test/06_chessboard_animation.js +36 -36
- package/test/07_chessboard_interaction.js +101 -101
- package/test/08_chessboard_play_moves.js +62 -62
- package/test/09_chessboard_small_screens.js +32 -32
- package/test/10_movetext_graphic.js +32 -32
- package/test/11_movetext_interaction.js +100 -100
- package/test/12_navigation_board_base.js +151 -0
- package/test/13_navigation_board_graphic.js +68 -0
- package/test/14_navigation_board_autoplay.js +100 -0
- package/test/common/graphic.js +106 -97
- package/test/graphic_references/12_navigation_board_base/controlled/default.png +0 -0
- package/test/graphic_references/{12_navigation_board/controlled/forbidden_navigation_1.png → 12_navigation_board_base/controlled/forbidden_navigation_0.png} +0 -0
- package/test/graphic_references/{12_navigation_board/controlled/invalid_node_id.png → 12_navigation_board_base/controlled/forbidden_navigation_1.png} +0 -0
- package/test/graphic_references/{12_navigation_board/controlled/forbidden_navigation_0.png → 12_navigation_board_base/controlled/invalid_node_id.png} +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/no_callback_defined_0.png +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/controlled/no_callback_defined_1.png +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/controlled/overriding_initial_node_id.png +0 -0
- package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_1.png → 12_navigation_board_base/controlled/regular_navigation_0.png} +0 -0
- package/test/graphic_references/{12_navigation_board/uncontrolled/initial_state_at_specific_id.png → 12_navigation_board_base/controlled/regular_navigation_1.png} +0 -0
- package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_3.png → 12_navigation_board_base/controlled/regular_navigation_2.png} +0 -0
- package/test/graphic_references/{12_navigation_board/controlled/regular_navigation_0.png → 12_navigation_board_base/controlled/regular_navigation_3.png} +0 -0
- package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_2.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_0.png} +0 -0
- package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_0.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_1.png} +0 -0
- package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_beginning_1.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_2.png} +0 -0
- package/test/graphic_references/{12_navigation_board/controlled/no_callback_defined_0.png → 12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_0.png} +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_2.png +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_at_end.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_at_specific_id.png +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_default.png +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_default_with_game_index.png +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/initial_state_on_null-move.png +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_1.png +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_2.png +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_3.png +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/navigation_with_keys_4.png +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_flipping_0.png +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_flipping_1.png +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_0.png +0 -0
- package/test/graphic_references/{12_navigation_board/controlled/default.png → 12_navigation_board_base/uncontrolled/regular_navigation_1.png} +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_2.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_3.png +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_4.png +0 -0
- package/test/graphic_references/{12_navigation_board → 12_navigation_board_base}/uncontrolled/regular_navigation_5.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_1.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_2.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/additional_buttons/multiple_buttons.png +0 -0
- package/test/graphic_references/{12_navigation_board/uncontrolled/regular_navigation_3.png → 13_navigation_board_graphic/additional_buttons/single_button.png} +0 -0
- package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/custom_1.png +0 -0
- package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/custom_2.png +0 -0
- package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/large.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/theme/small.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_acknowledging_is-playing_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_not_acknowledging_is-playing_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_acknowledging_node_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_not_acknowledging_node_changes.png +0 -0
- package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_1.png → 14_navigation_board_autoplay/controlled/after_reaching_the_end.png} +0 -0
- package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_2.png → 14_navigation_board_autoplay/controlled/already_at_the_end.png} +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_is-playing_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_node_changes.png +0 -0
- package/test/graphic_references/{12_navigation_board/uncontrolled/forbidden_navigation_at_end_0.png → 14_navigation_board_autoplay/controlled/initial_state_at_the_end.png} +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_close_to_end.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_is-playing_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_node_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_after_stop.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_before_stop.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_after_stop.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_before_stop.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/initial_state_close_to_end.png +0 -0
- package/test/graphic_references/{12_navigation_board/uncontrolled/navigation_with_keys_1.png → 14_navigation_board_autoplay/uncontrolled/initial_state_default.png} +0 -0
- package/test/graphic_test_app/03_error_box_graphic/base.tsx +14 -14
- package/test/graphic_test_app/03_error_box_graphic/localization.tsx +1 -1
- package/test/graphic_test_app/04_icons_graphic/chess_piece.tsx +7 -7
- package/test/graphic_test_app/04_icons_graphic/marker.tsx +15 -15
- package/test/graphic_test_app/05_chessboard_graphic/annotations.tsx +7 -7
- package/test/graphic_test_app/05_chessboard_graphic/base.tsx +6 -6
- package/test/graphic_test_app/05_chessboard_graphic/chess_variants.tsx +7 -7
- package/test/graphic_test_app/05_chessboard_graphic/flipped.tsx +5 -5
- package/test/graphic_test_app/05_chessboard_graphic/move.tsx +12 -12
- package/test/graphic_test_app/05_chessboard_graphic/theme.tsx +12 -12
- package/test/graphic_test_app/06_chessboard_animation/base_1.tsx +6 -6
- package/test/graphic_test_app/06_chessboard_animation/base_2.tsx +6 -6
- package/test/graphic_test_app/06_chessboard_animation/base_3.tsx +6 -6
- package/test/graphic_test_app/06_chessboard_animation/on_redraw.tsx +16 -16
- package/test/graphic_test_app/07_chessboard_interaction/click_squares.tsx +5 -5
- package/test/graphic_test_app/07_chessboard_interaction/edit_arrows.tsx +4 -4
- package/test/graphic_test_app/07_chessboard_interaction/error.tsx +2 -2
- package/test/graphic_test_app/07_chessboard_interaction/move_pieces.tsx +5 -5
- package/test/graphic_test_app/08_chessboard_play_moves/base.tsx +8 -8
- package/test/graphic_test_app/08_chessboard_play_moves/promotions.tsx +4 -4
- package/test/graphic_test_app/09_chessboard_small_screens/base.tsx +9 -9
- package/test/graphic_test_app/09_chessboard_small_screens/top_bottom_components.tsx +9 -9
- package/test/graphic_test_app/10_movetext_graphic/base.tsx +4 -4
- package/test/graphic_test_app/10_movetext_graphic/error.tsx +6 -6
- package/test/graphic_test_app/10_movetext_graphic/format_move.tsx +1 -1
- package/test/graphic_test_app/10_movetext_graphic/html.tsx +5 -5
- package/test/graphic_test_app/10_movetext_graphic/options.tsx +10 -10
- package/test/graphic_test_app/11_movetext_interaction/error.tsx +1 -1
- package/test/graphic_test_app/11_movetext_interaction/select_moves.tsx +11 -11
- package/test/graphic_test_app/{12_navigation_board → 12_navigation_board_base}/controlled.tsx +5 -5
- package/test/graphic_test_app/{12_navigation_board → 12_navigation_board_base}/uncontrolled.tsx +7 -7
- package/test/graphic_test_app/13_navigation_board_graphic/additional_buttons.tsx +49 -0
- package/test/graphic_test_app/{12_navigation_board → 13_navigation_board_graphic}/error.tsx +2 -2
- package/test/graphic_test_app/{12_navigation_board → 13_navigation_board_graphic}/theme.tsx +4 -4
- package/test/graphic_test_app/14_navigation_board_autoplay/controlled.tsx +73 -0
- package/test/graphic_test_app/14_navigation_board_autoplay/uncontrolled.tsx +34 -0
- package/test/graphic_test_app/common/decs.d.ts +2 -2
- package/test/graphic_test_app/common/test_app.css +15 -15
- package/test/graphic_test_app/common/test_app.tsx +48 -48
- package/tsconfig.json +13 -13
- package/test/12_navigation_board.js +0 -168
- package/test/graphic_references/12_navigation_board/controlled/regular_navigation_2.png +0 -0
- package/test/graphic_references/12_navigation_board/theme/small.png +0 -0
- package/test/graphic_references/12_navigation_board/uncontrolled/regular_navigation_1.png +0 -0
- /package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/error/pgn_parsing_error.png +0 -0
- /package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/error/wrong_game_type.png +0 -0
package/test/common/graphic.js
CHANGED
|
@@ -34,38 +34,39 @@ const outputDir = rootDir + '/build/graphic_output';
|
|
|
34
34
|
const coverageDir = rootDir + '/build/.nyc_output';
|
|
35
35
|
|
|
36
36
|
const UNREACHABLE_TEST_CLIENT_MESSAGE =
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
'Cannot reach the Dockerized Selenium webbrowser used for graphic tests (probably because the test environment is not running).\n' +
|
|
38
|
+
'\n' +
|
|
39
|
+
'Use command `npm run test_env:start` to start the test environment.\n' +
|
|
40
|
+
'Do not forget to run `npm run test_env:stop` when finished.\n';
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
const ANIMATION_DELAY = 200;
|
|
44
|
+
const AUTOPLAY_DELAY = 1000;
|
|
44
45
|
|
|
45
46
|
|
|
46
47
|
/**
|
|
47
48
|
* Create a Mocha test-suite that runs graphic tests in Dockerized Selenium webbrowser.
|
|
48
49
|
*/
|
|
49
50
|
exports.describeWithBrowser = function(suiteLabel, testFactory) {
|
|
50
|
-
|
|
51
|
+
describe(suiteLabel, function() {
|
|
51
52
|
|
|
52
|
-
|
|
53
|
-
|
|
53
|
+
// Fetching a new page in the browser may take a while, thus increase the timeout threshold.
|
|
54
|
+
this.timeout(10000);
|
|
54
55
|
|
|
55
|
-
|
|
56
|
-
|
|
56
|
+
// Configure the browser context.
|
|
57
|
+
const browserContext = {};
|
|
57
58
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
before(async () => {
|
|
60
|
+
await openBrowser(browserContext);
|
|
61
|
+
});
|
|
61
62
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
after(async () => {
|
|
64
|
+
await closeBrowser(browserContext);
|
|
65
|
+
});
|
|
65
66
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
// Register the tests.
|
|
68
|
+
testFactory(browserContext);
|
|
69
|
+
});
|
|
69
70
|
};
|
|
70
71
|
|
|
71
72
|
|
|
@@ -74,15 +75,15 @@ exports.describeWithBrowser = function(suiteLabel, testFactory) {
|
|
|
74
75
|
*/
|
|
75
76
|
async function openBrowser(browserContext) {
|
|
76
77
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
78
|
+
// Start the browser and ensure it can fetch something.
|
|
79
|
+
const capabilities = Capabilities.firefox();
|
|
80
|
+
const driver = new Builder().usingServer('http://localhost:4444').withCapabilities(capabilities).build();
|
|
81
|
+
await driver.get('file:///app/build/test_graphic/heartbeat.txt').catch(reason => {
|
|
82
|
+
return Promise.reject(reason.message.includes('ECONNREFUSED') ? new Error(UNREACHABLE_TEST_CLIENT_MESSAGE) : reason);
|
|
83
|
+
});
|
|
83
84
|
|
|
84
|
-
|
|
85
|
-
|
|
85
|
+
// Initialize the browser context
|
|
86
|
+
browserContext.driver = driver;
|
|
86
87
|
}
|
|
87
88
|
|
|
88
89
|
|
|
@@ -90,16 +91,16 @@ async function openBrowser(browserContext) {
|
|
|
90
91
|
* Close the given browser.
|
|
91
92
|
*/
|
|
92
93
|
async function closeBrowser(browserContext) {
|
|
93
|
-
|
|
94
|
+
if (browserContext.driver) {
|
|
94
95
|
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
// Save the coverage data before closing the browser.
|
|
97
|
+
await saveCoverage(browserContext);
|
|
97
98
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
// Close the browser and clean its context.
|
|
100
|
+
await browserContext.driver.quit();
|
|
101
|
+
delete browserContext.driver;
|
|
102
|
+
delete browserContext.latestTestCase;
|
|
103
|
+
}
|
|
103
104
|
}
|
|
104
105
|
|
|
105
106
|
|
|
@@ -107,21 +108,21 @@ async function closeBrowser(browserContext) {
|
|
|
107
108
|
* Save the coverage data, if any.
|
|
108
109
|
*/
|
|
109
110
|
async function saveCoverage(browserContext) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
111
|
+
if (!browserContext.latestTestCase) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Allocate a filename to save the coverage data.
|
|
116
|
+
let pageIndex = 0;
|
|
117
|
+
let coverageFile = '';
|
|
118
|
+
do {
|
|
119
|
+
coverageFile = `${coverageDir}/${browserContext.latestTestCase.replaceAll('/', '__')}-${pageIndex}.json`;
|
|
120
|
+
++pageIndex;
|
|
121
|
+
} while (fs.existsSync(coverageFile));
|
|
122
|
+
|
|
123
|
+
// Retrieve and save the coverage data.
|
|
124
|
+
const coverageData = await browserContext.driver.executeScript('return JSON.stringify(window.__coverage__)');
|
|
125
|
+
fs.writeFileSync(coverageFile, coverageData);
|
|
125
126
|
}
|
|
126
127
|
|
|
127
128
|
|
|
@@ -129,17 +130,17 @@ async function saveCoverage(browserContext) {
|
|
|
129
130
|
* Open the page corresponding to the given test-case.
|
|
130
131
|
*/
|
|
131
132
|
async function fetchTestCase(browserContext, testCaseName) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
if (browserContext.latestTestCase === testCaseName) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
135
136
|
|
|
136
|
-
|
|
137
|
-
|
|
137
|
+
// Save coverage data before changing the page.
|
|
138
|
+
await saveCoverage(browserContext);
|
|
138
139
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
140
|
+
// Fetch the new page.
|
|
141
|
+
await browserContext.driver.get(`file:///app/build/test_graphic/${testCaseName}/index.html`);
|
|
142
|
+
browserContext.latestTestCase = testCaseName;
|
|
143
|
+
await waitForAnimation();
|
|
143
144
|
}
|
|
144
145
|
|
|
145
146
|
|
|
@@ -147,7 +148,15 @@ async function fetchTestCase(browserContext, testCaseName) {
|
|
|
147
148
|
* Wait until the end of the chessboard animations.
|
|
148
149
|
*/
|
|
149
150
|
const waitForAnimation = exports.waitForAnimation = async function() {
|
|
150
|
-
|
|
151
|
+
await new Promise(resolve => setTimeout(resolve, ANIMATION_DELAY));
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Wait until the given number of moves have been auto-played.
|
|
157
|
+
*/
|
|
158
|
+
exports.waitForAutoplay = async function(nbMoves) {
|
|
159
|
+
await new Promise(resolve => setTimeout(resolve, (nbMoves + 0.5) * AUTOPLAY_DELAY));
|
|
151
160
|
};
|
|
152
161
|
|
|
153
162
|
|
|
@@ -156,13 +165,13 @@ const waitForAnimation = exports.waitForAnimation = async function() {
|
|
|
156
165
|
*/
|
|
157
166
|
const takeScreenshot = exports.takeScreenshot = async function(browserContext, imageBaseName, element) {
|
|
158
167
|
|
|
159
|
-
|
|
160
|
-
|
|
168
|
+
imageBaseName = imageBaseName.replaceAll(' ', '_').toLowerCase();
|
|
169
|
+
const actualFilename = `${outputDir}/${browserContext.latestTestCase}/${imageBaseName}.png`;
|
|
161
170
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
171
|
+
// Take a screenshot of the targeted element.
|
|
172
|
+
const image = await element.takeScreenshot();
|
|
173
|
+
fs.mkdirSync(path.dirname(actualFilename), { recursive: true });
|
|
174
|
+
fs.writeFileSync(actualFilename, image, 'base64');
|
|
166
175
|
};
|
|
167
176
|
|
|
168
177
|
|
|
@@ -171,18 +180,18 @@ const takeScreenshot = exports.takeScreenshot = async function(browserContext, i
|
|
|
171
180
|
*/
|
|
172
181
|
const compareScreenshot = exports.compareScreenshot = async function(browserContext, imageBaseName) {
|
|
173
182
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
183
|
+
imageBaseName = imageBaseName.replaceAll(' ', '_').toLowerCase();
|
|
184
|
+
const actualFilename = `${outputDir}/${browserContext.latestTestCase}/${imageBaseName}.png`;
|
|
185
|
+
const expectedFilename = `${referenceDir}/${browserContext.latestTestCase}/${imageBaseName}.png`;
|
|
186
|
+
const differenceFilename = `${outputDir}/${browserContext.latestTestCase}/${imageBaseName}.diff.png`;
|
|
187
|
+
|
|
188
|
+
// Compare the current screenshot to the reference.
|
|
189
|
+
const result = await imgDiff({
|
|
190
|
+
actualFilename: actualFilename,
|
|
191
|
+
expectedFilename: expectedFilename,
|
|
192
|
+
diffFilename: differenceFilename,
|
|
193
|
+
});
|
|
194
|
+
test.object(result).hasProperty('imagesAreSame', true);
|
|
186
195
|
};
|
|
187
196
|
|
|
188
197
|
|
|
@@ -190,8 +199,8 @@ const compareScreenshot = exports.compareScreenshot = async function(browserCont
|
|
|
190
199
|
* Compare content of the sandbox to the expected text.
|
|
191
200
|
*/
|
|
192
201
|
exports.compareSandbox = async function(browserContext, expectedText) {
|
|
193
|
-
|
|
194
|
-
|
|
202
|
+
const actualText = await browserContext.driver.findElement(By.id('sandbox')).getText();
|
|
203
|
+
test.value(actualText).is(expectedText);
|
|
195
204
|
};
|
|
196
205
|
|
|
197
206
|
|
|
@@ -199,10 +208,10 @@ exports.compareSandbox = async function(browserContext, expectedText) {
|
|
|
199
208
|
* Set the content of the sandbox to the given value.
|
|
200
209
|
*/
|
|
201
210
|
exports.setSandbox = async function(browserContext, value) {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
211
|
+
if (/[^\w \-=]/.test(value)) {
|
|
212
|
+
throw new Error('Invalid characters found in the sandox message.');
|
|
213
|
+
}
|
|
214
|
+
await browserContext.driver.executeScript(`document.getElementById("sandbox").innerText = "${value}"`);
|
|
206
215
|
};
|
|
207
216
|
|
|
208
217
|
|
|
@@ -210,8 +219,8 @@ exports.setSandbox = async function(browserContext, value) {
|
|
|
210
219
|
* Set the width of the browser.
|
|
211
220
|
*/
|
|
212
221
|
exports.setWindowWidth = async function(browserContext, width) {
|
|
213
|
-
|
|
214
|
-
|
|
222
|
+
const { height } = await await browserContext.driver.manage().window().getRect();
|
|
223
|
+
await browserContext.driver.manage().window().setRect({ width: width, height: height });
|
|
215
224
|
};
|
|
216
225
|
|
|
217
226
|
|
|
@@ -219,11 +228,11 @@ exports.setWindowWidth = async function(browserContext, width) {
|
|
|
219
228
|
* Open the page corresponding to the given test-case, and execute the given scenario.
|
|
220
229
|
*/
|
|
221
230
|
const itCustom = exports.itCustom = function(browserContext, testCaseName, itemIndex, itemName, scenario) {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
231
|
+
it(`${testCaseName} - ${itemName}`, async () => {
|
|
232
|
+
await fetchTestCase(browserContext, testCaseName);
|
|
233
|
+
const element = await browserContext.driver.findElement(By.id('test-item-' + itemIndex));
|
|
234
|
+
await scenario(element);
|
|
235
|
+
});
|
|
227
236
|
};
|
|
228
237
|
|
|
229
238
|
|
|
@@ -231,11 +240,11 @@ const itCustom = exports.itCustom = function(browserContext, testCaseName, itemI
|
|
|
231
240
|
* Open the page corresponding to the given test-case, take a screenshot for each item, and compare them to the reference.
|
|
232
241
|
*/
|
|
233
242
|
exports.itChecksScreenshots = function(browserContext, testCaseName, itemNames) {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
243
|
+
for (let i = 0; i < itemNames.length; ++i) {
|
|
244
|
+
const itemName = itemNames[i];
|
|
245
|
+
itCustom(browserContext, testCaseName, i, itemName, async element => {
|
|
246
|
+
await takeScreenshot(browserContext, itemName, element);
|
|
247
|
+
await compareScreenshot(browserContext, itemName);
|
|
248
|
+
});
|
|
249
|
+
}
|
|
241
250
|
};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_1.png
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_3.png
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/test/graphic_references/13_navigation_board_graphic/additional_buttons/multiple_buttons.png
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/test/graphic_references/{12_navigation_board → 13_navigation_board_graphic}/theme/large.png
RENAMED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -28,21 +28,21 @@ import { ErrorBox } from '../../../dist/lib/index';
|
|
|
28
28
|
|
|
29
29
|
testApp([ /* eslint-disable react/jsx-key */
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
<ErrorBox title="I'm the title" message="I'm the message" />,
|
|
32
|
+
<ErrorBox title="The title" message="Keep both the beginning and the end" text="| Error: x <- is here" errorIndex={9} lineNumber={1} />,
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
<ErrorBox title="No error index" message="Nothing below" text="You will not see this..." />,
|
|
35
|
+
<ErrorBox title="No error text" message="Nothing below" errorIndex={1} />,
|
|
36
|
+
<ErrorBox title="Negative error index" message="Nothing below" text="You will not see this..." errorIndex={-1} />,
|
|
37
|
+
<ErrorBox title="Too large error index" message="Nothing below" text="You will not see this..." errorIndex={100} />,
|
|
38
|
+
<ErrorBox title="Error index not an integer" message="Nothing below" text="You will not see this..." errorIndex={2.3} />,
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
40
|
+
<ErrorBox title="Cut the end of the text" message="and keep all the beginning" text="| x <- the error is there and the rest of the line is cut because too long"
|
|
41
|
+
errorIndex={2} />,
|
|
42
|
+
<ErrorBox title="Cut the beginning of the text" message="and keep all the end" text="The error is there -> x 234567890 234567890 234567890 234567890"
|
|
43
|
+
errorIndex={22} lineNumber={0} />,
|
|
44
|
+
<ErrorBox title="Cut on line breaks" message="both at the beginning and at the end" text={'This is the first line\n| x |\nThis is the third line'}
|
|
45
|
+
errorIndex={25} lineNumber={2} />,
|
|
46
|
+
<ErrorBox title="Single character text" message="The text is 1-character long" text="x" errorIndex={0} lineNumber={1.1} />,
|
|
47
47
|
|
|
48
48
|
]); /* eslint-enable react/jsx-key */
|
|
@@ -30,5 +30,5 @@ import { ErrorBox, i18n } from '../../../dist/lib/index';
|
|
|
30
30
|
i18n.LINE = 'ligne {0} (+ invalid placeholder {1})';
|
|
31
31
|
|
|
32
32
|
testApp([ /* eslint-disable react/jsx-key */
|
|
33
|
-
|
|
33
|
+
<ErrorBox title="The title" message="The message" text="| x <- error is here" errorIndex={2} lineNumber={42} />,
|
|
34
34
|
]); /* eslint-enable react/jsx-key */
|
|
@@ -28,13 +28,13 @@ import { ChessPieceIcon } from '../../../dist/lib/index';
|
|
|
28
28
|
|
|
29
29
|
testApp([ /* eslint-disable react/jsx-key */
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
<ChessPieceIcon size={44} type="wq" />,
|
|
32
|
+
<ChessPieceIcon size={24} type={[ 'bb', 'wx', 'wx', 'wn', 'bx', 'bk', 'bk' ]} />,
|
|
33
|
+
<ChessPieceIcon size={36} type={[ 'wr', 'wb', 'bq' ]} pieceset="eyes" />,
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
<ChessPieceIcon size={ /* eslint-disable @typescript-eslint/no-explicit-any */ 'not-a-number' as any /* eslint-enable @typescript-eslint/no-explicit-any */ } type="wq" />,
|
|
36
|
+
<ChessPieceIcon size={40} type={ /* eslint-disable @typescript-eslint/no-explicit-any */ 'invalid' as any /* eslint-enable @typescript-eslint/no-explicit-any */ } />,
|
|
37
|
+
<ChessPieceIcon size={40} type={[ 'bb', /* eslint-disable @typescript-eslint/no-explicit-any */ 'zp' as any /* eslint-enable @typescript-eslint/no-explicit-any */ ]} />,
|
|
38
|
+
<ChessPieceIcon size={40} type="wq" pieceset="not-a-pieceset" />,
|
|
39
39
|
|
|
40
40
|
]); /* eslint-enable react/jsx-key */
|
|
@@ -28,22 +28,22 @@ import { SquareMarkerIcon, TextMarkerIcon, ArrowMarkerIcon } from '../../../dist
|
|
|
28
28
|
|
|
29
29
|
testApp([ /* eslint-disable react/jsx-key */
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
<SquareMarkerIcon size={40} />,
|
|
32
|
+
<SquareMarkerIcon size={45} color="green" />,
|
|
33
|
+
<div style={{ color: 'purple' }}><SquareMarkerIcon size={31} /></div>,
|
|
34
|
+
<SquareMarkerIcon size={ /* eslint-disable @typescript-eslint/no-explicit-any */ 'not-a-number' as any /* eslint-enable @typescript-eslint/no-explicit-any */ } />,
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
<TextMarkerIcon size={41} symbol="A" />,
|
|
37
|
+
<TextMarkerIcon size={29} symbol="b" color="#0ff" />,
|
|
38
|
+
<div style={{ color: 'red' }}><TextMarkerIcon size={53} symbol="5" /></div>,
|
|
39
|
+
<TextMarkerIcon size={47} symbol="dot" color="#00f" />,
|
|
40
|
+
<div style={{ color: 'pink' }}><TextMarkerIcon size={48} symbol="circle" /></div>,
|
|
41
|
+
<TextMarkerIcon size={ /* eslint-disable @typescript-eslint/no-explicit-any */ 'not-a-number' as any /* eslint-enable @typescript-eslint/no-explicit-any */ } symbol="A" />,
|
|
42
|
+
<TextMarkerIcon size={40} symbol={ /* eslint-disable @typescript-eslint/no-explicit-any */ 'not-a-symbol' as any /* eslint-enable @typescript-eslint/no-explicit-any */ } />,
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
<ArrowMarkerIcon size={40} />,
|
|
45
|
+
<ArrowMarkerIcon size={24} color="#888" />,
|
|
46
|
+
<div style={{ color: '#f70' }}><ArrowMarkerIcon size={48} /></div>,
|
|
47
|
+
<ArrowMarkerIcon size={ /* eslint-disable @typescript-eslint/no-explicit-any */ 'not-a-number' as any /* eslint-enable @typescript-eslint/no-explicit-any */ } />,
|
|
48
48
|
|
|
49
49
|
]); /* eslint-enable react/jsx-key */
|
|
@@ -48,11 +48,11 @@ const arrowMarkers3 = { d1h5: G, a5f4: R, c7c3: Y, g7g7: G };
|
|
|
48
48
|
const textMarkers3 = 'G5c6,R(plus)a1,G(times)b1,B(dot)a2,Y(circle)b2';
|
|
49
49
|
|
|
50
50
|
testApp([ /* eslint-disable react/jsx-key */
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
51
|
+
<Chessboard squareMarkers={squareMarkers1} arrowMarkers={arrowMarkers1} textMarkers={textMarkers1} flipped={false} coordinateVisible={true} />,
|
|
52
|
+
<Chessboard squareMarkers={squareMarkers1} arrowMarkers={arrowMarkers1} textMarkers={textMarkers1} flipped={true} coordinateVisible={true} />,
|
|
53
|
+
<Chessboard squareMarkers={squareMarkers2} arrowMarkers={arrowMarkers2} textMarkers={textMarkers2} flipped={false} coordinateVisible={false} />,
|
|
54
|
+
<Chessboard squareMarkers={squareMarkers2} arrowMarkers={arrowMarkers2} textMarkers={textMarkers2} flipped={true} coordinateVisible={false} />,
|
|
55
|
+
<Chessboard squareMarkers={squareMarkers3} arrowMarkers={arrowMarkers3} textMarkers={textMarkers3} flipped={false} coordinateVisible={false} position="empty" />,
|
|
56
|
+
<Chessboard squareMarkers={squareMarkers3} arrowMarkers={arrowMarkers3} textMarkers={textMarkers3} flipped={true} coordinateVisible={true}
|
|
57
|
+
position="8/8/1r6/8/5k1K/8/8/8 b - - 0 1" />,
|
|
58
58
|
]); /* eslint-enable react/jsx-key */
|