mirror of
https://github.com/sasjs/lint.git
synced 2025-12-11 01:44:36 +00:00
282 lines
7.6 KiB
TypeScript
282 lines
7.6 KiB
TypeScript
import { LintConfig } from '../types'
|
|
import { parseMacros } from './parseMacros'
|
|
|
|
describe('parseMacros', () => {
|
|
it('should return an array with a single macro', () => {
|
|
const text = ` %macro test;
|
|
%put 'hello';
|
|
%mend`
|
|
|
|
const macros = parseMacros(text, new LintConfig())
|
|
|
|
expect(macros.length).toEqual(1)
|
|
expect(macros).toContainEqual({
|
|
name: 'test',
|
|
declarationLines: [' %macro test;'],
|
|
terminationLine: '%mend',
|
|
declaration: '%macro test',
|
|
termination: '%mend',
|
|
startLineNumbers: [1],
|
|
endLineNumber: 3,
|
|
parentMacro: '',
|
|
hasMacroNameInMend: false,
|
|
mismatchedMendMacroName: ''
|
|
})
|
|
})
|
|
|
|
it('should return an array with a single macro having parameters', () => {
|
|
const text = `%macro test(var,sum);
|
|
%put 'hello';
|
|
%mend`
|
|
|
|
const macros = parseMacros(text, new LintConfig())
|
|
|
|
expect(macros.length).toEqual(1)
|
|
expect(macros).toContainEqual({
|
|
name: 'test',
|
|
declarationLines: ['%macro test(var,sum);'],
|
|
terminationLine: '%mend',
|
|
declaration: '%macro test(var,sum)',
|
|
termination: '%mend',
|
|
startLineNumbers: [1],
|
|
endLineNumber: 3,
|
|
parentMacro: '',
|
|
hasMacroNameInMend: false,
|
|
mismatchedMendMacroName: ''
|
|
})
|
|
})
|
|
|
|
it('should return an array with a single macro having PARMBUFF option', () => {
|
|
const text = `%macro test/parmbuff;
|
|
%put 'hello';
|
|
%mend`
|
|
|
|
const macros = parseMacros(text, new LintConfig())
|
|
|
|
expect(macros.length).toEqual(1)
|
|
expect(macros).toContainEqual({
|
|
name: 'test',
|
|
declarationLines: ['%macro test/parmbuff;'],
|
|
terminationLine: '%mend',
|
|
declaration: '%macro test/parmbuff',
|
|
termination: '%mend',
|
|
startLineNumbers: [1],
|
|
endLineNumber: 3,
|
|
parentMacro: '',
|
|
hasMacroNameInMend: false,
|
|
mismatchedMendMacroName: ''
|
|
})
|
|
})
|
|
|
|
it('should return an array with a single macro having paramerter & SOURCE option', () => {
|
|
const text = `/* commentary */ %macro foobar(arg) /store source
|
|
des="This macro does not do much";
|
|
%put 'hello';
|
|
%mend`
|
|
|
|
const macros = parseMacros(text, new LintConfig())
|
|
|
|
expect(macros.length).toEqual(1)
|
|
expect(macros).toContainEqual({
|
|
name: 'foobar',
|
|
declarationLines: [
|
|
'/* commentary */ %macro foobar(arg) /store source',
|
|
' des="This macro does not do much";'
|
|
],
|
|
terminationLine: '%mend',
|
|
declaration:
|
|
'%macro foobar(arg) /store source des="This macro does not do much"',
|
|
termination: '%mend',
|
|
startLineNumbers: [1, 2],
|
|
endLineNumber: 4,
|
|
parentMacro: '',
|
|
hasMacroNameInMend: false,
|
|
mismatchedMendMacroName: ''
|
|
})
|
|
})
|
|
|
|
it('should return an array with multiple macros', () => {
|
|
const text = `%macro foo;
|
|
%put 'foo';
|
|
%mend;
|
|
%macro bar();
|
|
%put 'bar';
|
|
%mend bar;`
|
|
|
|
const macros = parseMacros(text, new LintConfig())
|
|
|
|
expect(macros.length).toEqual(2)
|
|
expect(macros).toContainEqual({
|
|
name: 'foo',
|
|
declarationLines: ['%macro foo;'],
|
|
terminationLine: '%mend;',
|
|
declaration: '%macro foo',
|
|
termination: '%mend',
|
|
startLineNumbers: [1],
|
|
endLineNumber: 3,
|
|
parentMacro: '',
|
|
hasMacroNameInMend: false,
|
|
mismatchedMendMacroName: ''
|
|
})
|
|
expect(macros).toContainEqual({
|
|
name: 'bar',
|
|
declarationLines: ['%macro bar();'],
|
|
terminationLine: '%mend bar;',
|
|
declaration: '%macro bar()',
|
|
termination: '%mend bar',
|
|
startLineNumbers: [4],
|
|
endLineNumber: 6,
|
|
parentMacro: '',
|
|
hasMacroNameInMend: true,
|
|
mismatchedMendMacroName: ''
|
|
})
|
|
})
|
|
|
|
it('should detect nested macro definitions', () => {
|
|
const text = `%macro test();
|
|
%put 'hello';
|
|
%macro test2;
|
|
%put 'world;
|
|
%mend
|
|
%mend test`
|
|
|
|
const macros = parseMacros(text, new LintConfig())
|
|
|
|
expect(macros.length).toEqual(2)
|
|
expect(macros).toContainEqual({
|
|
name: 'test',
|
|
declarationLines: ['%macro test();'],
|
|
terminationLine: '%mend test',
|
|
declaration: '%macro test()',
|
|
termination: '%mend test',
|
|
startLineNumbers: [1],
|
|
endLineNumber: 6,
|
|
parentMacro: '',
|
|
hasMacroNameInMend: true,
|
|
mismatchedMendMacroName: ''
|
|
})
|
|
expect(macros).toContainEqual({
|
|
name: 'test2',
|
|
declarationLines: [' %macro test2;'],
|
|
terminationLine: ' %mend',
|
|
declaration: '%macro test2',
|
|
termination: '%mend',
|
|
startLineNumbers: [3],
|
|
endLineNumber: 5,
|
|
parentMacro: 'test',
|
|
hasMacroNameInMend: false,
|
|
mismatchedMendMacroName: ''
|
|
})
|
|
})
|
|
|
|
describe(`multi-line macro declarations`, () => {
|
|
it('should return an array with a single macro', () => {
|
|
const text = `%macro
|
|
test;
|
|
%put 'hello';
|
|
%mend`
|
|
|
|
const macros = parseMacros(text, new LintConfig())
|
|
|
|
expect(macros.length).toEqual(1)
|
|
expect(macros).toContainEqual({
|
|
name: 'test',
|
|
declarationLines: ['%macro ', ' test;'],
|
|
terminationLine: '%mend',
|
|
declaration: '%macro test',
|
|
termination: '%mend',
|
|
startLineNumbers: [1, 2],
|
|
endLineNumber: 4,
|
|
parentMacro: '',
|
|
hasMacroNameInMend: false,
|
|
mismatchedMendMacroName: ''
|
|
})
|
|
})
|
|
|
|
it('should return an array with a single macro having parameters', () => {
|
|
const text = `%macro
|
|
test(
|
|
var,
|
|
sum);%put 'hello';
|
|
%mend`
|
|
|
|
const macros = parseMacros(text, new LintConfig())
|
|
|
|
expect(macros.length).toEqual(1)
|
|
expect(macros).toContainEqual({
|
|
name: 'test',
|
|
declarationLines: [
|
|
'%macro ',
|
|
` test(`,
|
|
` var,`,
|
|
` sum);%put 'hello';`
|
|
],
|
|
terminationLine: '%mend',
|
|
declaration: '%macro test( var, sum)',
|
|
termination: '%mend',
|
|
startLineNumbers: [1, 2, 3, 4],
|
|
endLineNumber: 5,
|
|
parentMacro: '',
|
|
hasMacroNameInMend: false,
|
|
mismatchedMendMacroName: ''
|
|
})
|
|
})
|
|
|
|
it('should return an array with a single macro having PARMBUFF option', () => {
|
|
const text = `%macro test
|
|
/parmbuff;
|
|
%put 'hello';
|
|
%mend`
|
|
|
|
const macros = parseMacros(text, new LintConfig())
|
|
|
|
expect(macros.length).toEqual(1)
|
|
expect(macros).toContainEqual({
|
|
name: 'test',
|
|
declarationLines: ['%macro test', ' /parmbuff;'],
|
|
terminationLine: '%mend',
|
|
declaration: '%macro test /parmbuff',
|
|
termination: '%mend',
|
|
startLineNumbers: [1, 2],
|
|
endLineNumber: 4,
|
|
parentMacro: '',
|
|
hasMacroNameInMend: false,
|
|
mismatchedMendMacroName: ''
|
|
})
|
|
})
|
|
|
|
it('should return an array with a single macro having paramerter & SOURCE option', () => {
|
|
const text = `/* commentary */ %macro foobar/* commentary */(arg)
|
|
/* commentary */
|
|
/store
|
|
/* commentary */source
|
|
des="This macro does not do much";
|
|
%put 'hello';
|
|
%mend`
|
|
|
|
const macros = parseMacros(text, new LintConfig())
|
|
|
|
expect(macros.length).toEqual(1)
|
|
expect(macros).toContainEqual({
|
|
name: 'foobar',
|
|
declarationLines: [
|
|
'/* commentary */ %macro foobar/* commentary */(arg) ',
|
|
' /* commentary */',
|
|
' /store',
|
|
' /* commentary */source',
|
|
' des="This macro does not do much";'
|
|
],
|
|
terminationLine: '%mend',
|
|
declaration:
|
|
'%macro foobar(arg) /store source des="This macro does not do much"',
|
|
termination: '%mend',
|
|
startLineNumbers: [1, 2, 3, 4, 5],
|
|
endLineNumber: 7,
|
|
parentMacro: '',
|
|
hasMacroNameInMend: false,
|
|
mismatchedMendMacroName: ''
|
|
})
|
|
})
|
|
})
|
|
})
|