newtests/lsp/documentHighlight/test.js (205 lines of code) (raw):
/**
* @flow
* @format
*/
import type {Suite} from 'flow-dev-tools/src/test/Suite';
const {readFileSync, readdirSync} = require('fs');
const {join} = require('path');
const {suite, test} = require('flow-dev-tools/src/test/Tester');
module.exports = (suite(
({
lspNotification,
lspStartAndConnect,
lspRequestAndWaitUntilResponse,
addFiles,
}) => {
function snapshot(fixture, line, col, expectedFile) {
return lspRequestAndWaitUntilResponse('textDocument/documentHighlight', {
textDocument: {
uri: `<PLACEHOLDER_PROJECT_URL>/__fixtures__/${fixture}`,
},
position: {line: line, character: col},
}).verifyLSPMessageSnapshot(
join(__dirname, '__snapshots__', expectedFile),
[
'textDocument/publishDiagnostics',
'window/showStatus',
'$/cancelRequest',
],
);
}
const fixtures = readdirSync(join(__dirname, '__fixtures__')).map(file =>
join('__fixtures__', file),
);
return [
test('Variable defs and uses', [
addFiles(...fixtures),
lspStartAndConnect(),
snapshot('locals.js', 3, 5, 'var_defs_1.json'),
snapshot('locals.js', 4, 2, 'var_defs_2.json'),
]),
test('Nested functions', [
addFiles(...fixtures),
lspStartAndConnect(),
snapshot('locals.js', 9, 10, 'nested_funcs_1.json'),
snapshot('locals.js', 12, 3, 'nested_funcs_2.json'),
]),
test('Classes', [
addFiles(...fixtures),
lspStartAndConnect(),
snapshot('locals.js', 17, 7, 'classes_1.json'),
]),
// test('Type aliases', [
// addFiles(...fixtures),
// lspStartAndConnect(),
// snapshot('locals.js', 22, 6, 'type_aliases_1.json'),
// ]),
test('Refinements', [
addFiles(...fixtures),
lspStartAndConnect(),
snapshot('locals.js', 27, 6, 'refinements_1.json'),
snapshot('locals.js', 28, 6, 'refinements_2.json'),
snapshot('locals.js', 29, 16, 'refinements_3.json'),
snapshot('locals.js', 30, 8, 'refinements_4.json'),
snapshot('locals.js', 32, 2, 'refinements_5.json'),
]),
test('Destructuring', [
addFiles(...fixtures),
lspStartAndConnect(),
snapshot('locals.js', 35, 7, 'destructuring_1.json'),
snapshot('locals.js', 36, 10, 'destructuring_2.json'),
snapshot('locals.js', 36, 26, 'destructuring_3.json'),
snapshot('locals.js', 37, 7, 'destructuring_4.json'),
]),
// test('Not in scope', [
// addFiles(...fixtures),
// lspStartAndConnect(),
// snapshot('locals.js', 40, 2, 'not_in_scope_1.json'),
// snapshot('locals.js', 41, 2, 'not_in_scope2.json'),
// snapshot('locals.js', 41, 9, 'not_in_scope3.json'),
// snapshot('locals.js', 42, 2, 'not_in_scope4.json'),
// ]),
test('JSX', [
addFiles(...fixtures),
lspStartAndConnect(),
// snapshot('locals.js', 49, 4, 'jsx_1.json'),
// Use as a JSX component class
snapshot('jsx.js', 4, 7, 'jsx_2.json'),
]),
test('Imports', [
addFiles(...fixtures),
lspStartAndConnect(),
snapshot('locals.js', 56, 2, 'imports_1.json'),
// This is a type, which doesn't work yet
// snapshot('locals.js', 54, 9, 'imports_2.json'),
]),
// test('Qualified types', [
// addFiles(...fixtures),
// lspStartAndConnect(),
// snapshot('locals.js', 57, 9, 'qualified_types_1.json'),
// ]),
test('Exports', [
addFiles(...fixtures),
lspStartAndConnect(),
snapshot('locals.js', 62, 18, 'exports_const_decl.json'),
snapshot('locals.js', 63, 23, 'exports_func_decl.json'),
snapshot('locals.js', 65, 20, 'exports_1.json'),
snapshot('locals.js', 66, 6, 'exports_2.json'),
]),
test('Methods and properties', [
addFiles(...fixtures),
lspStartAndConnect(),
// Method declaration
snapshot('locals.js', 71, 3, 'methods_1.json'),
// Property declaration
snapshot('locals.js', 72, 5, 'methods_2.json'),
// Method call (finds definition and other references)
snapshot('locals.js', 81, 13, 'methods_3.json'),
// Method call on an imported class (finds other references but not the definition since it's in another file)
snapshot('locals.js', 91, 16, 'methods_4.json'),
// Method call within a class that has type params
snapshot('locals.js', 97, 10, 'methods_5.json'),
]),
test('Class inheritance', [
addFiles(...fixtures),
lspStartAndConnect(),
// Instance method on a superclass
snapshot('classInheritance.js', 4, 3, 'class_inheritance_1.json'),
// Call of instance method on subclass which does not override
snapshot('classInheritance.js', 20, 10, 'class_inheritance_2.json'),
// Instance method on a subclass which does override
snapshot('classInheritance.js', 10, 3, 'class_inheritance_3.json'),
// Call of instance method on a subclass which does override
snapshot('classInheritance.js', 21, 10, 'class_inheritance_4.json'),
// Definition of a method in a parameterized class
snapshot('classInheritance.js', 25, 3, 'class_inheritance_5.json'),
// Call of an instance method on an upcasted class
snapshot('classInheritance.js', 31, 15, 'class_inheritance_6.json'),
// TODO it would be nice if the results included the use of the inherited class property.
// Definition of a static class property
snapshot('classInheritance.js', 3, 10, 'class_inheritance_7.json'),
// TODO it would be nice if the results included the use of the inherited class property.
// Use of a static class property
snapshot('classInheritance.js', 37, 3, 'class_inheritance_8.json'),
// TODO it would be nice if this returned results.
// Use of an inherited static class property
snapshot('classInheritance.js', 38, 3, 'class_inheritance_9.json'),
]),
test('Objects', [
addFiles(...fixtures),
lspStartAndConnect(),
// Method declaration in an object type alias
snapshot('objects.js', 3, 4, 'objects_1.json'),
// Property declaration in an object type alias
snapshot('objects.js', 4, 4, 'objects_2.json'),
// Method call on an object type alias
snapshot('objects.js', 8, 4, 'objects_3.json'),
// Property access on an object without an annotation
snapshot('objects.js', 14, 4, 'objects_4.json'),
// Property definition on an object without an annotation
snapshot('objects.js', 13, 12, 'objects_5.json'),
// Introduction of a shadow property via a write
snapshot('objects.js', 18, 4, 'objects_6.json'),
// Use of a shadow property
snapshot('objects.js', 19, 4, 'objects_7.json'),
// Introduction of a shadow property via a read
snapshot('objects.js', 22, 4, 'objects_8.json'),
// Write of a shadow property introduced via a read
snapshot('objects.js', 23, 4, 'objects_9.json'),
// Introduction of a shadow property that is never written
snapshot('objects.js', 26, 4, 'objects_10.json'),
// Read of a shadow property that is never written
snapshot('objects.js', 27, 4, 'objects_11.json'),
// Use of a property that came through type spread
snapshot('objects.js', 34, 25, 'objects_12.json'),
// Object literal method
snapshot('objects.js', 7, 21, 'objects_13.json'),
// Object literal property
snapshot('objects.js', 7, 31, 'objects_14.json'),
// Method in object literal which flows into two types
snapshot('objects.js', 41, 13, 'objects_15.json'),
// Property in object literal which flows into two types
snapshot('objects.js', 41, 23, 'objects_16.json'),
]),
test('Declare', [
addFiles(...fixtures),
lspStartAndConnect(),
snapshot('declare.js', 2, 13, 'declare_1.json'),
]),
test('Import Star', [
addFiles(...fixtures),
lspStartAndConnect(),
// object created via `import *`
snapshot('importStar.js', 4, 10, 'importStar_1.json'),
]),
test('Unchecked', [
addFiles(...fixtures),
lspStartAndConnect(),
// Property in an unchecked file
snapshot('unchecked.js', 3, 5, 'unchecked_1.json'),
]),
test('Optional chaining', [
addFiles(...fixtures),
lspStartAndConnect(),
snapshot('optional-chaining.js', 16, 6, 'optionalChaining_1.json'),
snapshot('optional-chaining.js', 16, 10, 'optionalChaining_2.json'),
]),
test('Idx', [
addFiles(...fixtures),
lspStartAndConnect(),
snapshot('idx.js', 5, 4, 'idx_1.json'),
snapshot('idx.js', 11, 25, 'idx_2.json'),
snapshot('idx.js', 6, 6, 'idx_3.json'),
snapshot('idx.js', 11, 29, 'idx_4.json'),
]),
test('Unions', [
addFiles(...fixtures),
lspStartAndConnect(),
snapshot('unions.js', 6, 3, 'unions_1.json'),
snapshot('unions.js', 9, 30, 'unions_2.json'),
snapshot('unions.js', 16, 10, 'unions_3.json'),
]),
test('Unsaved', [
addFiles(...fixtures),
lspStartAndConnect(),
lspNotification('textDocument/didOpen', {
textDocument: {
uri: '<PLACEHOLDER_PROJECT_URL>/__fixtures__/empty.js',
languageId: 'javascript',
version: 1,
text: `// @flow`,
},
}).verifyAllLSPMessagesInStep(
[],
[
'textDocument/publishDiagnostics',
'window/showStatus',
'$/cancelRequest',
],
),
lspNotification('textDocument/didChange', {
textDocument: {
uri: '<PLACEHOLDER_PROJECT_URL>/__fixtures__/empty.js',
version: 2,
},
contentChanges: [
{
text: `// @flow
type Bar = { foo: string };
const x: Bar = { foo: 'asdf' };
x.foo;
`,
},
],
}).verifyAllLSPMessagesInStep(
[],
[
'textDocument/publishDiagnostics',
'window/showStatus',
'$/cancelRequest',
],
),
snapshot('empty.js', 2, 15, 'unsaved_1.json'),
]),
];
},
): Suite);