public void FeatureNamesTest()
        {
            var mol = new MolReader(FileNames.PropaneFilePath).GetMol();

            this._descriptor = new MolDescriptor(mol);

            Assert.AreEqual(_featureNames.Length, MolDescriptor.FeatureCount());

            foreach (var name in this._featureNames)
            {
                Assert.IsTrue(MolDescriptor.GetFeatureNames().Contains(name));
            }
            try
            {
                this._descriptor.FeatureValue("Fenske Descriptor");
                Assert.Fail("Fenske Descriptor is not a valid feature");
            }
            catch (ArgumentException)
            {
                // Expected
            }
        }
        public void FormalChargeTest()
        {
            var mol = new MolReader(FileNames.AceticAcidFilePath).GetMol();

            this._descriptor = new MolDescriptor(mol);
            Assert.AreEqual(0, this._descriptor.TotalCharge);

            var newMol = mol.AssignGasteigerCharges();

            Assert.AreEqual(0, Math.Round(newMol.Atoms().Sum(a => a.GetPartialCharge()), 4));

            mol = new MolReader(FileNames.AcetateFilePath).GetMol();
            this._descriptor = new MolDescriptor(mol);
            Assert.AreEqual(-1, this._descriptor.TotalCharge);

            newMol           = mol.AssignGasteigerCharges();
            this._descriptor = new MolDescriptor(newMol);
            Assert.AreEqual(-1, Math.Round(newMol.Atoms().Sum(a => a.GetPartialCharge()), 4));

            mol = new MolReader(FileNames.CyclosporineFilePath).GetMol();
            this._descriptor = new MolDescriptor(mol);
            Assert.AreEqual(0d, Math.Round(this._descriptor.TotalCharge, 4));
        }
        public void PropaneTest()
        {
            var mol = new MolReader(FileNames.PropaneFilePath).GetMol();

            this._descriptor = new MolDescriptor(mol);
            Assert.AreEqual(Propane.Title, this._descriptor.Title);
            Assert.AreEqual(Propane.Smiles, this._descriptor.Smiles);
            Assert.AreEqual(Propane.SingleCarbonCount, this._descriptor.FragmentCount("C"));
            Assert.AreEqual(Propane.DoubleCarbonCount, this._descriptor.FragmentCount("CC"));
            Assert.AreEqual(Propane.TripleCarbonCount, this._descriptor.FragmentCount("CCC"));
            Assert.AreEqual(0, this._descriptor.FragmentCount("c"));
            Assert.AreEqual(Propane.LabuteASA, Math.Round(this._descriptor.LabuteASA, 4));

            var frags = this._descriptor.FragmentCounts;

            foreach (var key in frags.Keys)
            {
                int count;
                var hasCount = frags.TryGetValue(key, out count);
                if (!hasCount)
                {
                    throw new KeyNotFoundException(string.Format("{0} is not a valid key", key));
                }
                Assert.AreEqual(0, count);
            }
            Assert.AreEqual(Propane.NumHeavyAtoms, this._descriptor.FeatureValue("Number Heavy Atoms").Value);
            Assert.AreEqual(Propane.PeoeVSA1, this._descriptor.PeoeVSA1);
            Assert.AreEqual(Propane.PeoeVSA2, this._descriptor.PeoeVSA2);
            Assert.AreEqual(Propane.PeoeVSA3, this._descriptor.PeoeVSA3);
            Assert.AreEqual(Propane.PeoeVSA4, this._descriptor.PeoeVSA4);
            Assert.AreEqual(Propane.PeoeVSA5, this._descriptor.PeoeVSA5);
            Assert.AreEqual(Propane.PeoeVSA6, Math.Round(this._descriptor.PeoeVSA6, 4));
            Assert.AreEqual(Propane.PeoeVSA7, this._descriptor.PeoeVSA7);
            Assert.AreEqual(Propane.PeoeVSA8, this._descriptor.PeoeVSA8);
            Assert.AreEqual(Propane.PeoeVSA9, this._descriptor.PeoeVSA9);
            Assert.AreEqual(Propane.PeoeVSA10, this._descriptor.PeoeVSA10);
            Assert.AreEqual(Propane.PeoeVSA11, this._descriptor.PeoeVSA11);
            Assert.AreEqual(Propane.PeoeVSA12, this._descriptor.PeoeVSA12);
            Assert.AreEqual(Propane.SmrVSA1, this._descriptor.SmrVSA1);
            Assert.AreEqual(Propane.SmrVSA2, this._descriptor.SmrVSA2);
            Assert.AreEqual(Propane.SmrVSA3, this._descriptor.SmrVSA3);
            Assert.AreEqual(Propane.SmrVSA4, this._descriptor.SmrVSA4);
            Assert.AreEqual(Propane.SmrVSA5, Math.Round(this._descriptor.SmrVSA5, 4));
            Assert.AreEqual(Propane.SmrVSA6, this._descriptor.SmrVSA6);
            Assert.AreEqual(Propane.SmrVSA7, this._descriptor.SmrVSA7);
            Assert.AreEqual(Propane.SmrVSA8, this._descriptor.SmrVSA8);
            Assert.AreEqual(Propane.SmrVSA9, this._descriptor.SmrVSA9);
            Assert.AreEqual(Propane.SmrVSA10, this._descriptor.SmrVSA10);
            Assert.AreEqual(Propane.SLogPVSA1, this._descriptor.SLogPVSA1);
            Assert.AreEqual(Propane.SLogPVSA2, this._descriptor.SLogPVSA2);
            Assert.AreEqual(Propane.SLogPVSA3, this._descriptor.SLogPVSA3);
            Assert.AreEqual(Propane.SLogPVSA4, this._descriptor.SLogPVSA4);
            Assert.AreEqual(Propane.SLogPVSA5, Math.Round(this._descriptor.SLogPVSA5, 4));
            Assert.AreEqual(Propane.SLogPVSA6, this._descriptor.SLogPVSA6);
            Assert.AreEqual(Propane.SLogPVSA7, this._descriptor.SLogPVSA7);
            Assert.AreEqual(Propane.SLogPVSA8, this._descriptor.SLogPVSA8);
            Assert.AreEqual(Propane.SLogPVSA9, this._descriptor.SLogPVSA9);
            Assert.AreEqual(Propane.SLogPVSA10, this._descriptor.SLogPVSA10);
            Assert.AreEqual(Propane.SLogPVSA11, this._descriptor.SLogPVSA11);
            Assert.AreEqual(Propane.SLogPVSA12, this._descriptor.SLogPVSA12);
            Assert.AreEqual(Propane.VsaEState9, Math.Round(this._descriptor.VsaEState9, 1));
            Assert.AreEqual(Propane.EStateVsa5, Math.Round(this._descriptor.EStateVsa5, 4));
            Assert.AreEqual(Propane.EStateVsa8, Math.Round(this._descriptor.EStateVsa8, 4));
            Assert.AreEqual(Propane.Chi0, Math.Round(this._descriptor.Chi0, 4));
            Assert.AreEqual(Propane.Chi1, Math.Round(this._descriptor.Chi1, 4));
            Assert.AreEqual(Propane.Chi0v, Math.Round(this._descriptor.Chi0v, 4));
            Assert.AreEqual(Propane.Chi1v, Math.Round(this._descriptor.Chi1v, 4));
            Assert.AreEqual(Propane.Chi2v, Math.Round(this._descriptor.Chi2v, 4));
            Assert.AreEqual(Propane.Chi3v, Math.Round(this._descriptor.Chi3v, 4));
            Assert.AreEqual(Propane.Chi4v, Math.Round(this._descriptor.Chi4v, 4));
            Assert.AreEqual(Propane.Chi0n, Math.Round(this._descriptor.Chi0n, 4));
            Assert.AreEqual(Propane.Chi1n, Math.Round(this._descriptor.Chi1n, 4));
            Assert.AreEqual(Propane.Chi2n, Math.Round(this._descriptor.Chi2n, 4));
            Assert.AreEqual(Propane.Chi3n, Math.Round(this._descriptor.Chi3n, 4));
            Assert.AreEqual(Propane.Chi4n, Math.Round(this._descriptor.Chi4n, 4));
            Assert.AreEqual(Propane.HallKierAlpha, Math.Round(this._descriptor.HallKierAlpha, 1));
            Assert.AreEqual(Propane.Kappa1, Math.Round(this._descriptor.Kappa1, 1));
            Assert.AreEqual(Propane.Kappa2, Math.Round(this._descriptor.Kappa2, 1));
            Assert.AreEqual(Propane.Kappa3, Math.Round(this._descriptor.Kappa3, 1));
            Assert.AreEqual(Propane.Ipc, Math.Round(this._descriptor.Ipc, 4));
            Assert.AreEqual(Propane.BalabanJ, Math.Round(this._descriptor.BalabanJ, 4));
        }
        public void CyclosporineTest()
        {
            var mol = new MolReader(FileNames.CyclosporineFilePath).GetMol();

            this._descriptor = new MolDescriptor(mol);
            Assert.AreEqual(Cyclosporine.Title, this._descriptor.Title);
            Assert.AreEqual(Cyclosporine.CarbonylCount, this._descriptor.FragmentCount(Fragments.Collection["fr_C=O"]));
            Assert.AreEqual(Cyclosporine.LabuteASA, Math.Round(this._descriptor.LabuteASA, 4));
            Assert.AreEqual(Cyclosporine.NumHeavyAtoms, this._descriptor.NumHeavyAtoms);

            /** These test are not run because the values given by RDKit (used as the truth argument in
             *  the asserts) appear to be incorrect. This is based upon the fact that the total charge
             *  calculated by RDKit after computing the Gasteiger charges for cyclosporine gives -4.55
             *  and the actual total charge for cyclosporine should be close to 0. In comparison, the
             *  total charge given by OpenBabel (after assigning Gasteiger charges) was close to 0.
             *
             *  Since the binning of the PEOE VSA algorithm is dependent upon Gasteiger charges, this
             *  leads me to believe that the binning given by RDKit is incorrect and hence is leading
             *  to false fails for these tests.
             * Assert.AreEqual(Cyclosporine.PeoeVSA1, Math.Round(this._descriptor.PeoeVSA1, 4));
             * Assert.AreEqual(Cyclosporine.PeoeVSA2, Math.Round(this._descriptor.PeoeVSA2, 4));
             * Assert.AreEqual(Cyclosporine.PeoeVSA3, Math.Round(this._descriptor.PeoeVSA3, 4));
             * Assert.AreEqual(Cyclosporine.PeoeVSA4, Math.Round(this._descriptor.PeoeVSA4, 4));
             * Assert.AreEqual(Cyclosporine.PeoeVSA5, Math.Round(this._descriptor.PeoeVSA5, 4));
             * Assert.AreEqual(Cyclosporine.PeoeVSA6, Math.Round(this._descriptor.PeoeVSA6, 4));
             * Assert.AreEqual(Cyclosporine.PeoeVSA7, Math.Round(this._descriptor.PeoeVSA7, 4));
             * Assert.AreEqual(Cyclosporine.PeoeVSA8, Math.Round(this._descriptor.PeoeVSA8, 4));
             * Assert.AreEqual(Cyclosporine.PeoeVSA9, Math.Round(this._descriptor.PeoeVSA9, 4));
             * Assert.AreEqual(Cyclosporine.PeoeVSA10, Math.Round(this._descriptor.PeoeVSA10, 4));
             * Assert.AreEqual(Cyclosporine.PeoeVSA11, Math.Round(this._descriptor.PeoeVSA11, 4));
             * Assert.AreEqual(Cyclosporine.PeoeVSA12, Math.Round(this._descriptor.PeoeVSA12, 4));
             * Assert.AreEqual(Cyclosporine.PeoeVSA13, Math.Round(this._descriptor.PeoeVSA13, 4));
             * Assert.AreEqual(Cyclosporine.PeoeVSA14, Math.Round(this._descriptor.PeoeVSA14, 4));
             * */
            Assert.AreEqual(Cyclosporine.SmrVSA1, Math.Round(this._descriptor.SmrVSA1, 4));
            Assert.AreEqual(Cyclosporine.SmrVSA2, Math.Round(this._descriptor.SmrVSA2, 4));
            Assert.AreEqual(Cyclosporine.SmrVSA3, Math.Round(this._descriptor.SmrVSA3, 4));
            Assert.AreEqual(Cyclosporine.SmrVSA4, Math.Round(this._descriptor.SmrVSA4, 4));
            Assert.AreEqual(Cyclosporine.SmrVSA5, Math.Round(this._descriptor.SmrVSA5, 4));
            Assert.AreEqual(Cyclosporine.SmrVSA6, Math.Round(this._descriptor.SmrVSA6, 4));
            Assert.AreEqual(Cyclosporine.SmrVSA7, Math.Round(this._descriptor.SmrVSA7, 4));
            Assert.AreEqual(Cyclosporine.SmrVSA8, Math.Round(this._descriptor.SmrVSA8, 4));
            Assert.AreEqual(Cyclosporine.SmrVSA9, Math.Round(this._descriptor.SmrVSA9, 4));
            Assert.AreEqual(Cyclosporine.SmrVSA10, Math.Round(this._descriptor.SmrVSA10, 4));
            Assert.AreEqual(Cyclosporine.SLogPVSA1, Math.Round(this._descriptor.SLogPVSA1, 4));
            Assert.AreEqual(Cyclosporine.SLogPVSA2, Math.Round(this._descriptor.SLogPVSA2, 4));
            Assert.AreEqual(Cyclosporine.SLogPVSA3, Math.Round(this._descriptor.SLogPVSA3, 4));
            Assert.AreEqual(Cyclosporine.SLogPVSA4, Math.Round(this._descriptor.SLogPVSA4, 4));
            Assert.AreEqual(Cyclosporine.SLogPVSA5, Math.Round(this._descriptor.SLogPVSA5, 4));
            Assert.AreEqual(Cyclosporine.SLogPVSA6, Math.Round(this._descriptor.SLogPVSA6, 4));
            Assert.AreEqual(Cyclosporine.SLogPVSA7, Math.Round(this._descriptor.SLogPVSA7, 4));
            Assert.AreEqual(Cyclosporine.SLogPVSA8, Math.Round(this._descriptor.SLogPVSA8, 4));
            Assert.AreEqual(Cyclosporine.SLogPVSA9, Math.Round(this._descriptor.SLogPVSA9, 4));
            Assert.AreEqual(Cyclosporine.SLogPVSA10, Math.Round(this._descriptor.SLogPVSA10, 4));
            Assert.AreEqual(Cyclosporine.SLogPVSA11, Math.Round(this._descriptor.SLogPVSA11, 4));
            Assert.AreEqual(Cyclosporine.SLogPVSA12, Math.Round(this._descriptor.SLogPVSA12, 4));
            Assert.AreEqual(Cyclosporine.VsaEState9, Math.Round(this._descriptor.VsaEState9, 4));
            Assert.AreEqual(Cyclosporine.EStateVsa1, Math.Round(this._descriptor.EStateVsa1, 4));
            Assert.AreEqual(Cyclosporine.EStateVsa2, Math.Round(this._descriptor.EStateVsa2, 4));
            Assert.AreEqual(Cyclosporine.EStateVsa3, Math.Round(this._descriptor.EStateVsa3, 4));
            Assert.AreEqual(Cyclosporine.EStateVsa4, Math.Round(this._descriptor.EStateVsa4, 4));
            Assert.AreEqual(Cyclosporine.EStateVsa5, Math.Round(this._descriptor.EStateVsa5, 4));
            Assert.AreEqual(Cyclosporine.EStateVsa6, Math.Round(this._descriptor.EStateVsa6, 4));
            Assert.AreEqual(Cyclosporine.EStateVsa7, Math.Round(this._descriptor.EStateVsa7, 4));
            Assert.AreEqual(Cyclosporine.EStateVsa8, Math.Round(this._descriptor.EStateVsa8, 4));
            Assert.AreEqual(Cyclosporine.EStateVsa9, Math.Round(this._descriptor.EStateVsa9, 4));
            Assert.AreEqual(Cyclosporine.EStateVsa10, Math.Round(this._descriptor.EStateVsa10, 4));
            Assert.AreEqual(Cyclosporine.EStateVsa11, Math.Round(this._descriptor.EStateVsa11, 4));
            Assert.AreEqual(Cyclosporine.Chi0, Math.Round(this._descriptor.Chi0, 4));
            Assert.AreEqual(Cyclosporine.Chi1, Math.Round(this._descriptor.Chi1, 4));
            Assert.AreEqual(Cyclosporine.Chi0v, Math.Round(this._descriptor.Chi0v, 4));
            Assert.AreEqual(Cyclosporine.Chi1v, Math.Round(this._descriptor.Chi1v, 4));
            Assert.AreEqual(Cyclosporine.Chi2v, Math.Round(this._descriptor.Chi2v, 4));
            Assert.AreEqual(Cyclosporine.Chi3v, Math.Round(this._descriptor.Chi3v, 4));
            Assert.AreEqual(Cyclosporine.Chi4v, Math.Round(this._descriptor.Chi4v, 4));
            Assert.AreEqual(Cyclosporine.Chi0n, Math.Round(this._descriptor.Chi0n, 4));
            Assert.AreEqual(Cyclosporine.Chi1n, Math.Round(this._descriptor.Chi1n, 4));
            Assert.AreEqual(Cyclosporine.Chi2n, Math.Round(this._descriptor.Chi2n, 4));
            Assert.AreEqual(Cyclosporine.Chi3n, Math.Round(this._descriptor.Chi3n, 4));
            Assert.AreEqual(Cyclosporine.Chi4n, Math.Round(this._descriptor.Chi4n, 4));
            Assert.AreEqual(Cyclosporine.HallKierAlpha, Math.Round(this._descriptor.HallKierAlpha, 4));
            Assert.AreEqual(Cyclosporine.Kappa1, Math.Round(this._descriptor.Kappa1, 4));
            Assert.AreEqual(Cyclosporine.Kappa2, Math.Round(this._descriptor.Kappa2, 4));
            Assert.AreEqual(Cyclosporine.Kappa3, Math.Round(this._descriptor.Kappa3, 4));
            Assert.AreEqual(Cyclosporine.Ipc.ToString("E4"), this._descriptor.Ipc.ToString("E4"));
            Assert.AreEqual(Cyclosporine.BalabanJ, Math.Round(this._descriptor.BalabanJ, 4));
        }