From 95f81a7bd894c9bacbaa3d1de1a1e00fd11f44f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20M=C3=BCller?= Date: Mon, 28 Aug 2023 08:07:34 +0200 Subject: [PATCH] Added RangeConstraintExecutor tests --- .../range-constraint-executor.spec.ts | 91 +++++++++++++++++++ .../valid-constraint.jv | 29 ++++++ 2 files changed, 120 insertions(+) create mode 100644 libs/execution/src/lib/constraints/executors/range-constraint-executor.spec.ts create mode 100644 libs/execution/test/assets/range-constraint-executor/valid-constraint.jv diff --git a/libs/execution/src/lib/constraints/executors/range-constraint-executor.spec.ts b/libs/execution/src/lib/constraints/executors/range-constraint-executor.spec.ts new file mode 100644 index 000000000..e0bd6550a --- /dev/null +++ b/libs/execution/src/lib/constraints/executors/range-constraint-executor.spec.ts @@ -0,0 +1,91 @@ +// SPDX-FileCopyrightText: 2023 Friedrich-Alexander-Universitat Erlangen-Nurnberg +// +// SPDX-License-Identifier: AGPL-3.0-only + +import { + BlockDefinition, + InternalValueRepresentation, + TypedConstraintDefinition, + createJayveeServices, + useExtension, +} from '@jvalue/jayvee-language-server'; +import { + ParseHelperOptions, + TestLangExtension, + expectNoParserAndLexerErrors, + parseHelper, + readJvTestAssetHelper, +} from '@jvalue/jayvee-language-server/test'; +import { AstNode, AstNodeLocator, LangiumDocument } from 'langium'; +import { NodeFileSystem } from 'langium/node'; + +import { getTestExecutionContext } from '../../../../test/utils'; + +import { RangeConstraintExecutor } from './range-constraint-executor'; + +describe('Validation of RangeConstraintExecutor', () => { + let parse: ( + input: string, + options?: ParseHelperOptions, + ) => Promise>; + + let locator: AstNodeLocator; + + const readJvTestAsset = readJvTestAssetHelper( + __dirname, + '../../../../test/assets/', + ); + + async function parseAndValidateConstraint( + input: string, + value: InternalValueRepresentation, + ): Promise { + const document = await parse(input, { validationChecks: 'all' }); + expectNoParserAndLexerErrors(document); + + const usageBlock = locator.getAstNode( + document.parseResult.value, + 'pipelines@0/blocks@2', + ) as BlockDefinition; + const constraint = locator.getAstNode( + document.parseResult.value, + 'constraints@0', + ) as TypedConstraintDefinition; + + return new RangeConstraintExecutor().isValid( + value, + // Execution context with initial stack containing usage block of constraint and constraint itself + getTestExecutionContext(locator, document, [usageBlock, constraint]), + ); + } + + beforeAll(() => { + // Register test extension + useExtension(new TestLangExtension()); + // Create language services + const services = createJayveeServices(NodeFileSystem).Jayvee; + locator = services.workspace.AstNodeLocator; + // Parse function for Jayvee (without validation) + parse = parseHelper(services); + }); + + it('should diagnose no error on valid value', async () => { + const text = readJvTestAsset( + 'range-constraint-executor/valid-constraint.jv', + ); + + const valid = await parseAndValidateConstraint(text, 2); + + expect(valid).toBe(true); + }); + + it('should diagnose error on invalid value', async () => { + const text = readJvTestAsset( + 'range-constraint-executor/valid-constraint.jv', + ); + + const valid = await parseAndValidateConstraint(text, 11); + + expect(valid).toBe(false); + }); +}); diff --git a/libs/execution/test/assets/range-constraint-executor/valid-constraint.jv b/libs/execution/test/assets/range-constraint-executor/valid-constraint.jv new file mode 100644 index 000000000..c0234907d --- /dev/null +++ b/libs/execution/test/assets/range-constraint-executor/valid-constraint.jv @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2023 Friedrich-Alexander-Universitat Erlangen-Nurnberg +// +// SPDX-License-Identifier: AGPL-3.0-only + +constraint TestConstraint oftype RangeConstraint { + lowerBound: 1; + upperBound: 10; +} + +valuetype ConstraintType oftype integer { + constraints: [ + TestConstraint, + ]; +} + +pipeline TestPipeline { + + block TestExtractor oftype TestFileExtractor { + } + + block TestLoader oftype TestTableLoader { + } + + block TestProperty oftype TestProperty { + valuetypeAssignmentProperty: "test" oftype ConstraintType; + } + + TestExtractor -> TestProperty -> TestLoader; +}