From 8ddaaa78d6000f5dd131855536f1b0c1160f4941 Mon Sep 17 00:00:00 2001 From: Simon Gravelle Date: Wed, 3 Dec 2025 22:30:18 +0100 Subject: [PATCH 1/5] Added tests --- tests/readers/scan/run-test.sh | 44 +++++++++++++ tests/readers/scan/test_scan_files.f90 | 89 ++++++++++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100755 tests/readers/scan/run-test.sh create mode 100644 tests/readers/scan/test_scan_files.f90 diff --git a/tests/readers/scan/run-test.sh b/tests/readers/scan/run-test.sh new file mode 100755 index 0000000..c958098 --- /dev/null +++ b/tests/readers/scan/run-test.sh @@ -0,0 +1,44 @@ +#!/bin/bash +set -euo pipefail + +# Path to maniac files +BUILD_DIR="../../../build" +MODULE_DIR="../../../include" + +# Path to test executables +BIN_DIR="./build" +mkdir -p "$BIN_DIR" + +# Collect Maniac object files (excluding main.o) +shopt -s nullglob +MANIAC_OBJS=() +for obj in "$BUILD_DIR"/*.o; do + [[ $(basename "$obj") == "main.o" ]] && continue + MANIAC_OBJS+=("$obj") +done +shopt -u nullglob + +# COMPILE & RUN TESTS +for TEST_SRC in test_*.f90; do + [[ ! -f "$TEST_SRC" ]] && { + echo "No test_*.f90 files found — nothing to run." + exit 0 + } + + TEST_NAME="${TEST_SRC%.f90}" + OUT_EXE="$BIN_DIR/$TEST_NAME" + + gfortran -O2 -I"$MODULE_DIR" -I"$BUILD_DIR" -c "$TEST_SRC" -o "$TEST_NAME.o" + gfortran -O2 -o "$OUT_EXE" "$TEST_NAME.o" "${MANIAC_OBJS[@]}" + + if "$OUT_EXE"; then + echo "✅ [PASS] $TEST_NAME" + else + echo "❌ [FAIL] $TEST_NAME (runtime error)" + exit 1 + fi + + rm -f "$TEST_NAME.o" +done + +rm -f fort.10 2>/dev/null || true diff --git a/tests/readers/scan/test_scan_files.f90 b/tests/readers/scan/test_scan_files.f90 new file mode 100644 index 0000000..8f10da4 --- /dev/null +++ b/tests/readers/scan/test_scan_files.f90 @@ -0,0 +1,89 @@ +program test_prescan_files + + use, intrinsic :: iso_fortran_env, only: real64 + use data_parser + + implicit none + + character(len=LENPATH) :: base_main ! Path for main file + character(len=LENPATH) :: base_res ! Path for reservoir file + + !--------------------------------------------------------------------------- + ! Test 1 : ZIF8-H2O without reservoir + !--------------------------------------------------------------------------- + + base_main = "../../../mc-topology/testcase-energy/ZIF8-H2O/" + base_res = "" + + ! Expected : in absence of reservoir, use NB_MAX_MOLECULE + call run_test(base_main, base_res, .false., NB_MAX_MOLECULE, 1) + + !--------------------------------------------------------------------------- + ! Test 2 : ZIF8-CH4O system with reservoir + !--------------------------------------------------------------------------- + + base_main = "../../../mc-topology/testcase-adsorption/ZIF8-CH4O/" + base_res = "../../../mc-topology/molecule-reservoir/CH4O-H2O/" + + ! Expected : 5 molecules in main, 1500 in reservoir + call run_test(base_main, base_res, .true., 5+1500, 1) + + !--------------------------------------------------------------------------- + ! Test 3 : Bulk CO2 system without reservoir + !--------------------------------------------------------------------------- + + base_main = "../../../mc-topology/molecule-reservoir/CO2/" + base_res = "" + + ! Expected : in absence of reservoir, use NB_MAX_MOLECULE + call run_test(base_main, base_res, .false., NB_MAX_MOLECULE, 0) + + !--------------------------------------------------------------------------- + ! Test 4 : Bulk CO2 system with reservoir + !--------------------------------------------------------------------------- + + base_main = "../../../mc-topology/molecule-reservoir/CO2/" + + ! Expected : 50 molecules in main, 50 in reservoir + call run_test(base_main, base_main, .true., 100, 0) + +contains + + subroutine run_test(base_main, base_res, reservoir, exp_active, exp_inactive) + + ! Input parameters + character(len=*), intent(in) :: base_main ! Path for main file + character(len=*), intent(in) :: base_res ! Path for reservoir file (if reservoir is present) + logical, intent(in) :: reservoir ! Is reservoir present + integer, intent(in) :: exp_active ! Expected guest residue + integer, intent(in) :: exp_inactive ! Expected host residue + + ! Local variable + logical :: pass ! Did the test pass + + ! Set paths + path%input = trim(base_main) // "input.maniac" + path%topology = trim(base_main) // "topology.data" + path%parameters = trim(base_main) // "parameters.inc" + + status%reservoir_provided = reservoir + + if (reservoir) path%reservoir = trim(base_res) // "topology.data" + + ! Call data reader + call read_system_data() + + ! Check results + pass = (nmax%active_residues == exp_active) .and. & + (nmax%inactive_residues == exp_inactive) + + if (.not. pass) then + print *, "Test FAILED" + print *, " expected active =", exp_active, " got=", nmax%active_residues + print *, " expected inactive =", exp_inactive, " got=", nmax%inactive_residues + stop 1 + end if + + end subroutine run_test + +end program test_prescan_files From 08264f79948f4f746c3e19244ec259983ecce707 Mon Sep 17 00:00:00 2001 From: Simon Gravelle Date: Thu, 4 Dec 2025 21:54:43 +0100 Subject: [PATCH 2/5] wor on test scan --- tests/readers/scan/test_scan_files.f90 | 151 +++++++++++++++++++------ 1 file changed, 116 insertions(+), 35 deletions(-) diff --git a/tests/readers/scan/test_scan_files.f90 b/tests/readers/scan/test_scan_files.f90 index 8f10da4..8f553e5 100644 --- a/tests/readers/scan/test_scan_files.f90 +++ b/tests/readers/scan/test_scan_files.f90 @@ -1,7 +1,8 @@ -program test_prescan_files +program test_scan_files use, intrinsic :: iso_fortran_env, only: real64 use data_parser + use simulation_state implicit none @@ -11,79 +12,159 @@ program test_prescan_files !--------------------------------------------------------------------------- ! Test 1 : ZIF8-H2O without reservoir !--------------------------------------------------------------------------- - base_main = "../../../mc-topology/testcase-energy/ZIF8-H2O/" base_res = "" - - ! Expected : in absence of reservoir, use NB_MAX_MOLECULE call run_test(base_main, base_res, .false., NB_MAX_MOLECULE, 1) !--------------------------------------------------------------------------- ! Test 2 : ZIF8-CH4O system with reservoir !--------------------------------------------------------------------------- - base_main = "../../../mc-topology/testcase-adsorption/ZIF8-CH4O/" base_res = "../../../mc-topology/molecule-reservoir/CH4O-H2O/" - - ! Expected : 5 molecules in main, 1500 in reservoir call run_test(base_main, base_res, .true., 5+1500, 1) !--------------------------------------------------------------------------- ! Test 3 : Bulk CO2 system without reservoir !--------------------------------------------------------------------------- - base_main = "../../../mc-topology/molecule-reservoir/CO2/" base_res = "" - - ! Expected : in absence of reservoir, use NB_MAX_MOLECULE call run_test(base_main, base_res, .false., NB_MAX_MOLECULE, 0) !--------------------------------------------------------------------------- ! Test 4 : Bulk CO2 system with reservoir !--------------------------------------------------------------------------- - base_main = "../../../mc-topology/molecule-reservoir/CO2/" - - ! Expected : 50 molecules in main, 50 in reservoir call run_test(base_main, base_main, .true., 100, 0) contains subroutine run_test(base_main, base_res, reservoir, exp_active, exp_inactive) - - ! Input parameters - character(len=*), intent(in) :: base_main ! Path for main file - character(len=*), intent(in) :: base_res ! Path for reservoir file (if reservoir is present) - logical, intent(in) :: reservoir ! Is reservoir present - integer, intent(in) :: exp_active ! Expected guest residue - integer, intent(in) :: exp_inactive ! Expected host residue - - ! Local variable - logical :: pass ! Did the test pass - - ! Set paths + ! Inputs + character(len=*), intent(in) :: base_main + character(len=*), intent(in) :: base_res + logical, intent(in) :: reservoir + integer, intent(in) :: exp_active, exp_inactive + integer :: max_atoms_per_residue + + ! Local variables + logical :: pass, atoms_ok, connectivity_ok + integer :: i, j, k + character(len=200) :: msg + + !------------------------------------------------------------------- + ! Setup paths + !------------------------------------------------------------------- path%input = trim(base_main) // "input.maniac" path%topology = trim(base_main) // "topology.data" path%parameters = trim(base_main) // "parameters.inc" - status%reservoir_provided = reservoir - if (reservoir) path%reservoir = trim(base_res) // "topology.data" - ! Call data reader + !------------------------------------------------------------------- + ! Allocate arrays inside box + !------------------------------------------------------------------- + max_atoms_per_residue = 1000 + allocate(primary%atoms%types(res%number, max_atoms_per_residue)) + allocate(primary%atoms%ids(res%number, max_atoms_per_residue)) + allocate(primary%atoms%names(res%number, max_atoms_per_residue)) + allocate(primary%atoms%charges(res%number, max_atoms_per_residue)) + + ! Initialize + primary%atoms%types = 0 + primary%atoms%ids = 0 + primary%atoms%names = "" + primary%atoms%charges = 0.0_real64 + + !------------------------------------------------------------------- + ! Read the system + !------------------------------------------------------------------- call read_system_data() - ! Check results + !------------------------------------------------------------------- + ! Check residue counts + !------------------------------------------------------------------- pass = (nmax%active_residues == exp_active) .and. & - (nmax%inactive_residues == exp_inactive) - + (nmax%inactive_residues == exp_inactive) if (.not. pass) then - print *, "Test FAILED" - print *, " expected active =", exp_active, " got=", nmax%active_residues - print *, " expected inactive =", exp_inactive, " got=", nmax%inactive_residues + write(*,*) "Test FAILED: residue count mismatch" + write(*,*) " Expected active =", exp_active, " got=", nmax%active_residues + write(*,*) " Expected inactive =", exp_inactive, " got=", nmax%inactive_residues + end if + + !------------------------------------------------------------------- + ! Check total atom count matches sum over residues + !------------------------------------------------------------------- + atoms_ok = (primary%num%atoms == sum(res%atom)) + if (.not. atoms_ok) then + write(*,*) "Test FAILED: total atom count mismatch" + write(*,*) " primary%num%atoms =", primary%num%atoms + write(*,*) " sum(res%atom) =", sum(res%atom) + end if + + !------------------------------------------------------------------- + ! Check connectivity: all bonded atoms exist within their residue + !------------------------------------------------------------------- + connectivity_ok = .true. + do i = 1, res%number + ! Bonds + do j = 1, res%bonds(i) + do k = 1, 2 + if (.not. isInResidue(primary, i, connect%bonds(i,j,k))) then + connectivity_ok = .false. + write(msg, '(A,I0,A,I0)') "Bond atom ID ", connect%bonds(i,j,k), & + " not found in residue ", i + write(*,*) trim(msg) + end if + end do + end do + ! Angles + do j = 1, res%angles(i) + do k = 1, 3 + if (.not. isInResidue(primary, i, connect%angles(i,j,k))) then + connectivity_ok = .false. + write(msg, '(A,I0,A,I0)') "Angle atom ID ", connect%angles(i,j,k), & + " not found in residue ", i + write(*,*) trim(msg) + end if + end do + end do + ! Dihedrals + do j = 1, res%dihedrals(i) + do k = 1, 4 + if (.not. isInResidue(primary, i, connect%dihedrals(i,j,k))) then + connectivity_ok = .false. + write(msg, '(A,I0,A,I0)') "Dihedral atom ID ", connect%dihedrals(i,j,k), & + " not found in residue ", i + write(*,*) trim(msg) + end if + end do + end do + ! Impropers + do j = 1, res%impropers(i) + do k = 1, 4 + if (.not. isInResidue(primary, i, connect%impropers(i,j,k))) then + connectivity_ok = .false. + write(msg, '(A,I0,A,I0)') "Improper atom ID ", connect%impropers(i,j,k), & + " not found in residue ", i + write(*,*) trim(msg) + end if + end do + end do + end do + + if (.not. connectivity_ok) then + write(*,*) "Test FAILED: connectivity errors detected" + end if + + !------------------------------------------------------------------- + ! Final verdict + !------------------------------------------------------------------- + if (.not. pass .or. .not. atoms_ok .or. .not. connectivity_ok) then stop 1 + else + write(*,*) "Test PASSED" end if end subroutine run_test -end program test_prescan_files +end program test_scan_files From b4ddcc9b3124ddbd80b38311580f34b291b2f1bc Mon Sep 17 00:00:00 2001 From: Simon Gravelle Date: Tue, 9 Dec 2025 20:21:21 +0100 Subject: [PATCH 3/5] updated error check --- src/data_parser.f90 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/data_parser.f90 b/src/data_parser.f90 index 9594164..debaeb3 100644 --- a/src/data_parser.f90 +++ b/src/data_parser.f90 @@ -1310,7 +1310,11 @@ subroutine repair_active_molecules(box) real(real64) :: dist ! Intramoleclar distance for sanity check ! Allocate temporary arrays for one molecule's atom positions - allocate(tmp_xyz(3, maxval(res%atom))) + if (.not. allocated(res%atom)) then + call abort_run("res%atom is not allocated") + else + allocate(tmp_xyz(3, maxval(res%atom))) + end if k = 1 ! Global atom index From 46cf18437516908f09df664f67f4cb4bc35448fa Mon Sep 17 00:00:00 2001 From: Simon Gravelle Date: Tue, 9 Dec 2025 20:54:02 +0100 Subject: [PATCH 4/5] Fixed test scan --- tests/readers/scan/run-test.sh | 13 +- tests/readers/scan/test_scan_files.f90 | 162 ++++++------------------- 2 files changed, 50 insertions(+), 125 deletions(-) diff --git a/tests/readers/scan/run-test.sh b/tests/readers/scan/run-test.sh index c958098..56c24b4 100755 --- a/tests/readers/scan/run-test.sh +++ b/tests/readers/scan/run-test.sh @@ -28,10 +28,17 @@ for TEST_SRC in test_*.f90; do TEST_NAME="${TEST_SRC%.f90}" OUT_EXE="$BIN_DIR/$TEST_NAME" - gfortran -O2 -I"$MODULE_DIR" -I"$BUILD_DIR" -c "$TEST_SRC" -o "$TEST_NAME.o" - gfortran -O2 -o "$OUT_EXE" "$TEST_NAME.o" "${MANIAC_OBJS[@]}" + if ! gfortran -O2 -I"$MODULE_DIR" -I"$BUILD_DIR" -c "$TEST_SRC" -o "$TEST_NAME.o" &>/dev/null; then + echo "❌ [FAIL] $TEST_NAME (compilation error)" + exit 1 + fi + + if ! gfortran -O2 -o "$OUT_EXE" "$TEST_NAME.o" "${MANIAC_OBJS[@]}" &>/dev/null; then + echo "❌ [FAIL] $TEST_NAME (linking error)" + exit 1 + fi - if "$OUT_EXE"; then + if "$OUT_EXE" &>/dev/null; then echo "✅ [PASS] $TEST_NAME" else echo "❌ [FAIL] $TEST_NAME (runtime error)" diff --git a/tests/readers/scan/test_scan_files.f90 b/tests/readers/scan/test_scan_files.f90 index 8f553e5..db951ce 100644 --- a/tests/readers/scan/test_scan_files.f90 +++ b/tests/readers/scan/test_scan_files.f90 @@ -1,8 +1,10 @@ program test_scan_files use, intrinsic :: iso_fortran_env, only: real64 - use data_parser use simulation_state + use data_parser + use prescan_files + use input_parser implicit none @@ -14,42 +16,31 @@ program test_scan_files !--------------------------------------------------------------------------- base_main = "../../../mc-topology/testcase-energy/ZIF8-H2O/" base_res = "" - call run_test(base_main, base_res, .false., NB_MAX_MOLECULE, 1) - - !--------------------------------------------------------------------------- - ! Test 2 : ZIF8-CH4O system with reservoir - !--------------------------------------------------------------------------- - base_main = "../../../mc-topology/testcase-adsorption/ZIF8-CH4O/" - base_res = "../../../mc-topology/molecule-reservoir/CH4O-H2O/" - call run_test(base_main, base_res, .true., 5+1500, 1) - - !--------------------------------------------------------------------------- - ! Test 3 : Bulk CO2 system without reservoir - !--------------------------------------------------------------------------- - base_main = "../../../mc-topology/molecule-reservoir/CO2/" - base_res = "" - call run_test(base_main, base_res, .false., NB_MAX_MOLECULE, 0) - - !--------------------------------------------------------------------------- - ! Test 4 : Bulk CO2 system with reservoir - !--------------------------------------------------------------------------- - base_main = "../../../mc-topology/molecule-reservoir/CO2/" - call run_test(base_main, base_main, .true., 100, 0) + call run_test_zif8_h2o(base_main, base_res, .false.) contains - subroutine run_test(base_main, base_res, reservoir, exp_active, exp_inactive) + subroutine run_test_zif8_h2o(base_main, base_res, reservoir) + ! Inputs character(len=*), intent(in) :: base_main character(len=*), intent(in) :: base_res logical, intent(in) :: reservoir - integer, intent(in) :: exp_active, exp_inactive integer :: max_atoms_per_residue ! Local variables logical :: pass, atoms_ok, connectivity_ok integer :: i, j, k character(len=200) :: msg + real(real64), dimension(3,2) :: expected_bounds + + ! Set expected bounds (row=axis, col=lo/hi) + expected_bounds(1,1) = -17.01162d0 ! xlo + expected_bounds(1,2) = 17.01162d0 ! xhi + expected_bounds(2,1) = -17.01162d0 ! ylo + expected_bounds(2,2) = 17.01162d0 ! yhi + expected_bounds(3,1) = -17.01162d0 ! zlo + expected_bounds(3,2) = 17.01162d0 ! zhi !------------------------------------------------------------------- ! Setup paths @@ -58,113 +49,40 @@ subroutine run_test(base_main, base_res, reservoir, exp_active, exp_inactive) path%topology = trim(base_main) // "topology.data" path%parameters = trim(base_main) // "parameters.inc" status%reservoir_provided = reservoir - if (reservoir) path%reservoir = trim(base_res) // "topology.data" - - !------------------------------------------------------------------- - ! Allocate arrays inside box - !------------------------------------------------------------------- - max_atoms_per_residue = 1000 - allocate(primary%atoms%types(res%number, max_atoms_per_residue)) - allocate(primary%atoms%ids(res%number, max_atoms_per_residue)) - allocate(primary%atoms%names(res%number, max_atoms_per_residue)) - allocate(primary%atoms%charges(res%number, max_atoms_per_residue)) - - ! Initialize - primary%atoms%types = 0 - primary%atoms%ids = 0 - primary%atoms%names = "" - primary%atoms%charges = 0.0_real64 + if (reservoir) then + path%reservoir = trim(base_res) // "topology.data" + else + path%reservoir = trim(base_res) + end if !------------------------------------------------------------------- ! Read the system !------------------------------------------------------------------- + call prescan_inputs() + call read_input_file() call read_system_data() - !------------------------------------------------------------------- - ! Check residue counts - !------------------------------------------------------------------- - pass = (nmax%active_residues == exp_active) .and. & - (nmax%inactive_residues == exp_inactive) - if (.not. pass) then - write(*,*) "Test FAILED: residue count mismatch" - write(*,*) " Expected active =", exp_active, " got=", nmax%active_residues - write(*,*) " Expected inactive =", exp_inactive, " got=", nmax%inactive_residues - end if - - !------------------------------------------------------------------- - ! Check total atom count matches sum over residues - !------------------------------------------------------------------- - atoms_ok = (primary%num%atoms == sum(res%atom)) - if (.not. atoms_ok) then - write(*,*) "Test FAILED: total atom count mismatch" - write(*,*) " primary%num%atoms =", primary%num%atoms - write(*,*) " sum(res%atom) =", sum(res%atom) - end if + ! Test Expected values from the LAMMPS data file + call assert_real_matrix_equal(primary%cell%bounds, expected_bounds, 1.0d-6) - !------------------------------------------------------------------- - ! Check connectivity: all bonded atoms exist within their residue - !------------------------------------------------------------------- - connectivity_ok = .true. - do i = 1, res%number - ! Bonds - do j = 1, res%bonds(i) - do k = 1, 2 - if (.not. isInResidue(primary, i, connect%bonds(i,j,k))) then - connectivity_ok = .false. - write(msg, '(A,I0,A,I0)') "Bond atom ID ", connect%bonds(i,j,k), & - " not found in residue ", i - write(*,*) trim(msg) - end if - end do - end do - ! Angles - do j = 1, res%angles(i) - do k = 1, 3 - if (.not. isInResidue(primary, i, connect%angles(i,j,k))) then - connectivity_ok = .false. - write(msg, '(A,I0,A,I0)') "Angle atom ID ", connect%angles(i,j,k), & - " not found in residue ", i - write(*,*) trim(msg) - end if - end do - end do - ! Dihedrals - do j = 1, res%dihedrals(i) - do k = 1, 4 - if (.not. isInResidue(primary, i, connect%dihedrals(i,j,k))) then - connectivity_ok = .false. - write(msg, '(A,I0,A,I0)') "Dihedral atom ID ", connect%dihedrals(i,j,k), & - " not found in residue ", i - write(*,*) trim(msg) - end if - end do - end do - ! Impropers - do j = 1, res%impropers(i) - do k = 1, 4 - if (.not. isInResidue(primary, i, connect%impropers(i,j,k))) then - connectivity_ok = .false. - write(msg, '(A,I0,A,I0)') "Improper atom ID ", connect%impropers(i,j,k), & - " not found in residue ", i - write(*,*) trim(msg) - end if - end do - end do - end do + end subroutine run_test_zif8_h2o - if (.not. connectivity_ok) then - write(*,*) "Test FAILED: connectivity errors detected" - end if + subroutine assert_real_matrix_equal(a, b, tol) - !------------------------------------------------------------------- - ! Final verdict - !------------------------------------------------------------------- - if (.not. pass .or. .not. atoms_ok .or. .not. connectivity_ok) then - stop 1 - else - write(*,*) "Test PASSED" - end if + real(real64), intent(in) :: a(:,:), b(:,:) + real(real64), intent(in) :: tol + integer :: i, j - end subroutine run_test + do i = 1, size(a,1) + do j = 1, size(a,2) + if (abs(a(i,j) - b(i,j)) > tol) then + print *, "ASSERTION FAILED at (", i, ",", j, ")" + print *, " got =", a(i,j) + print *, " expected=", b(i,j) + call exit(1) + end if + end do + end do + end subroutine assert_real_matrix_equal end program test_scan_files From afb19f7e53480a2bb715744db7da8dfd2f57c3d6 Mon Sep 17 00:00:00 2001 From: Simon Gravelle Date: Tue, 9 Dec 2025 21:08:53 +0100 Subject: [PATCH 5/5] Improved test --- tests/readers/scan/run-test.sh | 1 + tests/readers/scan/test_scan_files.f90 | 27 +++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/tests/readers/scan/run-test.sh b/tests/readers/scan/run-test.sh index 56c24b4..402da7c 100755 --- a/tests/readers/scan/run-test.sh +++ b/tests/readers/scan/run-test.sh @@ -39,6 +39,7 @@ for TEST_SRC in test_*.f90; do fi if "$OUT_EXE" &>/dev/null; then + #if "$OUT_EXE"; then echo "✅ [PASS] $TEST_NAME" else echo "❌ [FAIL] $TEST_NAME (runtime error)" diff --git a/tests/readers/scan/test_scan_files.f90 b/tests/readers/scan/test_scan_files.f90 index db951ce..2f93455 100644 --- a/tests/readers/scan/test_scan_files.f90 +++ b/tests/readers/scan/test_scan_files.f90 @@ -33,14 +33,21 @@ subroutine run_test_zif8_h2o(base_main, base_res, reservoir) integer :: i, j, k character(len=200) :: msg real(real64), dimension(3,2) :: expected_bounds + integer :: expected_atoms, expected_bonds, expected_angles + integer :: expected_dihedrals, expected_impropers - ! Set expected bounds (row=axis, col=lo/hi) + ! Set expected values expected_bounds(1,1) = -17.01162d0 ! xlo expected_bounds(1,2) = 17.01162d0 ! xhi expected_bounds(2,1) = -17.01162d0 ! ylo expected_bounds(2,2) = 17.01162d0 ! yhi expected_bounds(3,1) = -17.01162d0 ! zlo expected_bounds(3,2) = 17.01162d0 ! zhi + expected_atoms = 2220 + expected_bonds = 9 + expected_angles = 9 + expected_dihedrals = 0 + expected_impropers = 0 !------------------------------------------------------------------- ! Setup paths @@ -64,6 +71,11 @@ subroutine run_test_zif8_h2o(base_main, base_res, reservoir) ! Test Expected values from the LAMMPS data file call assert_real_matrix_equal(primary%cell%bounds, expected_bounds, 1.0d-6) + call assert_int_equal(primary%num%atoms, expected_atoms, "Number of atoms") + call assert_int_equal(primary%num%bonds, expected_bonds, "Number of bonds") + call assert_int_equal(primary%num%angles, expected_angles, "Number of angles") + call assert_int_equal(primary%num%dihedrals, expected_dihedrals, "Number of dihedrals") + call assert_int_equal(primary%num%impropers, expected_impropers, "Number of impropers") end subroutine run_test_zif8_h2o @@ -85,4 +97,17 @@ subroutine assert_real_matrix_equal(a, b, tol) end do end subroutine assert_real_matrix_equal + subroutine assert_int_equal(actual, expected, msg) + + integer, intent(in) :: actual, expected + character(len=*), intent(in) :: msg + + if (actual /= expected) then + print *, "ASSERTION FAILED:", trim(msg) + print *, " got =", actual + print *, " expected=", expected + call exit(1) + end if + end subroutine assert_int_equal + end program test_scan_files