diff --git a/libs/language-server/src/lib/validation/checks/block-definition.spec.ts b/libs/language-server/src/lib/validation/checks/block-definition.spec.ts deleted file mode 100644 index e4228a6f4..000000000 --- a/libs/language-server/src/lib/validation/checks/block-definition.spec.ts +++ /dev/null @@ -1,86 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Friedrich-Alexander-Universitat Erlangen-Nurnberg -// -// SPDX-License-Identifier: AGPL-3.0-only - -import { AstNode, AstNodeLocator, LangiumDocument } from 'langium'; -import { NodeFileSystem } from 'langium/node'; - -import { - BlockDefinition, - ValidationContext, - createJayveeServices, -} from '../..'; -import { - ParseHelperOptions, - expectNoParserAndLexerErrors, - parseHelper, - readJvTestAssetHelper, - validationAcceptorMockImpl, -} from '../../../test'; - -import { validateBlockDefinition } from './block-definition'; - -describe('Validation of BlockDefinition', () => { - let parse: ( - input: string, - options?: ParseHelperOptions, - ) => Promise>; - - const validationAcceptorMock = jest.fn(validationAcceptorMockImpl); - - let locator: AstNodeLocator; - - const readJvTestAsset = readJvTestAssetHelper( - __dirname, - '../../../test/assets/', - ); - - async function parseAndValidateBlock(input: string) { - const document = await parse(input); - expectNoParserAndLexerErrors(document); - - const block = locator.getAstNode( - document.parseResult.value, - 'pipelines@0/blocks@0', - ) as BlockDefinition; - - validateBlockDefinition( - block, - new ValidationContext(validationAcceptorMock), - ); - } - - beforeAll(() => { - // Create language services - const services = createJayveeServices(NodeFileSystem).Jayvee; - locator = services.workspace.AstNodeLocator; - // Parse function for Jayvee (without validation) - parse = parseHelper(services); - }); - - afterEach(() => { - // Reset mock - validationAcceptorMock.mockReset(); - }); - - it('should diagnose error on block without pipe', async () => { - const text = readJvTestAsset('block-definition/invalid-missing-pipe.jv'); - - await parseAndValidateBlock(text); - - expect(validationAcceptorMock).toHaveBeenCalledTimes(1); - expect(validationAcceptorMock).toHaveBeenCalledWith( - 'warning', - 'A pipe should be connected to the output of this block', - expect.any(Object), - ); - }); - - it('should have no error on valid block definition', async () => { - const text = readJvTestAsset('block-definition/valid-block-definition.jv'); - - await parseAndValidateBlock(text); - - expect(validationAcceptorMock).toHaveBeenCalledTimes(0); - }); -}); diff --git a/libs/language-server/src/lib/validation/checks/composite-blocktype-definition.spec.ts b/libs/language-server/src/lib/validation/checks/composite-blocktype-definition.spec.ts index 302f44335..5f719bd85 100644 --- a/libs/language-server/src/lib/validation/checks/composite-blocktype-definition.spec.ts +++ b/libs/language-server/src/lib/validation/checks/composite-blocktype-definition.spec.ts @@ -138,4 +138,24 @@ describe('Validation of CompositeBlocktypeDefinition', () => { expect.any(Object), ); }); + + it('should diagnose error on block without pipe', async () => { + const text = readJvTestAsset( + 'composite-blocktype-definition/invalid-unconnected-block.jv', + ); + + await parseAndValidateBlocktype(text); + + expect(validationAcceptorMock).toHaveBeenCalledTimes(2); + expect(validationAcceptorMock).toHaveBeenCalledWith( + 'warning', + 'A pipe should be connected to the input of this block', + expect.any(Object), + ); + expect(validationAcceptorMock).toHaveBeenCalledWith( + 'warning', + 'A pipe should be connected to the output of this block', + expect.any(Object), + ); + }); }); diff --git a/libs/language-server/src/lib/validation/checks/pipeline-definition.spec.ts b/libs/language-server/src/lib/validation/checks/pipeline-definition.spec.ts index 0626d2baf..5988ad1e7 100644 --- a/libs/language-server/src/lib/validation/checks/pipeline-definition.spec.ts +++ b/libs/language-server/src/lib/validation/checks/pipeline-definition.spec.ts @@ -85,7 +85,7 @@ describe('Validation of PipelineDefinition', () => { await parseAndValidatePipeline(text); - expect(validationAcceptorMock).toHaveBeenCalledTimes(1); + expect(validationAcceptorMock).toHaveBeenCalledTimes(2); // one warning for unused blocks expect(validationAcceptorMock).toHaveBeenCalledWith( 'error', `An extractor block is required for this pipeline`, @@ -116,4 +116,17 @@ describe('Validation of PipelineDefinition', () => { expect.any(Object), ); }); + + it('should diagnose error on block without pipe', async () => { + const text = readJvTestAsset('pipeline-definition/invalid-missing-pipe.jv'); + + await parseAndValidatePipeline(text); + + expect(validationAcceptorMock).toHaveBeenCalledTimes(2); // one error since missing extractor + expect(validationAcceptorMock).toHaveBeenCalledWith( + 'warning', + 'A pipe should be connected to the output of this block', + expect.any(Object), + ); + }); }); diff --git a/libs/language-server/src/test/assets/block-definition/valid-block-definition.jv b/libs/language-server/src/test/assets/block-definition/valid-block-definition.jv deleted file mode 100644 index 272e0f9f7..000000000 --- a/libs/language-server/src/test/assets/block-definition/valid-block-definition.jv +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Friedrich-Alexander-Universitat Erlangen-Nurnberg -// -// SPDX-License-Identifier: AGPL-3.0-only - -pipeline Pipeline { - block TestExtractor oftype TestFileExtractor { - } - - block TestLoader oftype TestTableLoader { - } - - TestExtractor -> TestLoader; -} - -builtin blocktype TestFileExtractor { - input inPort oftype None; - output outPort oftype File; -} - -builtin blocktype TestTableLoader { - input inPort oftype File; - output outPort oftype None; -} \ No newline at end of file diff --git a/libs/language-server/src/test/assets/composite-blocktype-definition/invalid-unconnected-block.jv b/libs/language-server/src/test/assets/composite-blocktype-definition/invalid-unconnected-block.jv new file mode 100644 index 000000000..252667e32 --- /dev/null +++ b/libs/language-server/src/test/assets/composite-blocktype-definition/invalid-unconnected-block.jv @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: 2023 Friedrich-Alexander-Universitat Erlangen-Nurnberg +// +// SPDX-License-Identifier: AGPL-3.0-only + +composite blocktype TestBlockType { + input inPort oftype Table; + output outPort oftype File; + + block TestExtractor1 oftype TestFileExtractor { } + block TestExtractor2 oftype TestFileExtractor { } + + inPort -> TestExtractor1 -> outPort; +} + +builtin blocktype TestFileExtractor { + input inPort oftype Table; + output outPort oftype File; +} diff --git a/libs/language-server/src/test/assets/block-definition/invalid-missing-pipe.jv b/libs/language-server/src/test/assets/pipeline-definition/invalid-missing-pipe.jv similarity index 100% rename from libs/language-server/src/test/assets/block-definition/invalid-missing-pipe.jv rename to libs/language-server/src/test/assets/pipeline-definition/invalid-missing-pipe.jv