From e9e745e978078dcecb3ba99a13af7effbb69b9ba 2014-03-20 23:11:01 From: Jonathan Frederic Date: 2014-03-20 23:11:01 Subject: [PATCH] HUGE speed improvements to dual mode tests --- diff --git a/IPython/html/tests/notebook/dualmode.js b/IPython/html/tests/notebook/dualmode.js index 8f7d54c..2eb2e2d 100644 --- a/IPython/html/tests/notebook/dualmode.js +++ b/IPython/html/tests/notebook/dualmode.js @@ -15,25 +15,26 @@ casper.notebook_test(function () { this.execute_cell_then(index); this.then(function () { - this.validate_state('initial state', 'edit', 0); + this.print_log(); + this.validate_notebook_state('initial state', 'edit', 0); this.trigger_keydown('esc'); - this.validate_state('esc', 'command', 0); + this.validate_notebook_state('esc', 'command', 0); this.trigger_keydown('down'); - this.validate_state('down', 'command', 1); + this.validate_notebook_state('down', 'command', 1); this.trigger_keydown('enter'); - this.validate_state('enter', 'edit', 1); + this.validate_notebook_state('enter', 'edit', 1); this.trigger_keydown('j'); - this.validate_state('j in edit mode', 'edit', 1); + this.validate_notebook_state('j in edit mode', 'edit', 1); this.trigger_keydown('esc'); - this.validate_state('esc', 'command', 1); + this.validate_notebook_state('esc', 'command', 1); this.trigger_keydown('j'); - this.validate_state('j in command mode', 'command', 2); + this.validate_notebook_state('j in command mode', 'command', 2); this.click_cell_editor(0); - this.validate_state('click cell 0', 'edit', 0); + this.validate_notebook_state('click cell 0', 'edit', 0); this.click_cell_editor(3); - this.validate_state('click cell 3', 'edit', 3); + this.validate_notebook_state('click cell 3', 'edit', 3); this.trigger_keydown('esc'); - this.validate_state('esc', 'command', 3); + this.validate_notebook_state('esc', 'command', 3); // Open keyboard help this.evaluate(function(){ @@ -41,7 +42,7 @@ casper.notebook_test(function () { }, {}); this.trigger_keydown('k'); - this.validate_state('k in command mode while keyboard help is up', 'command', 3); + this.validate_notebook_state('k in command mode while keyboard help is up', 'command', 3); // Close keyboard help this.evaluate(function(){ @@ -49,69 +50,69 @@ casper.notebook_test(function () { }, {}); this.trigger_keydown('k'); - this.validate_state('k in command mode', 'command', 2); + this.validate_notebook_state('k in command mode', 'command', 2); this.click_cell_editor(0); - this.validate_state('click cell 0', 'edit', 0); + this.validate_notebook_state('click cell 0', 'edit', 0); this.focus_notebook(); - this.validate_state('focus #notebook', 'command', 0); + this.validate_notebook_state('focus #notebook', 'command', 0); this.click_cell_editor(0); - this.validate_state('click cell 0', 'edit', 0); + this.validate_notebook_state('click cell 0', 'edit', 0); this.focus_notebook(); - this.validate_state('focus #notebook', 'command', 0); + this.validate_notebook_state('focus #notebook', 'command', 0); this.click_cell_editor(3); - this.validate_state('click cell 3', 'edit', 3); + this.validate_notebook_state('click cell 3', 'edit', 3); // shift+enter // last cell in notebook var base_index = 3; this.trigger_keydown('shift+enter'); // Creates one cell - this.validate_state('shift+enter (no cell below)', 'edit', base_index + 1); + this.validate_notebook_state('shift+enter (no cell below)', 'edit', base_index + 1); // not last cell in notebook & starts in edit mode this.click_cell_editor(base_index); - this.validate_state('click cell ' + base_index, 'edit', base_index); + this.validate_notebook_state('click cell ' + base_index, 'edit', base_index); this.trigger_keydown('shift+enter'); - this.validate_state('shift+enter (cell exists below)', 'command', base_index + 1); + this.validate_notebook_state('shift+enter (cell exists below)', 'command', base_index + 1); // starts in command mode this.trigger_keydown('k'); - this.validate_state('k in comand mode', 'command', base_index); + this.validate_notebook_state('k in comand mode', 'command', base_index); this.trigger_keydown('shift+enter'); - this.validate_state('shift+enter (start in command mode)', 'command', base_index + 1); + this.validate_notebook_state('shift+enter (start in command mode)', 'command', base_index + 1); // ctrl+enter // last cell in notebook base_index++; this.trigger_keydown('ctrl+enter'); - this.validate_state('ctrl+enter (no cell below)', 'command', base_index); + this.validate_notebook_state('ctrl+enter (no cell below)', 'command', base_index); // not last cell in notebook & starts in edit mode this.click_cell_editor(base_index-1); - this.validate_state('click cell ' + (base_index-1), 'edit', base_index-1); + this.validate_notebook_state('click cell ' + (base_index-1), 'edit', base_index-1); this.trigger_keydown('ctrl+enter'); - this.validate_state('ctrl+enter (cell exists below)', 'command', base_index-1); + this.validate_notebook_state('ctrl+enter (cell exists below)', 'command', base_index-1); // starts in command mode this.trigger_keydown('j'); - this.validate_state('j in comand mode', 'command', base_index); + this.validate_notebook_state('j in comand mode', 'command', base_index); this.trigger_keydown('ctrl+enter'); - this.validate_state('ctrl+enter (start in command mode)', 'command', base_index); + this.validate_notebook_state('ctrl+enter (start in command mode)', 'command', base_index); // alt+enter // last cell in notebook this.trigger_keydown('alt+enter'); // Creates one cell - this.validate_state('alt+enter (no cell below)', 'edit', base_index + 1); + this.validate_notebook_state('alt+enter (no cell below)', 'edit', base_index + 1); // not last cell in notebook & starts in edit mode this.click_cell_editor(base_index); - this.validate_state('click cell ' + base_index, 'edit', base_index); + this.validate_notebook_state('click cell ' + base_index, 'edit', base_index); this.trigger_keydown('alt+enter'); // Creates one cell - this.validate_state('alt+enter (cell exists below)', 'edit', base_index + 1); + this.validate_notebook_state('alt+enter (cell exists below)', 'edit', base_index + 1); // starts in command mode this.trigger_keydown('esc', 'k'); - this.validate_state('k in comand mode', 'command', base_index); + this.validate_notebook_state('k in comand mode', 'command', base_index); this.trigger_keydown('alt+enter'); // Creates one cell - this.validate_state('alt+enter (start in command mode)', 'edit', base_index + 1); + this.validate_notebook_state('alt+enter (start in command mode)', 'edit', base_index + 1); // Notebook will now have 8 cells, the index of the last cell will be 7. this.test.assertEquals(this.get_cells_length(), 8, '*-enter commands added cells where needed.'); this.select_cell(7); - this.validate_state('click cell ' + 7 + ' and esc', 'command', 7); + this.validate_notebook_state('click cell ' + 7 + ' and esc', 'command', 7); // Cell mode change this.trigger_keydown('r'); @@ -137,7 +138,7 @@ casper.notebook_test(function () { // Cell deletion this.trigger_keydown('d', 'd'); this.test.assertEquals(this.get_cells_length(), 7, 'dd actually deletes a cell'); - this.validate_state('dd', 'command', 6); + this.validate_notebook_state('dd', 'command', 6); // Make sure that if the time between d presses is too long, nothing gets removed. this.trigger_keydown('d'); @@ -146,66 +147,66 @@ casper.notebook_test(function () { this.then(function () { this.trigger_keydown('d'); this.test.assertEquals(this.get_cells_length(), 7, "d, 1 second wait, d doesn't delete a cell"); - this.validate_state('d, 1 second wait, d', 'command', 6); + this.validate_notebook_state('d, 1 second wait, d', 'command', 6); // Up and down in command mode this.trigger_keydown('j'); - this.validate_state('j at end of notebook', 'command', 6); + this.validate_notebook_state('j at end of notebook', 'command', 6); this.trigger_keydown('down'); - this.validate_state('down at end of notebook', 'command', 6); + this.validate_notebook_state('down at end of notebook', 'command', 6); this.trigger_keydown('up'); - this.validate_state('up', 'command', 5); + this.validate_notebook_state('up', 'command', 5); this.select_cell(0); - this.validate_state('select 0', 'command', 0); + this.validate_notebook_state('select 0', 'command', 0); this.trigger_keydown('k'); - this.validate_state('k at top of notebook', 'command', 0); + this.validate_notebook_state('k at top of notebook', 'command', 0); this.trigger_keydown('up'); - this.validate_state('up at top of notebook', 'command', 0); + this.validate_notebook_state('up at top of notebook', 'command', 0); this.trigger_keydown('down'); - this.validate_state('down', 'command', 1); + this.validate_notebook_state('down', 'command', 1); // Up and down in edit mode this.click_cell_editor(6); - this.validate_state('click cell 6', 'edit', 6); + this.validate_notebook_state('click cell 6', 'edit', 6); this.trigger_keydown('down'); - this.validate_state('down at end of notebook', 'edit', 6); + this.validate_notebook_state('down at end of notebook', 'edit', 6); this.trigger_keydown('up'); - this.validate_state('up', 'edit', 5); + this.validate_notebook_state('up', 'edit', 5); this.click_cell_editor(0); - this.validate_state('click 0', 'edit', 0); + this.validate_notebook_state('click 0', 'edit', 0); this.trigger_keydown('up'); - this.validate_state('up at top of notebook', 'edit', 0); + this.validate_notebook_state('up at top of notebook', 'edit', 0); this.trigger_keydown('down'); - this.validate_state('down', 'edit', 1); + this.validate_notebook_state('down', 'edit', 1); // Markdown rendering / unredering this.select_cell(6); - this.validate_state('select 6', 'command', 6); + this.validate_notebook_state('select 6', 'command', 6); this.trigger_keydown('m'); this.test.assertEquals(this.get_cell(6).cell_type, 'markdown', 'm; cell is markdown'); this.test.assertEquals(this.get_cell(6).rendered, false, 'm; cell is rendered'); this.trigger_keydown('enter'); this.test.assertEquals(this.get_cell(6).rendered, false, 'enter; cell is unrendered'); - this.validate_state('enter', 'edit', 6); + this.validate_notebook_state('enter', 'edit', 6); this.trigger_keydown('ctrl+enter'); this.test.assertEquals(this.get_cell(6).rendered, true, 'ctrl+enter; cell is rendered'); - this.validate_state('enter', 'command', 6); + this.validate_notebook_state('enter', 'command', 6); this.trigger_keydown('enter'); this.test.assertEquals(this.get_cell(6).rendered, false, 'enter; cell is unrendered'); this.select_cell(5); this.test.assertEquals(this.get_cell(6).rendered, false, 'select 5; cell 6 is still unrendered'); - this.validate_state('select 5', 'command', 5); + this.validate_notebook_state('select 5', 'command', 5); this.select_cell(6); - this.validate_state('select 6', 'command', 6); + this.validate_notebook_state('select 6', 'command', 6); this.trigger_keydown('ctrl+enter'); this.test.assertEquals(this.get_cell(6).rendered, true, 'ctrl+enter; cell is rendered'); this.select_cell(5); - this.validate_state('select 5', 'command', 5); + this.validate_notebook_state('select 5', 'command', 5); this.trigger_keydown('shift+enter'); - this.validate_state('shift+enter', 'command', 6); + this.validate_notebook_state('shift+enter', 'command', 6); this.test.assertEquals(this.get_cell(6).rendered, true, 'shift+enter; cell is rendered'); this.trigger_keydown('shift+enter'); // Creates one cell - this.validate_state('shift+enter', 'edit', 7); + this.validate_notebook_state('shift+enter', 'edit', 7); this.test.assertEquals(this.get_cell(6).rendered, true, 'shift+enter; cell is rendered'); // Cell movement ( ctrl+(k or j) ) @@ -214,81 +215,79 @@ casper.notebook_test(function () { this.trigger_keydown('ctrl+k'); // Move cell 2 up one this.test.assertEquals(this.get_cell_text(1), b, 'ctrl+k; Cell 1 text is correct'); this.test.assertEquals(this.get_cell_text(2), a, 'ctrl+k; Cell 2 text is correct'); - this.validate_state('ctrl+k', 'command', 1); + this.validate_notebook_state('ctrl+k', 'command', 1); this.trigger_keydown('ctrl+j'); // Move cell 1 down one this.test.assertEquals(this.get_cell_text(1), a, 'ctrl+j; Cell 1 text is correct'); this.test.assertEquals(this.get_cell_text(2), b, 'ctrl+j; Cell 2 text is correct'); - this.validate_state('ctrl+j', 'command', 2); + this.validate_notebook_state('ctrl+j', 'command', 2); // Cell insertion this.trigger_keydown('a'); // Creates one cell this.test.assertEquals(this.get_cell_text(2), '', 'a; New cell 2 text is empty'); - this.validate_state('a', 'command', 2); + this.validate_notebook_state('a', 'command', 2); this.trigger_keydown('b'); // Creates one cell this.test.assertEquals(this.get_cell_text(2), '', 'b; Cell 2 text is still empty'); this.test.assertEquals(this.get_cell_text(3), '', 'b; New cell 3 text is empty'); - this.validate_state('b', 'command', 3); + this.validate_notebook_state('b', 'command', 3); // Copy/paste/cut var num_cells = this.get_cells_length(); this.test.assertEquals(this.get_cell_text(1), a, 'Verify that cell 1 is a'); this.select_cell(1); this.trigger_keydown('x'); // Cut - this.validate_state('x', 'command', 1); + this.validate_notebook_state('x', 'command', 1); this.test.assertEquals(this.get_cells_length(), num_cells-1, 'Verify that a cell was removed.'); this.test.assertEquals(this.get_cell_text(1), '', 'Verify that cell 2 is now where cell 1 was.'); this.select_cell(2); this.trigger_keydown('v'); // Paste - this.validate_state('v', 'command', 3); // Selection should move to pasted cell, below current cell. + this.validate_notebook_state('v', 'command', 3); // Selection should move to pasted cell, below current cell. this.test.assertEquals(this.get_cell_text(3), a, 'Verify that cell 3 has the cut contents.'); this.test.assertEquals(this.get_cells_length(), num_cells, 'Verify a the cell was added.'); this.trigger_keydown('v'); // Paste - this.validate_state('v', 'command', 4); // Selection should move to pasted cell, below current cell. + this.validate_notebook_state('v', 'command', 4); // Selection should move to pasted cell, below current cell. this.test.assertEquals(this.get_cell_text(4), a, 'Verify that cell 4 has the cut contents.'); this.test.assertEquals(this.get_cells_length(), num_cells+1, 'Verify a the cell was added.'); this.select_cell(5); this.trigger_keydown('c'); // Copy - this.validate_state('c', 'command', 5); + this.validate_notebook_state('c', 'command', 5); this.test.assertEquals(this.get_cell_text(5), b, 'Verify that cell 5 is b'); this.select_cell(6); this.trigger_keydown('c'); // Copy - this.validate_state('c', 'command', 6); + this.validate_notebook_state('c', 'command', 6); this.test.assertEquals(this.get_cell_text(6), c, 'Verify that cell 6 is c'); this.trigger_keydown('v'); // Paste - this.validate_state('v', 'command', 7); + this.validate_notebook_state('v', 'command', 7); this.test.assertEquals(this.get_cell_text(6), c, 'Verify that cell 6 still has the copied contents.'); this.test.assertEquals(this.get_cell_text(7), c, 'Verify that cell 7 has the copied contents.'); this.test.assertEquals(this.get_cells_length(), num_cells+2, 'Verify a the cell was added.'); this.select_cell(0); this.trigger_keydown('shift+v'); // Paste - this.validate_state('shift+v', 'command', 0); + this.validate_notebook_state('shift+v', 'command', 0); this.test.assertEquals(this.get_cell_text(0), c, 'Verify that cell 0 has the copied contents.'); this.test.assertEquals(this.get_cells_length(), num_cells+3, 'Verify a the cell was added.'); // Split and merge cells this.select_cell(0); this.trigger_keydown('a', 'enter'); // Create cell above and enter edit mode. - this.validate_state('a, enter', 'edit', 0); + this.validate_notebook_state('a, enter', 'edit', 0); this.set_cell_text(0, 'abcd'); this.set_cell_editor_cursor(0, 0, 2); this.test.assertEquals(this.get_cell_text(0), 'abcd', 'Verify that cell 0 has the new contents.'); this.trigger_keydown('alt+-'); // Split this.test.assertEquals(this.get_cell_text(0), 'ab', 'split; Verify that cell 0 has the first half.'); this.test.assertEquals(this.get_cell_text(1), 'cd', 'split; Verify that cell 1 has the second half.'); - this.validate_state('split', 'edit', 1); + this.validate_notebook_state('split', 'edit', 1); this.select_cell(0); // Move up to cell 0 this.trigger_keydown('shift+m'); // Merge - this.validate_state('merge', 'command', 0); + this.validate_notebook_state('merge', 'command', 0); this.test.assertEquals(this.get_cell_text(0), 'ab\ncd', 'merge; Verify that cell 0 has the merged contents.'); }); // Utility functions. - this.validate_state = function(message, mode, cell_index) { + this.validate_notebook_state = function(message, mode, cell_index) { // General tests. this.test.assertEquals(this.get_keyboard_mode(), this.get_notebook_mode(), message + '; keyboard and notebook modes match'); - // Is codemirror focused appropriately? - this.test.assert(this.is_editor_focus_valid(), message + '; cell editor focused appropriately'); // Is the selected cell the only cell that is selected? if (cell_index!==undefined) { this.test.assert(this.is_only_cell_selected(cell_index), @@ -303,41 +302,24 @@ casper.notebook_test(function () { // Make sure there isn't a single cell in edit mode. this.test.assert(this.is_only_cell_edit(null), message + '; all cells in command mode'); + this.test.assert(this.is_cell_editor_focused(null), + message + '; no cell editors are focused while in command mode'); } else if (mode==='edit') { // Are the notebook and keyboard manager in edit mode? this.test.assertEquals(this.get_keyboard_mode(), 'edit', message + '; in edit mode'); - // Is the specified cell the only cell in edit mode? if (cell_index!==undefined) { + // Is the specified cell the only cell in edit mode? this.test.assert(this.is_only_cell_edit(cell_index), message + '; cell ' + cell_index + ' is the only cell in edit mode'); + // Is the specified cell the only cell with a focused code mirror? + this.test.assert(this.is_cell_editor_focused(cell_index), + message + '; cell ' + cell_index + '\'s editor is appropriately focused'); } } else { this.test.assert(false, message + '; ' + mode + ' is an unknown mode'); } }; - - this.is_editor_focus_valid = function() { - var cells_length = this.get_cells_length(); - for (var i = 0; i < cells_length; i++) { - if (!this.is_cell_editor_focus_valid(i)) { - return false; - } - } - return true; - }; - - this.is_cell_editor_focus_valid = function(index) { - var cell = this.get_cell(index); - if (cell) { - if (cell.mode == 'edit') { - return this.is_cell_editor_focused(index); - } else { - return !this.is_cell_editor_focused(index); - } - } - return true; - }; }); diff --git a/IPython/html/tests/util.js b/IPython/html/tests/util.js index 2ebf112..6ee0341 100644 --- a/IPython/html/tests/util.js +++ b/IPython/html/tests/util.js @@ -296,10 +296,17 @@ casper.get_cell = function(index) { }; casper.is_cell_editor_focused = function(index) { + // Make sure a cell's editor is the only editor focused on the page. return this.evaluate(function(i) { - var cell = IPython.notebook.get_cell(i); - if (cell) { - return $(cell.code_mirror.getInputField()).is('.CodeMirror-focused *'); + var focused_textarea = $('#notebook .CodeMirror-focused textarea'); + if (focused_textarea.length > 1) { throw 'More than one Code Mirror editor is focused at once!'; } + if (i === null) { + return focused_textarea.length === 0; + } else { + var cell = IPython.notebook.get_cell(i); + if (cell) { + return cell.code_mirror.getInputField() == focused_textarea[0]; + } } return false; }, {i : index}); @@ -399,7 +406,7 @@ casper.on('waitFor.timeout', function onWaitForTimeout(timeout) { }); // Pass `console.log` calls from page JS to casper. -casper.printLog = function () { +casper.print_log = function () { this.on('remote.message', function(msg) { this.echo('Remote message caught: ' + msg); });