@@ -9,12 +9,21 @@ if (typeof process !== "undefined") {
9
9
var Editor = require ( "../editor" ) . Editor ;
10
10
var EditSession = require ( "../edit_session" ) . EditSession ;
11
11
var InlineAutocomplete = require ( "./inline_autocomplete" ) . InlineAutocomplete ;
12
+ const { Autocomplete } = require ( "../autocomplete" ) ;
12
13
var assert = require ( "../test/assertions" ) ;
14
+ var BUTTON_CLASS_NAME = require ( "./command_bar" ) . BUTTON_CLASS_NAME ;
13
15
var type = require ( "../test/user" ) . type ;
14
16
var VirtualRenderer = require ( "../virtual_renderer" ) . VirtualRenderer ;
15
17
16
18
var editor ;
17
19
var autocomplete ;
20
+ var inlineTooltip ;
21
+ var wrapperEl ;
22
+
23
+ function simulateClick ( node ) {
24
+ node . dispatchEvent ( new window . CustomEvent ( "click" , { bubbles : true } ) ) ;
25
+ }
26
+
18
27
19
28
var getAllLines = function ( ) {
20
29
var text = Array . from ( editor . renderer . $textLayer . element . childNodes ) . map ( function ( node ) {
@@ -61,22 +70,36 @@ var mockCompleter = {
61
70
}
62
71
} ;
63
72
73
+ var setupInlineTooltip = function ( ) {
74
+ inlineTooltip = autocomplete . getInlineTooltip ( ) ;
75
+ inlineTooltip . setAlwaysShow ( true ) ;
76
+ // Workaround: non-standard width and height hints for mock dom (mock dom does not work well with flex elements)
77
+ // When running in the browser, these are ignored
78
+ inlineTooltip . tooltip . getElement ( ) . style . widthHint = 150 ;
79
+ inlineTooltip . tooltip . getElement ( ) . style . heightHint = editor . renderer . lineHeight * 2 ;
80
+ inlineTooltip . moreOptions . getElement ( ) . style . widthHint = 150 ;
81
+ inlineTooltip . moreOptions . getElement ( ) . style . heightHint = editor . renderer . lineHeight * 2 ;
82
+ } ;
83
+
64
84
module . exports = {
65
85
setUp : function ( done ) {
66
- var el = document . createElement ( "div" ) ;
67
- el . style . left = "20px" ;
68
- el . style . top = "30px" ;
69
- el . style . width = "500px" ;
70
- el . style . height = "500px" ;
71
- document . body . appendChild ( el ) ;
72
- var renderer = new VirtualRenderer ( el ) ;
86
+ wrapperEl = document . createElement ( "div" ) ;
87
+ wrapperEl . style . position = "fixed" ;
88
+ wrapperEl . style . left = "400px" ;
89
+ wrapperEl . style . top = "30px" ;
90
+ wrapperEl . style . width = "500px" ;
91
+ wrapperEl . style . height = "500px" ;
92
+ document . body . appendChild ( wrapperEl ) ;
93
+ var renderer = new VirtualRenderer ( wrapperEl ) ;
73
94
var session = new EditSession ( "" ) ;
74
95
editor = new Editor ( renderer , session ) ;
96
+ editor . setOption ( "enableInlineAutocompletion" , true ) ;
75
97
editor . execCommand ( "insertstring" , "f" ) ;
76
98
editor . getSelection ( ) . moveCursorFileEnd ( ) ;
77
99
editor . renderer . $loop . _flush ( ) ;
78
100
editor . completers = [ mockCompleter ] ;
79
101
autocomplete = InlineAutocomplete . for ( editor ) ;
102
+ setupInlineTooltip ( ) ;
80
103
editor . focus ( ) ;
81
104
done ( ) ;
82
105
} ,
@@ -88,17 +111,48 @@ module.exports = {
88
111
assert . strictEqual ( getAllLines ( ) , "foo" ) ;
89
112
done ( ) ;
90
113
} ,
91
- "test: autocomplete tooltip is shown according to the selected option" : function ( done ) {
92
- assert . equal ( autocomplete . inlineTooltip , null ) ;
114
+ "test: autocomplete start keybinding works" : function ( done ) {
115
+ type ( "Alt-C" ) ;
116
+ assert . strictEqual ( autocomplete . isOpen ( ) , true ) ;
117
+ assert . strictEqual ( autocomplete . getIndex ( ) , 0 ) ;
118
+ assert . strictEqual ( autocomplete . getData ( ) . value , "foo" ) ;
119
+ editor . renderer . $loop . _flush ( ) ;
120
+ assert . strictEqual ( getAllLines ( ) , "foo" ) ;
121
+ autocomplete . detach ( ) ;
93
122
123
+ editor . setOption ( "enableInlineAutocompletion" , false ) ;
124
+
125
+ type ( "Alt-C" ) ;
126
+ assert . strictEqual ( autocomplete . isOpen ( ) , false ) ;
127
+ assert . strictEqual ( autocomplete . getIndex ( ) , - 1 ) ;
128
+ editor . renderer . $loop . _flush ( ) ;
129
+ assert . strictEqual ( getAllLines ( ) , "f" ) ;
130
+
131
+ done ( ) ;
132
+ } ,
133
+ "test: replaces different autocomplete implementation for the editor when opened" : function ( done ) {
134
+ var completer = Autocomplete . for ( editor ) ;
135
+ completer . showPopup ( editor , { } ) ;
136
+ assert . strictEqual ( editor . completer , completer ) ;
137
+ assert . strictEqual ( autocomplete . isOpen ( ) , false ) ;
138
+
139
+ autocomplete = InlineAutocomplete . for ( editor ) ;
140
+ autocomplete . show ( editor ) ;
141
+ assert . strictEqual ( editor . completer . isOpen ( ) , true ) ;
142
+ editor . renderer . $loop . _flush ( ) ;
143
+ assert . strictEqual ( getAllLines ( ) , "foo" ) ;
144
+
145
+ done ( ) ;
146
+ } ,
147
+ "test: autocomplete tooltip is shown according to the selected option" : function ( done ) {
94
148
autocomplete . show ( editor ) ;
95
- assert . strictEqual ( autocomplete . inlineTooltip . isShown ( ) , true ) ;
149
+ assert . strictEqual ( inlineTooltip . isShown ( ) , true ) ;
96
150
97
151
autocomplete . detach ( ) ;
98
- assert . strictEqual ( autocomplete . inlineTooltip . isShown ( ) , false ) ;
152
+ assert . strictEqual ( inlineTooltip . isShown ( ) , false ) ;
99
153
done ( ) ;
100
154
} ,
101
- "test: autocomplete navigation works" : function ( done ) {
155
+ "test: autocomplete keyboard navigation works" : function ( done ) {
102
156
autocomplete . show ( editor ) ;
103
157
editor . renderer . $loop . _flush ( ) ;
104
158
assert . strictEqual ( autocomplete . getIndex ( ) , 0 ) ;
@@ -118,6 +172,69 @@ module.exports = {
118
172
assert . equal ( getAllLines ( ) , "foo" ) ;
119
173
done ( ) ;
120
174
} ,
175
+ "test: autocomplete tooltip navigation works" : function ( done ) {
176
+ autocomplete . show ( editor ) ;
177
+ assert . strictEqual ( autocomplete . getInlineTooltip ( ) . isShown ( ) , true ) ;
178
+
179
+ editor . renderer . $loop . _flush ( ) ;
180
+ assert . strictEqual ( autocomplete . getIndex ( ) , 0 ) ;
181
+ assert . strictEqual ( autocomplete . getData ( ) . value , "foo" ) ;
182
+ assert . strictEqual ( getAllLines ( ) , "foo" ) ;
183
+
184
+ var buttonElements = Array . from ( document . querySelectorAll ( "." + BUTTON_CLASS_NAME ) ) ;
185
+
186
+ var prevButton = buttonElements [ 0 ] ;
187
+ var nextButton = buttonElements [ 2 ] ;
188
+
189
+ simulateClick ( prevButton ) ;
190
+
191
+ editor . renderer . $loop . _flush ( ) ;
192
+ assert . strictEqual ( autocomplete . getIndex ( ) , 5 ) ;
193
+ assert . strictEqual ( autocomplete . getData ( ) . value , "fundraiser" ) ;
194
+ assert . strictEqual ( getAllLines ( ) , "fundraiser" ) ;
195
+
196
+ simulateClick ( nextButton ) ;
197
+
198
+ editor . renderer . $loop . _flush ( ) ;
199
+ assert . strictEqual ( autocomplete . getIndex ( ) , 0 ) ;
200
+ assert . strictEqual ( autocomplete . getData ( ) . value , "foo" ) ;
201
+ assert . strictEqual ( getAllLines ( ) , "foo" ) ;
202
+
203
+ simulateClick ( nextButton ) ;
204
+
205
+ editor . renderer . $loop . _flush ( ) ;
206
+ assert . strictEqual ( autocomplete . getIndex ( ) , 1 ) ;
207
+ assert . strictEqual ( autocomplete . getData ( ) . value , "foobar" ) ;
208
+ assert . strictEqual ( getAllLines ( ) , "foobar" ) ;
209
+
210
+ autocomplete . setIndex ( 5 ) ;
211
+ editor . renderer . $loop . _flush ( ) ;
212
+ assert . strictEqual ( autocomplete . getData ( ) . value , "fundraiser" ) ;
213
+ assert . equal ( getAllLines ( ) , "fundraiser" ) ;
214
+
215
+ simulateClick ( nextButton ) ;
216
+
217
+ editor . renderer . $loop . _flush ( ) ;
218
+ assert . strictEqual ( autocomplete . getIndex ( ) , 0 ) ;
219
+ assert . strictEqual ( autocomplete . getData ( ) . value , "foo" ) ;
220
+ assert . strictEqual ( getAllLines ( ) , "foo" ) ;
221
+
222
+ simulateClick ( prevButton ) ;
223
+
224
+ editor . renderer . $loop . _flush ( ) ;
225
+ assert . strictEqual ( autocomplete . getIndex ( ) , 5 ) ;
226
+ assert . strictEqual ( autocomplete . getData ( ) . value , "fundraiser" ) ;
227
+ assert . strictEqual ( getAllLines ( ) , "fundraiser" ) ;
228
+
229
+ simulateClick ( prevButton ) ;
230
+
231
+ editor . renderer . $loop . _flush ( ) ;
232
+ assert . strictEqual ( autocomplete . getIndex ( ) , 4 ) ;
233
+ assert . strictEqual ( autocomplete . getData ( ) . value , "function" ) ;
234
+ assert . strictEqual ( getAllLines ( ) , "function" ) ;
235
+
236
+ done ( ) ;
237
+ } ,
121
238
"test: verify goTo commands" : function ( done ) {
122
239
autocomplete . show ( editor ) ;
123
240
autocomplete . setIndex ( 1 ) ;
@@ -145,9 +262,14 @@ module.exports = {
145
262
146
263
autocomplete . goTo ( "next" ) ;
147
264
editor . renderer . $loop . _flush ( ) ;
148
- assert . strictEqual ( autocomplete . getIndex ( ) , 5 ) ;
265
+ assert . strictEqual ( autocomplete . getIndex ( ) , 0 ) ;
266
+ assert . strictEqual ( autocomplete . getData ( ) . value , "foo" ) ;
267
+ assert . strictEqual ( getAllLines ( ) , "foo" ) ;
268
+
269
+ autocomplete . setIndex ( 5 ) ;
270
+ editor . renderer . $loop . _flush ( ) ;
149
271
assert . strictEqual ( autocomplete . getData ( ) . value , "fundraiser" ) ;
150
- assert . strictEqual ( getAllLines ( ) , "fundraiser" ) ;
272
+ assert . equal ( getAllLines ( ) , "fundraiser" ) ;
151
273
152
274
autocomplete . goTo ( "first" ) ;
153
275
editor . renderer . $loop . _flush ( ) ;
@@ -157,9 +279,9 @@ module.exports = {
157
279
158
280
autocomplete . goTo ( "prev" ) ;
159
281
editor . renderer . $loop . _flush ( ) ;
160
- assert . strictEqual ( autocomplete . getIndex ( ) , 0 ) ;
161
- assert . strictEqual ( autocomplete . getData ( ) . value , "foo " ) ;
162
- assert . strictEqual ( getAllLines ( ) , "foo " ) ;
282
+ assert . strictEqual ( autocomplete . getIndex ( ) , 5 ) ;
283
+ assert . strictEqual ( autocomplete . getData ( ) . value , "fundraiser " ) ;
284
+ assert . strictEqual ( getAllLines ( ) , "fundraiser " ) ;
163
285
done ( ) ;
164
286
} ,
165
287
"test: set index to negative value hides suggestions" : function ( done ) {
@@ -204,6 +326,29 @@ module.exports = {
204
326
assert . strictEqual ( getAllLines ( ) , "foo" ) ;
205
327
done ( ) ;
206
328
} ,
329
+ "test: autocomplete can be accepted via tooltip" : function ( done ) {
330
+ autocomplete . show ( editor ) ;
331
+ editor . renderer . $loop . _flush ( ) ;
332
+ assert . strictEqual ( autocomplete . isOpen ( ) , true ) ;
333
+ assert . equal ( autocomplete . inlineTooltip . isShown ( ) , true ) ;
334
+ assert . ok ( document . querySelectorAll ( ".ace_ghost_text" ) . length > 0 ) ;
335
+ assert . strictEqual ( getAllLines ( ) , "foo" ) ;
336
+
337
+ var buttonElements = Array . from ( document . querySelectorAll ( "." + BUTTON_CLASS_NAME ) ) ;
338
+ var acceptButton = buttonElements [ 3 ] ;
339
+
340
+ simulateClick ( acceptButton ) ;
341
+
342
+ editor . renderer . $loop . _flush ( ) ;
343
+ assert . equal ( autocomplete . inlineCompleter , null ) ;
344
+ assert . equal ( autocomplete . inlineTooltip . isShown ( ) , false ) ;
345
+ assert . strictEqual ( autocomplete . isOpen ( ) , false ) ;
346
+ assert . equal ( editor . renderer . $ghostText , null ) ;
347
+ assert . equal ( editor . renderer . $ghostTextWidget , null ) ;
348
+ assert . strictEqual ( document . querySelectorAll ( ".ace_ghost_text" ) . length , 0 ) ;
349
+ assert . strictEqual ( getAllLines ( ) , "foo" ) ;
350
+ done ( ) ;
351
+ } ,
207
352
"test: incremental typing filters results" : function ( done ) {
208
353
autocomplete . show ( editor ) ;
209
354
editor . renderer . $loop . _flush ( ) ;
@@ -232,6 +377,48 @@ module.exports = {
232
377
233
378
done ( ) ;
234
379
} ,
380
+ "test: tooltip stays open on incremental typing" : function ( done ) {
381
+ autocomplete . show ( editor ) ;
382
+ assert . strictEqual ( inlineTooltip . isShown ( ) , true ) ;
383
+ editor . renderer . $loop . _flush ( ) ;
384
+ assert . strictEqual ( autocomplete . isOpen ( ) , true ) ;
385
+ assert . equal ( getAllLines ( ) , "foo" ) ;
386
+ typeAndChange ( "u" , "n" ) ;
387
+ editor . renderer . $loop . _flush ( ) ;
388
+ assert . strictEqual ( autocomplete . isOpen ( ) , true ) ;
389
+ assert . strictEqual ( inlineTooltip . isShown ( ) , true ) ;
390
+ done ( ) ;
391
+ } ,
392
+ "test: can toggle tooltip display mode via tooltip button" : function ( done ) {
393
+ autocomplete . show ( editor ) ;
394
+ assert . strictEqual ( inlineTooltip . isShown ( ) , true ) ;
395
+
396
+ var buttonElements = Array . from ( document . querySelectorAll ( "." + BUTTON_CLASS_NAME ) ) ;
397
+ var moreOptionsButton = buttonElements [ 4 ] ;
398
+ var showTooltipToggle = buttonElements [ 5 ] ;
399
+ var showTooltipToggleCheckMark = showTooltipToggle . firstChild ;
400
+
401
+ assert . strictEqual ( showTooltipToggle . ariaChecked . toString ( ) , "true" ) ;
402
+ assert . strictEqual ( showTooltipToggleCheckMark . classList . contains ( "ace_checkmark" ) , true ) ;
403
+ assert . strictEqual ( inlineTooltip . getAlwaysShow ( ) , true ) ;
404
+ assert . strictEqual ( inlineTooltip . isMoreOptionsShown ( ) , false ) ;
405
+
406
+ simulateClick ( moreOptionsButton ) ;
407
+
408
+ assert . strictEqual ( inlineTooltip . isShown ( ) , true ) ;
409
+ assert . strictEqual ( showTooltipToggle . ariaChecked . toString ( ) , "true" ) ;
410
+ assert . strictEqual ( showTooltipToggleCheckMark . classList . contains ( "ace_checkmark" ) , true ) ;
411
+ assert . strictEqual ( inlineTooltip . getAlwaysShow ( ) , true ) ;
412
+ assert . strictEqual ( inlineTooltip . isMoreOptionsShown ( ) , true ) ;
413
+
414
+ simulateClick ( showTooltipToggle ) ;
415
+
416
+ assert . strictEqual ( showTooltipToggle . ariaChecked . toString ( ) , "false" ) ;
417
+ assert . strictEqual ( showTooltipToggleCheckMark . classList . contains ( "ace_checkmark" ) , false ) ;
418
+ assert . strictEqual ( inlineTooltip . getAlwaysShow ( ) , false ) ;
419
+ assert . strictEqual ( inlineTooltip . isMoreOptionsShown ( ) , false ) ;
420
+ done ( ) ;
421
+ } ,
235
422
"test: verify detach" : function ( done ) {
236
423
autocomplete . show ( editor ) ;
237
424
editor . renderer . $loop . _flush ( ) ;
@@ -274,9 +461,11 @@ module.exports = {
274
461
editor . renderer . $loop . _flush ( ) ;
275
462
done ( ) ;
276
463
} ,
464
+
277
465
tearDown : function ( ) {
278
466
autocomplete . destroy ( ) ;
279
467
editor . destroy ( ) ;
468
+ wrapperEl . parentElement . removeChild ( wrapperEl ) ;
280
469
}
281
470
} ;
282
471
0 commit comments