newtests/lsp/wait_for_recheck/test.js (294 lines of code) (raw):
/*
* @flow
* @format
*/
import type {Suite} from 'flow-dev-tools/src/test/Suite';
const {suite, test} = require('flow-dev-tools/src/test/Tester');
/**
* This test suite takes each query tested by lsp/queries and runs it once with
* wait_for_recheck=true and once with wait_for_recheck=false. In each case,
* we've triggered a 20s recheck and have a 2s timeout. Queries that run in
* parallel with a recheck will return a response. Those that don't will
* timeout
*/
module.exports = (suite(
({
lspStartAndConnect,
lspNotification,
lspRequestAndWaitUntilResponse,
addFile,
addFiles,
lspIgnoreStatusAndCancellation,
}) => [
test('invalid_method handled immediately when wait_for_recheck=true', [
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('foobar', {}).verifyAllLSPMessagesInStep(
['foobar'],
[...lspIgnoreStatusAndCancellation],
),
lspNotification('barfoo', {})
.waitUntilLSPMessage(2000, 'telemetry/event')
.verifyAllLSPMessagesInStep(
[
{
method: 'telemetry/event',
params: {type: 1, message: 'Unhandled method barfoo'},
},
],
[...lspIgnoreStatusAndCancellation],
),
]).waitForRecheck(true),
test('invalid_method handled immediately when wait_for_recheck=false', [
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('foobar', {}).verifyAllLSPMessagesInStep(
['foobar'],
[...lspIgnoreStatusAndCancellation],
),
lspNotification('barfoo', {})
.waitUntilLSPMessage(2000, 'telemetry/event')
.verifyAllLSPMessagesInStep(
[
{
method: 'telemetry/event',
params: {type: 1, message: 'Unhandled method barfoo'},
},
],
[...lspIgnoreStatusAndCancellation],
),
]).waitForRecheck(false),
test('textDocument/definition will time out with wait_for_recheck=true', [
addFile('definition.js'),
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('textDocument/definition', {
textDocument: {uri: '<PLACEHOLDER_PROJECT_URL>/definition.js'},
position: {line: 6, character: 1},
})
.verifyAllLSPMessagesInStep([], [...lspIgnoreStatusAndCancellation])
.timeout(2000),
]).waitForRecheck(true),
test('textDocument/definition will return with wait_for_recheck=false', [
addFile('definition.js'),
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('textDocument/definition', {
textDocument: {uri: '<PLACEHOLDER_PROJECT_URL>/definition.js'},
position: {line: 6, character: 1},
})
.verifyAllLSPMessagesInStep(
[
[
'textDocument/definition',
'{definition.js,"start":{"line":2,"character":9}}',
],
],
[...lspIgnoreStatusAndCancellation],
)
.timeout(2000),
]).waitForRecheck(false),
test('textDocument/hover will time out with wait_for_recheck=true', [
addFile('hover.js'),
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('textDocument/hover', {
textDocument: {uri: '<PLACEHOLDER_PROJECT_URL>/hover.js'},
position: {line: 6, character: 1}, // over a function use
})
.verifyAllLSPMessagesInStep([], [...lspIgnoreStatusAndCancellation])
.timeout(2000),
]).waitForRecheck(true),
test('textDocument/hover will return with wait_for_recheck=false', [
addFile('hover.js'),
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('textDocument/hover', {
textDocument: {uri: '<PLACEHOLDER_PROJECT_URL>/hover.js'},
position: {line: 6, character: 1}, // over a function use
})
.verifyAllLSPMessagesInStep(
[['textDocument/hover', '{() => number}']],
[...lspIgnoreStatusAndCancellation],
)
.timeout(2000),
]).waitForRecheck(false),
test('textDocument/completion will time out with wait_for_recheck=true', [
addFile('completion.js'),
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('textDocument/completion', {
textDocument: {uri: '<PLACEHOLDER_PROJECT_URL>/completion.js'},
position: {line: 10, character: 15}, // statement position
})
.verifyAllLSPMessagesInStep([], [...lspIgnoreStatusAndCancellation])
.timeout(2000),
]).waitForRecheck(true),
test('textDocument/completion will return with wait_for_recheck=false', [
addFile('completion.js'),
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('textDocument/completion', {
textDocument: {uri: '<PLACEHOLDER_PROJECT_URL>/completion.js'},
position: {line: 10, character: 15}, // statement position
})
.verifyAllLSPMessagesInStep(
[
[
'textDocument/completion',
'{"label":"x","label":"fred","detail":"(a: number, b: string) => number"}',
],
],
[...lspIgnoreStatusAndCancellation],
)
.timeout(2000),
]).waitForRecheck(false),
test(
'textDocument/documentHighlight will return with wait_for_recheck=false',
[
addFiles('references.js', 'references2.js'),
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('textDocument/documentHighlight', {
textDocument: {uri: '<PLACEHOLDER_PROJECT_URL>/references.js'},
position: {line: 9, character: 17}, // on an identifier
})
.verifyAllLSPMessagesInStep(
['textDocument/documentHighlight'],
[...lspIgnoreStatusAndCancellation],
)
.timeout(2000),
],
).waitForRecheck(false),
test(
'textDocument/documentHighlight will time out with wait_for_recheck=true',
[
addFiles('references.js', 'references2.js'),
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('textDocument/documentHighlight', {
textDocument: {uri: '<PLACEHOLDER_PROJECT_URL>/references.js'},
position: {line: 9, character: 17}, // on an identifier
})
.verifyAllLSPMessagesInStep([], [...lspIgnoreStatusAndCancellation])
.timeout(2000),
],
).waitForRecheck(true),
test('textDocument/documentSymbol will return with wait_for_recheck=true', [
addFiles('outline.js', 'references.js'),
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('textDocument/documentSymbol', {
textDocument: {uri: '<PLACEHOLDER_PROJECT_URL>/outline.js'},
})
.verifyAllLSPMessagesInStep(
[
[
'textDocument/documentSymbol',
'{WORD_REGEX,State,Preferences,pref1,EPrefs,pref2,MyClass1,_projectRoot,command,constructor,dispose,MyInterface2,getFoo,myFunction3}',
],
],
[...lspIgnoreStatusAndCancellation],
)
.timeout(2000),
]).waitForRecheck(true),
test(
'textDocument/documentSymbol will return with wait_for_recheck=false',
[
addFiles('outline.js', 'references.js'),
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('textDocument/documentSymbol', {
textDocument: {uri: '<PLACEHOLDER_PROJECT_URL>/outline.js'},
})
.verifyAllLSPMessagesInStep(
[
[
'textDocument/documentSymbol',
'{WORD_REGEX,State,Preferences,pref1,EPrefs,pref2,MyClass1,_projectRoot,command,constructor,dispose,MyInterface2,getFoo,myFunction3}',
],
],
[...lspIgnoreStatusAndCancellation],
)
.timeout(2000),
],
).waitForRecheck(false),
test('textDocument/typeCoverage will time out with wait_for_recheck=true', [
addFiles('coverage.js'),
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('textDocument/typeCoverage', {
textDocument: {uri: '<PLACEHOLDER_PROJECT_URL>/coverage.js'},
})
.verifyAllLSPMessagesInStep([], [...lspIgnoreStatusAndCancellation])
.timeout(2000),
]).waitForRecheck(true),
test('textDocument/typeCoverage will return with wait_for_recheck=false', [
addFiles('coverage.js'),
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('textDocument/typeCoverage', {
textDocument: {uri: '<PLACEHOLDER_PROJECT_URL>/coverage.js'},
})
.verifyAllLSPMessagesInStep(
[['textDocument/typeCoverage', '{"line":12,"line":8,"line":6}']],
[...lspIgnoreStatusAndCancellation],
)
.timeout(2000),
]).waitForRecheck(false),
test('telemetry/rage will time out with wait_for_recheck=true', [
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('telemetry/rage', {})
.verifyAllLSPMessagesInStep([], [...lspIgnoreStatusAndCancellation])
.timeout(10000),
]).waitForRecheck(true),
test('telemetry/rage will return with wait_for_recheck=false', [
lspStartAndConnect(),
addFile('sleep.js.ignored', 'sleep.js').verifyAllLSPMessagesInStep(
[''],
[...lspIgnoreStatusAndCancellation],
),
lspRequestAndWaitUntilResponse('telemetry/rage', {})
.verifyAllLSPMessagesInStep(
['telemetry/rage'],
[...lspIgnoreStatusAndCancellation],
)
.timeout(10000),
]).waitForRecheck(false),
],
): Suite);