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
2725TEST (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+ }
0 commit comments