Skip to content

Commit eb43e19

Browse files
committed
Tidy up asserting when command executes, wait for throttle and don't force a sync
1 parent 5b0f10e commit eb43e19

File tree

2 files changed

+57
-63
lines changed

2 files changed

+57
-63
lines changed

src/vs/platform/terminal/common/capabilities/commandDetection/promptInputModel.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ export class PromptInputModel extends Disposable implements IPromptInputModel {
8282

8383
getCombinedString(): string {
8484
const value = this._value.replaceAll('\n', '\u23CE');
85+
if (this._cursorIndex === -1) {
86+
return value;
87+
}
8588
let result = `${value.substring(0, this.cursorIndex)}|`;
8689
if (this.ghostTextIndex !== -1) {
8790
result += `${value.substring(this.cursorIndex, this.ghostTextIndex)}[`;
@@ -111,6 +114,7 @@ export class PromptInputModel extends Disposable implements IPromptInputModel {
111114
}
112115

113116
this._state = PromptInputState.Execute;
117+
this._cursorIndex = -1;
114118
this._onDidFinishInput.fire();
115119
}
116120

@@ -120,10 +124,6 @@ export class PromptInputModel extends Disposable implements IPromptInputModel {
120124

121125
@throttle(0)
122126
private _sync() {
123-
this._syncNow();
124-
}
125-
126-
protected _syncNow() {
127127
if (this._state !== PromptInputState.Input) {
128128
return;
129129
}

src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts

Lines changed: 53 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,10 @@ import { Terminal } from '@xterm/headless';
1414
import { strictEqual } from 'assert';
1515
import { timeout } from 'vs/base/common/async';
1616

17-
class TestPromptInputModel extends PromptInputModel {
18-
forceSync() {
19-
this._syncNow();
20-
}
21-
}
22-
2317
suite('PromptInputModel', () => {
2418
const store = ensureNoDisposablesAreLeakedInTestSuite();
2519

26-
let promptInputModel: TestPromptInputModel;
20+
let promptInputModel: PromptInputModel;
2721
let xterm: Terminal;
2822
let onCommandStart: Emitter<ITerminalCommand>;
2923
let onCommandExecuted: Emitter<ITerminalCommand>;
@@ -40,13 +34,13 @@ suite('PromptInputModel', () => {
4034
onCommandExecuted.fire(null!);
4135
}
4236

43-
function assertPromptInput(valueWithCursor: string) {
44-
if (!valueWithCursor.includes('|')) {
37+
async function assertPromptInput(valueWithCursor: string) {
38+
await timeout(0);
39+
40+
if (promptInputModel.cursorIndex !== -1 && !valueWithCursor.includes('|')) {
4541
throw new Error('assertPromptInput must contain | character');
4642
}
4743

48-
promptInputModel.forceSync();
49-
5044
const actualValueWithCursor = promptInputModel.getCombinedString();
5145
strictEqual(
5246
actualValueWithCursor,
@@ -64,123 +58,123 @@ suite('PromptInputModel', () => {
6458
xterm = store.add(new Terminal({ allowProposedApi: true }));
6559
onCommandStart = store.add(new Emitter());
6660
onCommandExecuted = store.add(new Emitter());
67-
promptInputModel = store.add(new TestPromptInputModel(xterm, onCommandStart.event, onCommandExecuted.event, new NullLogService));
61+
promptInputModel = store.add(new PromptInputModel(xterm, onCommandStart.event, onCommandExecuted.event, new NullLogService));
6862
});
6963

7064
test('basic input and execute', async () => {
7165
await writePromise('$ ');
7266
fireCommandStart();
73-
assertPromptInput('|');
67+
await assertPromptInput('|');
7468

7569
await writePromise('foo bar');
76-
assertPromptInput('foo bar|');
70+
await assertPromptInput('foo bar|');
7771

7872
await writePromise('\r\n');
7973
fireCommandExecuted();
80-
assertPromptInput('foo bar|');
74+
await assertPromptInput('foo bar');
8175

8276
await writePromise('(command output)\r\n$ ');
8377
fireCommandStart();
84-
assertPromptInput('|');
78+
await assertPromptInput('|');
8579
});
8680

8781
test('cursor navigation', async () => {
8882
await writePromise('$ ');
8983
fireCommandStart();
90-
assertPromptInput('|');
84+
await assertPromptInput('|');
9185

9286
await writePromise('foo bar');
93-
assertPromptInput('foo bar|');
87+
await assertPromptInput('foo bar|');
9488

9589
await writePromise('\x1b[3D');
96-
assertPromptInput('foo |bar');
90+
await assertPromptInput('foo |bar');
9791

9892
await writePromise('\x1b[4D');
99-
assertPromptInput('|foo bar');
93+
await assertPromptInput('|foo bar');
10094

10195
await writePromise('\x1b[3C');
102-
assertPromptInput('foo| bar');
96+
await assertPromptInput('foo| bar');
10397

10498
await writePromise('\x1b[4C');
105-
assertPromptInput('foo bar|');
99+
await assertPromptInput('foo bar|');
106100

107101
await writePromise('\x1b[D');
108-
assertPromptInput('foo ba|r');
102+
await assertPromptInput('foo ba|r');
109103

110104
await writePromise('\x1b[C');
111-
assertPromptInput('foo bar|');
105+
await assertPromptInput('foo bar|');
112106
});
113107

114108
test('ghost text', async () => {
115109
await writePromise('$ ');
116110
fireCommandStart();
117-
assertPromptInput('|');
111+
await assertPromptInput('|');
118112

119113
await writePromise('foo\x1b[2m bar\x1b[0m\x1b[4D');
120-
assertPromptInput('foo|[ bar]');
114+
await assertPromptInput('foo|[ bar]');
121115

122116
await writePromise('\x1b[2D');
123-
assertPromptInput('f|oo[ bar]');
117+
await assertPromptInput('f|oo[ bar]');
124118
});
125119

126120
test('wide input (Korean)', async () => {
127121
await writePromise('$ ');
128122
fireCommandStart();
129-
assertPromptInput('|');
123+
await assertPromptInput('|');
130124

131125
await writePromise('안영');
132-
assertPromptInput('안영|');
126+
await assertPromptInput('안영|');
133127

134128
await writePromise('\r\n컴퓨터');
135-
assertPromptInput('안영\n컴퓨터|');
129+
await assertPromptInput('안영\n컴퓨터|');
136130

137131
await writePromise('\r\n사람');
138-
assertPromptInput('안영\n컴퓨터\n사람|');
132+
await assertPromptInput('안영\n컴퓨터\n사람|');
139133

140134
await writePromise('\x1b[G');
141-
assertPromptInput('안영\n컴퓨터\n|사람');
135+
await assertPromptInput('안영\n컴퓨터\n|사람');
142136

143137
await writePromise('\x1b[A');
144-
assertPromptInput('안영\n|컴퓨터\n사람');
138+
await assertPromptInput('안영\n|컴퓨터\n사람');
145139

146140
await writePromise('\x1b[4C');
147-
assertPromptInput('안영\n컴퓨|터\n사람');
141+
await assertPromptInput('안영\n컴퓨|터\n사람');
148142

149143
await writePromise('\x1b[1;4H');
150-
assertPromptInput('안|영\n컴퓨터\n사람');
144+
await assertPromptInput('안|영\n컴퓨터\n사람');
151145

152146
await writePromise('\x1b[D');
153-
assertPromptInput('|안영\n컴퓨터\n사람');
147+
await assertPromptInput('|안영\n컴퓨터\n사람');
154148
});
155149

156150
test('emoji input', async () => {
157151
await writePromise('$ ');
158152
fireCommandStart();
159-
assertPromptInput('|');
153+
await assertPromptInput('|');
160154

161155
await writePromise('✌️👍');
162-
assertPromptInput('✌️👍|');
156+
await assertPromptInput('✌️👍|');
163157

164158
await writePromise('\r\n😎😕😅');
165-
assertPromptInput('✌️👍\n😎😕😅|');
159+
await assertPromptInput('✌️👍\n😎😕😅|');
166160

167161
await writePromise('\r\n🤔🤷😩');
168-
assertPromptInput('✌️👍\n😎😕😅\n🤔🤷😩|');
162+
await assertPromptInput('✌️👍\n😎😕😅\n🤔🤷😩|');
169163

170164
await writePromise('\x1b[G');
171-
assertPromptInput('✌️👍\n😎😕😅\n|🤔🤷😩');
165+
await assertPromptInput('✌️👍\n😎😕😅\n|🤔🤷😩');
172166

173167
await writePromise('\x1b[A');
174-
assertPromptInput('✌️👍\n|😎😕😅\n🤔🤷😩');
168+
await assertPromptInput('✌️👍\n|😎😕😅\n🤔🤷😩');
175169

176170
await writePromise('\x1b[2C');
177-
assertPromptInput('✌️👍\n😎😕|😅\n🤔🤷😩');
171+
await assertPromptInput('✌️👍\n😎😕|😅\n🤔🤷😩');
178172

179173
await writePromise('\x1b[1;4H');
180-
assertPromptInput('✌️|👍\n😎😕😅\n🤔🤷😩');
174+
await assertPromptInput('✌️|👍\n😎😕😅\n🤔🤷😩');
181175

182176
await writePromise('\x1b[D');
183-
assertPromptInput('|✌️👍\n😎😕😅\n🤔🤷😩');
177+
await assertPromptInput('|✌️👍\n😎😕😅\n🤔🤷😩');
184178
});
185179

186180
// To "record a session" for these tests:
@@ -206,7 +200,7 @@ suite('PromptInputModel', () => {
206200
'\r\n03:13:47  vscode   tyriar/prompt_input_model  $⇡  via  v18.18.2 \r\n❯ ',
207201
]);
208202
fireCommandStart();
209-
assertPromptInput('|');
203+
await assertPromptInput('|');
210204

211205
await replayEvents([
212206
'[?25lfakecommand[?25h',
@@ -216,7 +210,7 @@ suite('PromptInputModel', () => {
216210
'[?25lfoo[?25h',
217211
'',
218212
]);
219-
assertPromptInput('foo|');
213+
await assertPromptInput('foo|');
220214
});
221215
test('input with accepted and run ghost text', async () => {
222216
await replayEvents([
@@ -229,62 +223,62 @@ suite('PromptInputModel', () => {
229223
]);
230224
promptInputModel.setContinuationPrompt('∙ ');
231225
fireCommandStart();
232-
assertPromptInput('|');
226+
await assertPromptInput('|');
233227

234228
await replayEvents([
235229
'[?25lecho "hello world"[?25h',
236230
'',
237231
]);
238-
assertPromptInput('e|[cho "hello world"]');
232+
await assertPromptInput('e|[cho "hello world"]');
239233

240234
await replayEvents([
241235
'[?25lecho "hello world"[?25h',
242236
'',
243237
]);
244-
assertPromptInput('ec|[ho "hello world"]');
238+
await assertPromptInput('ec|[ho "hello world"]');
245239

246240
await replayEvents([
247241
'[?25lecho "hello world"[?25h',
248242
'',
249243
]);
250-
assertPromptInput('ech|[o "hello world"]');
244+
await assertPromptInput('ech|[o "hello world"]');
251245

252246
await replayEvents([
253247
'[?25lecho "hello world"[?25h',
254248
'',
255249
]);
256-
assertPromptInput('echo|[ "hello world"]');
250+
await assertPromptInput('echo|[ "hello world"]');
257251

258252
await replayEvents([
259253
'[?25lecho "hello world"[?25h',
260254
'',
261255
]);
262-
assertPromptInput('echo |["hello world"]');
256+
await assertPromptInput('echo |["hello world"]');
263257

264258
await replayEvents([
265259
'[?25lecho "hello world"[?25h',
266260
'',
267261
]);
268-
assertPromptInput('echo "hello world"|');
262+
await assertPromptInput('echo "hello world"|');
269263

270264
await replayEvents([
271265
']633;E;echo "hello world";ff464d39-bc80-4bae-9ead-b1cafc4adf6f]633;C',
272266
]);
273267
fireCommandExecuted();
274-
assertPromptInput('echo "hello world"|');
268+
await assertPromptInput('echo "hello world"');
275269

276270
await replayEvents([
277271
'\r\n',
278272
'hello world\r\n',
279273
]);
280-
assertPromptInput('echo "hello world"|');
274+
await assertPromptInput('echo "hello world"');
281275

282276
await replayEvents([
283277
']633;D;0]633;A]633;P;Cwd=C:\x5cGithub\x5cmicrosoft\x5cvscode]633;B',
284278
'\r\n03:41:42  vscode   tyriar/prompt_input_model  $  via  v18.18.2 \r\n❯ ',
285279
]);
286280
fireCommandStart();
287-
assertPromptInput('|');
281+
await assertPromptInput('|');
288282
});
289283

290284
test('input, go to start (ctrl+home), delete word in front (ctrl+delete)', async () => {
@@ -297,7 +291,7 @@ suite('PromptInputModel', () => {
297291
'\r\n16:07:06  vscode   tyriar/210662  $!  via  v18.18.2 \r\n❯ ',
298292
]);
299293
fireCommandStart();
300-
assertPromptInput('|');
294+
await assertPromptInput('|');
301295

302296
await replayEvents([
303297
'[?25lGit push[?25h',
@@ -306,7 +300,7 @@ suite('PromptInputModel', () => {
306300
'',
307301
'[?25lGet-ChildItem -Path a[?25h',
308302
]);
309-
assertPromptInput('Get|[-ChildItem -Path a]');
303+
await assertPromptInput('Get|[-ChildItem -Path a]');
310304

311305
await replayEvents([
312306
'',

0 commit comments

Comments
 (0)