@neo4j-cypher/language-support
Version:
Cypher language support
518 lines (508 loc) • 11.2 kB
text/typescript
import { CypherTokenType } from '../../lexerSymbols';
import { applySyntaxColouring } from '../../syntaxColouring/syntaxColouring';
describe('Function syntax colouring', () => {
test('Correctly colours function name', () => {
const query = 'RETURN reduce()';
expect(applySyntaxColouring(query)).toEqual([
{
bracketInfo: undefined,
length: 6,
position: {
line: 0,
startCharacter: 0,
startOffset: 0,
},
token: 'RETURN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 0,
startCharacter: 7,
startOffset: 7,
},
token: 'reduce',
tokenType: 'function',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 0,
startCharacter: 13,
startOffset: 13,
},
token: '(',
tokenType: 'bracket',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 0,
startCharacter: 14,
startOffset: 14,
},
token: ')',
tokenType: 'bracket',
},
]);
});
test('Correctly colours function with arguments', () => {
const query = "RETURN some.apoc.function(true, 'something')";
expect(applySyntaxColouring(query)).toEqual([
{
bracketInfo: undefined,
length: 6,
position: {
line: 0,
startCharacter: 0,
startOffset: 0,
},
token: 'RETURN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 0,
startCharacter: 7,
startOffset: 7,
},
token: 'some',
tokenType: 'function',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 11,
startOffset: 11,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 0,
startCharacter: 12,
startOffset: 12,
},
token: 'apoc',
tokenType: 'function',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 16,
startOffset: 16,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 8,
position: {
line: 0,
startCharacter: 17,
startOffset: 17,
},
token: 'function',
tokenType: 'function',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 0,
startCharacter: 25,
startOffset: 25,
},
token: '(',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 0,
startCharacter: 26,
startOffset: 26,
},
token: 'true',
tokenType: 'booleanLiteral',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 30,
startOffset: 30,
},
token: ',',
tokenType: 'separator',
},
{
bracketInfo: undefined,
length: 11,
position: {
line: 0,
startCharacter: 32,
startOffset: 32,
},
token: "'something'",
tokenType: 'stringLiteral',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 0,
startCharacter: 43,
startOffset: 43,
},
token: ')',
tokenType: 'bracket',
},
]);
});
test('Correctly colours multiline function', () => {
const query = `RETURN some.
apoc.
function()
`;
expect(applySyntaxColouring(query)).toEqual([
{
bracketInfo: undefined,
length: 6,
position: {
line: 0,
startCharacter: 0,
startOffset: 0,
},
token: 'RETURN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 0,
startCharacter: 7,
startOffset: 7,
},
token: 'some',
tokenType: 'function',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 11,
startOffset: 11,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 1,
startCharacter: 6,
startOffset: 19,
},
token: 'apoc',
tokenType: 'function',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 1,
startCharacter: 10,
startOffset: 23,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 8,
position: {
line: 2,
startCharacter: 6,
startOffset: 31,
},
token: 'function',
tokenType: 'function',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 2,
startCharacter: 14,
startOffset: 39,
},
token: '(',
tokenType: 'bracket',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 2,
startCharacter: 15,
startOffset: 40,
},
token: ')',
tokenType: 'bracket',
},
]);
});
test.each(['all', 'any', 'none', 'single'])(
'Colours %s list predicate as a function',
(listPredicate) => {
const query =
'RETURN ' + listPredicate + '(x IN coll WHERE x.property IS NOT NULL)';
const tokens = applySyntaxColouring(query);
expect(
tokens.find((t) => t.tokenType === CypherTokenType.predicateFunction),
).toEqual({
bracketInfo: undefined,
length: listPredicate.length,
position: { line: 0, startCharacter: 7, startOffset: 7 },
token: listPredicate,
tokenType: CypherTokenType.predicateFunction,
});
},
);
test('Colours reduce list predicate as a function', () => {
const query = "RETURN reduce(s = '', x IN list | s + x.prop)";
expect(applySyntaxColouring(query)).toEqual([
{
bracketInfo: undefined,
length: 6,
position: {
line: 0,
startCharacter: 0,
startOffset: 0,
},
token: 'RETURN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 6,
position: {
line: 0,
startCharacter: 7,
startOffset: 7,
},
token: 'reduce',
tokenType: 'predicateFunction',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 0,
startCharacter: 13,
startOffset: 13,
},
token: '(',
tokenType: 'bracket',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 14,
startOffset: 14,
},
token: 's',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 16,
startOffset: 16,
},
token: '=',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 0,
startCharacter: 18,
startOffset: 18,
},
token: "''",
tokenType: 'stringLiteral',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 20,
startOffset: 20,
},
token: ',',
tokenType: 'separator',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 22,
startOffset: 22,
},
token: 'x',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 2,
position: {
line: 0,
startCharacter: 24,
startOffset: 24,
},
token: 'IN',
tokenType: 'keyword',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 0,
startCharacter: 27,
startOffset: 27,
},
token: 'list',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 32,
startOffset: 32,
},
token: '|',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 34,
startOffset: 34,
},
token: 's',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 36,
startOffset: 36,
},
token: '+',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 38,
startOffset: 38,
},
token: 'x',
tokenType: 'variable',
},
{
bracketInfo: undefined,
length: 1,
position: {
line: 0,
startCharacter: 39,
startOffset: 39,
},
token: '.',
tokenType: 'operator',
},
{
bracketInfo: undefined,
length: 4,
position: {
line: 0,
startCharacter: 40,
startOffset: 40,
},
token: 'prop',
tokenType: 'property',
},
{
bracketInfo: {
bracketLevel: 0,
bracketType: 'parenthesis',
},
length: 1,
position: {
line: 0,
startCharacter: 44,
startOffset: 44,
},
token: ')',
tokenType: 'bracket',
},
]);
});
});