1 #include "obtest.h"
2 
3 #include <iostream>
4 
5 #include <openbabel/mol.h>
6 #include <openbabel/obconversion.h>
7 #include <openbabel/stereo/cistrans.h>
8 #include <openbabel/elements.h>
9 #include <openbabel/atom.h>
10 
11 using namespace std;
12 using namespace OpenBabel;
13 
test_GetType()14 void test_GetType ()
15 {
16   OBMol mol;
17   OBCisTransStereo ct(&mol);
18   OB_ASSERT( ct.GetType() == OBStereo::CisTrans );
19 }
20 
test_configStruct()21 void test_configStruct()
22 {
23   // reference Config
24   OBCisTransStereo::Config reference(0, 1, OBStereo::MakeRefs(2, 3, 4, 5), OBStereo::ShapeU);
25 
26   OB_ASSERT( reference.begin == 0 );
27   OB_ASSERT( reference.end == 1 );
28   OB_ASSERT( reference.refs.size() == 4 );
29   OB_ASSERT( reference.shape == OBStereo::ShapeU );
30 
31   // test copying
32   OBCisTransStereo::Config referenceCopy = reference;
33   OB_ASSERT( reference == referenceCopy );
34 
35   // invalid begin id
36   OBCisTransStereo::Config invalidBegin(45, 1, OBStereo::MakeRefs(2, 3, 4, 5), OBStereo::ShapeU);
37   OB_ASSERT( reference != invalidBegin );
38 
39   // invalid end id
40   OBCisTransStereo::Config invalidEnd(0, 45, OBStereo::MakeRefs(2, 3, 4, 5), OBStereo::ShapeU);
41   OB_ASSERT( reference != invalidEnd );
42 
43   // test other refs
44   OBCisTransStereo::Config cfg1(0, 1, OBStereo::MakeRefs(2, 4, 3, 5), OBStereo::ShapeU);
45   OB_ASSERT( reference != cfg1 );
46 
47   // test Z shape == U shape
48   OBCisTransStereo::Config cfg2(0, 1, OBStereo::MakeRefs(3, 2, 4, 5), OBStereo::ShapeZ);
49   OB_ASSERT( reference == cfg2 );
50 
51   // test 4 shape == U shape
52   OBCisTransStereo::Config cfg3(0, 1, OBStereo::MakeRefs(2, 4, 3, 5), OBStereo::Shape4);
53   OB_ASSERT( reference == cfg3 );
54 
55   // test Z shape == U shape
56   OB_ASSERT( cfg2 == cfg3 );
57 
58 }
59 
test_IsValid()60 void test_IsValid()
61 {
62   OBMol mol;
63   OBCisTransStereo ct(&mol);
64   OBCisTransStereo::Config cfg, cfgCopy;
65   cfg.begin = 0;
66   cfg.end = 1;
67   cfg.refs = OBStereo::MakeRefs(2, 3, 4, 5);
68 
69   ct.SetConfig(cfg);
70   OB_ASSERT( ct.IsValid() );
71 
72   // no begin
73   cfgCopy = cfg;
74   cfgCopy.begin = OBStereo::NoRef;
75   ct.SetConfig(cfgCopy);
76   OB_ASSERT( !ct.IsValid() );
77 
78   // no end
79   cfgCopy = cfg;
80   cfgCopy.end = OBStereo::NoRef;
81   ct.SetConfig(cfgCopy);
82   OB_ASSERT( !ct.IsValid() );
83 
84   // no refs
85   cfgCopy = cfg;
86   cfgCopy.refs = std::vector<unsigned long>();
87   ct.SetConfig(cfgCopy);
88   OB_ASSERT( !ct.IsValid() );
89 }
90 
test_equalsOperator()91 void test_equalsOperator()
92 {
93   OBCisTransStereo ct1(nullptr), ct2(nullptr);
94   OBCisTransStereo::Config cfg;
95   cfg.begin = 0;
96   cfg.end = 1;
97   cfg.refs = OBStereo::MakeRefs(2, 3, 4, 5);
98 
99   ct1.SetConfig(cfg);
100   ct2.SetConfig(cfg);
101   OB_ASSERT( ct1 == ct2 );
102 
103   cfg.shape = OBStereo::ShapeZ;
104   ct2.SetConfig(cfg);
105   OB_ASSERT( ct1 != ct2 );
106 
107   OBStereo::Permutate(cfg.refs, 0, 1);
108   ct2.SetConfig(cfg);
109   OB_ASSERT( ct1 == ct2 );
110 }
111 
test_GetSetConfig()112 void test_GetSetConfig()
113 {
114   OBCisTransStereo ct(nullptr);
115   OBCisTransStereo::Config cfg;
116 
117   // set clockwise, viewing from 1
118   OB_ASSERT( !ct.IsValid() );
119   cfg.refs = OBStereo::MakeRefs(2, 3, 4, 5);
120   cfg.begin = 0;
121   cfg.end = 1;
122   ct.SetConfig(cfg);
123   OB_ASSERT( ct.IsValid() );
124 
125   OBCisTransStereo::Config cfg2 = ct.GetConfig();
126   OB_ASSERT( cfg2.begin == 0 );
127   OB_ASSERT( cfg2.end == 1 );
128   OB_ASSERT( cfg2.refs.size() == 4 );
129   OB_ASSERT( cfg2.refs[0] == 2 );
130   OB_ASSERT( cfg2.refs[1] == 3 );
131   OB_ASSERT( cfg2.refs[2] == 4 );
132   OB_ASSERT( cfg2.refs[3] == 5 );
133   OB_ASSERT( cfg2.shape == OBStereo::ShapeU );
134   OB_ASSERT( cfg == cfg2 );
135 
136 }
137 
testRefs()138 void testRefs()
139 {
140   OBMol mol;
141   OBCisTransStereo ct(&mol);
142 
143   // 1   4     1   4     1---4     1   4
144   //  \ /      |   |        /       \ /
145   //   C    =  | C |  =    C    =    C
146   //  / \      |   |      /         / \
147   // 2   3     2---3     2---3     2---3
148 
149   // set refs using default U shape
150   OBCisTransStereo::Config cfg(0, 1, OBStereo::MakeRefs(2, 3, 4, 5));
151   ct.SetConfig(cfg);
152 
153   // get config using Z shape
154   OBCisTransStereo::Config cfg2 = ct.GetConfig(OBStereo::ShapeZ);
155   OB_ASSERT( cfg2.refs.size() == 4 );
156   OB_ASSERT( cfg2.refs[0] == 2 );
157   OB_ASSERT( cfg2.refs[1] == 3 );
158   OB_ASSERT( cfg2.refs[2] == 5 );
159   OB_ASSERT( cfg2.refs[3] == 4 );
160 
161   // get config using 4 shape
162   cfg2 = ct.GetConfig(OBStereo::Shape4);
163   OB_ASSERT( cfg2.refs.size() == 4 );
164   OB_ASSERT( cfg2.refs[0] == 2 );
165   OB_ASSERT( cfg2.refs[1] == 4 );
166   OB_ASSERT( cfg2.refs[2] == 3 );
167   OB_ASSERT( cfg2.refs[3] == 5 );
168 }
169 
test_IsOnSameAtom1()170 void test_IsOnSameAtom1()
171 {
172   OBConversion conv;
173   conv.SetInFormat("smi");
174   OBMol mol;
175   //
176   // C       I     C      I    0      5
177   //  \     /      |      |    |      |
178   //   C===C       | C  C |    | 1  3 |
179   //  /     \      |      |    |      |
180   // Cl      F     Cl-----F    2------4
181   //
182   OB_ASSERT( conv.ReadString(&mol, "CC(Cl)=C(F)I") );
183   OB_ASSERT( mol.NumAtoms() == 6 );
184 
185   OB_ASSERT( mol.GetAtomById(1) );
186   OB_ASSERT( mol.GetAtomById(1)->GetAtomicNum() == OBElements::Carbon );
187   OB_ASSERT( mol.GetAtomById(1)->GetExplicitDegree() == 3);
188   OB_ASSERT( mol.GetAtomById(3) );
189   OB_ASSERT( mol.GetAtomById(3)->GetAtomicNum() == OBElements::Carbon );
190   OB_ASSERT( mol.GetAtomById(3)->GetExplicitDegree() == 3);
191 
192   OB_ASSERT( mol.GetAtomById(4) );
193   OB_ASSERT( mol.GetAtomById(4)->GetAtomicNum() == 9 );
194   OB_ASSERT( mol.GetAtomById(5) );
195   OB_ASSERT( mol.GetAtomById(5)->GetAtomicNum() == 53 );
196 
197   OBCisTransStereo ct(&mol);
198   // set refs using default U shape
199   ct.SetConfig(OBCisTransStereo::Config(1, 3, OBStereo::MakeRefs(0, 2, 4, 5)));
200 
201   OB_ASSERT( ct.IsOnSameAtom(0, 2) );
202   OB_ASSERT( ct.IsOnSameAtom(2, 0) );
203   OB_ASSERT( ct.IsOnSameAtom(4, 5) );
204   OB_ASSERT( ct.IsOnSameAtom(5, 4) );
205 
206   OB_ASSERT( !ct.IsOnSameAtom(0, 5) );
207   OB_ASSERT( !ct.IsOnSameAtom(5, 0) );
208   OB_ASSERT( !ct.IsOnSameAtom(0, 4) );
209   OB_ASSERT( !ct.IsOnSameAtom(4, 0) );
210 
211   OB_ASSERT( !ct.IsOnSameAtom(2, 5) );
212   OB_ASSERT( !ct.IsOnSameAtom(5, 2) );
213   OB_ASSERT( !ct.IsOnSameAtom(2, 4) );
214   OB_ASSERT( !ct.IsOnSameAtom(4, 2) );
215 
216 }
217 
test_IsOnSameAtom2()218 void test_IsOnSameAtom2()
219 {
220   obErrorLog.SetOutputLevel(obInfo);
221   OBConversion conv;
222   conv.SetInFormat("smi");
223   OBMol mol;
224   //
225   //  Br      I     C      I    0      5
226   //   \     /      |      |    |      |
227   //    C===C       | C  C |    | 1  3 |
228   //   /     \      |      |    |      |
229   //  Cl      F     Cl-----F    2------4
230   //
231   OB_ASSERT( conv.ReadString(&mol, "[Br]C([Cl])=C(F)I") );
232   OB_ASSERT( mol.NumAtoms() == 6 );
233 
234   OBCisTransStereo ct(&mol);
235   // set refs using default U shape
236   ct.SetConfig(OBCisTransStereo::Config(1, 3, OBStereo::MakeRefs(0, 2, 4, 5)));
237 
238   OB_ASSERT( ct.IsOnSameAtom(0, 2) );
239   OB_ASSERT( ct.IsOnSameAtom(2, 0) );
240   OB_ASSERT( ct.IsOnSameAtom(4, 5) );
241   OB_ASSERT( ct.IsOnSameAtom(5, 4) );
242   OB_ASSERT( !ct.IsOnSameAtom(0, 5) );
243   OB_ASSERT( !ct.IsOnSameAtom(5, 0) );
244   OB_ASSERT( !ct.IsOnSameAtom(0, 4) );
245   OB_ASSERT( !ct.IsOnSameAtom(4, 0) );
246 
247   //
248   // Trans
249   //
250 
251   OB_ASSERT( ct.GetTransRef(0) == 4 );
252   OB_ASSERT( ct.GetTransRef(4) == 0 );
253   OB_ASSERT( ct.GetTransRef(2) == 5 );
254   OB_ASSERT( ct.GetTransRef(5) == 2 );
255 
256   OB_ASSERT( ct.GetTransRef(0) != 2 );
257   OB_ASSERT( ct.GetTransRef(2) != 0 );
258   OB_ASSERT( ct.GetTransRef(4) != 5 );
259   OB_ASSERT( ct.GetTransRef(5) != 4 );
260 
261   OB_ASSERT( ct.IsTrans(0, 4) );
262   OB_ASSERT( ct.IsTrans(2, 5) );
263   OB_ASSERT( !ct.IsTrans(0, 2) );
264   OB_ASSERT( !ct.IsTrans(0, 5) );
265 
266   //
267   // Cis
268   //
269 
270   OB_ASSERT( ct.GetCisRef(0) == 5 );
271   OB_ASSERT( ct.GetCisRef(5) == 0 );
272   OB_ASSERT( ct.GetCisRef(2) == 4 );
273   OB_ASSERT( ct.GetCisRef(4) == 2 );
274 
275   OB_ASSERT( ct.GetCisRef(2) != 5 );
276   OB_ASSERT( ct.GetCisRef(5) != 2 );
277   OB_ASSERT( ct.GetCisRef(0) != 4 );
278   OB_ASSERT( ct.GetCisRef(4) != 0 );
279 
280   OB_ASSERT( ct.IsCis(0, 5) );
281   OB_ASSERT( ct.IsCis(2, 4) );
282   OB_ASSERT( !ct.IsCis(0, 4) );
283   OB_ASSERT( !ct.IsCis(2, 5) );
284 
285 }
286 
test_CisTrans1()287 void test_CisTrans1()
288 {
289   obErrorLog.SetOutputLevel(obInfo);
290   OBConversion conv;
291   conv.SetInFormat("smi");
292   OBMol mol;
293   //
294   //  F       F      F      F     0      3
295   //   \     /       |      |     |      |
296   //    C===C        | C  C |     | 1  2 |
297   //   /     \       |      |     |      |
298   // (H)     (H)    (H)----(H)    H------H
299   //
300   OB_ASSERT( conv.ReadString(&mol, "FC=CF") );
301   OBCisTransStereo ct(&mol);
302   ct.SetConfig(OBCisTransStereo::Config(1, 2, OBStereo::MakeRefs(0,
303       OBStereo::ImplicitRef, OBStereo::ImplicitRef, 3)));
304 
305   OB_ASSERT( ct.IsOnSameAtom(0, OBStereo::ImplicitRef) );
306   OB_ASSERT( ct.IsOnSameAtom(3, OBStereo::ImplicitRef) );
307   OB_ASSERT( !ct.IsOnSameAtom(OBStereo::ImplicitRef, OBStereo::ImplicitRef) );
308   OB_ASSERT( !ct.IsOnSameAtom(0, 3) );
309 
310   OB_ASSERT( ct.GetCisRef(0) == 3 );
311   OB_ASSERT( ct.GetCisRef(3) == 0 );
312 
313   OB_ASSERT( ct.GetTransRef(0) == OBStereo::ImplicitRef );
314   OB_ASSERT( ct.GetTransRef(3) == OBStereo::ImplicitRef );
315 }
316 
test_CisTrans2()317 void test_CisTrans2()
318 {
319   obErrorLog.SetOutputLevel(obInfo);
320   OBConversion conv;
321   conv.SetInFormat("smi");
322   OBMol mol;
323   //
324   //  F      (H)     F     (H)   0      H
325   //   \     /       |      |    |      |
326   //    C===C        | C  C |    | 1  2 |
327   //   /     \       |      |    |      |
328   // (H)      F     (H)-----F    H------3
329   //
330   OB_ASSERT( conv.ReadString(&mol, "FC=CF") );
331   OBCisTransStereo ct(&mol);
332   OBCisTransStereo::Config cfg(1, 2, OBStereo::MakeRefs(0, OBStereo::ImplicitRef, 3, OBStereo::ImplicitRef));
333   ct.SetConfig(cfg);
334 
335   OB_ASSERT( ct.IsOnSameAtom(0, OBStereo::ImplicitRef) );
336   OB_ASSERT( ct.IsOnSameAtom(3, OBStereo::ImplicitRef) );
337   OB_ASSERT( !ct.IsOnSameAtom(OBStereo::ImplicitRef, OBStereo::ImplicitRef) );
338   OB_ASSERT( !ct.IsOnSameAtom(0, 3) );
339 
340   OB_ASSERT( ct.GetTransRef(0) == 3 );
341   OB_ASSERT( ct.GetTransRef(3) == 0 );
342 
343   OB_ASSERT( ct.GetCisRef(0) == OBStereo::ImplicitRef );
344   OB_ASSERT( ct.GetCisRef(3) == OBStereo::ImplicitRef );
345 
346 
347 }
348 
cistranstest(int argc,char * argv[])349 int cistranstest(int argc, char* argv[])
350 {
351   int defaultchoice = 1;
352 
353   int choice = defaultchoice;
354 
355   if (argc > 1) {
356     if(sscanf(argv[1], "%d", &choice) != 1) {
357       printf("Couldn't parse that input as a number\n");
358       return -1;
359     }
360   }
361   // Define location of file formats for testing
362   #ifdef FORMATDIR
363     char env[BUFF_SIZE];
364     snprintf(env, BUFF_SIZE, "BABEL_LIBDIR=%s", FORMATDIR);
365     putenv(env);
366   #endif
367 
368   switch(choice) {
369   case 1:
370     test_GetType();
371     break;
372   case 2:
373     test_configStruct();
374     break;
375   case 3:
376     test_IsValid();
377     break;
378   case 4:
379     test_equalsOperator();
380     break;
381   case 5:
382     test_GetSetConfig();
383     break;
384   case 6:
385     test_IsOnSameAtom1();
386     break;
387   case 7:
388     test_IsOnSameAtom2();
389     break;
390   case 8:
391     test_CisTrans1();
392     break;
393   case 9:
394     test_CisTrans2();
395     break;
396   default:
397     cout << "Test number " << choice << " does not exist!\n";
398     return -1;
399   }
400 
401   return 0;
402 }
403 
404 
405