@@ -279,3 +279,138 @@ fn test_unexpected_type_declaration_error_message() {
279
279
diagnostics
280
280
) ;
281
281
}
282
+
283
+ #[ test]
284
+ fn action_container_parsed ( ) {
285
+ let lexer = lex ( "ACTIONS foo ACTION bar END_ACTION END_ACTIONS" ) ;
286
+ let result = parse ( lexer) . unwrap ( ) . 0 ;
287
+
288
+ let prg = & result. implementations [ 0 ] ;
289
+ assert_eq ! ( prg. name, "foo.bar" ) ;
290
+ assert_eq ! ( prg. type_name, "foo" ) ;
291
+ }
292
+
293
+ #[ test]
294
+ fn two_action_containers_parsed ( ) {
295
+ let lexer = lex ( "ACTIONS foo ACTION bar END_ACTION ACTION buz END_ACTION END_ACTIONS" ) ;
296
+ let result = parse ( lexer) . unwrap ( ) . 0 ;
297
+
298
+ let prg = & result. implementations [ 0 ] ;
299
+ assert_eq ! ( prg. name, "foo.bar" ) ;
300
+ assert_eq ! ( prg. type_name, "foo" ) ;
301
+
302
+ let prg2 = & result. implementations [ 1 ] ;
303
+ assert_eq ! ( prg2. name, "foo.buz" ) ;
304
+ assert_eq ! ( prg2. type_name, "foo" ) ;
305
+ }
306
+
307
+ #[ test]
308
+ fn mixed_action_types_parsed ( ) {
309
+ let lexer = lex ( "PROGRAM foo END_PROGRAM ACTIONS foo ACTION bar END_ACTION END_ACTIONS ACTION foo.buz END_ACTION" ) ;
310
+ let result = parse ( lexer) . unwrap ( ) . 0 ;
311
+
312
+ let prg = & result. implementations [ 1 ] ;
313
+ assert_eq ! ( prg. name, "foo.bar" ) ;
314
+ assert_eq ! ( prg. type_name, "foo" ) ;
315
+
316
+ let prg2 = & result. implementations [ 2 ] ;
317
+ assert_eq ! ( prg2. name, "foo.buz" ) ;
318
+ assert_eq ! ( prg2. type_name, "foo" ) ;
319
+ }
320
+
321
+ #[ test]
322
+ fn actions_with_no_container_error ( ) {
323
+ let lexer = lex ( "ACTIONS ACTION bar END_ACTION ACTION buz END_ACTION END_ACTIONS" ) ;
324
+ let err = parse ( lexer) . expect_err ( "Expecting parser failure" ) ;
325
+ assert_eq ! (
326
+ err,
327
+ Diagnostic :: unexpected_token_found( "Identifier" . into( ) , "ACTION" . into( ) , ( 8 ..14 ) . into( ) )
328
+ ) ;
329
+ }
330
+
331
+ #[ test]
332
+ fn two_programs_can_be_parsed ( ) {
333
+ let lexer = lex ( "PROGRAM foo END_PROGRAM PROGRAM bar END_PROGRAM" ) ;
334
+ let result = parse ( lexer) . unwrap ( ) . 0 ;
335
+
336
+ let prg = & result. units [ 0 ] ;
337
+ assert_eq ! ( prg. name, "foo" ) ;
338
+ let prg2 = & result. units [ 1 ] ;
339
+ assert_eq ! ( prg2. name, "bar" ) ;
340
+ }
341
+
342
+ #[ test]
343
+ fn simple_program_with_varblock_can_be_parsed ( ) {
344
+ let lexer = lex ( "PROGRAM buz VAR END_VAR END_PROGRAM" ) ;
345
+ let result = parse ( lexer) . unwrap ( ) . 0 ;
346
+
347
+ let prg = & result. units [ 0 ] ;
348
+
349
+ assert_eq ! ( prg. variable_blocks. len( ) , 1 ) ;
350
+ }
351
+
352
+ #[ test]
353
+ fn simple_program_with_two_varblocks_can_be_parsed ( ) {
354
+ let lexer = lex ( "PROGRAM buz VAR END_VAR VAR END_VAR END_PROGRAM" ) ;
355
+ let result = parse ( lexer) . unwrap ( ) . 0 ;
356
+
357
+ let prg = & result. units [ 0 ] ;
358
+
359
+ assert_eq ! ( prg. variable_blocks. len( ) , 2 ) ;
360
+ }
361
+
362
+ #[ test]
363
+ fn a_program_needs_to_end_with_end_program ( ) {
364
+ let lexer = lex ( "PROGRAM buz " ) ;
365
+ let ( _, diagnostics) = parse ( lexer) . unwrap ( ) ;
366
+ assert_eq ! (
367
+ diagnostics,
368
+ vec![ Diagnostic :: unexpected_token_found(
369
+ "KeywordEndProgram" . into( ) ,
370
+ "''" . into( ) ,
371
+ ( 12 ..12 ) . into( )
372
+ ) , ]
373
+ ) ;
374
+ }
375
+
376
+ #[ test]
377
+ fn a_variable_declaration_block_needs_to_end_with_endvar ( ) {
378
+ let lexer = lex ( "PROGRAM buz VAR END_PROGRAM " ) ;
379
+ let ( _, diagnostics) = parse ( lexer) . unwrap ( ) ;
380
+
381
+ assert_eq ! (
382
+ diagnostics,
383
+ vec![
384
+ Diagnostic :: missing_token( "[KeywordEndVar]" . into( ) , ( 16 ..27 ) . into( ) ) ,
385
+ Diagnostic :: unexpected_token_found(
386
+ "KeywordEndVar" . into( ) ,
387
+ "'END_PROGRAM'" . into( ) ,
388
+ ( 16 ..27 ) . into( )
389
+ ) ,
390
+ ]
391
+ ) ;
392
+ }
393
+
394
+ #[ test]
395
+ fn single_action_parsed ( ) {
396
+ let lexer = lex ( "ACTION foo.bar END_ACTION" ) ;
397
+ let result = parse ( lexer) . unwrap ( ) . 0 ;
398
+
399
+ let prg = & result. implementations [ 0 ] ;
400
+ assert_eq ! ( prg. name, "foo.bar" ) ;
401
+ assert_eq ! ( prg. type_name, "foo" ) ;
402
+ }
403
+
404
+ #[ test]
405
+ fn two_actions_parsed ( ) {
406
+ let lexer = lex ( "ACTION foo.bar END_ACTION ACTION fuz.bar END_ACTION" ) ;
407
+ let result = parse ( lexer) . unwrap ( ) . 0 ;
408
+
409
+ let prg = & result. implementations [ 0 ] ;
410
+ assert_eq ! ( prg. name, "foo.bar" ) ;
411
+ assert_eq ! ( prg. type_name, "foo" ) ;
412
+
413
+ let prg2 = & result. implementations [ 1 ] ;
414
+ assert_eq ! ( prg2. name, "fuz.bar" ) ;
415
+ assert_eq ! ( prg2. type_name, "fuz" ) ;
416
+ }
0 commit comments