1 /* Copyright (C) 2007  Miguel Rojasch <miguelrojasch@users.sf.net>
2  *
3  * Contact: cdk-devel@lists.sourceforge.net
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public License
7  * as published by the Free Software Foundation; either version 2.1
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  */
20 package org.openscience.cdk.interfaces;
21 
22 import java.util.Iterator;
23 
24 import org.junit.Assert;
25 import org.junit.Test;
26 import org.openscience.cdk.CDKConstants;
27 import org.openscience.cdk.CDKTestCase;
28 
29 /**
30  * Checks the functionality of {@link IMolecularFormula} implementations.
31  *
32  * @cdk.module test-interfaces
33  */
34 public abstract class AbstractMolecularFormulaTest extends CDKTestCase {
35 
36     private static IChemObjectBuilder builder;
37 
getBuilder()38     public static IChemObjectBuilder getBuilder() {
39         return builder;
40     }
41 
setBuilder(IChemObjectBuilder builder)42     public static void setBuilder(IChemObjectBuilder builder) {
43         AbstractMolecularFormulaTest.builder = builder;
44     }
45 
46     /**
47      * A unit test suite for JUnit.
48      *
49      * @return    The test suite
50      */
51     @Test
testGetIsotopeCount0()52     public void testGetIsotopeCount0() {
53 
54         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
55 
56         Assert.assertEquals(0, mf.getIsotopeCount());
57     }
58 
59     /**
60      * A unit test suite for JUnit.
61      *
62      * @return    The test suite
63      */
64     @Test
testGetIsotopeCount()65     public void testGetIsotopeCount() {
66 
67         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
68         mf.addIsotope(getBuilder().newInstance(IIsotope.class, "C"));
69         mf.addIsotope(getBuilder().newInstance(IIsotope.class, "H"));
70         mf.addIsotope(getBuilder().newInstance(IIsotope.class, "H"));
71         mf.addIsotope(getBuilder().newInstance(IIsotope.class, "H"));
72         mf.addIsotope(getBuilder().newInstance(IIsotope.class, "H"));
73 
74         Assert.assertEquals(2, mf.getIsotopeCount());
75     }
76 
77     /**
78      * A unit test suite for JUnit.
79      *
80      * @return    The test suite
81      */
82     @Test
testAddIsotope_IIsotope()83     public void testAddIsotope_IIsotope() {
84 
85         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
86         mf.addIsotope(getBuilder().newInstance(IIsotope.class, "C"));
87         mf.addIsotope(getBuilder().newInstance(IIsotope.class, "H"));
88 
89         IIsotope hy = getBuilder().newInstance(IIsotope.class, "C");
90         hy.setNaturalAbundance(2.00342342);
91         mf.addIsotope(hy);
92 
93         Assert.assertEquals(3, mf.getIsotopeCount());
94     }
95 
96     /**
97      * A unit test suite for JUnit.
98      *
99      * @return    The test suite
100      */
101     @Test
testGetIsotopeCount_IIsotope()102     public void testGetIsotopeCount_IIsotope() {
103         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
104 
105         IIsotope carb = getBuilder().newInstance(IIsotope.class, "C");
106         IIsotope flu = getBuilder().newInstance(IIsotope.class, "F");
107         IIsotope h1 = getBuilder().newInstance(IIsotope.class, "H");
108         IIsotope h2 = getBuilder().newInstance(IIsotope.class, "H");
109         IIsotope h3 = getBuilder().newInstance(IIsotope.class, "H");
110         mf.addIsotope(carb);
111         mf.addIsotope(flu);
112         mf.addIsotope(h1);
113         mf.addIsotope(h2);
114         mf.addIsotope(h3);
115 
116         Assert.assertEquals(3, mf.getIsotopeCount());
117         Assert.assertEquals(1, mf.getIsotopeCount(carb));
118         Assert.assertEquals(1, mf.getIsotopeCount(flu));
119         Assert.assertEquals(3, mf.getIsotopeCount(h1));
120     }
121 
122     /**
123      * A unit test suite for JUnit.
124      *
125      * @return    The test suite
126      */
127     @Test
testGetIsotopeCount_IIsotope2()128     public void testGetIsotopeCount_IIsotope2() {
129         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
130 
131         IIsotope carb = getBuilder().newInstance(IIsotope.class, "C");
132         IIsotope flu = getBuilder().newInstance(IIsotope.class, "F");
133         IIsotope h1 = getBuilder().newInstance(IIsotope.class, "H");
134         mf.addIsotope(carb);
135         mf.addIsotope(flu);
136         mf.addIsotope(h1);
137         mf.addIsotope(h1);
138         mf.addIsotope(h1);
139 
140         Assert.assertEquals(3, mf.getIsotopeCount());
141         Assert.assertEquals(1, mf.getIsotopeCount(carb));
142         Assert.assertEquals(1, mf.getIsotopeCount(flu));
143         Assert.assertEquals(3, mf.getIsotopeCount(h1));
144     }
145 
146     /**
147      * A unit test suite for JUnit.
148      *
149      * @return    The test suite
150      */
151     @Test
testAddIsotope_IIsotope_int()152     public void testAddIsotope_IIsotope_int() {
153         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
154 
155         IIsotope carb = getBuilder().newInstance(IIsotope.class, "C");
156         IIsotope flu = getBuilder().newInstance(IIsotope.class, "F");
157         IIsotope h1 = getBuilder().newInstance(IIsotope.class, "H");
158         mf.addIsotope(carb);
159         mf.addIsotope(flu);
160         mf.addIsotope(h1, 3);
161 
162         Assert.assertEquals(3, mf.getIsotopeCount());
163         Assert.assertEquals(1, mf.getIsotopeCount(carb));
164         Assert.assertEquals(1, mf.getIsotopeCount(flu));
165         Assert.assertEquals(3, mf.getIsotopeCount(h1));
166         // In a List the objects are not stored in the same order than called
167         //        Assert.assertEquals("C", mf.getIsotope(0).getSymbol());
168         //        Assert.assertEquals("F", mf.getIsotope(1).getSymbol());
169         //        Assert.assertEquals("H", mf.getIsotope(2).getSymbol());
170     }
171 
172     /**
173      * A unit test suite for JUnit.
174      *
175      * @return    The test suite
176      */
177     @Test
testGetIsotope_Number_Clone()178     public void testGetIsotope_Number_Clone() throws Exception {
179         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
180 
181         IIsotope carb = getBuilder().newInstance(IIsotope.class, "C");
182         IIsotope flu = getBuilder().newInstance(IIsotope.class, "F");
183         IIsotope h1 = getBuilder().newInstance(IIsotope.class, "H");
184         mf.addIsotope(carb);
185         mf.addIsotope(flu);
186         mf.addIsotope(h1, 3);
187 
188         Object clone = mf.clone();
189         Assert.assertTrue(clone instanceof IMolecularFormula);
190 
191         IMolecularFormula cloneFormula = (IMolecularFormula) clone;
192 
193         Assert.assertEquals(1, cloneFormula.getIsotopeCount(carb));
194         Assert.assertEquals(1, cloneFormula.getIsotopeCount(flu));
195         Assert.assertEquals(3, cloneFormula.getIsotopeCount(h1));
196         // In a List the objects are not stored in the same order than called
197         //        Assert.assertEquals("C", cloneFormula.getIsotope(0).getSymbol());
198         //        Assert.assertEquals("F", cloneFormula.getIsotope(1).getSymbol());
199         //        Assert.assertEquals("H", cloneFormula.getIsotope(2).getSymbol());
200     }
201 
202     /**
203      * A unit test suite for JUnit.
204      *
205      * @return    The test suite
206      */
207     @Test
testGetIsotopeCount_IIsotope_Occurr()208     public void testGetIsotopeCount_IIsotope_Occurr() {
209         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
210 
211         IIsotope carb = getBuilder().newInstance(IIsotope.class, "C");
212         IIsotope flu = getBuilder().newInstance(IIsotope.class, "F");
213         IIsotope h1 = getBuilder().newInstance(IIsotope.class, "H");
214         mf.addIsotope(carb);
215         mf.addIsotope(flu);
216         mf.addIsotope(h1, 3);
217 
218         Assert.assertEquals(3, mf.getIsotopeCount());
219         Assert.assertEquals(1, mf.getIsotopeCount(carb));
220         Assert.assertEquals(1, mf.getIsotopeCount(flu));
221         Assert.assertEquals(3, mf.getIsotopeCount(h1));
222     }
223 
224     /**
225      * A unit test suite for JUnit.
226      *
227      * @return    The test suite
228      */
229     @Test
testAdd_IMolecularFormula()230     public void testAdd_IMolecularFormula() {
231 
232         IMolecularFormula acetone = getBuilder().newInstance(IMolecularFormula.class);
233         acetone.addIsotope(getBuilder().newInstance(IIsotope.class, "C"), 3);
234         IIsotope oxig = getBuilder().newInstance(IIsotope.class, "O");
235         acetone.addIsotope(oxig);
236 
237         Assert.assertEquals(2, acetone.getIsotopeCount());
238 
239         IMolecularFormula water = getBuilder().newInstance(IMolecularFormula.class);
240         water.addIsotope(getBuilder().newInstance(IIsotope.class, "H"), 2);
241         water.addIsotope(oxig);
242         acetone.add(water);
243 
244         Assert.assertEquals(3, acetone.getIsotopeCount());
245 
246     }
247 
248     @Test
testMolecularFormula_NullCharge()249     public void testMolecularFormula_NullCharge() {
250         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
251         IMolecularFormula mf2 = getBuilder().newInstance(IMolecularFormula.class);
252         mf2.setCharge(0);
253         mf.add(mf2);
254     }
255 
256     /**
257      * A unit test suite for JUnit.
258      *
259      * @return    The test suite
260      */
261     @Test
testIsotopes()262     public void testIsotopes() {
263 
264         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
265         mf.addIsotope(getBuilder().newInstance(IIsotope.class, "C"));
266         mf.addIsotope(getBuilder().newInstance(IIsotope.class, "F"));
267         mf.addIsotope(getBuilder().newInstance(IIsotope.class, "H"), 3);
268 
269         Iterator<IIsotope> istoIter = mf.isotopes().iterator();
270         int counter = 0;
271         while (istoIter.hasNext()) {
272             istoIter.next();
273             counter++;
274         }
275         Assert.assertEquals(3, counter);
276     }
277 
278     /**
279      * A unit test suite for JUnit.
280      *
281      * @return    The test suite
282      */
283     @Test
testContains_IIsotope()284     public void testContains_IIsotope() {
285         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
286 
287         IIsotope carb = getBuilder().newInstance(IIsotope.class, "C");
288         IIsotope h1 = getBuilder().newInstance(IIsotope.class, "H");
289         IIsotope h2 = getBuilder().newInstance(IIsotope.class, "H");
290         h2.setExactMass(2.0004);
291 
292         mf.addIsotope(carb);
293         mf.addIsotope(h1);
294 
295         Assert.assertTrue(mf.contains(carb));
296         Assert.assertTrue(mf.contains(h1));
297         Assert.assertFalse(mf.contains(h2));
298     }
299 
300     /**
301      * A unit test suite for JUnit.
302      *
303      * @return    The test suite
304      */
305     @Test
testInstance_IIsotope()306     public void testInstance_IIsotope() {
307 
308         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
309 
310         IIsotope carb = getBuilder().newInstance(IIsotope.class, "C");
311         IIsotope flu = getBuilder().newInstance(IIsotope.class, "F");
312         IIsotope h1 = getBuilder().newInstance(IIsotope.class, "H");
313         mf.addIsotope(carb);
314         mf.addIsotope(flu);
315         mf.addIsotope(h1, 3);
316 
317         Iterator<IIsotope> istoIter = mf.isotopes().iterator();
318         Assert.assertNotNull(istoIter);
319         Assert.assertTrue(istoIter.hasNext());
320         IIsotope next = istoIter.next();
321         Assert.assertTrue(next instanceof IIsotope);
322         //        Assert.assertEquals(carb, next);
323 
324         Assert.assertTrue(istoIter.hasNext());
325         next = istoIter.next();
326         Assert.assertTrue(next instanceof IIsotope);
327         //        Assert.assertEquals(flu, next);
328 
329         Assert.assertTrue(istoIter.hasNext());
330         next = istoIter.next();
331         Assert.assertTrue(next instanceof IIsotope);
332         //        Assert.assertEquals(h1, next);
333 
334         Assert.assertFalse(istoIter.hasNext());
335     }
336 
337     /**
338      * A unit test suite for JUnit.
339      *
340      * @return    The test suite
341      */
342     @Test
testGetCharge()343     public void testGetCharge() {
344 
345         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
346         mf.setCharge(1);
347         mf.addIsotope(getBuilder().newInstance(IAtom.class, "C"));
348         mf.addIsotope(getBuilder().newInstance(IAtom.class, "F"));
349         mf.addIsotope(getBuilder().newInstance(IAtom.class, "H"), 3);
350 
351         Assert.assertEquals(3, mf.getIsotopeCount());
352         Assert.assertEquals(1.0, mf.getCharge(), 0.001);
353 
354     }
355 
356     /**
357      * A unit test suite for JUnit.
358      *
359      * @return    The test suite
360      */
361     @Test
testSetCharge_Double()362     public void testSetCharge_Double() {
363 
364         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
365         Assert.assertEquals(CDKConstants.UNSET, mf.getCharge());
366 
367         mf.setCharge(1);
368         Assert.assertEquals(1.0, mf.getCharge(), 0.001);
369 
370         mf.add(mf);
371         Assert.assertEquals(2.0, mf.getCharge(), 0.001);
372     }
373 
374     @Test
testSetCharge_Integer()375     public void testSetCharge_Integer() {
376 
377         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
378         mf.setCharge(1);
379         mf.addIsotope(getBuilder().newInstance(IAtom.class, "C"));
380         mf.addIsotope(getBuilder().newInstance(IAtom.class, "F"));
381         mf.addIsotope(getBuilder().newInstance(IAtom.class, "H"), 3);
382 
383         Assert.assertEquals(1.0, mf.getCharge(), 0.001);
384 
385     }
386 
387     /**
388      * A unit test suite for JUnit.
389      *
390      * @return    The test suite
391      */
392     @Test
testCharge_rest()393     public void testCharge_rest() {
394 
395         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
396         Assert.assertEquals(CDKConstants.UNSET, mf.getCharge());
397 
398         mf.setCharge(1);
399         Assert.assertEquals(1.0, mf.getCharge(), 0.001);
400 
401         IMolecularFormula mf2 = getBuilder().newInstance(IMolecularFormula.class);
402         mf2.setCharge(-1);
403         mf.add(mf2);
404         Assert.assertEquals(0.0, mf.getCharge(), 0.001);
405     }
406 
407     /**
408      * A unit test suite for JUnit.
409      *
410      * @return    The test suite
411      */
412     @Test
testRemoveIsotope_IIsotope()413     public void testRemoveIsotope_IIsotope() {
414 
415         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
416         IIsotope carb = getBuilder().newInstance(IIsotope.class, "C");
417         IIsotope flu = getBuilder().newInstance(IIsotope.class, "F");
418         IIsotope h1 = getBuilder().newInstance(IIsotope.class, "H");
419         mf.addIsotope(carb);
420         mf.addIsotope(flu);
421         mf.addIsotope(h1, 3);
422 
423         // remove the Fluorine
424         mf.removeIsotope(flu);
425 
426         Assert.assertEquals(2, mf.getIsotopeCount());
427 
428     }
429 
430     /**
431      * A unit test suite for JUnit.
432      *
433      * @return    The test suite
434      */
435     @Test
testRemoveAllIsotopes()436     public void testRemoveAllIsotopes() {
437         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
438         IIsotope carb = getBuilder().newInstance(IIsotope.class, "C");
439         IIsotope flu = getBuilder().newInstance(IIsotope.class, "F");
440         IIsotope h1 = getBuilder().newInstance(IIsotope.class, "H");
441         mf.addIsotope(carb);
442         mf.addIsotope(flu);
443         mf.addIsotope(h1, 3);
444 
445         // remove the Fluorine
446         mf.removeAllIsotopes();
447 
448         Assert.assertEquals(0, mf.getIsotopeCount());
449 
450     }
451 
452     /**
453      * A unit test suite for JUnit. Only test whether the
454      * MolecularFormula are correctly cloned.
455      *
456      * @return    The test suite
457     */
458     @Test
testClone()459     public void testClone() throws Exception {
460         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
461         mf.setCharge(1);
462         Object clone = mf.clone();
463         Assert.assertTrue(clone instanceof IMolecularFormula);
464         Assert.assertEquals(mf.getIsotopeCount(), ((IMolecularFormula) clone).getIsotopeCount());
465         Assert.assertEquals(mf.getCharge(), ((IMolecularFormula) clone).getCharge());
466 
467     }
468 
469     /**
470      * A unit test suite for JUnit. Only test whether
471      * the MolecularFormula are correctly cloned.
472     */
473     @Test
testClone_Isotopes()474     public void testClone_Isotopes() throws Exception {
475         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
476         IIsotope carb = getBuilder().newInstance(IIsotope.class, "C");
477         IIsotope flu = getBuilder().newInstance(IIsotope.class, "F");
478         IIsotope h1 = getBuilder().newInstance(IIsotope.class, "H");
479         mf.addIsotope(carb);
480         mf.addIsotope(flu);
481         mf.addIsotope(h1, 3);
482 
483         Assert.assertEquals(3, mf.getIsotopeCount());
484         Assert.assertEquals(1, mf.getIsotopeCount(carb));
485         Assert.assertEquals(1, mf.getIsotopeCount(flu));
486         Assert.assertEquals(3, mf.getIsotopeCount(h1));
487 
488         Object clone = mf.clone();
489         Assert.assertTrue(clone instanceof IMolecularFormula);
490         Assert.assertEquals(mf.getIsotopeCount(), ((IMolecularFormula) clone).getIsotopeCount());
491 
492         Assert.assertEquals(3, ((IMolecularFormula) clone).getIsotopeCount());
493     }
494 
495     /**
496      * A unit test suite for JUnit.
497     */
498     @Test
testSetProperty_Object_Object()499     public void testSetProperty_Object_Object() throws Exception {
500         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
501         mf.setProperty("blabla", 2);
502         Assert.assertNotNull(mf.getProperty("blabla"));
503     }
504 
505     /**
506      * A unit test suite for JUnit.
507     */
508     @Test
testRemoveProperty_Object()509     public void testRemoveProperty_Object() throws Exception {
510         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
511         String blabla = "blabla";
512         double number = 2;
513         mf.setProperty(blabla, number);
514         Assert.assertNotNull(mf.getProperty(blabla));
515 
516         mf.removeProperty("blabla");
517         Assert.assertNull(mf.getProperty(blabla));
518 
519     }
520 
521     /**
522      * A unit test suite for JUnit.
523     */
524     @Test
testGetProperty_Object()525     public void testGetProperty_Object() throws Exception {
526         testSetProperty_Object_Object();
527 
528     }
529 
530     /**
531      * A unit test suite for JUnit.
532     */
533     @Test
testGetProperties()534     public void testGetProperties() throws Exception {
535         IMolecularFormula mf = getBuilder().newInstance(IMolecularFormula.class);
536         mf.setProperty("blabla", 2);
537         mf.setProperty("blabla3", 3);
538         Assert.assertEquals(2, mf.getProperties().size());
539     }
540 
541     /**
542      * A unit test suite for JUnit.
543     */
544     @Test
testSetProperties_Map()545     public void testSetProperties_Map() throws Exception {
546         testGetProperties();
547 
548     }
549 
550     @Test
testGetBuilder()551     public void testGetBuilder() {
552         IMolecularFormula add = getBuilder().newInstance(IMolecularFormula.class);
553         IChemObjectBuilder builder = add.getBuilder();
554         Assert.assertNotNull(getBuilder());
555         Assert.assertEquals(getBuilder().getClass().getName(), builder.getClass().getName());
556     }
557 }
558