diff --git a/IPython/html/tests/notebook/arrow_keys.js b/IPython/html/tests/notebook/arrow_keys.js
deleted file mode 100644
index 6f089ba..0000000
--- a/IPython/html/tests/notebook/arrow_keys.js
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// Check for errors with up and down arrow presses in a non-empty notebook.
-//
-casper.notebook_test(function () {
- var result = this.evaluate(function() {
- IPython.notebook.command_mode();
- pos0 = IPython.notebook.get_selected_index();
- IPython.keyboard.trigger_keydown('b');
- pos1 = IPython.notebook.get_selected_index();
- IPython.keyboard.trigger_keydown('b');
- pos2 = IPython.notebook.get_selected_index();
- // Simulate the "up arrow" and "down arrow" keys.
- IPython.keyboard.trigger_keydown('up');
- pos3 = IPython.notebook.get_selected_index();
- IPython.keyboard.trigger_keydown('down');
- pos4 = IPython.notebook.get_selected_index();
- return pos0 == 0 &&
- pos1 == 1 &&
- pos2 == 2 &&
- pos3 == 1 &&
- pos4 == 2;
- });
- this.test.assertTrue(result, 'Up/down arrow okay in non-empty notebook.');
-});
diff --git a/IPython/html/tests/notebook/dualmode.js b/IPython/html/tests/notebook/dualmode.js
index 8e218ea..87b5567 100644
--- a/IPython/html/tests/notebook/dualmode.js
+++ b/IPython/html/tests/notebook/dualmode.js
@@ -15,7 +15,6 @@ casper.notebook_test(function () {
this.execute_cell_then(index);
this.then(function () {
- this.print_log();
this.validate_notebook_state('initial state', 'edit', 0);
this.trigger_keydown('esc');
this.validate_notebook_state('esc', 'command', 0);
@@ -62,83 +61,10 @@ casper.notebook_test(function () {
this.click_cell_editor(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_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_notebook_state('click cell ' + base_index, 'edit', base_index);
- this.trigger_keydown('shift+enter');
- this.validate_notebook_state('shift+enter (cell exists below)', 'command', base_index + 1);
- // starts in command mode
- this.trigger_keydown('k');
- this.validate_notebook_state('k in comand mode', 'command', base_index);
- this.trigger_keydown('shift+enter');
- 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_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_notebook_state('click cell ' + (base_index-1), 'edit', base_index-1);
- this.trigger_keydown('ctrl+enter');
- this.validate_notebook_state('ctrl+enter (cell exists below)', 'command', base_index-1);
- // starts in command mode
- this.trigger_keydown('j');
- this.validate_notebook_state('j in comand mode', 'command', base_index);
- this.trigger_keydown('ctrl+enter');
- 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_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_notebook_state('click cell ' + base_index, 'edit', base_index);
- this.trigger_keydown('alt+enter'); // Creates one cell
- this.validate_notebook_state('alt+enter (cell exists below)', 'edit', base_index + 1);
- // starts in command mode
- this.trigger_keydown('esc', 'k');
- this.validate_notebook_state('k in comand mode', 'command', base_index);
- this.trigger_keydown('alt+enter'); // Creates one cell
- 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_notebook_state('click cell ' + 7 + ' and esc', 'command', 7);
-
- // Cell mode change
- this.trigger_keydown('r');
- this.test.assertEquals(this.get_cell(7).cell_type, 'raw', 'r; cell is raw');
- this.trigger_keydown('1');
- this.test.assertEquals(this.get_cell(7).cell_type, 'heading', '1; cell is heading');
- this.test.assertEquals(this.get_cell(7).level, 1, '1; cell is level 1 heading');
- this.trigger_keydown('2');
- this.test.assertEquals(this.get_cell(7).level, 2, '2; cell is level 2 heading');
- this.trigger_keydown('3');
- this.test.assertEquals(this.get_cell(7).level, 3, '3; cell is level 3 heading');
- this.trigger_keydown('4');
- this.test.assertEquals(this.get_cell(7).level, 4, '4; cell is level 4 heading');
- this.trigger_keydown('5');
- this.test.assertEquals(this.get_cell(7).level, 5, '5; cell is level 5 heading');
- this.trigger_keydown('6');
- this.test.assertEquals(this.get_cell(7).level, 6, '6; cell is level 6 heading');
- this.trigger_keydown('m');
- this.test.assertEquals(this.get_cell(7).cell_type, 'markdown', 'm; cell is markdown');
- this.trigger_keydown('y');
- this.test.assertEquals(this.get_cell(7).cell_type, 'code', 'y; cell is code');
-
// Cell deletion
- this.trigger_keydown('d', 'd');
- this.test.assertEquals(this.get_cells_length(), 7, 'dd actually deletes a cell');
- this.validate_notebook_state('dd', 'command', 6);
+ this.trigger_keydown('esc', 'd', 'd');
+ this.test.assertEquals(this.get_cells_length(), 3, 'dd actually deletes a cell');
+ this.validate_notebook_state('dd', 'command', 2);
// Make sure that if the time between d presses is too long, nothing gets removed.
this.trigger_keydown('d');
@@ -146,140 +72,7 @@ casper.notebook_test(function () {
this.wait(1000);
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_notebook_state('d, 1 second wait, d', 'command', 6);
-
- // Up and down in command mode
- this.trigger_keydown('j');
- this.validate_notebook_state('j at end of notebook', 'command', 6);
- this.trigger_keydown('down');
- this.validate_notebook_state('down at end of notebook', 'command', 6);
- this.trigger_keydown('up');
- this.validate_notebook_state('up', 'command', 5);
- this.select_cell(0);
- this.validate_notebook_state('select 0', 'command', 0);
- this.trigger_keydown('k');
- this.validate_notebook_state('k at top of notebook', 'command', 0);
- this.trigger_keydown('up');
- this.validate_notebook_state('up at top of notebook', 'command', 0);
- this.trigger_keydown('down');
- this.validate_notebook_state('down', 'command', 1);
-
- // Up and down in edit mode
- this.click_cell_editor(6);
- this.validate_notebook_state('click cell 6', 'edit', 6);
- this.trigger_keydown('down');
- this.validate_notebook_state('down at end of notebook', 'edit', 6);
- this.trigger_keydown('up');
- this.validate_notebook_state('up', 'edit', 5);
- this.click_cell_editor(0);
- this.validate_notebook_state('click 0', 'edit', 0);
- this.trigger_keydown('up');
- this.validate_notebook_state('up at top of notebook', 'edit', 0);
- this.trigger_keydown('down');
- this.validate_notebook_state('down', 'edit', 1);
-
- // Markdown rendering / unredering
- this.select_cell(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_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_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_notebook_state('select 5', 'command', 5);
- this.select_cell(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_notebook_state('select 5', 'command', 5);
- this.trigger_keydown('shift+enter');
- 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_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) )
- this.select_cell(2);
- this.test.assertEquals(this.get_cell_text(2), b, 'select 2; Cell 2 text is correct');
- 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_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_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_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_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_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_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_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_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_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_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_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_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_notebook_state('split', 'edit', 1);
- this.select_cell(0); // Move up to cell 0
- this.trigger_keydown('shift+m'); // Merge
- 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.');
+ this.test.assertEquals(this.get_cells_length(), 3, "d, 1 second wait, d doesn't delete a cell");
+ this.validate_notebook_state('d, 1 second wait, d', 'command', 2);
});
});
diff --git a/IPython/html/tests/notebook/dualmode_arrows.js b/IPython/html/tests/notebook/dualmode_arrows.js
new file mode 100644
index 0000000..4b839ac
--- /dev/null
+++ b/IPython/html/tests/notebook/dualmode_arrows.js
@@ -0,0 +1,49 @@
+
+// Test
+casper.notebook_test(function () {
+ var a = 'print("a")';
+ var index = this.append_cell(a);
+ this.execute_cell_then(index);
+
+ var b = 'print("b")';
+ index = this.append_cell(b);
+ this.execute_cell_then(index);
+
+ var c = 'print("c")';
+ index = this.append_cell(c);
+ this.execute_cell_then(index);
+
+ this.then(function () {
+
+ // Up and down in command mode
+ this.select_cell(3);
+ this.trigger_keydown('j');
+ this.validate_notebook_state('j at end of notebook', 'command', 3);
+ this.trigger_keydown('down');
+ this.validate_notebook_state('down at end of notebook', 'command', 3);
+ this.trigger_keydown('up');
+ this.validate_notebook_state('up', 'command', 2);
+ this.select_cell(0);
+ this.validate_notebook_state('select 0', 'command', 0);
+ this.trigger_keydown('k');
+ this.validate_notebook_state('k at top of notebook', 'command', 0);
+ this.trigger_keydown('up');
+ this.validate_notebook_state('up at top of notebook', 'command', 0);
+ this.trigger_keydown('down');
+ this.validate_notebook_state('down', 'command', 1);
+
+ // Up and down in edit mode
+ this.click_cell_editor(3);
+ this.validate_notebook_state('click cell 3', 'edit', 3);
+ this.trigger_keydown('down');
+ this.validate_notebook_state('down at end of notebook', 'edit', 3);
+ this.trigger_keydown('up');
+ this.validate_notebook_state('up', 'edit', 2);
+ this.click_cell_editor(0);
+ this.validate_notebook_state('click 0', 'edit', 0);
+ this.trigger_keydown('up');
+ this.validate_notebook_state('up at top of notebook', 'edit', 0);
+ this.trigger_keydown('down');
+ this.validate_notebook_state('down', 'edit', 1);
+ });
+});
diff --git a/IPython/html/tests/notebook/dualmode_cellinsert.js b/IPython/html/tests/notebook/dualmode_cellinsert.js
new file mode 100644
index 0000000..59b89a3
--- /dev/null
+++ b/IPython/html/tests/notebook/dualmode_cellinsert.js
@@ -0,0 +1,27 @@
+
+// Test
+casper.notebook_test(function () {
+ var a = 'print("a")';
+ var index = this.append_cell(a);
+ this.execute_cell_then(index);
+
+ var b = 'print("b")';
+ index = this.append_cell(b);
+ this.execute_cell_then(index);
+
+ var c = 'print("c")';
+ index = this.append_cell(c);
+ this.execute_cell_then(index);
+
+ this.then(function () {
+ // Cell insertion
+ this.select_cell(2);
+ this.trigger_keydown('a'); // Creates one cell
+ this.test.assertEquals(this.get_cell_text(2), '', 'a; New cell 2 text is empty');
+ 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_notebook_state('b', 'command', 3);
+ });
+});
\ No newline at end of file
diff --git a/IPython/html/tests/notebook/dualmode_cellmode.js b/IPython/html/tests/notebook/dualmode_cellmode.js
new file mode 100644
index 0000000..d4bf5f0
--- /dev/null
+++ b/IPython/html/tests/notebook/dualmode_cellmode.js
@@ -0,0 +1,28 @@
+// Test keyboard shortcuts that change the cell's mode.
+
+// Test
+casper.notebook_test(function () {
+ this.then(function () {
+ // Cell mode change
+ this.select_cell(0);
+ this.trigger_keydown('esc','r');
+ this.test.assertEquals(this.get_cell(0).cell_type, 'raw', 'r; cell is raw');
+ this.trigger_keydown('1');
+ this.test.assertEquals(this.get_cell(0).cell_type, 'heading', '1; cell is heading');
+ this.test.assertEquals(this.get_cell(0).level, 1, '1; cell is level 1 heading');
+ this.trigger_keydown('2');
+ this.test.assertEquals(this.get_cell(0).level, 2, '2; cell is level 2 heading');
+ this.trigger_keydown('3');
+ this.test.assertEquals(this.get_cell(0).level, 3, '3; cell is level 3 heading');
+ this.trigger_keydown('4');
+ this.test.assertEquals(this.get_cell(0).level, 4, '4; cell is level 4 heading');
+ this.trigger_keydown('5');
+ this.test.assertEquals(this.get_cell(0).level, 5, '5; cell is level 5 heading');
+ this.trigger_keydown('6');
+ this.test.assertEquals(this.get_cell(0).level, 6, '6; cell is level 6 heading');
+ this.trigger_keydown('m');
+ this.test.assertEquals(this.get_cell(0).cell_type, 'markdown', 'm; cell is markdown');
+ this.trigger_keydown('y');
+ this.test.assertEquals(this.get_cell(0).cell_type, 'code', 'y; cell is code');
+ });
+});
\ No newline at end of file
diff --git a/IPython/html/tests/notebook/dualmode_clipboard.js b/IPython/html/tests/notebook/dualmode_clipboard.js
new file mode 100644
index 0000000..3bda68d
--- /dev/null
+++ b/IPython/html/tests/notebook/dualmode_clipboard.js
@@ -0,0 +1,55 @@
+
+
+// Test
+casper.notebook_test(function () {
+ var a = 'print("a")';
+ var index = this.append_cell(a);
+ this.execute_cell_then(index);
+
+ var b = 'print("b")';
+ index = this.append_cell(b);
+ this.execute_cell_then(index);
+
+ var c = 'print("c")';
+ index = this.append_cell(c);
+ this.execute_cell_then(index);
+
+ this.then(function () {
+ // 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_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), b, 'Verify that cell 2 is now where cell 1 was.');
+ this.select_cell(2);
+ this.trigger_keydown('v'); // Paste
+ 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_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(1);
+ this.trigger_keydown('c'); // Copy
+ this.validate_notebook_state('c', 'command', 1);
+ this.test.assertEquals(this.get_cell_text(1), b, 'Verify that cell 1 is b');
+ this.select_cell(2);
+ this.trigger_keydown('c'); // Copy
+ this.validate_notebook_state('c', 'command', 2);
+ this.test.assertEquals(this.get_cell_text(2), c, 'Verify that cell 2 is c');
+ this.select_cell(4);
+ this.trigger_keydown('v'); // Paste
+ this.validate_notebook_state('v', 'command', 5);
+ this.test.assertEquals(this.get_cell_text(2), c, 'Verify that cell 2 still has the copied contents.');
+ this.test.assertEquals(this.get_cell_text(5), c, 'Verify that cell 5 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_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.');
+ });
+});
\ No newline at end of file
diff --git a/IPython/html/tests/notebook/dualmode_execute.js b/IPython/html/tests/notebook/dualmode_execute.js
new file mode 100644
index 0000000..750486e
--- /dev/null
+++ b/IPython/html/tests/notebook/dualmode_execute.js
@@ -0,0 +1,72 @@
+// Test keyboard invoked execution.
+
+// Test
+casper.notebook_test(function () {
+ var a = 'print("a")';
+ var index = this.append_cell(a);
+ this.execute_cell_then(index);
+
+ var b = 'print("b")';
+ index = this.append_cell(b);
+ this.execute_cell_then(index);
+
+ var c = 'print("c")';
+ index = this.append_cell(c);
+ this.execute_cell_then(index);
+
+ this.then(function () {
+
+ // shift+enter
+ // last cell in notebook
+ var base_index = 3;
+ this.select_cell(base_index);
+ this.trigger_keydown('shift+enter'); // Creates one cell
+ 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_notebook_state('click cell ' + base_index, 'edit', base_index);
+ this.trigger_keydown('shift+enter');
+ this.validate_notebook_state('shift+enter (cell exists below)', 'command', base_index + 1);
+ // starts in command mode
+ this.trigger_keydown('k');
+ this.validate_notebook_state('k in comand mode', 'command', base_index);
+ this.trigger_keydown('shift+enter');
+ 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_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_notebook_state('click cell ' + (base_index-1), 'edit', base_index-1);
+ this.trigger_keydown('ctrl+enter');
+ this.validate_notebook_state('ctrl+enter (cell exists below)', 'command', base_index-1);
+ // starts in command mode
+ this.trigger_keydown('j');
+ this.validate_notebook_state('j in comand mode', 'command', base_index);
+ this.trigger_keydown('ctrl+enter');
+ 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_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_notebook_state('click cell ' + base_index, 'edit', base_index);
+ this.trigger_keydown('alt+enter'); // Creates one cell
+ this.validate_notebook_state('alt+enter (cell exists below)', 'edit', base_index + 1);
+ // starts in command mode
+ this.trigger_keydown('esc', 'k');
+ this.validate_notebook_state('k in comand mode', 'command', base_index);
+ this.trigger_keydown('alt+enter'); // Creates one cell
+ 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_notebook_state('click cell ' + 7 + ' and esc', 'command', 7);
+ });
+});
\ No newline at end of file
diff --git a/IPython/html/tests/notebook/dualmode_markdown.js b/IPython/html/tests/notebook/dualmode_markdown.js
new file mode 100644
index 0000000..924ff8c
--- /dev/null
+++ b/IPython/html/tests/notebook/dualmode_markdown.js
@@ -0,0 +1,39 @@
+
+// Test
+casper.notebook_test(function () {
+ var a = 'print("a")';
+ var index = this.append_cell(a);
+ this.execute_cell_then(index);
+
+ this.then(function () {
+ // Markdown rendering / unredering
+ this.select_cell(1);
+ this.validate_notebook_state('select 1', 'command', 1);
+ this.trigger_keydown('m');
+ this.test.assertEquals(this.get_cell(1).cell_type, 'markdown', 'm; cell is markdown');
+ this.test.assertEquals(this.get_cell(1).rendered, false, 'm; cell is rendered');
+ this.trigger_keydown('enter');
+ this.test.assertEquals(this.get_cell(1).rendered, false, 'enter; cell is unrendered');
+ this.validate_notebook_state('enter', 'edit', 1);
+ this.trigger_keydown('ctrl+enter');
+ this.test.assertEquals(this.get_cell(1).rendered, true, 'ctrl+enter; cell is rendered');
+ this.validate_notebook_state('enter', 'command', 1);
+ this.trigger_keydown('enter');
+ this.test.assertEquals(this.get_cell(1).rendered, false, 'enter; cell is unrendered');
+ this.select_cell(0);
+ this.test.assertEquals(this.get_cell(1).rendered, false, 'select 0; cell 1 is still unrendered');
+ this.validate_notebook_state('select 0', 'command', 0);
+ this.select_cell(1);
+ this.validate_notebook_state('select 1', 'command', 1);
+ this.trigger_keydown('ctrl+enter');
+ this.test.assertEquals(this.get_cell(1).rendered, true, 'ctrl+enter; cell is rendered');
+ this.select_cell(0);
+ this.validate_notebook_state('select 0', 'command', 0);
+ this.trigger_keydown('shift+enter');
+ this.validate_notebook_state('shift+enter', 'command', 1);
+ this.test.assertEquals(this.get_cell(1).rendered, true, 'shift+enter; cell is rendered');
+ this.trigger_keydown('shift+enter'); // Creates one cell
+ this.validate_notebook_state('shift+enter', 'edit', 2);
+ this.test.assertEquals(this.get_cell(1).rendered, true, 'shift+enter; cell is rendered');
+ });
+});
\ No newline at end of file
diff --git a/IPython/html/tests/notebook/dualmode_merge.js b/IPython/html/tests/notebook/dualmode_merge.js
new file mode 100644
index 0000000..5d82798
--- /dev/null
+++ b/IPython/html/tests/notebook/dualmode_merge.js
@@ -0,0 +1,21 @@
+
+// Test
+casper.notebook_test(function () {
+ this.then(function () {
+ // Split and merge cells
+ this.select_cell(0);
+ this.trigger_keydown('a', 'enter'); // Create cell above and enter edit mode.
+ 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_notebook_state('split', 'edit', 1);
+ this.select_cell(0); // Move up to cell 0
+ this.trigger_keydown('shift+m'); // Merge
+ 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.');
+ });
+});
\ No newline at end of file
diff --git a/IPython/html/tests/notebook/dualmode_movecell.js b/IPython/html/tests/notebook/dualmode_movecell.js
new file mode 100644
index 0000000..713e38d
--- /dev/null
+++ b/IPython/html/tests/notebook/dualmode_movecell.js
@@ -0,0 +1,25 @@
+
+// Test
+casper.notebook_test(function () {
+ var a = 'print("a")';
+ var index = this.append_cell(a);
+ this.execute_cell_then(index);
+
+ var b = 'print("b")';
+ index = this.append_cell(b);
+ this.execute_cell_then(index);
+
+ this.then(function () {
+ // Cell movement ( ctrl+(k or j) )
+ this.select_cell(2);
+ this.test.assertEquals(this.get_cell_text(2), b, 'select 2; Cell 2 text is correct');
+ 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_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_notebook_state('ctrl+j', 'command', 2);
+ });
+});
\ No newline at end of file
diff --git a/IPython/html/tests/notebook/merge_cells.js b/IPython/html/tests/notebook/merge_cells_api.js
similarity index 100%
rename from IPython/html/tests/notebook/merge_cells.js
rename to IPython/html/tests/notebook/merge_cells_api.js