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 package org.openscience.cdk.tools.manipulator;
20 
21 import org.junit.Assert;
22 import org.junit.Test;
23 import org.openscience.cdk.Atom;
24 import org.openscience.cdk.AtomContainer;
25 import org.openscience.cdk.CDKConstants;
26 import org.openscience.cdk.CDKTestCase;
27 import org.openscience.cdk.ChemFile;
28 import org.openscience.cdk.DefaultChemObjectBuilder;
29 import org.openscience.cdk.Isotope;
30 import org.openscience.cdk.config.IsotopeFactory;
31 import org.openscience.cdk.config.Isotopes;
32 import org.openscience.cdk.exception.CDKException;
33 import org.openscience.cdk.formula.MolecularFormula;
34 import org.openscience.cdk.interfaces.IAtom;
35 import org.openscience.cdk.interfaces.IAtomContainer;
36 import org.openscience.cdk.interfaces.IChemObjectBuilder;
37 import org.openscience.cdk.interfaces.IElement;
38 import org.openscience.cdk.interfaces.IIsotope;
39 import org.openscience.cdk.interfaces.IMolecularFormula;
40 import org.openscience.cdk.io.MDLV2000Reader;
41 import org.openscience.cdk.silent.SilentChemObjectBuilder;
42 import org.openscience.cdk.templates.TestMoleculeFactory;
43 import org.openscience.cdk.tools.CDKHydrogenAdder;
44 
45 import java.io.IOException;
46 import java.io.InputStream;
47 import java.util.Arrays;
48 import java.util.List;
49 
50 import static org.hamcrest.CoreMatchers.is;
51 import static org.hamcrest.MatcherAssert.assertThat;
52 import static org.hamcrest.number.IsCloseTo.closeTo;
53 import static org.junit.Assert.assertFalse;
54 import static org.junit.Assert.assertTrue;
55 import static org.openscience.cdk.tools.manipulator.MolecularFormulaManipulator.*;
56 
57 /**
58  * Checks the functionality of the MolecularFormulaManipulator.
59  *
60  * @cdk.module test-formula
61  */
62 public class MolecularFormulaManipulatorTest extends CDKTestCase {
63 
64     private final static IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance();
65     private IsotopeFactory                  ifac;
66 
67     /**
68      *  Constructor for the MolecularFormulaManipulatorTest object.
69      */
MolecularFormulaManipulatorTest()70     public MolecularFormulaManipulatorTest() {
71 
72         super();
73         try {
74             ifac = Isotopes.getInstance();
75         } catch (IOException e) {
76             e.printStackTrace();
77         }
78     }
79 
80     /** Test atom and isotope count for methyl-group. */
81     @Test
testGetAtomCount_IMolecularFormula()82     public void testGetAtomCount_IMolecularFormula() {
83 
84         IMolecularFormula formula = new MolecularFormula();
85         formula.addIsotope(builder.newInstance(IIsotope.class, "C"));
86         formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 3);
87 
88         Assert.assertEquals(2, formula.getIsotopeCount());
89 
90         Assert.assertEquals(4, MolecularFormulaManipulator.getAtomCount(formula));
91     }
92 
93     /**
94      * Test molecular formula's generated from IIsotopes, including hydrogen/deuterium handling.
95      */
96     @Test
testGetElementCount_IMolecularFormula_IElement()97     public void testGetElementCount_IMolecularFormula_IElement() {
98         IMolecularFormula formula = new MolecularFormula();
99         IIsotope carb = builder.newInstance(IIsotope.class, "C");
100         IIsotope flu = builder.newInstance(IIsotope.class, "F");
101         IIsotope h1 = builder.newInstance(IIsotope.class, "H");
102         IIsotope h2 = builder.newInstance(IIsotope.class, "H");
103         h2.setExactMass(2.014101778);
104         formula.addIsotope(carb, 2);
105         formula.addIsotope(flu);
106         formula.addIsotope(h1, 3);
107         formula.addIsotope(h2, 4);
108 
109         Assert.assertEquals(10, MolecularFormulaManipulator.getAtomCount(formula));
110         Assert.assertEquals(4, formula.getIsotopeCount());
111         Assert.assertEquals(3, formula.getIsotopeCount(h1));
112         Assert.assertEquals(4, formula.getIsotopeCount(h2));
113 
114         Assert.assertEquals(2,
115                 MolecularFormulaManipulator.getElementCount(formula, builder.newInstance(IElement.class, carb)));
116         Assert.assertEquals(1,
117                 MolecularFormulaManipulator.getElementCount(formula, builder.newInstance(IElement.class, flu)));
118         Assert.assertEquals(7,
119                 MolecularFormulaManipulator.getElementCount(formula, builder.newInstance(IElement.class, h1)));
120     }
121 
122     /**
123      * Test getIsotopes for hydrogen/deuterium.
124      */
125     @Test
testGetIsotopes_IMolecularFormula_IElement()126     public void testGetIsotopes_IMolecularFormula_IElement() {
127         IMolecularFormula formula = new MolecularFormula();
128         IIsotope carb = builder.newInstance(IIsotope.class, "C");
129         IIsotope flu = builder.newInstance(IIsotope.class, "F");
130         IIsotope h1 = builder.newInstance(IIsotope.class, "H");
131         IIsotope h2 = builder.newInstance(IIsotope.class, "H");
132         h2.setExactMass(2.014101778);
133         formula.addIsotope(carb, 1);
134         formula.addIsotope(flu);
135         formula.addIsotope(h1, 1);
136         formula.addIsotope(h2, 2);
137 
138         List<IIsotope> isotopes = MolecularFormulaManipulator.getIsotopes(formula,
139                 builder.newInstance(IElement.class, "H"));
140         Assert.assertEquals(2, isotopes.size());
141     }
142 
143     @Test
testContainsElement_IMolecularFormula_IElement()144     public void testContainsElement_IMolecularFormula_IElement() {
145         IMolecularFormula formula = new MolecularFormula();
146         IIsotope carb = builder.newInstance(IIsotope.class, "C");
147         IIsotope flu = builder.newInstance(IIsotope.class, "F");
148         IIsotope h1 = builder.newInstance(IIsotope.class, "H");
149         IIsotope h2 = builder.newInstance(IIsotope.class, "H");
150         h2.setExactMass(2.014101778);
151         formula.addIsotope(carb, 1);
152         formula.addIsotope(flu);
153         formula.addIsotope(h1, 1);
154         formula.addIsotope(h2, 2);
155 
156         Assert.assertTrue(MolecularFormulaManipulator.containsElement(formula, builder.newInstance(IElement.class, "C")));
157         Assert.assertTrue(MolecularFormulaManipulator.containsElement(formula, builder.newInstance(IElement.class, "H")));
158         Assert.assertTrue(MolecularFormulaManipulator.containsElement(formula, builder.newInstance(IElement.class, "F")));
159     }
160 
161     @Test
testGetString_IMolecularFormula_Empty()162     public void testGetString_IMolecularFormula_Empty() {
163         String stringMF = MolecularFormulaManipulator.getString(new MolecularFormula());
164         Assert.assertNotNull(stringMF);
165         Assert.assertEquals("", stringMF);
166     }
167 
168     /** Test if formula re-ordering to a user-specified element order works */
169     @Test
testGetString_IMolecularFormula_arrayString_boolean()170     public void testGetString_IMolecularFormula_arrayString_boolean() {
171         IMolecularFormula formula = new MolecularFormula();
172         formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 2);
173         formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 2);
174         Assert.assertEquals("C2H2", MolecularFormulaManipulator.getString(formula));
175 
176         String[] newOrder = new String[2];
177         newOrder[0] = "H";
178         newOrder[1] = "C";
179 
180         Assert.assertEquals("H2C2", MolecularFormulaManipulator.getString(formula, newOrder, true));
181 
182     }
183 
184     /** Test if isotope-list re-ordering to a user-specified element order works */
185     @Test
testPutInOrder_arrayString_IMolecularFormula()186     public void testPutInOrder_arrayString_IMolecularFormula() {
187         IMolecularFormula formula = new MolecularFormula();
188         formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 2);
189         formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 2);
190 
191         String[] newOrder = new String[2];
192         newOrder[0] = "H";
193         newOrder[1] = "C";
194 
195         List<IIsotope> list = MolecularFormulaManipulator.putInOrder(newOrder, formula);
196         Assert.assertEquals("H", list.get(0).getSymbol());
197         Assert.assertEquals("C", list.get(1).getSymbol());
198 
199         newOrder = new String[2];
200         newOrder[0] = "C";
201         newOrder[1] = "H";
202 
203         list = MolecularFormulaManipulator.putInOrder(newOrder, formula);
204         Assert.assertEquals("C", list.get(0).getSymbol());
205         Assert.assertEquals("H", list.get(1).getSymbol());
206 
207     }
208 
209     @Test
testGetString__String_IMolecularFormula()210     public void testGetString__String_IMolecularFormula() {
211         Assert.assertNotNull(MolecularFormulaManipulator.getMolecularFormula("C10H16", new MolecularFormula()));
212         Assert.assertNotNull(MolecularFormulaManipulator.getMolecularFormula("C10H16", builder));
213         IMolecularFormula formula = MolecularFormulaManipulator.getMolecularFormula("O3(Fe(O2))3", builder);
214         Assert.assertEquals( formula.getIsotopeCount( new Atom("Fe") ), 3);
215         Assert.assertEquals( formula.getIsotopeCount( new Atom("O") ), 9);
216     }
217 
218     /** Test if formula-order is independent of isotope-insertion order */
219     @Test
testGetString_IMolecularFormula()220     public void testGetString_IMolecularFormula() {
221         IMolecularFormula mf1 = new MolecularFormula();
222         mf1.addIsotope(builder.newInstance(IIsotope.class, "C"), 10);
223         mf1.addIsotope(builder.newInstance(IIsotope.class, "H"), 16);
224 
225         Assert.assertEquals("C10H16", MolecularFormulaManipulator.getString(mf1));
226 
227         IMolecularFormula mf2 = new MolecularFormula();
228         mf2.addIsotope(builder.newInstance(IAtom.class, "H"), 16);
229         mf2.addIsotope(builder.newInstance(IAtom.class, "C"), 10);
230 
231         Assert.assertEquals("C10H16", MolecularFormulaManipulator.getString(mf2));
232 
233         Assert.assertEquals(MolecularFormulaManipulator.getString(mf2), MolecularFormulaManipulator.getString(mf1));
234 
235     }
236 
237     /**
238      * @cdk.bug 2276507
239      */
240     @Test
testBug2276507()241     public void testBug2276507() {
242         IMolecularFormula mf1 = new MolecularFormula();
243         mf1.addIsotope(builder.newInstance(IIsotope.class, "C"), 1);
244         mf1.addIsotope(builder.newInstance(IIsotope.class, "H"), 4);
245 
246         Assert.assertEquals("CH4", MolecularFormulaManipulator.getString(mf1));
247     }
248 
249     /**
250      * Test setOne parameter for {@link MolecularFormulaManipulator#getString(IMolecularFormula, boolean)}
251      */
252     @Test
testGetString_IMolecularFormula_boolean()253     public void testGetString_IMolecularFormula_boolean() {
254         IMolecularFormula mf1 = new MolecularFormula();
255         mf1.addIsotope(builder.newInstance(IIsotope.class, "C"), 1);
256         mf1.addIsotope(builder.newInstance(IIsotope.class, "H"), 4);
257 
258         Assert.assertEquals("C1H4", MolecularFormulaManipulator.getString(mf1, true));
259     }
260 
261     /** Test if formulae group elements when not inserted simultaneously */
262     @Test
testGetString_Isotopes()263     public void testGetString_Isotopes() {
264         IMolecularFormula mf1 = new MolecularFormula();
265         mf1.addIsotope(builder.newInstance(IIsotope.class, "C", 12), 9);
266         mf1.addIsotope(builder.newInstance(IIsotope.class, "C", 13), 1);
267         mf1.addIsotope(builder.newInstance(IIsotope.class, "H"), 16);
268 
269         Assert.assertEquals("C10H16", MolecularFormulaManipulator.getString(mf1));
270     }
271 
272     @Test
testGetMolecularFormula_String_IChemObjectBuilder()273     public void testGetMolecularFormula_String_IChemObjectBuilder() {
274         IMolecularFormula molecularFormula = MolecularFormulaManipulator.getMolecularFormula("C10H16", builder);
275 
276         Assert.assertEquals(26, MolecularFormulaManipulator.getAtomCount(molecularFormula));
277         Assert.assertEquals(2, molecularFormula.getIsotopeCount());
278 
279     }
280 
281     /** Test formula summing */
282     @Test
testGetMolecularFormula_String_IMolecularFormula()283     public void testGetMolecularFormula_String_IMolecularFormula() {
284 
285         IMolecularFormula mf1 = new MolecularFormula();
286         mf1.addIsotope(builder.newInstance(IIsotope.class, "C"), 10);
287         mf1.addIsotope(builder.newInstance(IIsotope.class, "H"), 16);
288 
289         Assert.assertEquals(26, MolecularFormulaManipulator.getAtomCount(mf1));
290         Assert.assertEquals(2, mf1.getIsotopeCount());
291 
292         IMolecularFormula mf2 = MolecularFormulaManipulator.getMolecularFormula("C11H17", mf1);
293 
294         Assert.assertEquals(54, MolecularFormulaManipulator.getAtomCount(mf2));
295         Assert.assertEquals(2, mf2.getIsotopeCount());
296     }
297 
298     /** Test formula mass calculation */
299     @Test
testGetMajorIsotopeMolecularFormula_String_IChemObjectBuilder()300     public void testGetMajorIsotopeMolecularFormula_String_IChemObjectBuilder() throws Exception {
301         IMolecularFormula mf2 = MolecularFormulaManipulator.getMajorIsotopeMolecularFormula("C11H17", builder);
302 
303         Assert.assertEquals(28, MolecularFormulaManipulator.getAtomCount(mf2));
304         Assert.assertEquals(2, mf2.getIsotopeCount());
305         IIsotope carbon = Isotopes.getInstance().getMajorIsotope("C");
306         IIsotope hydrogen = Isotopes.getInstance().getMajorIsotope("H");
307         double totalMass = carbon.getExactMass() * 11;
308         totalMass += hydrogen.getExactMass() * 17;
309         Assert.assertEquals(totalMass, MolecularFormulaManipulator.getTotalExactMass(mf2), 0.0000001);
310     }
311 
312     /** test @link {@link MolecularFormulaManipulator#removeElement(IMolecularFormula, IElement)} */
313     @Test
testRemoveElement_IMolecularFormula_IElement()314     public void testRemoveElement_IMolecularFormula_IElement() {
315         IMolecularFormula formula = new MolecularFormula();
316         formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 1);
317         IIsotope fl = builder.newInstance(IIsotope.class, "F");
318         IIsotope hy2 = builder.newInstance(IIsotope.class, "H");
319         IIsotope hy1 = builder.newInstance(IIsotope.class, "H");
320         hy2.setExactMass(2.014101778);
321         formula.addIsotope(fl, 1);
322         formula.addIsotope(hy1, 2);
323         formula.addIsotope(hy2, 1);
324 
325         Assert.assertEquals(4, formula.getIsotopeCount());
326 
327         formula = MolecularFormulaManipulator.removeElement(formula, builder.newInstance(IElement.class, "F"));
328 
329         Assert.assertEquals(3, formula.getIsotopeCount());
330         Assert.assertEquals(4, MolecularFormulaManipulator.getAtomCount(formula));
331 
332         formula = MolecularFormulaManipulator.removeElement(formula, builder.newInstance(IElement.class, "H"));
333 
334         Assert.assertEquals(1, MolecularFormulaManipulator.getAtomCount(formula));
335         Assert.assertEquals(1, formula.getIsotopeCount());
336 
337     }
338 
339     /**
340      * Test total Exact Mass.
341      */
342     @Test
testGetTotalExactMass_IMolecularFormula()343     public void testGetTotalExactMass_IMolecularFormula() throws Exception {
344 
345         IMolecularFormula formula = new MolecularFormula();
346         IIsotope carb = builder.newInstance(IIsotope.class, "C");
347         carb.setExactMass(12.00);
348         IIsotope cl = builder.newInstance(IIsotope.class, "Cl");
349         cl.setExactMass(34.96885268);
350 
351         formula.addIsotope(carb);
352         formula.addIsotope(cl);
353 
354         double totalExactMass = MolecularFormulaManipulator.getTotalExactMass(formula);
355 
356         Assert.assertEquals(46.96885268, totalExactMass, 0.000001);
357     }
358 
359     /**
360      * Test total Exact Mass.
361      *
362      * @throws IOException
363      * @throws ClassNotFoundException
364      * @throws CDKException
365      */
366     @Test
testGetTotalExactMassWithCharge_IMolecularFormula()367     public void testGetTotalExactMassWithCharge_IMolecularFormula() throws Exception {
368 
369         IMolecularFormula formula = MolecularFormulaManipulator.getMajorIsotopeMolecularFormula("CH5O", builder);
370 
371         double totalExactMass = MolecularFormulaManipulator.getTotalExactMass(formula);
372         Assert.assertEquals(33.034040, totalExactMass, 0.0001);
373 
374         formula.setCharge(1);
375         double totalExactMass2 = MolecularFormulaManipulator.getTotalExactMass(formula);
376         Assert.assertEquals(33.03349, totalExactMass2, 0.0001);
377     }
378 
379     /**
380      * Test total Exact Mass.
381      *
382      * @throws IOException
383      * @throws ClassNotFoundException
384      * @throws CDKException
385      */
386     @Test
testGetTotalExactMassWithChargeNeg_IMolecularFormula()387     public void testGetTotalExactMassWithChargeNeg_IMolecularFormula() throws IOException, ClassNotFoundException {
388 
389         IMolecularFormula formula = MolecularFormulaManipulator.getMajorIsotopeMolecularFormula("H2PO4", builder);
390         formula.setCharge(-1);
391         double totalExactMass2 = MolecularFormulaManipulator.getTotalExactMass(formula);
392         Assert.assertEquals(96.96961875390926, totalExactMass2, 0.0001);
393     }
394 
395     @Test
testGetNaturalExactMass_IMolecularFormula()396     public void testGetNaturalExactMass_IMolecularFormula() throws Exception {
397         IMolecularFormula formula = new MolecularFormula();
398         formula.addIsotope(builder.newInstance(IIsotope.class, "C"));
399         formula.addIsotope(builder.newInstance(IIsotope.class, "Cl"));
400 
401         double expectedMass = 0.0;
402         expectedMass += Isotopes.getInstance().getNaturalMass(builder.newInstance(IElement.class, "C"));
403         expectedMass += Isotopes.getInstance().getNaturalMass(builder.newInstance(IElement.class, "Cl"));
404 
405         double totalExactMass = MolecularFormulaManipulator.getNaturalExactMass(formula);
406         Assert.assertEquals(expectedMass, totalExactMass, 0.000001);
407     }
408 
409     @Test
testGetTotalMassNumber_IMolecularFormula()410     public void testGetTotalMassNumber_IMolecularFormula() throws Exception {
411         IMolecularFormula formula = new MolecularFormula();
412         formula.addIsotope(builder.newInstance(IIsotope.class, "C"));
413         formula.addIsotope(builder.newInstance(IIsotope.class, "O"));
414 
415         double totalExactMass = MolecularFormulaManipulator.getTotalMassNumber(formula);
416         Assert.assertEquals(28, totalExactMass, 0.000001);
417     }
418 
419     @Test
testGetMajorIsotopeMass_IMolecularFormula()420     public void testGetMajorIsotopeMass_IMolecularFormula() throws Exception {
421         IMolecularFormula formula = new MolecularFormula();
422         formula.addIsotope(builder.newInstance(IIsotope.class, "C"));
423         formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 4);
424 
425         double expectedMass = 0.0;
426         expectedMass += Isotopes.getInstance().getMajorIsotope("C").getExactMass();
427         expectedMass += 4.0 * Isotopes.getInstance().getMajorIsotope("H").getExactMass();
428 
429         double totalExactMass = MolecularFormulaManipulator.getMajorIsotopeMass(formula);
430         Assert.assertEquals(expectedMass, totalExactMass, 0.000001);
431     }
432 
433     /**
434      * Test total Exact Mass. It is necessary to have added the
435      * corresponding isotope before to calculate the exact mass.
436      *
437      */
438     @Test
testBug_1944604()439     public void testBug_1944604() throws Exception {
440 
441         IMolecularFormula formula = new MolecularFormula();
442         IIsotope carb = builder.newInstance(IIsotope.class, "C");
443 
444         formula.addIsotope(carb);
445 
446         Assert.assertEquals("C1", MolecularFormulaManipulator.getString(formula, true));
447 
448         double totalExactMass = MolecularFormulaManipulator.getTotalExactMass(formula);
449 
450         Assert.assertEquals(12.0, totalExactMass, 0.000001);
451     }
452 
453     /**
454      * Test total natural abundance.
455      */
456     @Test
testGetTotalNaturalAbundance_IMolecularFormula()457     public void testGetTotalNaturalAbundance_IMolecularFormula() throws Exception {
458 
459         IMolecularFormula formula = new MolecularFormula();
460         IIsotope carb = builder.newInstance(IIsotope.class, "C");
461         carb.setNaturalAbundance(98.93);
462         IIsotope cl = builder.newInstance(IIsotope.class, "Cl");
463         cl.setNaturalAbundance(75.78);
464         formula.addIsotope(carb);
465         formula.addIsotope(cl);
466 
467         double totalAbudance = MolecularFormulaManipulator.getTotalNaturalAbundance(formula);
468 
469         Assert.assertEquals(0.74969154, totalAbudance, 0.000001);
470     }
471 
472     /**
473      * Test total natural abundance.
474      */
475     @Test
testGetTotalNaturalAbundance_IMolecularFormula2()476     public void testGetTotalNaturalAbundance_IMolecularFormula2() throws Exception {
477 
478         IMolecularFormula formula1 = new MolecularFormula();
479         IIsotope br1 = builder.newInstance(IIsotope.class, "Br");
480         br1.setNaturalAbundance(49.31);
481         IIsotope br2 = builder.newInstance(IIsotope.class, "Br");
482         br2.setNaturalAbundance(50.69);
483         formula1.addIsotope(br1);
484         formula1.addIsotope(br2);
485 
486         Assert.assertEquals(2, formula1.getIsotopeCount(), 0.000001);
487         double totalAbudance = MolecularFormulaManipulator.getTotalNaturalAbundance(formula1);
488         Assert.assertEquals(0.24995235, totalAbudance, 0.000001);
489     }
490 
491     @Test
testGetTotalNaturalAbundance_IMolecularFormula3()492     public void testGetTotalNaturalAbundance_IMolecularFormula3() throws Exception {
493         IMolecularFormula formula2 = new MolecularFormula();
494         IIsotope br1 = builder.newInstance(IIsotope.class, "Br");
495         br1.setNaturalAbundance(50.69);
496         IIsotope br2 = builder.newInstance(IIsotope.class, "Br");
497         br2.setNaturalAbundance(50.69);
498         formula2.addIsotope(br1);
499         formula2.addIsotope(br2);
500 
501         Assert.assertEquals(1, formula2.getIsotopeCount(), 0.000001);
502         double totalAbudance = MolecularFormulaManipulator.getTotalNaturalAbundance(formula2);
503 
504         Assert.assertEquals(0.25694761, totalAbudance, 0.000001);
505     }
506 
507     @Test
testGetTotalNaturalAbundance_IMolecularFormula4()508     public void testGetTotalNaturalAbundance_IMolecularFormula4() throws Exception {
509         IMolecularFormula formula2 = new MolecularFormula();
510         IIsotope br1 = builder.newInstance(IIsotope.class, "Br");
511         br1.setNaturalAbundance(50.69);
512         formula2.addIsotope(br1);
513         formula2.addIsotope(br1);
514 
515         Assert.assertEquals(1, formula2.getIsotopeCount());
516         double totalAbudance = MolecularFormulaManipulator.getTotalNaturalAbundance(formula2);
517 
518         Assert.assertEquals(0.25694761, totalAbudance, 0.000001);
519     }
520 
521     /** Test Double-Bond-Equivalent (DBE) calculation */
522     @Test
testGetDBE_IMolecularFormula()523     public void testGetDBE_IMolecularFormula() throws Exception {
524         IMolecularFormula formula = new MolecularFormula();
525         formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 10);
526         formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 22);
527 
528         Assert.assertEquals(0.0, MolecularFormulaManipulator.getDBE(formula), 0.01);
529 
530         formula = new MolecularFormula();
531         formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 10);
532         formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 16);
533 
534         Assert.assertEquals(3.0, MolecularFormulaManipulator.getDBE(formula), 0.01);
535 
536         formula = new MolecularFormula();
537         formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 10);
538         formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 16);
539         formula.addIsotope(builder.newInstance(IIsotope.class, "O"));
540 
541         Assert.assertEquals(3.0, MolecularFormulaManipulator.getDBE(formula), 0.01);
542 
543         formula = new MolecularFormula();
544         formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 10);
545         formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 19);
546         formula.addIsotope(builder.newInstance(IIsotope.class, "N"));
547 
548         Assert.assertEquals(2.0, MolecularFormulaManipulator.getDBE(formula), 0.01);
549 
550     }
551 
552     @Test
testGetHTML_IMolecularFormula()553     public void testGetHTML_IMolecularFormula() {
554         MolecularFormula formula = new MolecularFormula();
555         formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 8);
556         formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 10);
557         formula.addIsotope(builder.newInstance(IIsotope.class, "Cl"), 2);
558         formula.addIsotope(builder.newInstance(IIsotope.class, "O"), 2);
559 
560         Assert.assertEquals("C<sub>8</sub>H<sub>10</sub>Cl<sub>2</sub>O<sub>2</sub>",
561                 MolecularFormulaManipulator.getHTML(formula));
562     }
563 
564     @Test
htmlFormulaDoesNotAddSubscriptForSingleElements()565     public void htmlFormulaDoesNotAddSubscriptForSingleElements() {
566         MolecularFormula formula = new MolecularFormula();
567         formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 1);
568         formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 4);
569 
570         Assert.assertEquals("CH<sub>4</sub>", MolecularFormulaManipulator.getHTML(formula));
571     }
572 
573     @Test
testGetHTML_IMolecularFormula_boolean_boolean()574     public void testGetHTML_IMolecularFormula_boolean_boolean() {
575         MolecularFormula formula = new MolecularFormula();
576         formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 10);
577 
578         Assert.assertEquals("C<sub>10</sub>", MolecularFormulaManipulator.getHTML(formula, true, false));
579         formula.setCharge(1);
580         Assert.assertEquals("C<sub>10</sub><sup>+</sup>", MolecularFormulaManipulator.getHTML(formula, true, false));
581         formula.setCharge(formula.getCharge() - 2);
582         Assert.assertEquals("C<sub>10</sub><sup>–</sup>", MolecularFormulaManipulator.getHTML(formula, true, false));
583     }
584 
585     @Test
nullIsotopeLabels()586     public void nullIsotopeLabels() {
587         MolecularFormula formula = new MolecularFormula();
588         formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 10);
589 
590         Assert.assertEquals("C<sub>10</sub>", MolecularFormulaManipulator.getHTML(formula, true, false));
591         formula.setCharge(1);
592         Assert.assertEquals("C<sub>10</sub><sup>+</sup>", MolecularFormulaManipulator.getHTML(formula, true, true));
593         formula.setCharge(formula.getCharge() - 2);
594         Assert.assertEquals("C<sub>10</sub><sup>–</sup>", MolecularFormulaManipulator.getHTML(formula, true, true));
595     }
596 
597     @Test
testGetHTML_IMolecularFormula_arrayString_boolean_boolean()598     public void testGetHTML_IMolecularFormula_arrayString_boolean_boolean() {
599         IMolecularFormula formula = new MolecularFormula();
600         formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 2);
601         formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 2);
602 
603         String[] newOrder = new String[2];
604         newOrder[0] = "H";
605         newOrder[1] = "C";
606 
607         Assert.assertEquals("H<sub>2</sub>C<sub>2</sub>",
608                 MolecularFormulaManipulator.getHTML(formula, newOrder, false, false));
609     }
610 
611     @Test
testGetHTML_IMolecularFormulaWithIsotope()612     public void testGetHTML_IMolecularFormulaWithIsotope() {
613         MolecularFormula formula = new MolecularFormula();
614         formula.addIsotope(ifac.getMajorIsotope("C"), 2);
615         formula.addIsotope(ifac.getMajorIsotope("H"), 6);
616         Assert.assertEquals("<sup>12</sup>C<sub>2</sub><sup>1</sup>H<sub>6</sub>",
617                 MolecularFormulaManipulator.getHTML(formula, false, true));
618     }
619 
620     @Test
testGetHTML_IMolecularFormulaWithIsotopeAndCharge()621     public void testGetHTML_IMolecularFormulaWithIsotopeAndCharge() {
622         MolecularFormula formula = new MolecularFormula();
623         formula.addIsotope(ifac.getMajorIsotope("C"), 2);
624         formula.addIsotope(ifac.getMajorIsotope("H"), 6);
625         formula.setCharge(1);
626         Assert.assertEquals("<sup>12</sup>C<sub>2</sub><sup>1</sup>H<sub>6</sub><sup>+</sup>",
627                 MolecularFormulaManipulator.getHTML(formula, true, true));
628     }
629 
630     @Test
testGetMolecularFormula_IAtomContainer()631     public void testGetMolecularFormula_IAtomContainer() {
632         IAtomContainer ac = builder.newInstance(IAtomContainer.class);
633         ac.addAtom(builder.newInstance(IAtom.class, "C"));
634         ac.addAtom(builder.newInstance(IAtom.class, "C"));
635         ac.addAtom(builder.newInstance(IAtom.class, "H"));
636         ac.addAtom(builder.newInstance(IAtom.class, "H"));
637         ac.addAtom(builder.newInstance(IAtom.class, "H"));
638         ac.addAtom(builder.newInstance(IAtom.class, "H"));
639 
640         IMolecularFormula mf1 = MolecularFormulaManipulator.getMolecularFormula(ac);
641 
642         IMolecularFormula mf2 = new MolecularFormula();
643         mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 2);
644         mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 4);
645 
646         Assert.assertEquals(MolecularFormulaManipulator.getAtomCount(mf2),
647                 MolecularFormulaManipulator.getAtomCount(mf1));
648         Assert.assertEquals(mf2.getIsotopeCount(), mf1.getIsotopeCount());
649         IElement elemC = builder.newInstance(IElement.class, "C");
650         IElement elemH = builder.newInstance(IElement.class, "H");
651         Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemC)),
652                 mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemC)));
653         Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemH)),
654                 mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemH)));
655         Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemC),
656                 MolecularFormulaManipulator.getElementCount(mf1, elemC));
657         Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemH),
658                 MolecularFormulaManipulator.getElementCount(mf1, elemH));
659 
660     }
661 
662     @Test
testGetMolecularFormula_IAtomNullCharge()663     public void testGetMolecularFormula_IAtomNullCharge() {
664         IAtomContainer ac = builder.newInstance(IAtomContainer.class);
665         ac.addAtom(builder.newInstance(IAtom.class, "C"));
666         ac.getAtom(0).setFormalCharge((Integer) CDKConstants.UNSET);
667         ac.addAtom(builder.newInstance(IAtom.class, "C"));
668         ac.addAtom(builder.newInstance(IAtom.class, "H"));
669         ac.addAtom(builder.newInstance(IAtom.class, "H"));
670         ac.addAtom(builder.newInstance(IAtom.class, "H"));
671         ac.addAtom(builder.newInstance(IAtom.class, "H"));
672 
673         IMolecularFormula mf1 = MolecularFormulaManipulator.getMolecularFormula(ac);
674         Assert.assertNotNull(mf1);
675     }
676 
677     @Test
testGetMolecularFormula_IAtomContainer_withCharge()678     public void testGetMolecularFormula_IAtomContainer_withCharge() {
679         IAtomContainer ac = builder.newInstance(IAtomContainer.class);
680         ac.addAtom(builder.newInstance(IAtom.class, "C"));
681         ac.getAtom(0).setFormalCharge(1);
682         ac.addAtom(builder.newInstance(IAtom.class, "C"));
683         ac.addAtom(builder.newInstance(IAtom.class, "H"));
684         ac.addAtom(builder.newInstance(IAtom.class, "H"));
685         ac.addAtom(builder.newInstance(IAtom.class, "H"));
686 
687         IMolecularFormula mf1 = MolecularFormulaManipulator.getMolecularFormula(ac);
688 
689         Assert.assertEquals(1, mf1.getCharge(), 0.000);
690     }
691 
692     @Test
testGetMolecularFormula_IAtomContainer_IMolecularFormula()693     public void testGetMolecularFormula_IAtomContainer_IMolecularFormula() {
694         IAtomContainer ac = builder.newInstance(IAtomContainer.class);
695         ac.addAtom(builder.newInstance(IAtom.class, "C"));
696         ac.addAtom(builder.newInstance(IAtom.class, "C"));
697         ac.addAtom(builder.newInstance(IAtom.class, "H"));
698         ac.addAtom(builder.newInstance(IAtom.class, "H"));
699         ac.addAtom(builder.newInstance(IAtom.class, "H"));
700         ac.addAtom(builder.newInstance(IAtom.class, "H"));
701 
702         IMolecularFormula mf1 = MolecularFormulaManipulator.getMolecularFormula(ac, new MolecularFormula());
703 
704         IMolecularFormula mf2 = new MolecularFormula();
705         mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 2);
706         mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 4);
707 
708         Assert.assertEquals(MolecularFormulaManipulator.getAtomCount(mf2),
709                 MolecularFormulaManipulator.getAtomCount(mf1));
710         Assert.assertEquals(mf2.getIsotopeCount(), mf1.getIsotopeCount());
711         IElement elemC = builder.newInstance(IElement.class, "C");
712         IElement elemH = builder.newInstance(IElement.class, "H");
713         Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemC)),
714                 mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemC)));
715         Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemH)),
716                 mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemH)));
717         Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemC),
718                 MolecularFormulaManipulator.getElementCount(mf1, elemC));
719         Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemH),
720                 MolecularFormulaManipulator.getElementCount(mf1, elemH));
721 
722     }
723 
724     @Test
testGetMolecularFormula_IAtomContainerIMolecularFormula_2()725     public void testGetMolecularFormula_IAtomContainerIMolecularFormula_2() {
726         IAtomContainer ac = builder.newInstance(IAtomContainer.class);
727         ac.addAtom(builder.newInstance(IAtom.class, "C"));
728         ac.addAtom(builder.newInstance(IAtom.class, "C"));
729         ac.addAtom(builder.newInstance(IAtom.class, "H"));
730         ac.addAtom(builder.newInstance(IAtom.class, "H"));
731         ac.addAtom(builder.newInstance(IAtom.class, "H"));
732         ac.addAtom(builder.newInstance(IAtom.class, "H"));
733 
734         IMolecularFormula mf0 = new MolecularFormula();
735         mf0.addIsotope(builder.newInstance(IIsotope.class, "C"), 2);
736         mf0.addIsotope(builder.newInstance(IIsotope.class, "H"), 5);
737 
738         IMolecularFormula mf1 = MolecularFormulaManipulator.getMolecularFormula(ac, mf0);
739 
740         IMolecularFormula mf2 = new MolecularFormula();
741         mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 4);
742         mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 9);
743 
744         Assert.assertEquals(MolecularFormulaManipulator.getAtomCount(mf2),
745                 MolecularFormulaManipulator.getAtomCount(mf1));
746         Assert.assertEquals(mf2.getIsotopeCount(), mf1.getIsotopeCount());
747         IElement elemC = builder.newInstance(IElement.class, "C");
748         IElement elemH = builder.newInstance(IElement.class, "H");
749         Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemC)),
750                 mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemC)));
751         Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemH)),
752                 mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemH)));
753         Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemC),
754                 MolecularFormulaManipulator.getElementCount(mf1, elemC));
755         Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemH),
756                 MolecularFormulaManipulator.getElementCount(mf1, elemH));
757 
758     }
759 
760     @Test
testGetAtomContainer_IMolecularFormula()761     public void testGetAtomContainer_IMolecularFormula() {
762 
763         IMolecularFormula mf2 = new MolecularFormula();
764         mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 2);
765         mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 4);
766 
767         IAtomContainer ac = MolecularFormulaManipulator.getAtomContainer(mf2);
768 
769         Assert.assertEquals(6, ac.getAtomCount());
770 
771     }
772 
773     @Test
testGetAtomContainer_IMolecularFormula_IAtomContainer()774     public void testGetAtomContainer_IMolecularFormula_IAtomContainer() {
775 
776         IMolecularFormula mf2 = new MolecularFormula();
777         mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 2);
778         mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 4);
779 
780         IAtomContainer ac = MolecularFormulaManipulator
781                 .getAtomContainer(mf2, builder.newInstance(IAtomContainer.class));
782 
783         Assert.assertEquals(6, ac.getAtomCount());
784 
785     }
786 
787     @Test
testGetAtomContainer_String_IChemObjectBuilder()788     public void testGetAtomContainer_String_IChemObjectBuilder() {
789         String mf = "C2H4";
790         IAtomContainer atomContainer = MolecularFormulaManipulator.getAtomContainer(mf,
791                 DefaultChemObjectBuilder.getInstance());
792         Assert.assertEquals(6, atomContainer.getAtomCount());
793     }
794 
795     /**
796      * @cdk.bug 1296
797      */
798     @Test
testGetAtomContainer_AddsAtomicNumbers()799     public void testGetAtomContainer_AddsAtomicNumbers() {
800         IMolecularFormula mf2 = new MolecularFormula();
801         mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 2);
802         mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 4);
803         IAtomContainer ac = MolecularFormulaManipulator
804                 .getAtomContainer(mf2, builder.newInstance(IAtomContainer.class));
805         Assert.assertEquals(6, ac.getAtomCount());
806         Assert.assertNotNull(ac.getAtom(0).getAtomicNumber());
807         for (IAtom atom : ac.atoms()) {
808             if ("C".equals(atom.getSymbol()))
809                 Assert.assertEquals(6, atom.getAtomicNumber().intValue());
810             else if ("H".equals(atom.getSymbol()))
811                 Assert.assertEquals(1, atom.getAtomicNumber().intValue());
812             else
813                 Assert.fail("Unexcepted element: " + atom.getSymbol());
814         }
815     }
816 
817     @Test
testMolecularFormulaIAtomContainer_to_IAtomContainer2()818     public void testMolecularFormulaIAtomContainer_to_IAtomContainer2() {
819         IAtomContainer ac = builder.newInstance(IAtomContainer.class);
820         ac.addAtom(builder.newInstance(IAtom.class, "C"));
821         ac.addAtom(builder.newInstance(IAtom.class, "C"));
822         ac.addAtom(builder.newInstance(IAtom.class, "H"));
823         ac.addAtom(builder.newInstance(IAtom.class, "H"));
824         ac.addAtom(builder.newInstance(IAtom.class, "H"));
825         ac.addAtom(builder.newInstance(IAtom.class, "H"));
826 
827         IMolecularFormula mf2 = new MolecularFormula();
828         mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 2);
829         mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 4);
830 
831         IAtomContainer ac2 = MolecularFormulaManipulator.getAtomContainer(mf2,
832                 builder.newInstance(IAtomContainer.class));
833 
834         Assert.assertEquals(ac2.getAtomCount(), ac2.getAtomCount());
835         Assert.assertEquals(ac2.getAtom(0).getSymbol(), ac2.getAtom(0).getSymbol());
836         Assert.assertEquals(ac2.getAtom(5).getSymbol(), ac2.getAtom(5).getSymbol());
837 
838     }
839 
840     @Test
testElements_IMolecularFormula()841     public void testElements_IMolecularFormula() {
842 
843         IMolecularFormula formula = new MolecularFormula();
844         formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 1);
845         formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 2);
846 
847         IIsotope br1 = builder.newInstance(IIsotope.class, "Br");
848         br1.setNaturalAbundance(50.69);
849         formula.addIsotope(br1);
850         IIsotope br2 = builder.newInstance(IIsotope.class, "Br");
851         br2.setNaturalAbundance(50.69);
852         formula.addIsotope(br2);
853 
854         List<IElement> elements = MolecularFormulaManipulator.elements(formula);
855 
856         Assert.assertEquals(5, MolecularFormulaManipulator.getAtomCount(formula));
857         Assert.assertEquals(3, elements.size());
858     }
859 
860     @Test
testCompare_Charge()861     public void testCompare_Charge() {
862 
863         IMolecularFormula formula1 = new MolecularFormula();
864         formula1.addIsotope(builder.newInstance(IIsotope.class, "C"), 1);
865         formula1.addIsotope(builder.newInstance(IIsotope.class, "H"), 2);
866 
867         IMolecularFormula formula2 = new MolecularFormula();
868         formula2.addIsotope(builder.newInstance(IIsotope.class, "C"), 1);
869         formula2.addIsotope(builder.newInstance(IIsotope.class, "H"), 2);
870 
871         IMolecularFormula formula3 = new MolecularFormula();
872         formula3.addIsotope(builder.newInstance(IIsotope.class, "C"), 1);
873         formula3.addIsotope(builder.newInstance(IIsotope.class, "H"), 2);
874         formula3.setCharge(0);
875 
876         Assert.assertTrue(MolecularFormulaManipulator.compare(formula1, formula2));
877         Assert.assertFalse(MolecularFormulaManipulator.compare(formula1, formula3));
878 
879     }
880 
881     @Test
testCompare_NumberIsotope()882     public void testCompare_NumberIsotope() {
883 
884         IMolecularFormula formula1 = new MolecularFormula();
885         formula1.addIsotope(builder.newInstance(IIsotope.class, "C"), 1);
886         formula1.addIsotope(builder.newInstance(IIsotope.class, "H"), 2);
887 
888         IMolecularFormula formula2 = new MolecularFormula();
889         formula2.addIsotope(builder.newInstance(IIsotope.class, "C"), 1);
890         formula2.addIsotope(builder.newInstance(IIsotope.class, "H"), 2);
891 
892         IMolecularFormula formula3 = new MolecularFormula();
893         formula3.addIsotope(builder.newInstance(IIsotope.class, "C"), 1);
894         formula3.addIsotope(builder.newInstance(IIsotope.class, "H"), 3);
895 
896         Assert.assertTrue(MolecularFormulaManipulator.compare(formula1, formula2));
897         Assert.assertFalse(MolecularFormulaManipulator.compare(formula1, formula3));
898 
899     }
900 
901     @Test
testCompare_IMolecularFormula_IMolecularFormula()902     public void testCompare_IMolecularFormula_IMolecularFormula() {
903 
904         IMolecularFormula formula1 = new MolecularFormula();
905         formula1.addIsotope(builder.newInstance(IIsotope.class, "C"), 1);
906         formula1.addIsotope(builder.newInstance(IIsotope.class, "H"), 2);
907 
908         IMolecularFormula formula2 = new MolecularFormula();
909         formula2.addIsotope(builder.newInstance(IIsotope.class, "C"), 1);
910         formula2.addIsotope(builder.newInstance(IIsotope.class, "H"), 2);
911 
912         IMolecularFormula formula3 = new MolecularFormula();
913         formula3.addIsotope(builder.newInstance(IIsotope.class, "C"), 1);
914         IIsotope hyd = builder.newInstance(IIsotope.class, "H");
915         hyd.setExactMass(2.002334234);
916         formula3.addIsotope(hyd, 2);
917 
918         Assert.assertTrue(MolecularFormulaManipulator.compare(formula1, formula2));
919         Assert.assertFalse(MolecularFormulaManipulator.compare(formula1, formula3));
920 
921     }
922 
923     @Test
testGetHeavyElements_IMolecularFormula()924     public void testGetHeavyElements_IMolecularFormula() {
925         IMolecularFormula formula = new MolecularFormula();
926         formula.addIsotope(builder.newInstance(IIsotope.class, "C"), 10);
927         formula.addIsotope(builder.newInstance(IIsotope.class, "H"), 16);
928         Assert.assertEquals(1, MolecularFormulaManipulator.getHeavyElements(formula).size());
929     }
930 
931     @Test
testGetHeavyElements_IMolecularFormula_2()932     public void testGetHeavyElements_IMolecularFormula_2() {
933         IMolecularFormula formula = MolecularFormulaManipulator.getMolecularFormula("CH3OH", builder);
934         Assert.assertEquals(2, MolecularFormulaManipulator.getHeavyElements(formula).size());
935     }
936 
937     /**
938      * Test if the elements-ordered-by-probability are in the expected order.
939      */
940     @Test
testGenerateOrderEle()941     public void testGenerateOrderEle() {
942         String[] listElements = new String[]{
943                 // Elements of life
944                 "C", "H", "O", "N", "Si", "P", "S", "F", "Cl",
945 
946                 "Br", "I", "Sn", "B", "Pb", "Tl", "Ba", "In", "Pd", "Pt", "Os", "Ag", "Zr", "Se", "Zn", "Cu", "Ni",
947                 "Co", "Fe", "Cr", "Ti", "Ca", "K", "Al", "Mg", "Na", "Ce", "Hg", "Au", "Ir", "Re", "W", "Ta", "Hf",
948                 "Lu", "Yb", "Tm", "Er", "Ho", "Dy", "Tb", "Gd", "Eu", "Sm", "Pm", "Nd", "Pr", "La", "Cs", "Xe", "Te",
949                 "Sb", "Cd", "Rh", "Ru", "Tc", "Mo", "Nb", "Y", "Sr", "Rb", "Kr", "As", "Ge", "Ga", "Mn", "V", "Sc",
950                 "Ar", "Ne", "He", "Be", "Li",
951 
952                 // rest of periodic table, in atom-number order.
953                 "Bi", "Po", "At", "Rn",
954                 // row-7 elements (including f-block)
955                 "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr",
956                 "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn",
957 
958                 // The "odd one out": an unspecified R-group
959                 "R"};
960 
961         String[] arrayGenerated = MolecularFormulaManipulator.generateOrderEle();
962         List<String> listGenerated = Arrays.asList(arrayGenerated);
963         Assert.assertEquals(113, listGenerated.size());
964 
965         for (int i = 0; i < listElements.length; i++) {
966             String element = listElements[i];
967             Assert.assertTrue("Element missing from generateOrderEle: " + element, listGenerated.contains(element));
968         }
969     }
970 
971     /**
972      * TODO: REACT: Introduce method
973      *
974      * @cdk.bug 2672696
975      */
976     @Test
testGetHillString_IMolecularFormula()977     public void testGetHillString_IMolecularFormula() {
978         IMolecularFormula formula = MolecularFormulaManipulator.getMolecularFormula("CH3OH", builder);
979         String listGenerated = MolecularFormulaManipulator.getHillString(formula);
980         Assert.assertEquals("CH4O", listGenerated);
981 
982         formula = MolecularFormulaManipulator.getMolecularFormula("CH3CH2Br", builder);
983         listGenerated = MolecularFormulaManipulator.getHillString(formula);
984         Assert.assertEquals("C2H5Br", listGenerated);
985 
986         formula = MolecularFormulaManipulator.getMolecularFormula("HCl", builder);
987         listGenerated = MolecularFormulaManipulator.getHillString(formula);
988         Assert.assertEquals("ClH", listGenerated);
989 
990         formula = MolecularFormulaManipulator.getMolecularFormula("HBr", builder);
991         listGenerated = MolecularFormulaManipulator.getHillString(formula);
992         Assert.assertEquals("BrH", listGenerated);
993     }
994 
995     /**
996      * Tests that an atom which has not be configured with isotope information,
997      * provides the correct exact mass.
998      * @cdk.bug 1944604
999      */
1000     @Test
testSingleAtomFromSmiles()1001     public void testSingleAtomFromSmiles() throws CDKException {
1002         IAtomContainer mol = new AtomContainer();
1003         mol.addAtom(new Atom("C"));
1004 
1005         // previously performed inside SmilesParser
1006         AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(mol);
1007         CDKHydrogenAdder.getInstance(DefaultChemObjectBuilder.getInstance()).addImplicitHydrogens(mol);
1008 
1009         IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula(mol);
1010         double exactMass = MolecularFormulaManipulator.getTotalExactMass(mf);
1011         Assert.assertEquals(16.0313, exactMass, 0.0001);
1012     }
1013 
1014     @Test
testSingleAtom()1015     public void testSingleAtom() {
1016         String formula = "CH4";
1017         IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula(formula, builder);
1018         Assert.assertEquals(1,
1019                 MolecularFormulaManipulator.getIsotopes(mf, mf.getBuilder().newInstance(IElement.class, "C")).size());
1020     }
1021 
1022     @Test
testSimplifyMolecularFormula_String()1023     public void testSimplifyMolecularFormula_String() {
1024         String formula = "C1H41.H2O";
1025         String simplifyMF = MolecularFormulaManipulator.simplifyMolecularFormula(formula);
1026         Assert.assertEquals("C1H43O", simplifyMF);
1027     }
1028 
1029     @Test
testSimplifyMolecularFormula_String2()1030     public void testSimplifyMolecularFormula_String2() {
1031         String formula = "CH41.H2O";
1032         String simplifyMF = MolecularFormulaManipulator.simplifyMolecularFormula(formula);
1033         Assert.assertEquals("CH43O", simplifyMF);
1034     }
1035 
1036     @Test
testSimplifygetMF()1037     public void testSimplifygetMF() {
1038         String formula = "CH4.H2O";
1039         IMolecularFormula formula1 = new MolecularFormula();
1040         formula1.addIsotope(builder.newInstance(IIsotope.class, "C"), 1);
1041         formula1.addIsotope(builder.newInstance(IIsotope.class, "H"), 6);
1042         formula1.addIsotope(builder.newInstance(IIsotope.class, "O"), 1);
1043         IMolecularFormula ff = MolecularFormulaManipulator.getMolecularFormula(formula, builder);
1044         Assert.assertTrue(MolecularFormulaManipulator.compare(formula1,
1045                 MolecularFormulaManipulator.getMolecularFormula(formula, builder)));
1046         Assert.assertEquals("CH6O", MolecularFormulaManipulator.getString(ff));
1047     }
1048 
1049     @Test
testSpace()1050     public void testSpace() {
1051         String formula = "C17H21NO. C7H6O3";
1052         String simplifyMF = MolecularFormulaManipulator.simplifyMolecularFormula(formula);
1053         Assert.assertEquals("C24H27NO4", simplifyMF);
1054     }
1055 
1056     /** Test molecule simplification */
1057     @Test
test0()1058     public void test0() {
1059         String formula = "Fe.(C6H11O7)3";
1060         String simplifyMF = MolecularFormulaManipulator.simplifyMolecularFormula(formula);
1061         Assert.assertEquals("FeC18H33O21", simplifyMF);
1062     }
1063 
1064     /** Test molecule simplification */
1065     @Test
test1()1066     public void test1() {
1067         String formula = "(C6H11O7)3.Fe";
1068         String simplifyMF = MolecularFormulaManipulator.simplifyMolecularFormula(formula);
1069         Assert.assertEquals("C18H33O21Fe", simplifyMF);
1070     }
1071 
1072     /** Test molecule simplification */
1073     @Test
test2()1074     public void test2() {
1075         String formula = "C14H14N2.2HCl";
1076         String simplifyMF = MolecularFormulaManipulator.simplifyMolecularFormula(formula);
1077         Assert.assertEquals("C14H16N2Cl2", simplifyMF);
1078     }
1079 
1080     /** Test molecule simplification */
1081     @Test
test3()1082     public void test3() {
1083         String formula = "(C27H33N3O8)2.2HNO3.3H2O";
1084         String simplifyMF = MolecularFormulaManipulator.simplifyMolecularFormula(formula);
1085         Assert.assertEquals("C54H74N8O25", simplifyMF);
1086     }
1087 
1088     /** Test if formula-comparison is simplify-independant */
1089     @Test
test4()1090     public void test4() {
1091         String formula = "(C27H33N3O8)2.2HNO3.3H2O";
1092         IMolecularFormula formula1 = new MolecularFormula();
1093         formula1.addIsotope(builder.newInstance(IIsotope.class, "C"), 54);
1094         formula1.addIsotope(builder.newInstance(IIsotope.class, "H"), 74);
1095         formula1.addIsotope(builder.newInstance(IIsotope.class, "O"), 25);
1096         formula1.addIsotope(builder.newInstance(IIsotope.class, "N"), 8);
1097         IMolecularFormula ff = MolecularFormulaManipulator.getMolecularFormula(formula, builder);
1098         Assert.assertTrue(MolecularFormulaManipulator.compare(formula1,
1099                 MolecularFormulaManipulator.getMolecularFormula(formula, builder)));
1100         Assert.assertEquals("C54H74N8O25", MolecularFormulaManipulator.getString(ff));
1101     }
1102 
1103     /** Test if formula-comparison is simplify-independant */
1104     @Test
test5()1105     public void test5() {
1106         String formula = "[SO3]2-";
1107         IMolecularFormula formula1 = new MolecularFormula();
1108         formula1.addIsotope(builder.newInstance(IIsotope.class, "S"), 1);
1109         formula1.addIsotope(builder.newInstance(IIsotope.class, "O"), 3);
1110         formula1.setCharge(-2);
1111         IMolecularFormula ff = MolecularFormulaManipulator.getMolecularFormula(formula, builder);
1112         Assert.assertTrue(MolecularFormulaManipulator.compare(formula1,
1113                 MolecularFormulaManipulator.getMolecularFormula(formula, builder)));
1114         Assert.assertEquals("[O3S]2-", MolecularFormulaManipulator.getString(ff));
1115         Assert.assertEquals(-2, ff.getCharge(), 0.00001);
1116     }
1117 
1118     /** Test if formula-comparison is simplify-independant */
1119     @Test
test6()1120     public void test6() {
1121         String formula = "(CH3)2";
1122         IMolecularFormula formula1 = new MolecularFormula();
1123         formula1.addIsotope(builder.newInstance(IIsotope.class, "C"), 2);
1124         formula1.addIsotope(builder.newInstance(IIsotope.class, "H"), 6);
1125         IMolecularFormula ff = MolecularFormulaManipulator.getMolecularFormula(formula, builder);
1126         Assert.assertTrue(MolecularFormulaManipulator.compare(formula1,
1127                 MolecularFormulaManipulator.getMolecularFormula(formula, builder)));
1128         Assert.assertEquals("C2H6", MolecularFormulaManipulator.getString(ff));
1129     }
1130 
1131     /** Test if formula-comparison is simplify-independant */
1132     @Test
testWithH_Initial()1133     public void testWithH_Initial() {
1134         String formula = "HC5H11NO2H";
1135         IMolecularFormula formula1 = new MolecularFormula();
1136         formula1.addIsotope(builder.newInstance(IIsotope.class, "C"), 5);
1137         formula1.addIsotope(builder.newInstance(IIsotope.class, "H"), 13);
1138         formula1.addIsotope(builder.newInstance(IIsotope.class, "N"), 1);
1139         formula1.addIsotope(builder.newInstance(IIsotope.class, "O"), 2);
1140         IMolecularFormula ff = MolecularFormulaManipulator.getMolecularFormula(formula, builder);
1141         Assert.assertTrue(MolecularFormulaManipulator.compare(formula1,
1142                 MolecularFormulaManipulator.getMolecularFormula(formula, builder)));
1143         Assert.assertEquals("C5H13NO2", MolecularFormulaManipulator.getString(ff));
1144     }
1145 
1146     /**
1147      * @cdk.bug 3071473
1148      */
1149     @Test
testFromMol()1150     public void testFromMol() throws Exception {
1151         String filename = "data/mdl/formulatest.mol";
1152         InputStream ins = this.getClass().getClassLoader().getResourceAsStream(filename);
1153         MDLV2000Reader reader = new MDLV2000Reader(ins);
1154         ChemFile chemFile = reader.read(new ChemFile());
1155         reader.close();
1156         Assert.assertNotNull(chemFile);
1157         List<IAtomContainer> mols = ChemFileManipulator.getAllAtomContainers(chemFile);
1158         IAtomContainer mol = mols.get(0);
1159 
1160         AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(mol);
1161         CDKHydrogenAdder ha = CDKHydrogenAdder.getInstance(DefaultChemObjectBuilder.getInstance());
1162         ha.addImplicitHydrogens(mol);
1163         AtomContainerManipulator.convertImplicitToExplicitHydrogens(mol);
1164 
1165         IMolecularFormula molecularFormula = MolecularFormulaManipulator.getMolecularFormula(mol);
1166         String formula2 = MolecularFormulaManipulator.getString(molecularFormula);
1167         Assert.assertTrue(formula2.equals("C35H64N3O21P3S"));
1168     }
1169 
1170     /**
1171      * @cdk.bug 3340660
1172      */
1173     @Test
testHelium()1174     public void testHelium() {
1175         IAtomContainer helium = new AtomContainer();
1176         helium.addAtom(new Atom("He"));
1177 
1178         IMolecularFormula formula = MolecularFormulaManipulator.getMolecularFormula(helium);
1179         Assert.assertNotNull(formula);
1180         Assert.assertEquals("He", MolecularFormulaManipulator.getString(formula));
1181     }
1182 
1183     /**
1184      * @cdk.bug 3340660
1185      */
1186     @Test
testAmericum()1187     public void testAmericum() {
1188         IAtomContainer helium = new AtomContainer();
1189         helium.addAtom(new Atom("Am"));
1190 
1191         IMolecularFormula formula = MolecularFormulaManipulator.getMolecularFormula(helium);
1192         Assert.assertNotNull(formula);
1193         Assert.assertEquals("Am", MolecularFormulaManipulator.getString(formula));
1194     }
1195 
1196     /**
1197      * @cdk.bug 2983334
1198      */
1199     @Test
testImplicitH()1200     public void testImplicitH() throws Exception {
1201 
1202         CDKHydrogenAdder adder = CDKHydrogenAdder.getInstance(SilentChemObjectBuilder.getInstance());
1203 
1204         IAtomContainer mol = TestMoleculeFactory.makeBenzene();
1205 
1206         IMolecularFormula f = MolecularFormulaManipulator.getMolecularFormula(mol);
1207         Assert.assertEquals("C6", MolecularFormulaManipulator.getString(f));
1208 
1209         Assert.assertEquals(6, mol.getAtomCount());
1210         AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(mol);
1211         adder.addImplicitHydrogens(mol);
1212         Assert.assertEquals(6, mol.getAtomCount());
1213         f = MolecularFormulaManipulator.getMolecularFormula(mol);
1214         Assert.assertEquals("C6H6", MolecularFormulaManipulator.getString(f));
1215 
1216     }
1217 
noNullPointerExceptionForExactMassOfRGroups()1218     @Test public void noNullPointerExceptionForExactMassOfRGroups() throws Exception {
1219         IMolecularFormula formula = new MolecularFormula();
1220         formula.addIsotope(new Isotope("C"));
1221         formula.addIsotope(new Isotope("H"), 3);
1222         formula.addIsotope(new Isotope("R"));
1223         assertThat(MolecularFormulaManipulator.getTotalExactMass(formula),
1224                    closeTo(15.0234, 0.01));
1225     }
1226 
noNullPointerExceptionForMassOfRGroups()1227     @Test public void noNullPointerExceptionForMassOfRGroups() throws Exception {
1228         IMolecularFormula formula = new MolecularFormula();
1229         formula.addIsotope(new Isotope("C"));
1230         formula.addIsotope(new Isotope("H"), 3);
1231         formula.addIsotope(new Isotope("R"));
1232         assertThat(MolecularFormulaManipulator.getTotalMassNumber(formula),
1233                    closeTo(15.0, 0.01));
1234     }
1235 
noNullPointerExceptionForMajorMassOfRGroups()1236     @Test public void noNullPointerExceptionForMajorMassOfRGroups() throws Exception {
1237         IMolecularFormula formula = new MolecularFormula();
1238         formula.addIsotope(new Isotope("C"));
1239         formula.addIsotope(new Isotope("H"), 3);
1240         formula.addIsotope(new Isotope("R"));
1241         assertThat(MolecularFormulaManipulator.getMajorIsotopeMass(formula),
1242                    closeTo(15.0234, 0.01));
1243     }
1244 
noNullPointerForStaticIsotopes()1245     @Test public void noNullPointerForStaticIsotopes() throws Exception {
1246         Isotopes is = Isotopes.getInstance();
1247         IIsotope carbon = is.getMajorIsotope("C");
1248         MolecularFormula mf = new MolecularFormula();
1249         mf.addIsotope(carbon, 10);
1250         MolecularFormulaManipulator.getNaturalExactMass(mf);
1251     }
1252 
acceptMinusAsInput()1253     @Test public void acceptMinusAsInput() throws Exception {
1254         IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance();
1255         IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula("[PO4]3–",
1256                                                                                bldr);
1257         assertThat(mf.getCharge(), is(-3));
1258     }
1259 
deprotonatePhenol()1260     @Test public void deprotonatePhenol() throws Exception {
1261         IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance();
1262         IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula("C6H6O", bldr);
1263         assertTrue(MolecularFormulaManipulator.adjustProtonation(mf, -1));
1264         assertThat(MolecularFormulaManipulator.getString(mf), is("[C6H5O]-"));
1265         assertThat(mf.getCharge(), is(-1));
1266     }
1267 
protonatePhenolate()1268     @Test public void protonatePhenolate() throws Exception {
1269         IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance();
1270         IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula("[C6H5O]-", bldr);
1271         assertTrue(MolecularFormulaManipulator.adjustProtonation(mf, +1));
1272         assertThat(MolecularFormulaManipulator.getString(mf), is("C6H6O"));
1273         assertThat(mf.getCharge(), is(0));
1274         assertThat(mf.getIsotopeCount(), is(3));
1275     }
1276 
protonatePhenolateMajorIsotopes()1277     @Test public void protonatePhenolateMajorIsotopes() throws Exception {
1278         IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance();
1279         IMolecularFormula mf = MolecularFormulaManipulator.getMajorIsotopeMolecularFormula("[C6H5O]-", bldr);
1280         assertTrue(MolecularFormulaManipulator.adjustProtonation(mf, +1));
1281         assertThat(MolecularFormulaManipulator.getString(mf), is("C6H6O"));
1282         assertThat(mf.getCharge(), is(0));
1283         assertThat(mf.getIsotopeCount(), is(3));
1284     }
1285 
deprontateHCl()1286     @Test public void deprontateHCl() throws Exception {
1287         IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance();
1288         IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula("HCl", bldr);
1289         assertTrue(MolecularFormulaManipulator.adjustProtonation(mf, -1));
1290         assertThat(MolecularFormulaManipulator.getString(mf), is("[Cl]-"));
1291         assertThat(mf.getCharge(), is(-1));
1292         assertThat(mf.getIsotopeCount(), is(1));
1293     }
1294 
prontateChloride()1295     @Test public void prontateChloride() throws Exception {
1296         IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance();
1297         IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula("[Cl]-", bldr);
1298         assertTrue(MolecularFormulaManipulator.adjustProtonation(mf, +1));
1299         assertThat(MolecularFormulaManipulator.getString(mf), is("ClH"));
1300         assertThat(mf.getCharge(), is(0));
1301         assertThat(mf.getIsotopeCount(), is(2));
1302     }
1303 
deprontateChloride()1304     @Test public void deprontateChloride() throws Exception {
1305         IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance();
1306         IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula("[Cl]-", bldr);
1307         assertFalse(MolecularFormulaManipulator.adjustProtonation(mf, -1));
1308     }
1309 
protonateDeuteratedPhenolate()1310     @Test public void protonateDeuteratedPhenolate() throws Exception {
1311         IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance();
1312         IMolecularFormula mf = bldr.newInstance(IMolecularFormula.class);
1313         // [C6DH4O]- (parser not good enough ATM so need to create like this)
1314         IIsotope deuterium = Isotopes.getInstance().getIsotope("H", 2);
1315         IIsotope hydrogen = Isotopes.getInstance().getMajorIsotope(1);
1316         mf.addIsotope(deuterium, 1);
1317         mf.addIsotope(hydrogen, 4);
1318         mf.addIsotope(Isotopes.getInstance().getMajorIsotope(6), 6);
1319         mf.addIsotope(Isotopes.getInstance().getMajorIsotope(8), 1);
1320         mf.setCharge(-1);
1321         assertTrue(MolecularFormulaManipulator.adjustProtonation(mf, +1));
1322         assertThat(MolecularFormulaManipulator.getString(mf), is("C6H6O"));
1323         assertThat(mf.getCharge(), is(0));
1324         assertThat(mf.getIsotopeCount(), is(4));
1325         assertThat(mf.getIsotopeCount(deuterium), is(1));
1326         assertThat(mf.getIsotopeCount(hydrogen), is(5));
1327     }
1328 
testMassNumberDisplay()1329     @Test public void testMassNumberDisplay() throws Exception {
1330         IsotopeFactory ifac = Isotopes.getInstance();
1331         IIsotope br81 = ifac.getIsotope("Br", 81);
1332 
1333         IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance();
1334         IMolecularFormula mf = bldr.newInstance(IMolecularFormula.class);
1335 
1336         mf.addIsotope(new Atom("C"), 7);
1337         mf.addIsotope(new Atom("O"), 3);
1338         mf.addIsotope(new Atom("H"), 3);
1339         mf.addIsotope(new Atom("Br"), 1);
1340         mf.addIsotope(ifac.getIsotope("Br", 81), 1);
1341 
1342         assertThat(MolecularFormulaManipulator.getString(mf, false, false), is("C7H3Br2O3"));
1343         assertThat(MolecularFormulaManipulator.getString(mf, false, true), is("C7H3Br[81]BrO3"));
1344     }
1345 
1346     @Test
testMassNumberDisplayWithDefinedIsotopes()1347     public void testMassNumberDisplayWithDefinedIsotopes() throws Exception {
1348         IsotopeFactory ifac = Isotopes.getInstance();
1349 
1350         IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance();
1351         IMolecularFormula mf = bldr.newInstance(IMolecularFormula.class);
1352 
1353         mf.addIsotope(ifac.getMajorIsotope("C"), 7);
1354         mf.addIsotope(ifac.getMajorIsotope("O"), 3);
1355         mf.addIsotope(ifac.getMajorIsotope("H"), 3);
1356         mf.addIsotope(ifac.getMajorIsotope("Br"), 1);
1357         mf.addIsotope(ifac.getIsotope("Br", 81), 1);
1358         Isotopes.clearMajorIsotopes(mf);
1359         assertThat(MolecularFormulaManipulator.getString(mf, false, false), is("C7H3Br2O3"));
1360         assertThat(MolecularFormulaManipulator.getString(mf, false, true), is("C7H3Br[81]BrO3"));
1361     }
1362 
parseMFMass()1363     @Test public void parseMFMass() throws Exception {
1364         String str = "C7H3[81]BrBrO3";
1365         IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance();
1366         IMolecularFormula mf = MolecularFormulaManipulator.getMolecularFormula(str, builder);
1367         assertThat(MolecularFormulaManipulator.getString(mf, false, true),
1368             is("C7H3Br[81]BrO3"));
1369     }
1370 
1371     @Test
testRoundTripCharge()1372     public void testRoundTripCharge() {
1373         String f = "[C3H7]+";
1374         IMolecularFormula m =
1375                 MolecularFormulaManipulator.getMolecularFormula(f,
1376                                                                 SilentChemObjectBuilder.getInstance());
1377         assertThat(MolecularFormulaManipulator.getString(m), is("[C3H7]+"));
1378     }
1379 
1380     @Test
getMostAbundant()1381     public void getMostAbundant() {
1382         IMolecularFormula mf = new MolecularFormula();
1383         mf.addIsotope(new Atom("C"), 6);
1384         mf.addIsotope(new Atom("Br"), 6);
1385         IMolecularFormula mamf = MolecularFormulaManipulator.getMostAbundant(mf);
1386         assertThat(MolecularFormulaManipulator.getString(mamf, false, true),
1387                    is("[12]C6[79]Br3[81]Br3"));
1388     }
1389 
1390 
assertMass(String str, double expMass, int flav)1391     private static void assertMass(String str, double expMass, int flav) {
1392         IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance();
1393         IMolecularFormula mf =
1394             MolecularFormulaManipulator.getMolecularFormula(str, bldr);
1395         double act = MolecularFormulaManipulator.getMass(mf, flav);
1396         assertThat(act, is(closeTo(expMass, 0.01)));
1397     }
1398 
1399     @Test
C6Br6()1400     public void C6Br6() {
1401         assertMass("C6Br6", 551.485, MolWeight);
1402         assertMass("C6Br6", 545.510, MonoIsotopic);
1403         assertMass("C6Br6", 551.503, MostAbundant);
1404         assertMass("[12]C4[13]C2Br6", 553.427, MolWeight);
1405         assertMass("[12]C4[13]C2Br6", 547.516, MonoIsotopic);
1406         assertMass("[12]C4[13]C2Br6", 553.510, MostAbundant);
1407     }
1408 
1409     // Iron has 4 stable isotopes, 54 @ 5.85%, 56 @ 91.57%, 57 @ 2.12%, and
1410     // 58 @ 0.28%. Given 100 iron's we expected ~6 @ 54, ~92 @ 56 and 2 @ 57
1411     @Test
getMostAbundantFe100()1412     public void getMostAbundantFe100() {
1413         IMolecularFormula mf = new MolecularFormula();
1414         mf.addIsotope(new Atom("Fe"), 100);
1415         IMolecularFormula mamf = MolecularFormulaManipulator.getMostAbundant(mf);
1416         assertThat(MolecularFormulaManipulator.getString(mamf, false, true),
1417                    is("[54]Fe6[56]Fe92[57]Fe2"));
1418     }
1419 
getMassCranbin()1420     @Test public void getMassCranbin() {
1421         IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance();
1422         IMolecularFormula mf =
1423                 MolecularFormulaManipulator.getMolecularFormula("C202H315N55O64S6",
1424                                                                 bldr);
1425         Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MolWeight),
1426                           closeTo(4730.397, 0.001));
1427         Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MolWeightIgnoreSpecified),
1428                           closeTo(4730.397, 0.001));
1429         Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MonoIsotopic),
1430                           closeTo(4727.140, 0.001));
1431         Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MostAbundant),
1432                           closeTo(4729.147, 0.001));
1433     }
1434 
getMassCranbinSpecIsotopes()1435     @Test public void getMassCranbinSpecIsotopes() {
1436         IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance();
1437         IMolecularFormula mf =
1438                 MolecularFormulaManipulator.getMolecularFormula("[12]C200[13]C2[1]H315[14]N55[16]O64[32]S6",
1439                                                                bldr);
1440         Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MolWeight),
1441                           closeTo(4729.147, 0.001));
1442         Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MolWeightIgnoreSpecified),
1443                           closeTo(4730.397, 0.001));
1444         Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MonoIsotopic),
1445                           closeTo(4729.147, 0.001));
1446         Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MostAbundant),
1447                           closeTo(4729.147, 0.001));
1448     }
1449 
getMassCranbinMixedSpecIsotopes()1450     @Test public void getMassCranbinMixedSpecIsotopes() {
1451         IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance();
1452         IMolecularFormula mf =
1453                 MolecularFormulaManipulator.getMolecularFormula("C200[13]C2H315N55O64S6",
1454                                                                 bldr);
1455         Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MolWeight),
1456                           closeTo(4732.382, 0.001));
1457         Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MolWeightIgnoreSpecified),
1458                           closeTo(4730.397, 0.001));
1459         Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MonoIsotopic),
1460                           closeTo(4729.147, 0.001));
1461         Assert.assertThat(MolecularFormulaManipulator.getMass(mf, MostAbundant),
1462                           closeTo(4731.154, 0.001));
1463     }
1464 }
1465