@@ -10,6 +10,7 @@ module test_module_dependencies
10
10
FPM_UNIT_CHEADER, FPM_SCOPE_UNKNOWN, FPM_SCOPE_LIB, &
11
11
FPM_SCOPE_DEP, FPM_SCOPE_APP, FPM_SCOPE_TEST
12
12
use fpm_strings, only: string_t, operator (.in .)
13
+ use fpm, only: check_modules_for_duplicates
13
14
implicit none
14
15
private
15
16
@@ -39,6 +40,14 @@ subroutine collect_module_dependencies(testsuite)
39
40
test_missing_program_use, should_fail= .true. ), &
40
41
& new_unittest(" invalid-library-use" , &
41
42
test_invalid_library_use, should_fail= .true. ), &
43
+ & new_unittest(" package-with-no-duplicates" , &
44
+ test_package_with_no_module_duplicates), &
45
+ & new_unittest(" package-with-duplicates-in-same-source" , &
46
+ test_package_module_duplicates_same_source, should_fail= .true. ), &
47
+ & new_unittest(" package-with-duplicates-in-one-package" , &
48
+ test_package_module_duplicates_one_package, should_fail= .true. ), &
49
+ & new_unittest(" package-with-duplicates-in-two-packages" , &
50
+ test_package_module_duplicates_two_packages, should_fail= .true. ), &
42
51
& new_unittest(" subdirectory-module-use" , &
43
52
test_subdirectory_module_use), &
44
53
& new_unittest(" invalid-subdirectory-module-use" , &
@@ -391,9 +400,103 @@ subroutine test_subdirectory_module_use(error)
391
400
uses= [string_t(' app_mod' )])
392
401
393
402
call targets_from_sources(targets,model,error)
394
-
403
+
395
404
end subroutine test_subdirectory_module_use
396
405
406
+ ! > Check program with no duplicate modules
407
+ subroutine test_package_with_no_module_duplicates (error )
408
+
409
+ type (error_t), allocatable , intent (out ) :: error
410
+
411
+ type (fpm_model_t) :: model
412
+ logical :: duplicates_found = .false.
413
+
414
+ allocate (model% packages(1 ))
415
+ allocate (model% packages(1 )% sources(2 ))
416
+
417
+ model% packages(1 )% sources(1 ) = new_test_source(FPM_UNIT_MODULE,file_name= " src/my_mod_1.f90" , &
418
+ scope = FPM_SCOPE_LIB, provides= [string_t(' my_mod_1' )])
419
+
420
+ model% packages(1 )% sources(2 ) = new_test_source(FPM_UNIT_MODULE,file_name= " src/my_mod_2.f90" , &
421
+ scope = FPM_SCOPE_LIB, provides= [string_t(' my_mod_2' )])
422
+
423
+ call check_modules_for_duplicates(model, duplicates_found)
424
+ if (duplicates_found) then
425
+ call test_failed(error,' Duplicate modules found' )
426
+ return
427
+ end if
428
+ end subroutine test_package_with_no_module_duplicates
429
+
430
+ ! > Check program with duplicate modules in same source file
431
+ subroutine test_package_module_duplicates_same_source (error )
432
+
433
+ type (error_t), allocatable , intent (out ) :: error
434
+
435
+ type (fpm_model_t) :: model
436
+ logical :: duplicates_found
437
+
438
+ allocate (model% packages(1 ))
439
+ allocate (model% packages(1 )% sources(1 ))
440
+
441
+ model% packages(1 )% sources(1 ) = new_test_source(FPM_UNIT_MODULE,file_name= " src/my_mod_1.f90" , &
442
+ scope = FPM_SCOPE_LIB, provides= [string_t(' my_mod_1' ), string_t(' my_mod_1' )])
443
+
444
+ call check_modules_for_duplicates(model, duplicates_found)
445
+ if (duplicates_found) then
446
+ call test_failed(error,' Duplicate modules found' )
447
+ return
448
+ end if
449
+ end subroutine test_package_module_duplicates_same_source
450
+
451
+ ! > Check program with duplicate modules in two different source files in one package
452
+ subroutine test_package_module_duplicates_one_package (error )
453
+
454
+ type (error_t), allocatable , intent (out ) :: error
455
+
456
+ type (fpm_model_t) :: model
457
+ logical :: duplicates_found
458
+
459
+ allocate (model% packages(1 ))
460
+ allocate (model% packages(1 )% sources(2 ))
461
+
462
+ model% packages(1 )% sources(1 ) = new_test_source(FPM_UNIT_MODULE,file_name= " src/my_mod_1_a.f90" , &
463
+ scope = FPM_SCOPE_LIB, provides= [string_t(' my_mod_1' )])
464
+
465
+ model% packages(1 )% sources(2 ) = new_test_source(FPM_UNIT_MODULE,file_name= " src/my_mod_1_b.f90" , &
466
+ scope = FPM_SCOPE_LIB, provides= [string_t(' my_mod_1' )])
467
+
468
+ call check_modules_for_duplicates(model, duplicates_found)
469
+ if (duplicates_found) then
470
+ call test_failed(error,' Duplicate modules found' )
471
+ return
472
+ end if
473
+ end subroutine test_package_module_duplicates_one_package
474
+
475
+ ! > Check program with duplicate modules in two different packages
476
+ subroutine test_package_module_duplicates_two_packages (error )
477
+
478
+ type (error_t), allocatable , intent (out ) :: error
479
+
480
+ type (fpm_model_t) :: model
481
+ logical :: duplicates_found
482
+
483
+ allocate (model% packages(2 ))
484
+ allocate (model% packages(1 )% sources(1 ))
485
+ allocate (model% packages(2 )% sources(1 ))
486
+
487
+ model% packages(1 )% sources(1 ) = new_test_source(FPM_UNIT_MODULE,file_name= " src/subdir1/my_mod_1.f90" , &
488
+ scope = FPM_SCOPE_LIB, provides= [string_t(' my_mod_1' )])
489
+
490
+ model% packages(2 )% sources(1 ) = new_test_source(FPM_UNIT_MODULE,file_name= " src/subdir2/my_mod_1.f90" , &
491
+ scope = FPM_SCOPE_LIB, provides= [string_t(' my_mod_1' )])
492
+
493
+ call check_modules_for_duplicates(model, duplicates_found)
494
+ if (duplicates_found) then
495
+ call test_failed(error,' Duplicate modules found' )
496
+ return
497
+ end if
498
+ end subroutine test_package_module_duplicates_two_packages
499
+
397
500
! > Check program using a non-library module in a differente sub-directory
398
501
subroutine test_invalid_subdirectory_module_use (error )
399
502
0 commit comments