Skip to content

Commit acbf2d3

Browse files
committed
Added unit tests for mol_fmt and strutil
1 parent d210edd commit acbf2d3

File tree

2 files changed

+243
-45
lines changed

2 files changed

+243
-45
lines changed
Lines changed: 172 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#include <gtest/gtest.h>
22

3-
extern "C"
4-
{
3+
extern "C" {
54
#include "../../../INCHI-1-SRC/INCHI_BASE/src/mol_fmt.h"
65
}
76

@@ -16,7 +15,6 @@ TEST(mol_fmt_testing, test_MolfileStrnread)
1615
EXPECT_EQ(first_space, dest + 11);
1716
EXPECT_EQ(first_space[0], '\0'); // null terminator
1817

19-
2018
len = MolfileStrnread(dest, source, 6, &first_space);
2119
EXPECT_EQ(len, 6);
2220
EXPECT_STREQ(dest, "Hello ");
@@ -26,84 +24,222 @@ TEST(mol_fmt_testing, test_MolfileStrnread)
2624

2725
TEST(mol_fmt_testing, test_MolfileReadField)
2826
{
29-
//int MolfileReadField(void *data, int field_len, int data_type, char **line_ptr)
27+
// int MolfileReadField(void *data, int field_len, int data_type, char **line_ptr)
3028

31-
// SEG FAULT?
29+
// SEG FAULT?
3230
// EXPECT_EQ(MolfileReadField(NULL, 0, MOL_FMT_STRING_DATA, NULL), 0); // no data, no line pointer
3331

34-
35-
//MOL_FMT_STRING_DATA
32+
// MOL_FMT_STRING_DATA
3633
char data_str[5];
3734
char source_data1[] = "ABCD 1234 56789";
38-
char *line_ptr1 = source_data1;
39-
int ret_val_str = MolfileReadField(data_str, sizeof(data_str), MOL_FMT_STRING_DATA, &line_ptr1);
40-
EXPECT_EQ(ret_val_str, 4);
35+
char *line_ptr1 = source_data1;
36+
int ret_val_str = MolfileReadField(data_str, sizeof(data_str), MOL_FMT_STRING_DATA, &line_ptr1);
37+
EXPECT_EQ(ret_val_str, 4);
4138
EXPECT_STREQ(data_str, "ABCD");
4239
EXPECT_EQ(line_ptr1, source_data1 + 5);
4340

44-
//MOL_FMT_CHAR_INT_DATA -128 to 127
41+
// MOL_FMT_CHAR_INT_DATA -128 to 127
4542
char data_char[2];
4643
char source_data2[] = "13";
47-
char *line_ptr2 = source_data2;
48-
int ret_val_char = MolfileReadField(data_char, sizeof(data_char), MOL_FMT_CHAR_INT_DATA, &line_ptr2);
44+
char *line_ptr2 = source_data2;
45+
int ret_val_char = MolfileReadField(data_char, sizeof(data_char), MOL_FMT_CHAR_INT_DATA, &line_ptr2);
4946
EXPECT_EQ(ret_val_char, 1);
5047
EXPECT_EQ(*data_char, static_cast<char>(13));
5148
EXPECT_EQ(line_ptr2, source_data2 + 2);
5249

53-
//MOL_FMT_SHORT_INT_DATA -32,768 to 32,767
50+
// MOL_FMT_SHORT_INT_DATA -32,768 to 32,767
5451
signed short data_s_int[10];
5552
char source_data3[] = "12345";
56-
char *line_ptr3 = source_data3;
57-
int ret_val_s_int = MolfileReadField(data_s_int, sizeof(data_s_int), MOL_FMT_SHORT_INT_DATA, &line_ptr3);
53+
char *line_ptr3 = source_data3;
54+
int ret_val_s_int = MolfileReadField(data_s_int, sizeof(data_s_int), MOL_FMT_SHORT_INT_DATA, &line_ptr3);
5855
EXPECT_EQ(ret_val_s_int, 1);
5956
EXPECT_EQ(*data_s_int, static_cast<signed short>(12345));
6057
EXPECT_EQ(line_ptr3, source_data3 + 5);
6158

62-
//MOL_FMT_LONG_INT_DATA -2,147,483,648 to 2,147,483,647
59+
// MOL_FMT_LONG_INT_DATA -2,147,483,648 to 2,147,483,647
6360
long data_long[1];
6461
char source_data4[] = "1234567";
65-
char *line_ptr4 = source_data4;
66-
int ret_val_long = MolfileReadField(data_long, sizeof(data_long), MOL_FMT_LONG_INT_DATA, &line_ptr4);
62+
char *line_ptr4 = source_data4;
63+
int ret_val_long = MolfileReadField(data_long, sizeof(data_long), MOL_FMT_LONG_INT_DATA, &line_ptr4);
6764
EXPECT_EQ(ret_val_long, 1);
6865
EXPECT_EQ(*data_long, static_cast<long>(1234567));
6966
EXPECT_EQ(line_ptr4, source_data4 + 7);
70-
71-
//MOL_FMT_DOUBLE_DATA
67+
68+
// MOL_FMT_DOUBLE_DATA
7269
double data_double[1];
7370
char source_data5[] = "123.4567";
74-
char *line_ptr5 = source_data5;
75-
int ret_val_double = MolfileReadField(data_double, sizeof(data_double), MOL_FMT_DOUBLE_DATA, &line_ptr5);
71+
char *line_ptr5 = source_data5;
72+
int ret_val_double = MolfileReadField(data_double, sizeof(data_double), MOL_FMT_DOUBLE_DATA, &line_ptr5);
7673
EXPECT_EQ(ret_val_double, 1);
7774
EXPECT_EQ(*data_double, static_cast<double>(123.4567));
7875
EXPECT_EQ(line_ptr5, source_data5 + 8);
7976

80-
//MOL_FMT_FLOAT_DATA
77+
// MOL_FMT_FLOAT_DATA
8178
float data_float[2];
8279
char source_data6[] = "12233.45";
83-
char *line_ptr6 = source_data6;
84-
int ret_val_float = MolfileReadField(data_float, sizeof(data_float), MOL_FMT_FLOAT_DATA, &line_ptr6);
80+
char *line_ptr6 = source_data6;
81+
int ret_val_float = MolfileReadField(data_float, sizeof(data_float), MOL_FMT_FLOAT_DATA, &line_ptr6);
8582
EXPECT_EQ(ret_val_float, 1);
8683
EXPECT_EQ(*data_float, static_cast<float>(12233.45));
8784
EXPECT_EQ(line_ptr6, source_data6 + 8);
88-
89-
//MOL_FMT_JUMP_TO_RIGHT
85+
86+
// MOL_FMT_JUMP_TO_RIGHT
9087
int jmp_idx = 9;
9188
char data_jmp[jmp_idx];
9289
char source_data7[] = "ABCD 1234 56789";
93-
char *line_ptr7 = source_data7;
94-
int ret_val_jmp = MolfileReadField(data_jmp, sizeof(data_jmp), MOL_FMT_JUMP_TO_RIGHT, &line_ptr7);
95-
EXPECT_EQ(ret_val_jmp, jmp_idx);
96-
EXPECT_EQ(line_ptr7, source_data7 + jmp_idx);
90+
char *line_ptr7 = source_data7;
91+
int ret_val_jmp = MolfileReadField(data_jmp, sizeof(data_jmp), MOL_FMT_JUMP_TO_RIGHT, &line_ptr7);
92+
EXPECT_EQ(ret_val_jmp, jmp_idx);
93+
EXPECT_EQ(line_ptr7, source_data7 + jmp_idx);
9794

98-
//MOL_FMT_FLOAT_DATA
95+
// MOL_FMT_FLOAT_DATA
9996
float data_float_neg[2];
100-
char source_data8[] = "AVCD 23d";
101-
char *line_ptr8 = source_data8;
97+
char source_data8[] = "AVCD 23d";
98+
char *line_ptr8 = source_data8;
10299
int ret_val_float_neg = MolfileReadField(data_float_neg, sizeof(data_float_neg), MOL_FMT_FLOAT_DATA, &line_ptr8);
103100
EXPECT_EQ(ret_val_float_neg, -1);
104101
EXPECT_EQ(*data_float_neg, static_cast<float>(0));
105102
EXPECT_EQ(line_ptr8, source_data8 + 8);
106-
103+
}
104+
105+
TEST(mol_fmt_testing, test_MolfileExtractStrucNum)
106+
{
107+
// long MolfileExtractStrucNum(MOL_FMT_HEADER_BLOCK *pHdr);
108+
109+
MOL_FMT_HEADER_BLOCK hdr;
110+
memset(&hdr, 0, sizeof(hdr));
111+
112+
/* valid header: "Structure #42" and line2 starts with INCHI_NAME and contains "SDfile Output" */
113+
strncpy(hdr.molname, "Structure #42", sizeof(hdr.molname) - 1);
114+
snprintf(hdr.line2, sizeof(hdr.line2), "%s SDfile Output", INCHI_NAME);
115+
116+
long num = MolfileExtractStrucNum(&hdr);
117+
EXPECT_EQ(num, 42);
118+
119+
//--------------------------
120+
memset(&hdr, 0, sizeof(hdr));
121+
122+
/* correct "Structure #5" but line2 does not start with INCHI_NAME -> should return 0 */
123+
strncpy(hdr.molname, "Structure #5", sizeof(hdr.molname) - 1);
124+
strncpy(hdr.line2, "SomeOtherProducer SDfile Output", sizeof(hdr.line2) - 1);
125+
126+
num = MolfileExtractStrucNum(&hdr);
127+
EXPECT_EQ(num, 0);
128+
129+
//--------------------------
130+
memset(&hdr, 0, sizeof(hdr));
131+
132+
/* non-numeric structure number should return 0 */
133+
strncpy(hdr.molname, "Structure #XX", sizeof(hdr.molname) - 1);
134+
snprintf(hdr.line2, sizeof(hdr.line2), "%s SDfile Output", INCHI_NAME);
135+
136+
num = MolfileExtractStrucNum(&hdr);
137+
EXPECT_EQ(num, 0);
138+
139+
//--------------------------
140+
memset(&hdr, 0, sizeof(hdr));
141+
142+
/* non-numeric structure number should return 0 */
143+
strncpy(hdr.molname, "Structure #", sizeof(hdr.molname) - 1);
144+
snprintf(hdr.line2, sizeof(hdr.line2), "%s SDfile Output", INCHI_NAME);
145+
146+
num = MolfileExtractStrucNum(&hdr);
147+
EXPECT_EQ(num, 0);
148+
149+
//--------------------------
150+
memset(&hdr, 0, sizeof(hdr));
151+
152+
/* non-numeric structure number should return 0 */
153+
strncpy(hdr.molname, "Strructure #12", sizeof(hdr.molname) - 1);
154+
snprintf(hdr.line2, sizeof(hdr.line2), "%s SDfile Output", INCHI_NAME);
155+
156+
num = MolfileExtractStrucNum(&hdr);
157+
EXPECT_EQ(num, 0);
158+
}
107159

160+
TEST(mol_fmt_testing, test_MolfileHasNoChemStruc)
161+
{
162+
MOL_FMT_DATA mfdata;
163+
MOL_FMT_CTAB ctab;
164+
MOL_FMT_BOND bonds;
165+
MOL_FMT_ATOM *atoms;
166+
167+
// Test NULL mfdata
168+
EXPECT_EQ(MolfileHasNoChemStruc(NULL), 1);
169+
170+
// Initialize mfdata with NULL atoms
171+
memset(&mfdata, 0, sizeof(MOL_FMT_DATA));
172+
memset(&ctab, 0, sizeof(MOL_FMT_CTAB));
173+
mfdata.ctab = ctab;
174+
EXPECT_EQ(MolfileHasNoChemStruc(&mfdata), 1);
175+
176+
// Test with n_atoms <= 0
177+
atoms = (MOL_FMT_ATOM *)calloc(1, sizeof(MOL_FMT_ATOM));
178+
ASSERT_NE(atoms, nullptr);
179+
mfdata.ctab.atoms = atoms;
180+
mfdata.ctab.n_atoms = 0;
181+
EXPECT_EQ(MolfileHasNoChemStruc(&mfdata), 1);
182+
mfdata.ctab.n_atoms = -1;
183+
EXPECT_EQ(MolfileHasNoChemStruc(&mfdata), 1);
184+
185+
// Test with bonds declared but no bonds array
186+
mfdata.ctab.n_atoms = 1;
187+
mfdata.ctab.n_bonds = 1;
188+
mfdata.ctab.bonds = NULL;
189+
EXPECT_EQ(MolfileHasNoChemStruc(&mfdata), 1);
190+
191+
// Test valid structure (has atoms and either no bonds or valid bonds array)
192+
mfdata.ctab.n_bonds = 0;
193+
EXPECT_EQ(MolfileHasNoChemStruc(&mfdata), 0);
194+
195+
memset(&bonds, 0, sizeof(MOL_FMT_BOND));
196+
mfdata.ctab.n_bonds = 1;
197+
mfdata.ctab.bonds = &bonds;
198+
EXPECT_EQ(MolfileHasNoChemStruc(&mfdata), 0);
199+
200+
// Clean up
201+
free(atoms);
108202
}
109203

204+
TEST(mol_fmt_testing, test_FreeMolfileData)
205+
{
206+
207+
MOL_FMT_DATA *mfdata;
208+
209+
MOL_FMT_HEADER_BLOCK *hdr;
210+
211+
MOL_FMT_CTAB *ctab;
212+
MOL_FMT_BOND *bonds;
213+
MOL_FMT_ATOM *atoms;
214+
215+
MOL_FMT_SGROUPS *sgroups;
216+
MOL_COORD *coords;
217+
MOL_FMT_v3000 *v3000;
218+
219+
mfdata = (MOL_FMT_DATA *)calloc(1, sizeof(MOL_FMT_DATA));
220+
221+
hdr = (MOL_FMT_HEADER_BLOCK *)calloc(1, sizeof(MOL_FMT_HEADER_BLOCK));
222+
223+
ctab = (MOL_FMT_CTAB *)calloc(1, sizeof(MOL_FMT_CTAB));
224+
atoms = (MOL_FMT_ATOM *)calloc(1, sizeof(MOL_FMT_ATOM));
225+
bonds = (MOL_FMT_BOND *)calloc(1, sizeof(MOL_FMT_BOND));
226+
227+
sgroups = (MOL_FMT_SGROUPS *)calloc(1, sizeof(MOL_FMT_SGROUPS));
228+
229+
coords = (MOL_COORD *)calloc(1, sizeof(MOL_COORD));
230+
v3000 = (MOL_FMT_v3000 *)calloc(1, sizeof(MOL_FMT_v3000));
231+
232+
mfdata->hdr = *hdr;
233+
234+
mfdata->ctab = *ctab;
235+
mfdata->ctab.atoms = atoms;
236+
mfdata->ctab.bonds = bonds;
237+
238+
mfdata->ctab.sgroups = *sgroups;
239+
mfdata->ctab.coords = coords;
240+
mfdata->ctab.v3000 = v3000;
241+
242+
EXPECT_EQ(FreeMolfileData(NULL), nullptr);
243+
244+
EXPECT_EQ(FreeMolfileData(mfdata), nullptr);
245+
}
Lines changed: 71 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
#include <gtest/gtest.h>
22

3-
extern "C"
4-
{
3+
extern "C" {
54
#include "../../../INCHI-1-SRC/INCHI_BASE/src/strutil.h"
65
}
76

87
TEST(strutil_testing, test_SetConnectedComponentNumber)
98
{
109

11-
int num_atoms = 1;
10+
int num_atoms = 1;
1211
int test_component_number = 23;
13-
inp_ATOM *new_mol = CreateInpAtom(num_atoms);
12+
inp_ATOM *new_mol = CreateInpAtom(num_atoms);
1413

1514
// int SetConnectedComponentNumber( inp_ATOM *at, int num_at, int component_number )
1615
EXPECT_EQ(SetConnectedComponentNumber(new_mol, 1, test_component_number), 0);
1716

18-
for (int i = 0; i < num_atoms; i++)
19-
{
17+
for (int i = 0; i < num_atoms; i++) {
2018
EXPECT_EQ(new_mol[i].component, test_component_number);
2119
}
2220
FreeInpAtom(&new_mol);
@@ -25,15 +23,79 @@ TEST(strutil_testing, test_SetConnectedComponentNumber)
2523
TEST(strutil_testing, test_UnMarkRingSystemsInp)
2624
{
2725

28-
int num_atoms = 1;
26+
int num_atoms = 5;
2927
inp_ATOM *new_mol = CreateInpAtom(num_atoms);
3028

29+
for (int i = 0; i < num_atoms; i++) {
30+
new_mol[i].nRingSystem = i + 1;
31+
}
32+
3133
// int UnMarkRingSystemsInp( inp_ATOM *at, int num_atoms )
3234
EXPECT_EQ(UnMarkRingSystemsInp(new_mol, num_atoms), 0);
3335

34-
for (int i = 0; i < num_atoms; i++)
35-
{
36+
for (int i = 0; i < num_atoms; i++) {
3637
EXPECT_EQ(new_mol[i].nRingSystem, 0);
3738
}
3839
FreeInpAtom(&new_mol);
3940
}
41+
42+
TEST(strutil_testing, test_CreateAndFreeInpAtom)
43+
{
44+
45+
int num_atoms = 10;
46+
inp_ATOM *new_mol = CreateInpAtom(num_atoms);
47+
48+
EXPECT_NE(new_mol, nullptr);
49+
50+
FreeInpAtom(&new_mol);
51+
52+
EXPECT_EQ(new_mol, nullptr);
53+
54+
int num_atoms1 = -1;
55+
inp_ATOM *new_mol1 = CreateInpAtom(num_atoms1);
56+
57+
EXPECT_EQ(new_mol1, nullptr);
58+
59+
FreeInpAtom(&new_mol1);
60+
61+
EXPECT_EQ(new_mol1, nullptr);
62+
63+
int num_atoms2 = 0;
64+
inp_ATOM *new_mol2 = CreateInpAtom(num_atoms2);
65+
66+
EXPECT_NE(new_mol2, nullptr);
67+
68+
FreeInpAtom(&new_mol2);
69+
70+
EXPECT_EQ(new_mol2, nullptr);
71+
}
72+
73+
// void FreeInpAtomData( INP_ATOM_DATA *inp_at_data )
74+
TEST(strutil_testing, test_CreateAndFreeInpAtomData)
75+
{
76+
77+
int num_atoms = 10;
78+
INP_ATOM_DATA inp_at_data = {0};
79+
80+
EXPECT_EQ(CreateInpAtomData(&inp_at_data, num_atoms, 1), 1);
81+
EXPECT_NE(inp_at_data.at, nullptr);
82+
EXPECT_NE(inp_at_data.at_fixed_bonds, nullptr);
83+
EXPECT_EQ(inp_at_data.num_at, num_atoms);
84+
85+
FreeInpAtomData(&inp_at_data);
86+
87+
EXPECT_EQ(inp_at_data.at, nullptr);
88+
EXPECT_EQ(inp_at_data.at_fixed_bonds, nullptr);
89+
EXPECT_EQ(inp_at_data.num_at, 0);
90+
91+
EXPECT_EQ(CreateInpAtomData(&inp_at_data, num_atoms, 0), 1);
92+
EXPECT_NE(inp_at_data.at, nullptr);
93+
EXPECT_EQ(inp_at_data.at_fixed_bonds, nullptr);
94+
EXPECT_EQ(inp_at_data.num_at, num_atoms);
95+
96+
FreeInpAtomData(&inp_at_data);
97+
98+
EXPECT_EQ(inp_at_data.at, nullptr);
99+
EXPECT_EQ(inp_at_data.at_fixed_bonds, nullptr);
100+
EXPECT_EQ(inp_at_data.num_at, 0);
101+
}

0 commit comments

Comments
 (0)