Coverage for tests/test_crc.py: 99%
83 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-19 09:48 -0700
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-19 09:48 -0700
1import csv
2import json
3from pathlib import Path
5import pytest
7from pchemdb.crc import load_crc_database
8from pchemdb.crc import parse_crc
10MOLAR_CONDUCTIVITY_SOURCES = [
11 "Molar Electrical Conductivity of Aqueous HBr as a Function of Temperature and Concentration.csv",
12 "Molar Electrical Conductivity of Aqueous HCl as a Function of Temperature and Concentration.csv",
13 "Molar Electrical Conductivity of Aqueous Hydro-Halogen Acids at 25C as a Function of Concentration.csv",
14 "Molar Electrical Conductivity of Electrolytes in Aqueous Solution at 25C as a Function of Concentration.csv",
15]
16CONDUCTIVITY_SOURCES = [
17 "Electrical Conductivity of Aqueous Solutions at 20C as a Function of Concentration.csv"
18]
19ACTIVITY_SOURCES = [
20 "Activity Coefficients of Acids, Bases, and Salts at 25C as a Function of Concentration Molality 0_1 m to 1_0 m - 1.csv",
21 "Activity Coefficients of Acids, Bases, and Salts at 25C as a Function of Concentration Molality 0_1 m to 1_0 m - 2.csv",
22 "Activity Coefficients of Acids, Bases, and Salts at 25C as a Function of Concentration Molality 2_0 m to 20 m - 1.csv",
23 "Activity Coefficients of Acids, Bases, and Salts at 25C as a Function of Concentration Molality 2_0 m to 20 m - 2.csv",
24]
27@pytest.fixture(name="source", params=[])
28def fixture_source(request: pytest.FixtureRequest, datadir: Path) -> Path:
29 return datadir.joinpath(request.param)
32@pytest.fixture(
33 name="sources",
34 params=[
35 [
36 *MOLAR_CONDUCTIVITY_SOURCES,
37 *CONDUCTIVITY_SOURCES,
38 *ACTIVITY_SOURCES,
39 ]
40 ],
41)
42def fixture_sources(
43 request: pytest.FixtureRequest, datadir: Path
44) -> list[Path]:
45 sources = [datadir.joinpath(p) for p in request.param]
46 return sources
49class TestParseCRC:
50 _label = "crc"
52 @staticmethod
53 def test_should_parse_sources(source: Path) -> None:
54 with source.open(mode="r", encoding="utf-8-sig") as file:
55 reader = csv.DictReader(file)
56 dataset = []
57 for row in reader:
58 try:
59 dataset.extend(parse_crc(row))
60 except ValueError as err:
61 if "picrate" in err.args[0]:
62 pass
63 assert dataset
65 def test_should_create_json_database(self, sources: list[Path]) -> None:
66 dataset = []
67 for filename in sources:
68 with filename.open(mode="r", encoding="utf-8-sig") as file:
69 reader = csv.DictReader(file)
70 for row in reader:
71 try:
72 dataset.extend(parse_crc(row))
73 except ValueError as err:
74 if "picrate" in err.args[0]:
75 pass
77 with Path(f"{self._label}.json").open(
78 mode="w", encoding="utf-8"
79 ) as file:
80 json.dump(dataset, file, indent=4)
83class TestParseMolarElectricalConductivity(TestParseCRC):
84 _label = "molar_conductivity"
86 @staticmethod
87 @pytest.fixture(name="source", params=MOLAR_CONDUCTIVITY_SOURCES)
88 def fixture_source(request: pytest.FixtureRequest, datadir: Path) -> Path:
89 source: Path = datadir.joinpath(request.param)
90 return source
92 @staticmethod
93 @pytest.fixture(name="sources", params=[MOLAR_CONDUCTIVITY_SOURCES])
94 def fixture_sources(
95 request: pytest.FixtureRequest, datadir: Path
96 ) -> list[Path]:
97 sources = [datadir.joinpath(p) for p in request.param]
98 return sources
101class TestParseElectricalConductivity(TestParseCRC):
102 _label = "conductivity"
104 @staticmethod
105 @pytest.fixture(name="source", params=CONDUCTIVITY_SOURCES)
106 def fixture_source(request: pytest.FixtureRequest, datadir: Path) -> Path:
107 source: Path = datadir.joinpath(request.param)
108 return source
110 @staticmethod
111 @pytest.fixture(name="sources", params=[CONDUCTIVITY_SOURCES])
112 def fixture_sources(
113 request: pytest.FixtureRequest, datadir: Path
114 ) -> list[Path]:
115 sources = [datadir.joinpath(p) for p in request.param]
116 return sources
119class TestParseMeanActvityCoefficient(TestParseCRC):
120 _label = "mean_activity_coefficient"
122 @staticmethod
123 @pytest.fixture(name="source", params=ACTIVITY_SOURCES)
124 def fixture_source(request: pytest.FixtureRequest, datadir: Path) -> Path:
125 source: Path = datadir.joinpath(request.param)
126 return source
128 @staticmethod
129 @pytest.fixture(name="sources", params=[ACTIVITY_SOURCES])
130 def fixture_sources(
131 request: pytest.FixtureRequest, datadir: Path
132 ) -> list[Path]:
133 sources = [datadir.joinpath(p) for p in request.param]
134 return sources
137class TestLoadCRCData:
138 @staticmethod
139 def test_should_load_crc_data() -> None:
140 assert load_crc_database()