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

1import csv 

2import json 

3from pathlib import Path 

4 

5import pytest 

6 

7from pchemdb.crc import load_crc_database 

8from pchemdb.crc import parse_crc 

9 

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] 

25 

26 

27@pytest.fixture(name="source", params=[]) 

28def fixture_source(request: pytest.FixtureRequest, datadir: Path) -> Path: 

29 return datadir.joinpath(request.param) 

30 

31 

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 

47 

48 

49class TestParseCRC: 

50 _label = "crc" 

51 

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 

64 

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 

76 

77 with Path(f"{self._label}.json").open( 

78 mode="w", encoding="utf-8" 

79 ) as file: 

80 json.dump(dataset, file, indent=4) 

81 

82 

83class TestParseMolarElectricalConductivity(TestParseCRC): 

84 _label = "molar_conductivity" 

85 

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 

91 

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 

99 

100 

101class TestParseElectricalConductivity(TestParseCRC): 

102 _label = "conductivity" 

103 

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 

109 

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 

117 

118 

119class TestParseMeanActvityCoefficient(TestParseCRC): 

120 _label = "mean_activity_coefficient" 

121 

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 

127 

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 

135 

136 

137class TestLoadCRCData: 

138 @staticmethod 

139 def test_should_load_crc_data() -> None: 

140 assert load_crc_database()