diff --git a/.eslintignore b/.eslintignore index 9b3c437e..a6c7c285 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1 @@ *.js -test/**/index.ts -test/**/runTest.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c093628..fe82de5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Added +- Added unittests for the formatting providers + ([#423](https://github.com/fortran-lang/vscode-fortran-support/issues/423)) - Added GitHub Actions environment to dependabot - Adds support for Intel (ifort) and LLVM (flang) compilers ([#291](https://github.com/krvajal/vscode-fortran-support/issues/291)) diff --git a/test/formatting-provider.test.ts b/test/formatting-provider.test.ts new file mode 100644 index 00000000..c8947014 --- /dev/null +++ b/test/formatting-provider.test.ts @@ -0,0 +1,61 @@ +import { strictEqual } from 'assert'; +import { FortranFormattingProvider } from '../src/features/formatting-provider'; +import * as vscode from 'vscode'; +import * as path from 'path'; +import { LoggingService } from '../src/services/logging-service'; +import { spawnSync } from 'child_process'; + +suite('Formatting tests', () => { + let doc: vscode.TextDocument; + const fmt = new FortranFormattingProvider(new LoggingService()); + const fileUri = vscode.Uri.file( + path.resolve(__dirname, '../../test/resources/formatting_test.f90') + ); + + suiteSetup(async function (): Promise { + spawnSync('pip', ['install', '--user', '--upgrade', 'findent']); + spawnSync('pip', ['install', '--user', '--upgrade', 'fprettify']); + doc = await vscode.workspace.openTextDocument(fileUri); + await vscode.window.showTextDocument(doc); + console.log('Open file: ' + fileUri.toString()); + }); + + test('Using findent', async () => { + const fmt = new FortranFormattingProvider(new LoggingService()); + fmt['formatter'] = 'findent'; + const edits = await fmt['doFormatFindent'](doc); + strictEqual( + edits[0].newText.toString(), + `program main + implicit none + integer :: i, j + do i = 1, 5 + do j = 1, 5 + if (i == j) then + print *, i + end if + end do + end do +end program main +` + ); + }); + + test('Using fprettify', async () => { + fmt['formatter'] = 'fprettify'; + const edits = await fmt['doFormatFprettify'](doc); + const ref = `program main + implicit none + integer :: i, j + do i = 1, 5 + do j = 1, 5 + if (i == j) then + print *, i + end if + end do + end do +end program main +`; + strictEqual(edits[0].newText.toString(), ref); + }); +}); diff --git a/test/resources/formatting_test.f90 b/test/resources/formatting_test.f90 new file mode 100644 index 00000000..8050bc4d --- /dev/null +++ b/test/resources/formatting_test.f90 @@ -0,0 +1,11 @@ +program main +implicit none +integer :: i, j +do i = 1, 5 +do j = 1, 5 +if (i == j) then +print *, i +end if +end do +end do +end program main \ No newline at end of file diff --git a/test/resources/formatting_test.f90.snap b/test/resources/formatting_test.f90.snap new file mode 100644 index 00000000..bcb34e9a --- /dev/null +++ b/test/resources/formatting_test.f90.snap @@ -0,0 +1,64 @@ +>program main +#^^^^^^^ source.fortran.free meta.program.fortran keyword.control.program.fortran +# ^ source.fortran.free meta.program.fortran +# ^^^^ source.fortran.free meta.program.fortran entity.name.program.fortran +>implicit none +#^^^^^^^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.statement.implicit.fortran keyword.other.implicit.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.statement.implicit.fortran +# ^^^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.statement.implicit.fortran keyword.other.none.fortran +>integer :: i, j +#^^^^^^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.specification.type.fortran storage.type.integer.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.specification.type.fortran meta.attribute-list.type-specification-statements.fortran +# ^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.specification.type.fortran keyword.operator.double-colon.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.specification.type.fortran meta.name-list.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.specification.type.fortran meta.name-list.fortran meta.parameter.fortran +# ^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.specification.type.fortran meta.name-list.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.specification.type.fortran meta.name-list.fortran meta.parameter.fortran +>do i = 1, 5 +#^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran keyword.control.do.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran meta.parameter.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran keyword.operator.assignment.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran constant.numeric.fortran +# ^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran constant.numeric.fortran +>do j = 1, 5 +#^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran keyword.control.do.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran meta.parameter.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran keyword.operator.assignment.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran constant.numeric.fortran +# ^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.loop-control.fortran constant.numeric.fortran +>if (i == j) then +#^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran keyword.control.if.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.expression.control.logical.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.expression.control.logical.fortran punctuation.parentheses.left.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.expression.control.logical.fortran meta.parameter.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.expression.control.logical.fortran +# ^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.expression.control.logical.fortran keyword.logical.fortran.modern +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.expression.control.logical.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.expression.control.logical.fortran meta.parameter.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.expression.control.logical.fortran punctuation.parentheses.right.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran +# ^^^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran keyword.control.then.fortran +>print *, i +#^^^^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.block.if.fortran keyword.control.print.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.block.if.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.block.if.fortran keyword.operator.power.fortran +# ^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.block.if.fortran +# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran meta.block.if.fortran meta.parameter.fortran +>end if +#^^^^^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran keyword.control.endif.fortran +>end do +#^^^^^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran meta.block.do.unlabeled.fortran keyword.control.enddo.fortran +>end do +#^^^^^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.block.do.unlabeled.fortran keyword.control.enddo.fortran +>end program main +#^^^^^^^^^^^ source.fortran.free meta.program.fortran keyword.control.endprogram.fortran +# ^ source.fortran.free meta.program.fortran +# ^^^^ source.fortran.free meta.program.fortran entity.name.program.fortran \ No newline at end of file diff --git a/test/runTest.ts b/test/runTest.ts index b7d75a77..0d34d797 100644 --- a/test/runTest.ts +++ b/test/runTest.ts @@ -6,13 +6,13 @@ async function main() { try { // The folder containing the Extension Manifest package.json // Passed to `--extensionDevelopmentPath` - const extensionDevelopmentPath = path.resolve(__dirname, '../'); + const extensionDevelopmentPath = path.resolve(__dirname, '../../'); // The path to the extension test runner script // Passed to --extensionTestsPath const extensionTestsPath = path.resolve(__dirname, './index'); - const launchArgs = ['--disable-extensions', '--install-extension ms-vscode.cpptools']; + const launchArgs = ['--disable-extensions', '--install-extension', 'ms-vscode.cpptools']; // Download VS Code, unzip it and run the integration test await runTests({ launchArgs,