@neo4j-cypher/language-support
Version:
Cypher language support
2,204 lines (2,182 loc) • 45.9 kB
text/typescript
import { applySyntaxColouring } from '../../syntaxColouring/syntaxColouring';
describe('CALL syntax colouring', () => {
test('Correctly colours standalone procedure CALL', () => {
const query = 'CALL dbms.info() YIELD *';
expect(applySyntaxColouring(query)).toEqual([
{
bracketInfo: undefined,
length: 4,
position: {
line: 0,
startCharacter: 0,
startOffset: 0,
},
token: 'CALL',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 0,
startCharacter: 5,
startOffset: 5,
},
token: 'dbms',
tokenType: 'procedure',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 9,
startOffset: 9,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 0,
startCharacter: 10,
startOffset: 10,
},
token: 'info',
tokenType: 'procedure',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 0,
startCharacter: 14,
startOffset: 14,
},
token: '(',
tokenType: 'bracket',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 0,
startCharacter: 15,
startOffset: 15,
},
token: ')',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 5,
position: {
line: 0,
startCharacter: 17,
startOffset: 17,
},
token: 'YIELD',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 23,
startOffset: 23,
},
token: '*',
tokenType: 'operator',
},
]);
});
test('Correctly colours procedure CALL with yield', () => {
const query =
'CALL apoc.do.when(true, "foo", false, "bar") YIELD name, result';
expect(applySyntaxColouring(query)).toEqual([
{
bracketInfo: undefined,
length: 4,
position: {
line: 0,
startCharacter: 0,
startOffset: 0,
},
token: 'CALL',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 0,
startCharacter: 5,
startOffset: 5,
},
token: 'apoc',
tokenType: 'procedure',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 9,
startOffset: 9,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 0,
startCharacter: 10,
startOffset: 10,
},
token: 'do',
tokenType: 'procedure',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 12,
startOffset: 12,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 0,
startCharacter: 13,
startOffset: 13,
},
token: 'when',
tokenType: 'procedure',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 0,
startCharacter: 17,
startOffset: 17,
},
token: '(',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 0,
startCharacter: 18,
startOffset: 18,
},
token: 'true',
tokenType: 'booleanLiteral',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 22,
startOffset: 22,
},
token: ',',
tokenType: 'separator',
},
{
bracketInfo: undefined,
length: 5,
position: {
line: 0,
startCharacter: 24,
startOffset: 24,
},
token: '"foo"',
tokenType: 'stringLiteral',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 29,
startOffset: 29,
},
token: ',',
tokenType: 'separator',
},
{
bracketInfo: undefined,
length: 5,
position: {
line: 0,
startCharacter: 31,
startOffset: 31,
},
token: 'false',
tokenType: 'booleanLiteral',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 36,
startOffset: 36,
},
token: ',',
tokenType: 'separator',
},
{
bracketInfo: undefined,
length: 5,
position: {
line: 0,
startCharacter: 38,
startOffset: 38,
},
token: '"bar"',
tokenType: 'stringLiteral',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 0,
startCharacter: 43,
startOffset: 43,
},
token: ')',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 5,
position: {
line: 0,
startCharacter: 45,
startOffset: 45,
},
token: 'YIELD',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 0,
startCharacter: 51,
startOffset: 51,
},
token: 'name',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 55,
startOffset: 55,
},
token: ',',
tokenType: 'separator',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 0,
startCharacter: 57,
startOffset: 57,
},
token: 'result',
tokenType: 'variable',
},
]);
});
});
describe('CASE syntax colouring', () => {
test('Correctly colours CASE', () => {
const query = `
RETURN
CASE
WHEN n:A&B THEN 1
WHEN r:!R1&!R2 THEN 2
ELSE -1
END AS result
`;
expect(applySyntaxColouring(query)).toEqual([
{
bracketInfo: undefined,
length: 6,
position: {
line: 1,
startCharacter: 6,
startOffset: 7,
},
token: 'RETURN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 2,
startCharacter: 6,
startOffset: 20,
},
token: 'CASE',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 3,
startCharacter: 8,
startOffset: 33,
},
token: 'WHEN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 3,
startCharacter: 13,
startOffset: 38,
},
token: 'n',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 3,
startCharacter: 14,
startOffset: 39,
},
token: ':',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 3,
startCharacter: 15,
startOffset: 40,
},
token: 'A',
tokenType: 'label',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 3,
startCharacter: 16,
startOffset: 41,
},
token: '&',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 3,
startCharacter: 17,
startOffset: 42,
},
token: 'B',
tokenType: 'label',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 3,
startCharacter: 19,
startOffset: 44,
},
token: 'THEN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 3,
startCharacter: 24,
startOffset: 49,
},
token: '1',
tokenType: 'numberLiteral',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 4,
startCharacter: 8,
startOffset: 59,
},
token: 'WHEN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 4,
startCharacter: 13,
startOffset: 64,
},
token: 'r',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 4,
startCharacter: 14,
startOffset: 65,
},
token: ':',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 4,
startCharacter: 15,
startOffset: 66,
},
token: '!',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 4,
startCharacter: 16,
startOffset: 67,
},
token: 'R1',
tokenType: 'label',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 4,
startCharacter: 18,
startOffset: 69,
},
token: '&',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 4,
startCharacter: 19,
startOffset: 70,
},
token: '!',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 4,
startCharacter: 20,
startOffset: 71,
},
token: 'R2',
tokenType: 'label',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 4,
startCharacter: 23,
startOffset: 74,
},
token: 'THEN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 4,
startCharacter: 28,
startOffset: 79,
},
token: '2',
tokenType: 'numberLiteral',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 5,
startCharacter: 8,
startOffset: 89,
},
token: 'ELSE',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 5,
startCharacter: 13,
startOffset: 94,
},
token: '-1',
tokenType: 'numberLiteral',
},
{
bracketInfo: undefined,
length: 3,
position: {
line: 6,
startCharacter: 6,
startOffset: 103,
},
token: 'END',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 6,
startCharacter: 10,
startOffset: 107,
},
token: 'AS',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 6,
startCharacter: 13,
startOffset: 110,
},
token: 'result',
tokenType: 'variable',
},
]);
});
});
describe('LOAD CSV colouring', () => {
test('Correctly colours LOAD CSV', () => {
const query = `
LOAD CSV WITH HEADERS FROM
'https://neo4j.com/docs/cypher-cheat-sheet/5/csv/artists-with-headers.csv'
AS line
CALL {
WITH line
CREATE (:Artist {name: line.Name, year: toInteger(line.Year)})
} IN TRANSACTIONS OF 500 ROWS
`;
expect(applySyntaxColouring(query)).toEqual([
{
bracketInfo: undefined,
length: 4,
position: {
line: 1,
startCharacter: 6,
startOffset: 7,
},
token: 'LOAD',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 3,
position: {
line: 1,
startCharacter: 11,
startOffset: 12,
},
token: 'CSV',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 1,
startCharacter: 15,
startOffset: 16,
},
token: 'WITH',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 7,
position: {
line: 1,
startCharacter: 20,
startOffset: 21,
},
token: 'HEADERS',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 1,
startCharacter: 28,
startOffset: 29,
},
token: 'FROM',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 74,
position: {
line: 2,
startCharacter: 6,
startOffset: 40,
},
token:
"'https://neo4j.com/docs/cypher-cheat-sheet/5/csv/artists-with-headers.csv'",
tokenType: 'stringLiteral',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 3,
startCharacter: 6,
startOffset: 121,
},
token: 'AS',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 3,
startCharacter: 9,
startOffset: 124,
},
token: 'line',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 4,
startCharacter: 6,
startOffset: 135,
},
token: 'CALL',
tokenType: 'keyword',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'curly',
},
length: 1,
position: {
line: 4,
startCharacter: 11,
startOffset: 140,
},
token: '{',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 5,
startCharacter: 8,
startOffset: 150,
},
token: 'WITH',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 5,
startCharacter: 13,
startOffset: 155,
},
token: 'line',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 6,
startCharacter: 8,
startOffset: 168,
},
token: 'CREATE',
tokenType: 'keyword',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 6,
startCharacter: 15,
startOffset: 175,
},
token: '(',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 6,
startCharacter: 16,
startOffset: 176,
},
token: ':',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 6,
startCharacter: 17,
startOffset: 177,
},
token: 'Artist',
tokenType: 'label',
},
{
bracketInfo: {
bracketLevel: 1,
bracketType: 'curly',
},
length: 1,
position: {
line: 6,
startCharacter: 24,
startOffset: 184,
},
token: '{',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 6,
startCharacter: 25,
startOffset: 185,
},
token: 'name',
tokenType: 'property',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 6,
startCharacter: 29,
startOffset: 189,
},
token: ':',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 6,
startCharacter: 31,
startOffset: 191,
},
token: 'line',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 6,
startCharacter: 35,
startOffset: 195,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 6,
startCharacter: 36,
startOffset: 196,
},
token: 'Name',
tokenType: 'property',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 6,
startCharacter: 40,
startOffset: 200,
},
token: ',',
tokenType: 'separator',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 6,
startCharacter: 42,
startOffset: 202,
},
token: 'year',
tokenType: 'property',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 6,
startCharacter: 46,
startOffset: 206,
},
token: ':',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 9,
position: {
line: 6,
startCharacter: 48,
startOffset: 208,
},
token: 'toInteger',
tokenType: 'function',
},
{
bracketInfo: {
bracketLevel: 1,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 6,
startCharacter: 57,
startOffset: 217,
},
token: '(',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 6,
startCharacter: 58,
startOffset: 218,
},
token: 'line',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 6,
startCharacter: 62,
startOffset: 222,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 6,
startCharacter: 63,
startOffset: 223,
},
token: 'Year',
tokenType: 'property',
},
{
bracketInfo: {
bracketLevel: 1,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 6,
startCharacter: 67,
startOffset: 227,
},
token: ')',
tokenType: 'bracket',
},
{
bracketInfo: {
bracketLevel: 1,
bracketType: 'curly',
},
length: 1,
position: {
line: 6,
startCharacter: 68,
startOffset: 228,
},
token: '}',
tokenType: 'bracket',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 6,
startCharacter: 69,
startOffset: 229,
},
token: ')',
tokenType: 'bracket',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'curly',
},
length: 1,
position: {
line: 7,
startCharacter: 6,
startOffset: 237,
},
token: '}',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 7,
startCharacter: 8,
startOffset: 239,
},
token: 'IN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 12,
position: {
line: 7,
startCharacter: 11,
startOffset: 242,
},
token: 'TRANSACTIONS',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 7,
startCharacter: 24,
startOffset: 255,
},
token: 'OF',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 3,
position: {
line: 7,
startCharacter: 27,
startOffset: 258,
},
token: '500',
tokenType: 'numberLiteral',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 7,
startCharacter: 31,
startOffset: 262,
},
token: 'ROWS',
tokenType: 'keyword',
},
]);
});
});
describe('USE colouring', () => {
test('Correctly colours USE', () => {
const query = `
USE neo4j
WHERE n.name = 'Alice'
`;
expect(applySyntaxColouring(query)).toEqual([
{
bracketInfo: undefined,
length: 3,
position: {
line: 1,
startCharacter: 6,
startOffset: 7,
},
token: 'USE',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 5,
position: {
line: 1,
startCharacter: 10,
startOffset: 11,
},
token: 'neo4j',
tokenType: 'symbolicName',
},
{
bracketInfo: undefined,
length: 5,
position: {
line: 2,
startCharacter: 6,
startOffset: 23,
},
token: 'WHERE',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 2,
startCharacter: 12,
startOffset: 29,
},
token: 'n',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 2,
startCharacter: 13,
startOffset: 30,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 2,
startCharacter: 14,
startOffset: 31,
},
token: 'name',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 2,
startCharacter: 19,
startOffset: 36,
},
token: '=',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 7,
position: {
line: 2,
startCharacter: 21,
startOffset: 38,
},
token: "'Alice'",
tokenType: 'stringLiteral',
},
]);
});
});
describe('FOREACH syntax colouring', () => {
test('Correctly colours FOREACH', () => {
const query = `
FOREACH ( r IN relationships(path) | SET r.marked = true )
`;
expect(applySyntaxColouring(query)).toEqual([
{
bracketInfo: undefined,
length: 7,
position: {
line: 1,
startCharacter: 4,
startOffset: 5,
},
token: 'FOREACH',
tokenType: 'keyword',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 1,
startCharacter: 12,
startOffset: 13,
},
token: '(',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 1,
startCharacter: 14,
startOffset: 15,
},
token: 'r',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 1,
startCharacter: 16,
startOffset: 17,
},
token: 'IN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 13,
position: {
line: 1,
startCharacter: 19,
startOffset: 20,
},
token: 'relationships',
tokenType: 'function',
},
{
bracketInfo: {
bracketLevel: 1,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 1,
startCharacter: 32,
startOffset: 33,
},
token: '(',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 1,
startCharacter: 33,
startOffset: 34,
},
token: 'path',
tokenType: 'variable',
},
{
bracketInfo: {
bracketLevel: 1,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 1,
startCharacter: 37,
startOffset: 38,
},
token: ')',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 1,
startCharacter: 39,
startOffset: 40,
},
token: '|',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 3,
position: {
line: 1,
startCharacter: 41,
startOffset: 42,
},
token: 'SET',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 1,
startCharacter: 45,
startOffset: 46,
},
token: 'r',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 1,
startCharacter: 46,
startOffset: 47,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 1,
startCharacter: 47,
startOffset: 48,
},
token: 'marked',
tokenType: 'property',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 1,
startCharacter: 54,
startOffset: 55,
},
token: '=',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 1,
startCharacter: 56,
startOffset: 57,
},
token: 'true',
tokenType: 'booleanLiteral',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 1,
startCharacter: 61,
startOffset: 62,
},
token: ')',
tokenType: 'bracket',
},
]);
});
});
describe('UNWIND colouring', () => {
test('Correctly colours UNWIND', () => {
const query = `
UNWIND nested AS ix
UNWIND ix AS iy
RETURN iy AS number
`;
expect(applySyntaxColouring(query)).toEqual([
{
bracketInfo: undefined,
length: 6,
position: {
line: 1,
startCharacter: 6,
startOffset: 7,
},
token: 'UNWIND',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 1,
startCharacter: 13,
startOffset: 14,
},
token: 'nested',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 1,
startCharacter: 20,
startOffset: 21,
},
token: 'AS',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 1,
startCharacter: 23,
startOffset: 24,
},
token: 'ix',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 2,
startCharacter: 6,
startOffset: 33,
},
token: 'UNWIND',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 2,
startCharacter: 13,
startOffset: 40,
},
token: 'ix',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 2,
startCharacter: 16,
startOffset: 43,
},
token: 'AS',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 2,
startCharacter: 19,
startOffset: 46,
},
token: 'iy',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 3,
startCharacter: 6,
startOffset: 55,
},
token: 'RETURN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 3,
startCharacter: 13,
startOffset: 62,
},
token: 'iy',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 3,
startCharacter: 16,
startOffset: 65,
},
token: 'AS',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 3,
startCharacter: 19,
startOffset: 68,
},
token: 'number',
tokenType: 'variable',
},
]);
});
});
describe('Subqueries colouring', () => {
test('Correctly colours subquery with two union parts', () => {
const query = `
CALL {
RETURN p, other
UNION
RETURN p, other
}
`;
expect(applySyntaxColouring(query)).toEqual([
{
bracketInfo: undefined,
length: 4,
position: {
line: 1,
startCharacter: 6,
startOffset: 7,
},
token: 'CALL',
tokenType: 'keyword',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'curly',
},
length: 1,
position: {
line: 1,
startCharacter: 11,
startOffset: 12,
},
token: '{',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 2,
startCharacter: 8,
startOffset: 22,
},
token: 'RETURN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 2,
startCharacter: 15,
startOffset: 29,
},
token: 'p',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 2,
startCharacter: 16,
startOffset: 30,
},
token: ',',
tokenType: 'separator',
},
{
bracketInfo: undefined,
length: 5,
position: {
line: 2,
startCharacter: 18,
startOffset: 32,
},
token: 'other',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 5,
position: {
line: 3,
startCharacter: 8,
startOffset: 46,
},
token: 'UNION',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 4,
startCharacter: 8,
startOffset: 60,
},
token: 'RETURN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 4,
startCharacter: 15,
startOffset: 67,
},
token: 'p',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 4,
startCharacter: 16,
startOffset: 68,
},
token: ',',
tokenType: 'separator',
},
{
bracketInfo: undefined,
length: 5,
position: {
line: 4,
startCharacter: 18,
startOffset: 70,
},
token: 'other',
tokenType: 'variable',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'curly',
},
length: 1,
position: {
line: 5,
startCharacter: 6,
startOffset: 82,
},
token: '}',
tokenType: 'bracket',
},
]);
});
test('Correctly colours EXISTS', () => {
const query = `
MATCH (p:Person)
WHERE EXISTS {
WHERE p.name = dog.name
}
RETURN person.name AS name
`;
expect(applySyntaxColouring(query)).toEqual([
{
bracketInfo: undefined,
length: 5,
position: {
line: 1,
startCharacter: 6,
startOffset: 7,
},
token: 'MATCH',
tokenType: 'keyword',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 1,
startCharacter: 12,
startOffset: 13,
},
token: '(',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 1,
startCharacter: 13,
startOffset: 14,
},
token: 'p',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 1,
startCharacter: 14,
startOffset: 15,
},
token: ':',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 1,
startCharacter: 15,
startOffset: 16,
},
token: 'Person',
tokenType: 'label',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 1,
startCharacter: 21,
startOffset: 22,
},
token: ')',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 5,
position: {
line: 2,
startCharacter: 6,
startOffset: 30,
},
token: 'WHERE',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 2,
startCharacter: 12,
startOffset: 36,
},
token: 'EXISTS',
tokenType: 'keyword',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'curly',
},
length: 1,
position: {
line: 2,
startCharacter: 19,
startOffset: 43,
},
token: '{',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 5,
position: {
line: 3,
startCharacter: 8,
startOffset: 53,
},
token: 'WHERE',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 3,
startCharacter: 14,
startOffset: 59,
},
token: 'p',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 3,
startCharacter: 15,
startOffset: 60,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 3,
startCharacter: 16,
startOffset: 61,
},
token: 'name',
tokenType: 'property',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 3,
startCharacter: 21,
startOffset: 66,
},
token: '=',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 3,
position: {
line: 3,
startCharacter: 23,
startOffset: 68,
},
token: 'dog',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 3,
startCharacter: 26,
startOffset: 71,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 3,
startCharacter: 27,
startOffset: 72,
},
token: 'name',
tokenType: 'property',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'curly',
},
length: 1,
position: {
line: 4,
startCharacter: 6,
startOffset: 83,
},
token: '}',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 5,
startCharacter: 6,
startOffset: 91,
},
token: 'RETURN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 5,
startCharacter: 13,
startOffset: 98,
},
token: 'person',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 5,
startCharacter: 19,
startOffset: 104,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 5,
startCharacter: 20,
startOffset: 105,
},
token: 'name',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 5,
startCharacter: 25,
startOffset: 110,
},
token: 'AS',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 5,
startCharacter: 28,
startOffset: 113,
},
token: 'name',
tokenType: 'keyword',
},
]);
});
test('Correctly colours COUNT', () => {
const query = `
MATCH (p:Person)
RETURN p.name AS name
`;
expect(applySyntaxColouring(query)).toEqual([
{
bracketInfo: undefined,
length: 5,
position: {
line: 1,
startCharacter: 6,
startOffset: 7,
},
token: 'MATCH',
tokenType: 'keyword',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 1,
startCharacter: 12,
startOffset: 13,
},
token: '(',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 1,
startCharacter: 13,
startOffset: 14,
},
token: 'p',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 1,
startCharacter: 14,
startOffset: 15,
},
token: ':',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 1,
startCharacter: 15,
startOffset: 16,
},
token: 'Person',
tokenType: 'label',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 1,
startCharacter: 21,
startOffset: 22,
},
token: ')',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 2,
startCharacter: 6,
startOffset: 30,
},
token: 'RETURN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 2,
startCharacter: 13,
startOffset: 37,
},
token: 'p',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 2,
startCharacter: 14,
startOffset: 38,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 2,
startCharacter: 15,
startOffset: 39,
},
token: 'name',
tokenType: 'property',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 2,
startCharacter: 20,
startOffset: 44,
},
token: 'AS',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 2,
startCharacter: 23,
startOffset: 47,
},
token: 'name',
tokenType: 'variable',
},
]);
});
});
describe('CREATE colouring', () => {
test('correctly highlight broken create constraint', () => {
// is missing :Label, should not crash
expect(applySyntaxColouring('CREATE CONSTRAINT FOR (node)')).toEqual([
{
bracketInfo: undefined,
length: 6,
position: {
line: 0,
startCharacter: 0,
startOffset: 0,
},
token: 'CREATE',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 10,
position: {
line: 0,
startCharacter: 7,
startOffset: 7,
},
token: 'CONSTRAINT',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 3,
position: {
line: 0,
startCharacter: 18,
startOffset: 18,
},
token: 'FOR',
tokenType: 'keyword',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 0,
startCharacter: 22,
startOffset: 22,
},
token: '(',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 0,
startCharacter: 23,
startOffset: 23,
},
token: 'node',
tokenType: 'variable',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 0,
startCharacter: 27,
startOffset: 27,
},
token: ')',
tokenType: 'bracket',
},
]);
});
});