From d975a2ee5e0cf2369a20c1fec5108b0d13f0ff89 Mon Sep 17 00:00:00 2001 From: Virvi Huta Date: Wed, 29 Jul 2026 01:52:11 +0200 Subject: [PATCH 01/11] add test.pqr fixture for the new base reader/writer tests --- testsuite/MDAnalysisTests/data/coordinates/test.pqr | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 testsuite/MDAnalysisTests/data/coordinates/test.pqr diff --git a/testsuite/MDAnalysisTests/data/coordinates/test.pqr b/testsuite/MDAnalysisTests/data/coordinates/test.pqr new file mode 100644 index 00000000000..df008cc718a --- /dev/null +++ b/testsuite/MDAnalysisTests/data/coordinates/test.pqr @@ -0,0 +1,6 @@ +REMARK 1 Test case for MDAnalysis +ATOM 1 CA MET 1 0.000 1.000 2.000 0.0000 1.0000 +ATOM 2 CA ARG 2 3.000 4.000 5.000 0.0000 1.0000 +ATOM 3 CA ILE 3 6.000 7.000 8.000 0.0000 1.0000 +ATOM 4 CA LYS 4 9.000 10.000 11.000 0.0000 1.0000 +ATOM 5 CA LEU 5 12.000 13.000 14.000 0.0000 1.0000 \ No newline at end of file From 64ac03929babd1a9dcb621216cb202cc6556ba37 Mon Sep 17 00:00:00 2001 From: Virvi Huta Date: Wed, 29 Jul 2026 10:30:07 +0200 Subject: [PATCH 02/11] register COORDINATES_PQR in datafiles --- testsuite/MDAnalysisTests/datafiles.py | 1 + 1 file changed, 1 insertion(+) diff --git a/testsuite/MDAnalysisTests/datafiles.py b/testsuite/MDAnalysisTests/datafiles.py index 0289d64aed9..af07a741fe7 100644 --- a/testsuite/MDAnalysisTests/datafiles.py +++ b/testsuite/MDAnalysisTests/datafiles.py @@ -431,6 +431,7 @@ GRO_huge_box = (_data_ref / "huge_box.gro").as_posix() COORDINATES_GRO = (_data_ref / "coordinates/test.gro").as_posix() +COORDINATES_PQR = (_data_ref / "coordinates/test.pqr").as_posix() COORDINATES_GRO_INCOMPLETE_VELOCITY = ( _data_ref / "coordinates/test_incomplete_vel.gro" ).as_posix() From ee5771774bb527c12f23ee8521076a9300a5e95f Mon Sep 17 00:00:00 2001 From: Virvi Huta Date: Wed, 29 Jul 2026 10:43:22 +0200 Subject: [PATCH 03/11] add PQRReference class --- .../MDAnalysisTests/coordinates/test_pqr.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/coordinates/test_pqr.py b/testsuite/MDAnalysisTests/coordinates/test_pqr.py index fc69337ddbe..980758b99a6 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_pqr.py +++ b/testsuite/MDAnalysisTests/coordinates/test_pqr.py @@ -21,6 +21,8 @@ # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # import MDAnalysis as mda +from MDAnalysis.coordinates.PQR import PQRReader, PQRWriter +from MDAnalysisTests.coordinates.base import BaseReference, BaseWriterTest, BaseReaderTest import os import pytest @@ -31,7 +33,7 @@ from MDAnalysisTests.coordinates.reference import RefAdKSmall from MDAnalysisTests.coordinates.base import _SingleFrameReader -from MDAnalysisTests.datafiles import PQR +from MDAnalysisTests.datafiles import PQR, COORDINATES_PQR from MDAnalysisTests import make_Universe @@ -187,6 +189,19 @@ def test_total_charge(self, universe, tmpdir): "Total charge (in CHARMM) does not match expected value.", ) +class PQRReference(BaseReference): + def __init__(self): + super(PQRReference, self).__init__() + self.trajectory = COORDINATES_PQR + self.topology = COORDINATES_PQR + self.reader = PQRReader + self.writer = PQRWriter + self.ext = "pqr" + self.n_frames = 1 + self.prec = 3 + self.totaltime = 0 + self.container_format = False + self.dimensions = None class TestPQRWriterMissingAttrs(object): # pqr requires names, resids, resnames, segids, radii, charges From 911dd0bf7cf50d988f4fff441b763f181662211d Mon Sep 17 00:00:00 2001 From: Virvi Huta Date: Wed, 29 Jul 2026 10:55:20 +0200 Subject: [PATCH 04/11] rename old PQR test classes to make room for new base test classes --- testsuite/MDAnalysisTests/coordinates/test_pqr.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testsuite/MDAnalysisTests/coordinates/test_pqr.py b/testsuite/MDAnalysisTests/coordinates/test_pqr.py index 980758b99a6..d3bf446fd68 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_pqr.py +++ b/testsuite/MDAnalysisTests/coordinates/test_pqr.py @@ -37,7 +37,7 @@ from MDAnalysisTests import make_Universe -class TestPQRReader(_SingleFrameReader): +class TestPQRReaderOld(_SingleFrameReader): __test__ = True def setUp(self): @@ -87,7 +87,7 @@ def test_dimensions(self): assert self.universe.dimensions is None -class TestPQRWriter(RefAdKSmall): +class TestPQRWriterOld(RefAdKSmall): @staticmethod @pytest.fixture def universe(): From fd7a57afffcca72d78c11e8d3ae51813d1224bd0 Mon Sep 17 00:00:00 2001 From: Virvi Huta Date: Wed, 29 Jul 2026 11:11:07 +0200 Subject: [PATCH 05/11] add TestPQRReader with BaseReaderTest, fix volume and writer n_atoms overrides --- .../MDAnalysisTests/coordinates/test_pqr.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/testsuite/MDAnalysisTests/coordinates/test_pqr.py b/testsuite/MDAnalysisTests/coordinates/test_pqr.py index d3bf446fd68..bc8f9bf966e 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_pqr.py +++ b/testsuite/MDAnalysisTests/coordinates/test_pqr.py @@ -202,6 +202,25 @@ def __init__(self): self.totaltime = 0 self.container_format = False self.dimensions = None + self.volume = 0 + +class TestPQRReader(BaseReaderTest): + @staticmethod + @pytest.fixture(scope="class") + def ref(): + return PQRReference() + + def test_get_writer_1(self, ref, reader, tmpdir): + with tmpdir.as_cwd(): + outfile = "test_writer." + ref.ext + with reader.Writer(outfile) as W: + assert_equal(isinstance(W, ref.writer), True) + + def test_get_writer_2(self, ref, reader, tmpdir): + with tmpdir.as_cwd(): + outfile = "test_writer." + ref.ext + with reader.Writer(outfile, n_atoms=100) as W: + assert_equal(isinstance(W, ref.writer), True) class TestPQRWriterMissingAttrs(object): # pqr requires names, resids, resnames, segids, radii, charges From 0935a3f4ff5145e8f4b85962e934448310bf8141 Mon Sep 17 00:00:00 2001 From: Virvi Huta Date: Wed, 29 Jul 2026 11:17:19 +0200 Subject: [PATCH 06/11] add TestPQRWriter with base writer test, override test_no_container since PQR doesnt need n_atoms --- testsuite/MDAnalysisTests/coordinates/test_pqr.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/testsuite/MDAnalysisTests/coordinates/test_pqr.py b/testsuite/MDAnalysisTests/coordinates/test_pqr.py index bc8f9bf966e..21693d11937 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_pqr.py +++ b/testsuite/MDAnalysisTests/coordinates/test_pqr.py @@ -222,6 +222,17 @@ def test_get_writer_2(self, ref, reader, tmpdir): with reader.Writer(outfile, n_atoms=100) as W: assert_equal(isinstance(W, ref.writer), True) +class TestPQRWriter(BaseWriterTest): + @staticmethod + @pytest.fixture(scope="class") + def ref(): + return PQRReference() + + def test_no_container(self, ref, tmpdir): + with tmpdir.as_cwd(): + # PQRWriter doesnt require n_atoms at construction time + ref.writer("foo") + class TestPQRWriterMissingAttrs(object): # pqr requires names, resids, resnames, segids, radii, charges @staticmethod From 2aaba98a338cdbd826c6efaa079e2736a9fd2034 Mon Sep 17 00:00:00 2001 From: Virvi Huta Date: Wed, 29 Jul 2026 11:19:51 +0200 Subject: [PATCH 07/11] run black formatter on test_pqr.py --- .../MDAnalysisTests/coordinates/test_pqr.py | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/testsuite/MDAnalysisTests/coordinates/test_pqr.py b/testsuite/MDAnalysisTests/coordinates/test_pqr.py index 21693d11937..b166d05f0a6 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_pqr.py +++ b/testsuite/MDAnalysisTests/coordinates/test_pqr.py @@ -22,7 +22,11 @@ # import MDAnalysis as mda from MDAnalysis.coordinates.PQR import PQRReader, PQRWriter -from MDAnalysisTests.coordinates.base import BaseReference, BaseWriterTest, BaseReaderTest +from MDAnalysisTests.coordinates.base import ( + BaseReference, + BaseWriterTest, + BaseReaderTest, +) import os import pytest @@ -189,6 +193,7 @@ def test_total_charge(self, universe, tmpdir): "Total charge (in CHARMM) does not match expected value.", ) + class PQRReference(BaseReference): def __init__(self): super(PQRReference, self).__init__() @@ -204,12 +209,13 @@ def __init__(self): self.dimensions = None self.volume = 0 + class TestPQRReader(BaseReaderTest): @staticmethod @pytest.fixture(scope="class") def ref(): return PQRReference() - + def test_get_writer_1(self, ref, reader, tmpdir): with tmpdir.as_cwd(): outfile = "test_writer." + ref.ext @@ -217,10 +223,11 @@ def test_get_writer_1(self, ref, reader, tmpdir): assert_equal(isinstance(W, ref.writer), True) def test_get_writer_2(self, ref, reader, tmpdir): - with tmpdir.as_cwd(): - outfile = "test_writer." + ref.ext - with reader.Writer(outfile, n_atoms=100) as W: - assert_equal(isinstance(W, ref.writer), True) + with tmpdir.as_cwd(): + outfile = "test_writer." + ref.ext + with reader.Writer(outfile, n_atoms=100) as W: + assert_equal(isinstance(W, ref.writer), True) + class TestPQRWriter(BaseWriterTest): @staticmethod @@ -233,6 +240,7 @@ def test_no_container(self, ref, tmpdir): # PQRWriter doesnt require n_atoms at construction time ref.writer("foo") + class TestPQRWriterMissingAttrs(object): # pqr requires names, resids, resnames, segids, radii, charges @staticmethod From f08fe6704bdee1c1761db57a6b99f76a6cbd2b99 Mon Sep 17 00:00:00 2001 From: Virvi Huta Date: Wed, 29 Jul 2026 11:22:18 +0200 Subject: [PATCH 08/11] remove unused os import --- testsuite/MDAnalysisTests/coordinates/test_pqr.py | 1 - 1 file changed, 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/coordinates/test_pqr.py b/testsuite/MDAnalysisTests/coordinates/test_pqr.py index b166d05f0a6..346cb8c76d2 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_pqr.py +++ b/testsuite/MDAnalysisTests/coordinates/test_pqr.py @@ -27,7 +27,6 @@ BaseWriterTest, BaseReaderTest, ) -import os import pytest from numpy.testing import ( From 244ba1eb7c7d88b2b48d25b4102b280d0a51c007 Mon Sep 17 00:00:00 2001 From: Virvi Huta Date: Wed, 29 Jul 2026 11:27:39 +0200 Subject: [PATCH 09/11] update changelog and authors for PQR test port --- package/CHANGELOG | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 71411414874..c80ec12765e 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -18,7 +18,7 @@ The rules for this file: spyke7, talagayev, tanii1125, BradyAJohnston, hejamu, jeremyleung521, harshitgajjela-droid, kunjsinha, aygarwal, jauy123, Dreamstick9, ollyfutur, Amarendra22, charity-g, ParthUppal523, apoorva-01, RMeli, - raulloiscuns, Aryaman-Chaudhri + raulloiscuns, Aryaman-Chaudhri, virvihuta * 2.11.0 @@ -101,6 +101,8 @@ Enhancements Changes * The msd.py inside analysis is changed, and ProgressBar is implemented inside _conclude_simple and _conclude_fft functions instead of tqdm (Issue #5144, PR #5153) + * Ported `test_pqr.py` to use the new `BaseReaderTest`/`BaseWriterTest` + classes (Issue #516). Deprecations From 478562c9e69b4f776b1d75a788fc6dc92a3f8d98 Mon Sep 17 00:00:00 2001 From: Virvi Huta Date: Wed, 29 Jul 2026 11:28:56 +0200 Subject: [PATCH 10/11] add changelog entry and author credit for PQR test port --- package/AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/package/AUTHORS b/package/AUTHORS index ed82321a9e8..61adcd9a07a 100644 --- a/package/AUTHORS +++ b/package/AUTHORS @@ -284,6 +284,7 @@ Chronological list of authors - Sai Udayagiri - Apoorva Verma - Aryaman Chaudhri + - Virvi Huta External code ------------- From 0dcbe2cf84880746b116e884658e7138fbbf1982 Mon Sep 17 00:00:00 2001 From: Virvi Huta Date: Wed, 29 Jul 2026 12:38:47 +0200 Subject: [PATCH 11/11] add COORDINATES_PQR to __all__ list --- testsuite/MDAnalysisTests/datafiles.py | 1 + 1 file changed, 1 insertion(+) diff --git a/testsuite/MDAnalysisTests/datafiles.py b/testsuite/MDAnalysisTests/datafiles.py index af07a741fe7..5287e9d7e0d 100644 --- a/testsuite/MDAnalysisTests/datafiles.py +++ b/testsuite/MDAnalysisTests/datafiles.py @@ -308,6 +308,7 @@ "COORDINATES_XYZ", "COORDINATES_XYZ_BZ2", "COORDINATES_GRO", + "COORDINATES_PQR", "COORDINATES_GRO_INCOMPLETE_VELOCITY", "Martini_membrane_gro", # for testing the leaflet finder "COORDINATES_XTC",