1
0
mirror of https://github.com/sasjs/lint.git synced 2025-12-10 17:34:36 +00:00

Merge branch 'main' of https://github.com/sasjs/lint into main

This commit is contained in:
Krishna Acondy
2021-04-19 20:06:51 +01:00
5 changed files with 240 additions and 177 deletions

View File

@@ -2,68 +2,87 @@ import { lintFile } from './lintFile'
import { Severity } from '../types/Severity' import { Severity } from '../types/Severity'
import path from 'path' 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', () => { describe('lintFile', () => {
it('should identify lint issues in a given file', async () => { it('should identify lint issues in a given file', async () => {
const results = await lintFile( const results = await lintFile(
path.join(__dirname, '..', 'Example File.sas') path.join(__dirname, '..', 'Example File.sas')
) )
expect(results.length).toEqual(8) expect(results.length).toEqual(expectedDiagnostics.length)
expect(results).toContainEqual({ expect(results).toContainEqual(expectedDiagnostics[0])
message: 'Line contains trailing spaces', expect(results).toContainEqual(expectedDiagnostics[1])
lineNumber: 1, expect(results).toContainEqual(expectedDiagnostics[2])
startColumnNumber: 1, expect(results).toContainEqual(expectedDiagnostics[3])
endColumnNumber: 2, expect(results).toContainEqual(expectedDiagnostics[4])
severity: Severity.Warning expect(results).toContainEqual(expectedDiagnostics[5])
}) expect(results).toContainEqual(expectedDiagnostics[6])
expect(results).toContainEqual({ expect(results).toContainEqual(expectedDiagnostics[7])
message: 'Line contains trailing spaces', expect(results).toContainEqual(expectedDiagnostics[8])
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
})
}) })
}) })

View File

@@ -2,70 +2,90 @@ import { lintFolder } from './lintFolder'
import { Severity } from '../types/Severity' import { Severity } from '../types/Severity'
import path from 'path' 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', () => { describe('lintFolder', () => {
it('should identify lint issues in a given folder', async () => { it('should identify lint issues in a given folder', async () => {
const results = await lintFolder(path.join(__dirname, '..')) const results = await lintFolder(path.join(__dirname, '..'))
expect(results.size).toEqual(1) expect(results.size).toEqual(expectedFilesCount)
const diagnostics = results.get( const diagnostics = results.get(
path.join(__dirname, '..', 'Example File.sas') path.join(__dirname, '..', 'Example File.sas')
)! )!
expect(diagnostics.length).toEqual(8) expect(diagnostics.length).toEqual(expectedDiagnostics.length)
expect(diagnostics).toContainEqual({ expect(diagnostics).toContainEqual(expectedDiagnostics[0])
message: 'Line contains trailing spaces', expect(diagnostics).toContainEqual(expectedDiagnostics[1])
lineNumber: 1, expect(diagnostics).toContainEqual(expectedDiagnostics[2])
startColumnNumber: 1, expect(diagnostics).toContainEqual(expectedDiagnostics[3])
endColumnNumber: 2, expect(diagnostics).toContainEqual(expectedDiagnostics[4])
severity: Severity.Warning expect(diagnostics).toContainEqual(expectedDiagnostics[5])
}) expect(diagnostics).toContainEqual(expectedDiagnostics[6])
expect(diagnostics).toContainEqual({ expect(diagnostics).toContainEqual(expectedDiagnostics[7])
message: 'Line contains trailing spaces', expect(diagnostics).toContainEqual(expectedDiagnostics[8])
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
})
}) })
}) })

View File

@@ -4,6 +4,73 @@ import * as getProjectRootModule from '../utils/getProjectRoot'
import path from 'path' import path from 'path'
jest.mock('../utils/getProjectRoot') 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', () => { describe('lintProject', () => {
it('should identify lint issues in a given project', async () => { it('should identify lint issues in a given project', async () => {
jest jest
@@ -11,67 +78,20 @@ describe('lintProject', () => {
.mockImplementation(() => Promise.resolve(path.join(__dirname, '..'))) .mockImplementation(() => Promise.resolve(path.join(__dirname, '..')))
const results = await lintProject() const results = await lintProject()
expect(results.size).toEqual(1) expect(results.size).toEqual(expectedFilesCount)
const diagnostics = results.get( const diagnostics = results.get(
path.join(__dirname, '..', 'Example File.sas') path.join(__dirname, '..', 'Example File.sas')
)! )!
expect(diagnostics.length).toEqual(8) expect(diagnostics.length).toEqual(expectedDiagnostics.length)
expect(diagnostics).toContainEqual({ expect(diagnostics).toContainEqual(expectedDiagnostics[0])
message: 'Line contains trailing spaces', expect(diagnostics).toContainEqual(expectedDiagnostics[1])
lineNumber: 1, expect(diagnostics).toContainEqual(expectedDiagnostics[2])
startColumnNumber: 1, expect(diagnostics).toContainEqual(expectedDiagnostics[3])
endColumnNumber: 2, expect(diagnostics).toContainEqual(expectedDiagnostics[4])
severity: Severity.Warning expect(diagnostics).toContainEqual(expectedDiagnostics[5])
}) expect(diagnostics).toContainEqual(expectedDiagnostics[6])
expect(diagnostics).toContainEqual({ expect(diagnostics).toContainEqual(expectedDiagnostics[7])
message: 'Line contains trailing spaces', expect(diagnostics).toContainEqual(expectedDiagnostics[8])
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
})
}) })
it('should throw an error when a project root is not found', async () => { it('should throw an error when a project root is not found', async () => {

View File

@@ -2,6 +2,10 @@ import * as fileModule from '@sasjs/utils/file'
import { LintConfig } from '../types/LintConfig' import { LintConfig } from '../types/LintConfig'
import { getLintConfig } from './getLintConfig' import { getLintConfig } from './getLintConfig'
const expectedFileLintRulesCount = 4
const expectedLineLintRulesCount = 5
const expectedPathLintRulesCount = 2
describe('getLintConfig', () => { describe('getLintConfig', () => {
it('should get the lint config', async () => { it('should get the lint config', async () => {
const config = await getLintConfig() const config = await getLintConfig()
@@ -17,8 +21,8 @@ describe('getLintConfig', () => {
const config = await getLintConfig() const config = await getLintConfig()
expect(config).toBeInstanceOf(LintConfig) expect(config).toBeInstanceOf(LintConfig)
expect(config.fileLintRules.length).toEqual(3) expect(config.fileLintRules.length).toEqual(expectedFileLintRulesCount)
expect(config.lineLintRules.length).toEqual(5) expect(config.lineLintRules.length).toEqual(expectedLineLintRulesCount)
expect(config.pathLintRules.length).toEqual(2) expect(config.pathLintRules.length).toEqual(expectedPathLintRulesCount)
}) })
}) })

View File

@@ -15,7 +15,7 @@ export const DefaultLintConfiguration = {
maxLineLength: 80, maxLineLength: 80,
noTabIndentation: true, noTabIndentation: true,
indentationMultiple: 2, indentationMultiple: 2,
hasMacroNameInMend: false, hasMacroNameInMend: true,
noNestedMacros: true, noNestedMacros: true,
hasMacroParentheses: true hasMacroParentheses: true
} }