Skip to content

Commit 12d1bcc

Browse files
committed
Add simple tests for the module duplicates
1 parent aa7eca7 commit 12d1bcc

File tree

2 files changed

+106
-2
lines changed

2 files changed

+106
-2
lines changed

fpm/src/fpm.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ module fpm
2727
implicit none
2828
private
2929
public :: cmd_build, cmd_run
30-
public :: build_model
30+
public :: build_model, check_modules_for_duplicates
3131

3232
contains
3333

fpm/test/fpm_test/test_module_dependencies.f90

Lines changed: 105 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ module test_module_dependencies
1010
FPM_UNIT_CHEADER, FPM_SCOPE_UNKNOWN, FPM_SCOPE_LIB, &
1111
FPM_SCOPE_DEP, FPM_SCOPE_APP, FPM_SCOPE_TEST
1212
use fpm_strings, only: string_t, operator(.in.)
13+
use fpm, only: check_modules_for_duplicates
1314
implicit none
1415
private
1516

@@ -40,7 +41,17 @@ subroutine collect_module_dependencies(testsuite)
4041
& new_unittest("invalid-library-use", &
4142
test_invalid_library_use, should_fail=.true.), &
4243
& new_unittest("invalid-own-module-use", &
43-
test_invalid_own_module_use, should_fail=.true.) &
44+
test_invalid_own_module_use, should_fail=.true.), &
45+
& new_unittest("package-with-no-duplicates", &
46+
test_package_with_no_module_duplicates), &
47+
& new_unittest("package-with-duplicates-in-same-source", &
48+
test_package_module_duplicates_same_source, should_fail=.true.), &
49+
& new_unittest("package-with-duplicates-in-same-source", &
50+
test_package_module_duplicates_same_source, should_fail=.true.), &
51+
& new_unittest("package-with-duplicates-in-one-package", &
52+
test_package_module_duplicates_one_package, should_fail=.true.), &
53+
& new_unittest("package-with-duplicates-in-two-packages", &
54+
test_package_module_duplicates_two_packages, should_fail=.true.) &
4455
]
4556

4657
end subroutine collect_module_dependencies
@@ -392,6 +403,99 @@ subroutine test_invalid_own_module_use(error)
392403

393404
end subroutine test_invalid_own_module_use
394405

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
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
395499

396500
!> Helper to create a new srcfile_t
397501
function new_test_source(type,file_name, scope, uses, provides) result(src)

0 commit comments

Comments
 (0)