@@ -8,7 +8,7 @@ import { AstUtils } from 'langium';
88import type { AstNode , ValidationAcceptor , ValidationChecks } from 'langium' ;
99import { createServicesForGrammar } from 'langium/grammar' ;
1010import type { LangiumServices } from 'langium/lsp' ;
11- import type { ValidationResult } from 'langium/test' ;
11+ import type { ValidationHelperOptions , ValidationResult } from 'langium/test' ;
1212import { validationHelper } from 'langium/test' ;
1313import { beforeAll , describe , expect , test } from 'vitest' ;
1414import { Position , Range } from 'vscode-languageserver' ;
@@ -259,4 +259,82 @@ describe('Register Before/AfterDocument logic for validations with state', () =>
259259 } ) ;
260260 } ) ;
261261
262+ describe ( 'Custom validation categories' , ( ) => {
263+
264+ const grammar = `grammar Test
265+
266+ entry Model:
267+ 'model' name=ID;
268+
269+ hidden terminal WS: /\\s+/;
270+ terminal ID: /[_a-zA-Z][\\w_]*/;
271+ ` ;
272+
273+ let validate : ( input : string , options ?: ValidationHelperOptions ) => Promise < ValidationResult < AstNode > > ;
274+
275+ beforeAll ( async ( ) => {
276+ const services = await createServicesForGrammar ( {
277+ grammar
278+ } ) ;
279+ const validationChecksUser : ValidationChecks < object > = {
280+ AstNode : [
281+ ( node , accept ) => {
282+ accept ( 'error' , 'TEST' , { node } ) ;
283+ }
284+ ]
285+ } ;
286+ services . validation . ValidationRegistry . register ( validationChecksUser , services . validation . ValidationRegistry , 'user' ) ;
287+ const validationChecksFast : ValidationChecks < object > = {
288+ AstNode : [
289+ ( node , accept ) => {
290+ accept ( 'warning' , 'TEST' , { node } ) ;
291+ }
292+ ]
293+ } ;
294+ services . validation . ValidationRegistry . register ( validationChecksFast ) ;
295+
296+ validate = validationHelper ( services ) ;
297+ } ) ;
298+
299+ test ( 'empty categories' , async ( ) => {
300+ const validationResult = await validate ( 'model test' , { validation :{ categories :[ ] } } ) ;
301+ const diagnostics = validationResult . diagnostics ;
302+ expect ( diagnostics ) . toHaveLength ( 0 ) ;
303+ expect ( diagnostics . filter ( d => d . severity === 1 ) ) . toHaveLength ( 0 ) ; // 0 error
304+ expect ( diagnostics . filter ( d => d . severity === 2 ) ) . toHaveLength ( 0 ) ; // 0 warning
305+ } ) ;
306+
307+ test ( 'fast category' , async ( ) => {
308+ const validationResult = await validate ( 'model test' , { validation :{ categories :[ 'fast' ] } } ) ;
309+ const diagnostics = validationResult . diagnostics ;
310+ expect ( diagnostics ) . toHaveLength ( 1 ) ;
311+ expect ( diagnostics . filter ( d => d . severity === 1 ) ) . toHaveLength ( 0 ) ; // 0 error
312+ expect ( diagnostics . filter ( d => d . severity === 2 ) ) . toHaveLength ( 1 ) ; // 1 warning
313+ } ) ;
314+
315+ test ( 'user category' , async ( ) => {
316+ const validationResult = await validate ( 'model test' , { validation :{ categories :[ 'user' ] } } ) ;
317+ const diagnostics = validationResult . diagnostics ;
318+ expect ( diagnostics ) . toHaveLength ( 1 ) ;
319+ expect ( diagnostics . filter ( d => d . severity === 1 ) ) . toHaveLength ( 1 ) ; // 1 error
320+ expect ( diagnostics . filter ( d => d . severity === 2 ) ) . toHaveLength ( 0 ) ; // 0 warning
321+ } ) ;
322+
323+ test ( 'user&fast categories' , async ( ) => {
324+ const validationResult = await validate ( 'model test' , { validation :{ categories :[ 'user' , 'fast' ] } } ) ;
325+ const diagnostics = validationResult . diagnostics ;
326+ expect ( diagnostics ) . toHaveLength ( 2 ) ;
327+ expect ( diagnostics . filter ( d => d . severity === 1 ) ) . toHaveLength ( 1 ) ; // 1 error
328+ expect ( diagnostics . filter ( d => d . severity === 2 ) ) . toHaveLength ( 1 ) ; // 1 warning
329+ } ) ;
330+
331+ test ( 'default categories' , async ( ) => {
332+ const validationResult = await validate ( 'model test' ) ;
333+ const diagnostics = validationResult . diagnostics ;
334+ expect ( diagnostics ) . toHaveLength ( 2 ) ;
335+ expect ( diagnostics . filter ( d => d . severity === 1 ) ) . toHaveLength ( 1 ) ; // 1 error
336+ expect ( diagnostics . filter ( d => d . severity === 2 ) ) . toHaveLength ( 1 ) ; // 1 warning
337+ } ) ;
338+ } ) ;
339+
262340} ) ;
0 commit comments