1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/devtools/sourceeditor/test/cm_emacs_test.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,138 @@ 1.4 +(function() { 1.5 + "use strict"; 1.6 + 1.7 + var Pos = CodeMirror.Pos; 1.8 + namespace = "emacs_"; 1.9 + 1.10 + var eventCache = {}; 1.11 + function fakeEvent(keyName) { 1.12 + var event = eventCache[key]; 1.13 + if (event) return event; 1.14 + 1.15 + var ctrl, shift, alt; 1.16 + var key = keyName.replace(/\w+-/g, function(type) { 1.17 + if (type == "Ctrl-") ctrl = true; 1.18 + else if (type == "Alt-") alt = true; 1.19 + else if (type == "Shift-") shift = true; 1.20 + return ""; 1.21 + }); 1.22 + var code; 1.23 + for (var c in CodeMirror.keyNames) 1.24 + if (CodeMirror.keyNames[c] == key) { code = c; break; } 1.25 + if (c == null) throw new Error("Unknown key: " + key); 1.26 + 1.27 + return eventCache[keyName] = { 1.28 + type: "keydown", keyCode: code, ctrlKey: ctrl, shiftKey: shift, altKey: alt, 1.29 + preventDefault: function(){}, stopPropagation: function(){} 1.30 + }; 1.31 + } 1.32 + 1.33 + function sim(name, start /*, actions... */) { 1.34 + var keys = Array.prototype.slice.call(arguments, 2); 1.35 + testCM(name, function(cm) { 1.36 + for (var i = 0; i < keys.length; ++i) { 1.37 + var cur = keys[i]; 1.38 + if (cur instanceof Pos) cm.setCursor(cur); 1.39 + else if (cur.call) cur(cm); 1.40 + else cm.triggerOnKeyDown(fakeEvent(cur)); 1.41 + } 1.42 + }, {keyMap: "emacs", value: start, mode: "javascript"}); 1.43 + } 1.44 + 1.45 + function at(line, ch) { return function(cm) { eqPos(cm.getCursor(), Pos(line, ch)); }; } 1.46 + function txt(str) { return function(cm) { eq(cm.getValue(), str); }; } 1.47 + 1.48 + sim("motionHSimple", "abc", "Ctrl-F", "Ctrl-F", "Ctrl-B", at(0, 1)); 1.49 + sim("motionHMulti", "abcde", 1.50 + "Ctrl-4", "Ctrl-F", at(0, 4), "Ctrl--", "Ctrl-2", "Ctrl-F", at(0, 2), 1.51 + "Ctrl-5", "Ctrl-B", at(0, 0)); 1.52 + 1.53 + sim("motionHWord", "abc. def ghi", 1.54 + "Alt-F", at(0, 3), "Alt-F", at(0, 8), 1.55 + "Ctrl-B", "Alt-B", at(0, 5), "Alt-B", at(0, 0)); 1.56 + sim("motionHWordMulti", "abc. def ghi ", 1.57 + "Ctrl-3", "Alt-F", at(0, 12), "Ctrl-2", "Alt-B", at(0, 5), 1.58 + "Ctrl--", "Alt-B", at(0, 8)); 1.59 + 1.60 + sim("motionVSimple", "a\nb\nc\n", "Ctrl-N", "Ctrl-N", "Ctrl-P", at(1, 0)); 1.61 + sim("motionVMulti", "a\nb\nc\nd\ne\n", 1.62 + "Ctrl-2", "Ctrl-N", at(2, 0), "Ctrl-F", "Ctrl--", "Ctrl-N", at(1, 1), 1.63 + "Ctrl--", "Ctrl-3", "Ctrl-P", at(4, 1)); 1.64 + 1.65 + sim("killYank", "abc\ndef\nghi", 1.66 + "Ctrl-F", "Ctrl-Space", "Ctrl-N", "Ctrl-N", "Ctrl-W", "Ctrl-E", "Ctrl-Y", 1.67 + txt("ahibc\ndef\ng")); 1.68 + sim("killRing", "abcdef", 1.69 + "Ctrl-Space", "Ctrl-F", "Ctrl-W", "Ctrl-Space", "Ctrl-F", "Ctrl-W", 1.70 + "Ctrl-Y", "Alt-Y", 1.71 + txt("acdef")); 1.72 + sim("copyYank", "abcd", 1.73 + "Ctrl-Space", "Ctrl-E", "Alt-W", "Ctrl-Y", 1.74 + txt("abcdabcd")); 1.75 + 1.76 + sim("killLineSimple", "foo\nbar", "Ctrl-F", "Ctrl-K", txt("f\nbar")); 1.77 + sim("killLineEmptyLine", "foo\n \nbar", "Ctrl-N", "Ctrl-K", txt("foo\nbar")); 1.78 + sim("killLineMulti", "foo\nbar\nbaz", 1.79 + "Ctrl-F", "Ctrl-F", "Ctrl-K", "Ctrl-K", "Ctrl-K", "Ctrl-A", "Ctrl-Y", 1.80 + txt("o\nbarfo\nbaz")); 1.81 + 1.82 + sim("moveByParagraph", "abc\ndef\n\n\nhij\nklm\n\n", 1.83 + "Ctrl-F", "Ctrl-Down", at(2, 0), "Ctrl-Down", at(6, 0), 1.84 + "Ctrl-N", "Ctrl-Up", at(3, 0), "Ctrl-Up", at(0, 0), 1.85 + Pos(1, 2), "Ctrl-Down", at(2, 0), Pos(4, 2), "Ctrl-Up", at(3, 0)); 1.86 + sim("moveByParagraphMulti", "abc\n\ndef\n\nhij\n\nklm", 1.87 + "Ctrl-U", "2", "Ctrl-Down", at(3, 0), 1.88 + "Shift-Alt-.", "Ctrl-3", "Ctrl-Up", at(1, 0)); 1.89 + 1.90 + sim("moveBySentence", "sentence one! sentence\ntwo\n\nparagraph two", 1.91 + "Alt-E", at(0, 13), "Alt-E", at(1, 3), "Ctrl-F", "Alt-A", at(0, 13)); 1.92 + 1.93 + sim("moveByExpr", "function foo(a, b) {}", 1.94 + "Ctrl-Alt-F", at(0, 8), "Ctrl-Alt-F", at(0, 12), "Ctrl-Alt-F", at(0, 18), 1.95 + "Ctrl-Alt-B", at(0, 12), "Ctrl-Alt-B", at(0, 9)); 1.96 + sim("moveByExprMulti", "foo bar baz bug", 1.97 + "Ctrl-2", "Ctrl-Alt-F", at(0, 7), 1.98 + "Ctrl--", "Ctrl-Alt-F", at(0, 4), 1.99 + "Ctrl--", "Ctrl-2", "Ctrl-Alt-B", at(0, 11)); 1.100 + sim("delExpr", "var x = [\n a,\n b\n c\n];", 1.101 + Pos(0, 8), "Ctrl-Alt-K", txt("var x = ;"), "Ctrl-/", 1.102 + Pos(4, 1), "Ctrl-Alt-Backspace", txt("var x = ;")); 1.103 + sim("delExprMulti", "foo bar baz", 1.104 + "Ctrl-2", "Ctrl-Alt-K", txt(" baz"), 1.105 + "Ctrl-/", "Ctrl-E", "Ctrl-2", "Ctrl-Alt-Backspace", txt("foo ")); 1.106 + 1.107 + sim("justOneSpace", "hi bye ", 1.108 + Pos(0, 4), "Alt-Space", txt("hi bye "), 1.109 + Pos(0, 4), "Alt-Space", txt("hi b ye "), 1.110 + "Ctrl-A", "Alt-Space", "Ctrl-E", "Alt-Space", txt(" hi b ye ")); 1.111 + 1.112 + sim("openLine", "foo bar", "Alt-F", "Ctrl-O", txt("foo\n bar")) 1.113 + 1.114 + sim("transposeChar", "abcd\n\ne", 1.115 + "Ctrl-F", "Ctrl-T", "Ctrl-T", txt("bcad\n\ne"), at(0, 3), 1.116 + "Ctrl-F", "Ctrl-T", "Ctrl-T", "Ctrl-T", txt("bcda\n\ne"), at(0, 4), 1.117 + "Ctrl-F", "Ctrl-T", txt("bcd\na\ne"), at(1, 1)); 1.118 + 1.119 + sim("manipWordCase", "foo BAR bAZ", 1.120 + "Alt-C", "Alt-L", "Alt-U", txt("Foo bar BAZ"), 1.121 + "Ctrl-A", "Alt-U", "Alt-L", "Alt-C", txt("FOO bar Baz")); 1.122 + sim("manipWordCaseMulti", "foo Bar bAz", 1.123 + "Ctrl-2", "Alt-U", txt("FOO BAR bAz"), 1.124 + "Ctrl-A", "Ctrl-3", "Alt-C", txt("Foo Bar Baz")); 1.125 + 1.126 + sim("upExpr", "foo {\n bar[];\n baz(blah);\n}", 1.127 + Pos(2, 7), "Ctrl-Alt-U", at(2, 5), "Ctrl-Alt-U", at(0, 4)); 1.128 + sim("transposeExpr", "do foo[bar] dah", 1.129 + Pos(0, 6), "Ctrl-Alt-T", txt("do [bar]foo dah")); 1.130 + 1.131 + sim("clearMark", "abcde", Pos(0, 2), "Ctrl-Space", "Ctrl-F", "Ctrl-F", 1.132 + "Ctrl-G", "Ctrl-W", txt("abcde")); 1.133 + 1.134 + testCM("save", function(cm) { 1.135 + var saved = false; 1.136 + CodeMirror.commands.save = function(cm) { saved = cm.getValue(); }; 1.137 + cm.triggerOnKeyDown(fakeEvent("Ctrl-X")); 1.138 + cm.triggerOnKeyDown(fakeEvent("Ctrl-S")); 1.139 + is(saved, "hi"); 1.140 + }, {value: "hi", keyMap: "emacs"}); 1.141 +})();