Mercurial
comparison .cms/lib/codemirror/test/emacs_test.js @ 0:78edf6b517a0 draft
24.10
author | Coffee CMS <info@coffee-cms.ru> |
---|---|
date | Fri, 11 Oct 2024 22:40:23 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:78edf6b517a0 |
---|---|
1 (function() { | |
2 "use strict"; | |
3 | |
4 var Pos = CodeMirror.Pos; | |
5 namespace = "emacs_"; | |
6 | |
7 var eventCache = {}; | |
8 function fakeEvent(keyName) { | |
9 var event = eventCache[key]; | |
10 if (event) return event; | |
11 | |
12 var ctrl, shift, alt; | |
13 var key = keyName.replace(/\w+-/g, function(type) { | |
14 if (type == "Ctrl-") ctrl = true; | |
15 else if (type == "Alt-") alt = true; | |
16 else if (type == "Shift-") shift = true; | |
17 return ""; | |
18 }); | |
19 var code; | |
20 for (var c in CodeMirror.keyNames) | |
21 if (CodeMirror.keyNames[c] == key) { code = c; break; } | |
22 if (code == null) throw new Error("Unknown key: " + key); | |
23 | |
24 return eventCache[keyName] = { | |
25 type: "keydown", keyCode: code, ctrlKey: ctrl, shiftKey: shift, altKey: alt, | |
26 preventDefault: function(){}, stopPropagation: function(){} | |
27 }; | |
28 } | |
29 | |
30 function sim(name, start /*, actions... */) { | |
31 var keys = Array.prototype.slice.call(arguments, 2); | |
32 testCM(name, function(cm) { | |
33 for (var i = 0; i < keys.length; ++i) { | |
34 var cur = keys[i]; | |
35 if (cur instanceof Pos) cm.setCursor(cur); | |
36 else if (cur.call) cur(cm); | |
37 else cm.triggerOnKeyDown(fakeEvent(cur)); | |
38 } | |
39 }, {keyMap: "emacs", value: start, mode: "javascript"}); | |
40 } | |
41 | |
42 function dialog(answer) { return function(cm) { cm.openDialog = function(_, cb) { cb(answer); }; }; } | |
43 | |
44 function at(line, ch, sticky) { return function(cm) { eqCursorPos(cm.getCursor(), Pos(line, ch, sticky)); }; } | |
45 function txt(str) { return function(cm) { eq(cm.getValue(), str); }; } | |
46 | |
47 sim("motionHSimple", "abc", "Ctrl-F", "Ctrl-F", "Ctrl-B", at(0, 1, "after")); | |
48 sim("motionHMulti", "abcde", | |
49 "Ctrl-4", "Ctrl-F", at(0, 4, "before"), "Ctrl--", "Ctrl-2", "Ctrl-F", at(0, 2, "after"), | |
50 "Ctrl-5", "Ctrl-B", at(0, 0, "after")); | |
51 | |
52 sim("motionHWord", "abc. def ghi", | |
53 "Alt-F", at(0, 3, "before"), "Alt-F", at(0, 8, "before"), | |
54 "Ctrl-B", "Alt-B", at(0, 5, "after"), "Alt-B", at(0, 0, "after")); | |
55 sim("motionHWordMulti", "abc. def ghi ", | |
56 "Ctrl-3", "Alt-F", at(0, 12, "before"), "Ctrl-2", "Alt-B", at(0, 5, "after"), | |
57 "Ctrl--", "Alt-B", at(0, 8, "before")); | |
58 | |
59 sim("motionVSimple", "a\nb\nc\n", "Ctrl-N", "Ctrl-N", "Ctrl-P", at(1, 0, "after")); | |
60 sim("motionVMulti", "a\nb\nc\nd\ne\n", | |
61 "Ctrl-2", "Ctrl-N", at(2, 0, "after"), "Ctrl-F", "Ctrl--", "Ctrl-N", at(1, 1, "before"), | |
62 "Ctrl--", "Ctrl-3", "Ctrl-P", at(4, 1, "before")); | |
63 | |
64 sim("killYank", "abc\ndef\nghi", | |
65 "Ctrl-F", "Ctrl-Space", "Ctrl-N", "Ctrl-N", "Ctrl-W", "Ctrl-E", "Ctrl-Y", | |
66 txt("ahibc\ndef\ng")); | |
67 sim("killRing", "abcdef", | |
68 "Ctrl-Space", "Ctrl-F", "Ctrl-W", "Ctrl-Space", "Ctrl-F", "Ctrl-W", | |
69 "Ctrl-Y", "Alt-Y", | |
70 txt("acdef")); | |
71 sim("copyYank", "abcd", | |
72 "Ctrl-Space", "Ctrl-E", "Alt-W", "Ctrl-Y", | |
73 txt("abcdabcd")); | |
74 | |
75 sim("killLineSimple", "foo\nbar", "Ctrl-F", "Ctrl-K", txt("f\nbar")); | |
76 sim("killLineEmptyLine", "foo\n \nbar", "Ctrl-N", "Ctrl-K", txt("foo\nbar")); | |
77 sim("killLineMulti", "foo\nbar\nbaz", | |
78 "Ctrl-F", "Ctrl-F", "Ctrl-K", "Ctrl-K", "Ctrl-K", "Ctrl-A", "Ctrl-Y", | |
79 txt("o\nbarfo\nbaz")); | |
80 | |
81 sim("moveByParagraph", "abc\ndef\n\n\nhij\nklm\n\n", | |
82 "Ctrl-F", "Ctrl-Down", at(2, 0), "Ctrl-Down", at(6, 0), | |
83 "Ctrl-N", "Ctrl-Up", at(3, 0), "Ctrl-Up", at(0, 0), | |
84 Pos(1, 2), "Ctrl-Down", at(2, 0), Pos(4, 2), "Ctrl-Up", at(3, 0)); | |
85 sim("moveByParagraphMulti", "abc\n\ndef\n\nhij\n\nklm", | |
86 "Ctrl-U", "2", "Ctrl-Down", at(3, 0), | |
87 "Shift-Alt-.", "Ctrl-3", "Ctrl-Up", at(1, 0)); | |
88 | |
89 sim("moveBySentence", "sentence one! sentence\ntwo\n\nparagraph two", | |
90 "Alt-E", at(0, 13), "Alt-E", at(1, 3), "Ctrl-F", "Alt-A", at(0, 13)); | |
91 | |
92 sim("moveByExpr", "function foo(a, b) {}", | |
93 "Ctrl-Alt-F", at(0, 8), "Ctrl-Alt-F", at(0, 12), "Ctrl-Alt-F", at(0, 18), | |
94 "Ctrl-Alt-B", at(0, 12), "Ctrl-Alt-B", at(0, 9)); | |
95 sim("moveByExprMulti", "foo bar baz bug", | |
96 "Ctrl-2", "Ctrl-Alt-F", at(0, 7), | |
97 "Ctrl--", "Ctrl-Alt-F", at(0, 4), | |
98 "Ctrl--", "Ctrl-2", "Ctrl-Alt-B", at(0, 11)); | |
99 sim("delExpr", "var x = [\n a,\n b\n c\n];", | |
100 Pos(0, 8), "Ctrl-Alt-K", txt("var x = ;"), "Ctrl-/", | |
101 Pos(4, 1), "Ctrl-Alt-Backspace", txt("var x = ;")); | |
102 sim("delExprMulti", "foo bar baz", | |
103 "Ctrl-2", "Ctrl-Alt-K", txt(" baz"), | |
104 "Ctrl-/", "Ctrl-E", "Ctrl-2", "Ctrl-Alt-Backspace", txt("foo ")); | |
105 | |
106 sim("justOneSpace", "hi bye ", | |
107 Pos(0, 4), "Alt-Space", txt("hi bye "), | |
108 Pos(0, 4), "Alt-Space", txt("hi b ye "), | |
109 "Ctrl-A", "Alt-Space", "Ctrl-E", "Alt-Space", txt(" hi b ye ")); | |
110 | |
111 sim("openLine", "foo bar", "Alt-F", "Ctrl-O", txt("foo\n bar")) | |
112 | |
113 sim("transposeChar", "abcd\ne", | |
114 "Ctrl-F", "Ctrl-T", "Ctrl-T", txt("bcad\ne"), at(0, 3), | |
115 "Ctrl-F", "Ctrl-T", "Ctrl-T", "Ctrl-T", txt("bcda\ne"), at(0, 4), | |
116 "Ctrl-F", "Ctrl-T", txt("bcde\na"), at(1, 1)); | |
117 | |
118 sim("manipWordCase", "foo BAR bAZ", | |
119 "Alt-C", "Alt-L", "Alt-U", txt("Foo bar BAZ"), | |
120 "Ctrl-A", "Alt-U", "Alt-L", "Alt-C", txt("FOO bar Baz")); | |
121 sim("manipWordCaseMulti", "foo Bar bAz", | |
122 "Ctrl-2", "Alt-U", txt("FOO BAR bAz"), | |
123 "Ctrl-A", "Ctrl-3", "Alt-C", txt("Foo Bar Baz")); | |
124 | |
125 sim("upExpr", "foo {\n bar[];\n baz(blah);\n}", | |
126 Pos(2, 7), "Ctrl-Alt-U", at(2, 5), "Ctrl-Alt-U", at(0, 4)); | |
127 sim("transposeExpr", "do foo[bar] dah", | |
128 Pos(0, 6), "Ctrl-Alt-T", txt("do [bar]foo dah")); | |
129 | |
130 sim("clearMark", "abcde", Pos(0, 2), "Ctrl-Space", "Ctrl-F", "Ctrl-F", | |
131 "Ctrl-G", "Ctrl-W", txt("abcde")); | |
132 | |
133 sim("delRegion", "abcde", "Ctrl-Space", "Ctrl-F", "Ctrl-F", "Delete", txt("cde")); | |
134 sim("backspaceRegion", "abcde", "Ctrl-Space", "Ctrl-F", "Ctrl-F", "Backspace", txt("cde")); | |
135 | |
136 sim("backspaceDoesntAddToRing", "foobar", "Ctrl-F", "Ctrl-F", "Ctrl-F", "Ctrl-K", "Backspace", "Backspace", "Ctrl-Y", txt("fbar")); | |
137 | |
138 sim("gotoLine", "0\n1\n2\n3", dialog("3"), "Alt-G", "G", at(2, 0)); | |
139 sim("gotoInvalidLineFloat", "0\n1\n2\n3", dialog("2.2"), "Alt-G", "G", at(0, 0)); | |
140 | |
141 testCM("gotoDialogTemplate", function(cm) { | |
142 cm.openDialog = function(template, cb) { | |
143 var input = template.querySelector("input"); | |
144 eq(template.textContent, "Goto line: "); | |
145 eq(input.tagName, "INPUT"); | |
146 }; | |
147 cm.triggerOnKeyDown(fakeEvent("Alt-G")); | |
148 cm.triggerOnKeyDown(fakeEvent("G")); | |
149 }, {value: "", keyMap: "emacs"}); | |
150 | |
151 testCM("save", function(cm) { | |
152 var saved = false; | |
153 CodeMirror.commands.save = function(cm) { saved = cm.getValue(); }; | |
154 cm.triggerOnKeyDown(fakeEvent("Ctrl-X")); | |
155 cm.triggerOnKeyDown(fakeEvent("Ctrl-S")); | |
156 is(saved, "hi"); | |
157 }, {value: "hi", keyMap: "emacs"}); | |
158 })(); |