diff --git a/src/lint/lintFile.spec.ts b/src/lint/lintFile.spec.ts index a7de9ef..69bbad5 100644 --- a/src/lint/lintFile.spec.ts +++ b/src/lint/lintFile.spec.ts @@ -2,68 +2,87 @@ import { lintFile } from './lintFile' import { Severity } from '../types/Severity' import path from 'path' +const expectedDiagnostics = [ + { + message: 'Line contains trailing spaces', + lineNumber: 1, + startColumnNumber: 1, + endColumnNumber: 2, + severity: Severity.Warning + }, + { + message: 'Line contains trailing spaces', + lineNumber: 2, + startColumnNumber: 1, + endColumnNumber: 2, + severity: Severity.Warning + }, + { + message: 'File name contains spaces', + lineNumber: 1, + startColumnNumber: 1, + endColumnNumber: 1, + severity: Severity.Warning + }, + { + message: 'File name contains uppercase characters', + lineNumber: 1, + startColumnNumber: 1, + endColumnNumber: 1, + severity: Severity.Warning + }, + { + message: 'File missing Doxygen header', + lineNumber: 1, + startColumnNumber: 1, + endColumnNumber: 1, + severity: Severity.Warning + }, + { + message: 'Line contains encoded password', + lineNumber: 5, + startColumnNumber: 10, + endColumnNumber: 18, + severity: Severity.Error + }, + { + message: 'Line is indented with a tab', + lineNumber: 7, + startColumnNumber: 1, + endColumnNumber: 1, + severity: Severity.Warning + }, + { + message: 'Line has incorrect indentation - 3 spaces', + lineNumber: 6, + startColumnNumber: 1, + endColumnNumber: 1, + severity: Severity.Warning + }, + { + message: '%mend statement is missing macro name - mf_getuniquelibref', + lineNumber: 17, + startColumnNumber: 3, + endColumnNumber: 9, + severity: Severity.Warning + } +] + describe('lintFile', () => { it('should identify lint issues in a given file', async () => { const results = await lintFile( path.join(__dirname, '..', 'Example File.sas') ) - expect(results.length).toEqual(8) - expect(results).toContainEqual({ - message: 'Line contains trailing spaces', - lineNumber: 1, - startColumnNumber: 1, - endColumnNumber: 2, - severity: Severity.Warning - }) - expect(results).toContainEqual({ - message: 'Line contains trailing spaces', - lineNumber: 2, - startColumnNumber: 1, - endColumnNumber: 2, - severity: Severity.Warning - }) - expect(results).toContainEqual({ - message: 'File name contains spaces', - lineNumber: 1, - startColumnNumber: 1, - endColumnNumber: 1, - severity: Severity.Warning - }) - expect(results).toContainEqual({ - message: 'File name contains uppercase characters', - lineNumber: 1, - startColumnNumber: 1, - endColumnNumber: 1, - severity: Severity.Warning - }) - expect(results).toContainEqual({ - message: 'File missing Doxygen header', - lineNumber: 1, - startColumnNumber: 1, - endColumnNumber: 1, - severity: Severity.Warning - }) - expect(results).toContainEqual({ - message: 'Line contains encoded password', - lineNumber: 5, - startColumnNumber: 10, - endColumnNumber: 18, - severity: Severity.Error - }) - expect(results).toContainEqual({ - message: 'Line is indented with a tab', - lineNumber: 7, - startColumnNumber: 1, - endColumnNumber: 1, - severity: Severity.Warning - }) - expect(results).toContainEqual({ - message: 'Line has incorrect indentation - 3 spaces', - lineNumber: 6, - startColumnNumber: 1, - endColumnNumber: 1, - severity: Severity.Warning - }) + expect(results.length).toEqual(expectedDiagnostics.length) + expect(results).toContainEqual(expectedDiagnostics[0]) + expect(results).toContainEqual(expectedDiagnostics[1]) + expect(results).toContainEqual(expectedDiagnostics[2]) + expect(results).toContainEqual(expectedDiagnostics[3]) + expect(results).toContainEqual(expectedDiagnostics[4]) + expect(results).toContainEqual(expectedDiagnostics[5]) + expect(results).toContainEqual(expectedDiagnostics[6]) + expect(results).toContainEqual(expectedDiagnostics[7]) + expect(results).toContainEqual(expectedDiagnostics[8]) }) }) diff --git a/src/lint/lintFolder.spec.ts b/src/lint/lintFolder.spec.ts index 7124d3e..69938fd 100644 --- a/src/lint/lintFolder.spec.ts +++ b/src/lint/lintFolder.spec.ts @@ -2,70 +2,90 @@ import { lintFolder } from './lintFolder' import { Severity } from '../types/Severity' import path from 'path' +const expectedFilesCount = 1 +const expectedDiagnostics = [ + { + message: 'Line contains trailing spaces', + lineNumber: 1, + startColumnNumber: 1, + endColumnNumber: 2, + severity: Severity.Warning + }, + { + message: 'Line contains trailing spaces', + lineNumber: 2, + startColumnNumber: 1, + endColumnNumber: 2, + severity: Severity.Warning + }, + { + message: 'File name contains spaces', + lineNumber: 1, + startColumnNumber: 1, + endColumnNumber: 1, + severity: Severity.Warning + }, + { + message: 'File name contains uppercase characters', + lineNumber: 1, + startColumnNumber: 1, + endColumnNumber: 1, + severity: Severity.Warning + }, + { + message: 'File missing Doxygen header', + lineNumber: 1, + startColumnNumber: 1, + endColumnNumber: 1, + severity: Severity.Warning + }, + { + message: 'Line contains encoded password', + lineNumber: 5, + startColumnNumber: 10, + endColumnNumber: 18, + severity: Severity.Error + }, + { + message: 'Line is indented with a tab', + lineNumber: 7, + startColumnNumber: 1, + endColumnNumber: 1, + severity: Severity.Warning + }, + { + message: 'Line has incorrect indentation - 3 spaces', + lineNumber: 6, + startColumnNumber: 1, + endColumnNumber: 1, + severity: Severity.Warning + }, + { + message: '%mend statement is missing macro name - mf_getuniquelibref', + lineNumber: 17, + startColumnNumber: 3, + endColumnNumber: 9, + severity: Severity.Warning + } +] + describe('lintFolder', () => { it('should identify lint issues in a given folder', async () => { const results = await lintFolder(path.join(__dirname, '..')) - expect(results.size).toEqual(1) + expect(results.size).toEqual(expectedFilesCount) const diagnostics = results.get( path.join(__dirname, '..', 'Example File.sas') )! - expect(diagnostics.length).toEqual(8) - expect(diagnostics).toContainEqual({ - message: 'Line contains trailing spaces', - lineNumber: 1, - startColumnNumber: 1, - endColumnNumber: 2, - severity: Severity.Warning - }) - expect(diagnostics).toContainEqual({ - message: 'Line contains trailing spaces', - lineNumber: 2, - startColumnNumber: 1, - endColumnNumber: 2, - severity: Severity.Warning - }) - expect(diagnostics).toContainEqual({ - message: 'File name contains spaces', - lineNumber: 1, - startColumnNumber: 1, - endColumnNumber: 1, - severity: Severity.Warning - }) - expect(diagnostics).toContainEqual({ - message: 'File name contains uppercase characters', - lineNumber: 1, - startColumnNumber: 1, - endColumnNumber: 1, - severity: Severity.Warning - }) - expect(diagnostics).toContainEqual({ - message: 'File missing Doxygen header', - lineNumber: 1, - startColumnNumber: 1, - endColumnNumber: 1, - severity: Severity.Warning - }) - expect(diagnostics).toContainEqual({ - message: 'Line contains encoded password', - lineNumber: 5, - startColumnNumber: 10, - endColumnNumber: 18, - severity: Severity.Error - }) - expect(diagnostics).toContainEqual({ - message: 'Line is indented with a tab', - lineNumber: 7, - startColumnNumber: 1, - endColumnNumber: 1, - severity: Severity.Warning - }) - expect(diagnostics).toContainEqual({ - message: 'Line has incorrect indentation - 3 spaces', - lineNumber: 6, - startColumnNumber: 1, - endColumnNumber: 1, - severity: Severity.Warning - }) + expect(diagnostics.length).toEqual(expectedDiagnostics.length) + expect(diagnostics).toContainEqual(expectedDiagnostics[0]) + expect(diagnostics).toContainEqual(expectedDiagnostics[1]) + expect(diagnostics).toContainEqual(expectedDiagnostics[2]) + expect(diagnostics).toContainEqual(expectedDiagnostics[3]) + expect(diagnostics).toContainEqual(expectedDiagnostics[4]) + expect(diagnostics).toContainEqual(expectedDiagnostics[5]) + expect(diagnostics).toContainEqual(expectedDiagnostics[6]) + expect(diagnostics).toContainEqual(expectedDiagnostics[7]) + expect(diagnostics).toContainEqual(expectedDiagnostics[8]) }) }) diff --git a/src/lint/lintProject.spec.ts b/src/lint/lintProject.spec.ts index b1f092d..ec7245f 100644 --- a/src/lint/lintProject.spec.ts +++ b/src/lint/lintProject.spec.ts @@ -4,6 +4,73 @@ import * as getProjectRootModule from '../utils/getProjectRoot' import path from 'path' jest.mock('../utils/getProjectRoot') +const expectedFilesCount = 1 +const expectedDiagnostics = [ + { + message: 'Line contains trailing spaces', + lineNumber: 1, + startColumnNumber: 1, + endColumnNumber: 2, + severity: Severity.Warning + }, + { + message: 'Line contains trailing spaces', + lineNumber: 2, + startColumnNumber: 1, + endColumnNumber: 2, + severity: Severity.Warning + }, + { + message: 'File name contains spaces', + lineNumber: 1, + startColumnNumber: 1, + endColumnNumber: 1, + severity: Severity.Warning + }, + { + message: 'File name contains uppercase characters', + lineNumber: 1, + startColumnNumber: 1, + endColumnNumber: 1, + severity: Severity.Warning + }, + { + message: 'File missing Doxygen header', + lineNumber: 1, + startColumnNumber: 1, + endColumnNumber: 1, + severity: Severity.Warning + }, + { + message: 'Line contains encoded password', + lineNumber: 5, + startColumnNumber: 10, + endColumnNumber: 18, + severity: Severity.Error + }, + { + message: 'Line is indented with a tab', + lineNumber: 7, + startColumnNumber: 1, + endColumnNumber: 1, + severity: Severity.Warning + }, + { + message: 'Line has incorrect indentation - 3 spaces', + lineNumber: 6, + startColumnNumber: 1, + endColumnNumber: 1, + severity: Severity.Warning + }, + { + message: '%mend statement is missing macro name - mf_getuniquelibref', + lineNumber: 17, + startColumnNumber: 3, + endColumnNumber: 9, + severity: Severity.Warning + } +] + describe('lintProject', () => { it('should identify lint issues in a given project', async () => { jest @@ -11,67 +78,20 @@ describe('lintProject', () => { .mockImplementation(() => Promise.resolve(path.join(__dirname, '..'))) const results = await lintProject() - expect(results.size).toEqual(1) + expect(results.size).toEqual(expectedFilesCount) const diagnostics = results.get( path.join(__dirname, '..', 'Example File.sas') )! - expect(diagnostics.length).toEqual(8) - expect(diagnostics).toContainEqual({ - message: 'Line contains trailing spaces', - lineNumber: 1, - startColumnNumber: 1, - endColumnNumber: 2, - severity: Severity.Warning - }) - expect(diagnostics).toContainEqual({ - message: 'Line contains trailing spaces', - lineNumber: 2, - startColumnNumber: 1, - endColumnNumber: 2, - severity: Severity.Warning - }) - expect(diagnostics).toContainEqual({ - message: 'File name contains spaces', - lineNumber: 1, - startColumnNumber: 1, - endColumnNumber: 1, - severity: Severity.Warning - }) - expect(diagnostics).toContainEqual({ - message: 'File name contains uppercase characters', - lineNumber: 1, - startColumnNumber: 1, - endColumnNumber: 1, - severity: Severity.Warning - }) - expect(diagnostics).toContainEqual({ - message: 'File missing Doxygen header', - lineNumber: 1, - startColumnNumber: 1, - endColumnNumber: 1, - severity: Severity.Warning - }) - expect(diagnostics).toContainEqual({ - message: 'Line contains encoded password', - lineNumber: 5, - startColumnNumber: 10, - endColumnNumber: 18, - severity: Severity.Error - }) - expect(diagnostics).toContainEqual({ - message: 'Line is indented with a tab', - lineNumber: 7, - startColumnNumber: 1, - endColumnNumber: 1, - severity: Severity.Warning - }) - expect(diagnostics).toContainEqual({ - message: 'Line has incorrect indentation - 3 spaces', - lineNumber: 6, - startColumnNumber: 1, - endColumnNumber: 1, - severity: Severity.Warning - }) + expect(diagnostics.length).toEqual(expectedDiagnostics.length) + expect(diagnostics).toContainEqual(expectedDiagnostics[0]) + expect(diagnostics).toContainEqual(expectedDiagnostics[1]) + expect(diagnostics).toContainEqual(expectedDiagnostics[2]) + expect(diagnostics).toContainEqual(expectedDiagnostics[3]) + expect(diagnostics).toContainEqual(expectedDiagnostics[4]) + expect(diagnostics).toContainEqual(expectedDiagnostics[5]) + expect(diagnostics).toContainEqual(expectedDiagnostics[6]) + expect(diagnostics).toContainEqual(expectedDiagnostics[7]) + expect(diagnostics).toContainEqual(expectedDiagnostics[8]) }) it('should throw an error when a project root is not found', async () => { diff --git a/src/utils/getLintConfig.spec.ts b/src/utils/getLintConfig.spec.ts index 1ea0d94..5ada859 100644 --- a/src/utils/getLintConfig.spec.ts +++ b/src/utils/getLintConfig.spec.ts @@ -2,6 +2,10 @@ import * as fileModule from '@sasjs/utils/file' import { LintConfig } from '../types/LintConfig' import { getLintConfig } from './getLintConfig' +const expectedFileLintRulesCount = 4 +const expectedLineLintRulesCount = 5 +const expectedPathLintRulesCount = 2 + describe('getLintConfig', () => { it('should get the lint config', async () => { const config = await getLintConfig() @@ -17,8 +21,8 @@ describe('getLintConfig', () => { const config = await getLintConfig() expect(config).toBeInstanceOf(LintConfig) - expect(config.fileLintRules.length).toEqual(3) - expect(config.lineLintRules.length).toEqual(5) - expect(config.pathLintRules.length).toEqual(2) + expect(config.fileLintRules.length).toEqual(expectedFileLintRulesCount) + expect(config.lineLintRules.length).toEqual(expectedLineLintRulesCount) + expect(config.pathLintRules.length).toEqual(expectedPathLintRulesCount) }) }) diff --git a/src/utils/getLintConfig.ts b/src/utils/getLintConfig.ts index 43df7c4..69b179e 100644 --- a/src/utils/getLintConfig.ts +++ b/src/utils/getLintConfig.ts @@ -15,7 +15,7 @@ export const DefaultLintConfiguration = { maxLineLength: 80, noTabIndentation: true, indentationMultiple: 2, - hasMacroNameInMend: false, + hasMacroNameInMend: true, noNestedMacros: true, hasMacroParentheses: true }