Task::ReportResult GTest_LoadRemoteDocumentTask::report(){ if(t != NULL){ if(!t->hasError()){ QFile expectedFile(expectedDoc), actualFile(t->getLocalUrl()); expectedFile.open(QIODevice::ReadOnly), actualFile.open(QIODevice::ReadOnly); QByteArray expectedContent(expectedFile.readAll()), actualContent(actualFile.readAll()); if(expectedContent != actualContent){ stateInfo.setError(GTest::tr("File %1 content not equal with expected").arg(t->getLocalUrl())); } expectedFile.close(), actualFile.close(); } return ReportResult_Finished; } return ReportResult_Finished; }
// The validate() method validates the MMFF force field using the MMFF94 // Validation Suite from <http://www.ccl.net/cca/data/MMFF94/>. The suite // includes 753 molecules and each is check for correct atom typing, atom // charge assignment, and total energy. void MmffTest::validate() { // open molecule data file chemkit::MoleculeFile dataFile(dataPath + "MMFF94_hypervalent.mol2"); bool ok = dataFile.read(); if(!ok) qDebug() << dataFile.errorString().c_str(); QVERIFY(ok); QCOMPARE(dataFile.moleculeCount(), size_t(753)); // open expected results file QFile expectedFile("mmff94.expected"); if(!expectedFile.open(QFile::ReadOnly)){ qDebug() << expectedFile.errorString(); QFAIL("Failed to open expected data file."); } QDomDocument expectedFileDocument; expectedFileDocument.setContent(&expectedFile); QDomElement expectedMolecule = expectedFileDocument.documentElement().firstChildElement(); QCOMPARE(expectedMolecule.tagName(), QString("molecule")); // validate molecules QList<chemkit::ForceField *> failedMolecules; foreach(const boost::shared_ptr<chemkit::Molecule> &molecule, dataFile.molecules()){ bool failed = false; // check for correct expected molecule QByteArray name = expectedMolecule.attribute("name").toAscii(); QCOMPARE(name.constData(), molecule->name().c_str()); // create mmff force field chemkit::ForceField *forceField = chemkit::ForceField::create("mmff"); QVERIFY(forceField); // add molecule and setup force field forceField->setMolecule(molecule.get()); bool setup = forceField->setup(); if(!setup){ //failed = true; } // verify atoms int atomCount = forceField->atomCount(); int expectedAtomCount = expectedMolecule.attribute("atomCount").toInt(); if(atomCount != expectedAtomCount){ failed = true; } QDomElement expectedAtom = expectedMolecule.firstChildElement(); QCOMPARE(expectedAtom.tagName(), QString("atom")); foreach(const chemkit::ForceFieldAtom *forceFieldAtom, forceField->atoms()){ std::string type = forceFieldAtom->type(); QByteArray expectedType = expectedAtom.attribute("type").toAscii(); if(type != expectedType.constData()){ failed = true; } double charge = forceFieldAtom->charge(); double expectedCharge = expectedAtom.attribute("charge").toDouble(); double chargeDifference = std::abs(charge - expectedCharge); if(chargeDifference > 0.1){ failed = true; } expectedAtom = expectedAtom.nextSiblingElement(); } // verify energy double energy = forceField->energy(); double expectedEnergy = expectedMolecule.attribute("energy").toDouble(); double energyDifference = std::abs(energy - expectedEnergy); if(energyDifference > 1.0){ failed = true; } // move expected molecule to next molecule element expectedMolecule = expectedMolecule.nextSiblingElement(); if(failed){ failedMolecules.append(forceField); } else{ delete forceField; } } // write actual results file if any molecules failed if(failedMolecules.size() > 0){ QFile actualFile("mmff94.actual"); actualFile.open(QFile::WriteOnly); actualFile.write("<molecules>\n"); foreach(chemkit::ForceField *forceField, failedMolecules){ const chemkit::Molecule *molecule = forceField->molecule(); actualFile.write(QString(" <molecule name=\"%1\" energy=\"%2\" atomCount=\"%3\">\n") .arg(molecule->name().c_str()) .arg(forceField->energy()) .arg(forceField->atomCount()) .toAscii()); foreach(const chemkit::ForceFieldAtom *forceFieldAtom, forceField->atoms()){ actualFile.write(QString(" <atom type=\"%1\" charge=\"%2\"/>\n") .arg(forceFieldAtom->type().c_str()) .arg(forceFieldAtom->charge()) .toAscii()); } actualFile.write(" </molecule>\n"); delete forceField; } actualFile.write("</molecules>\n"); actualFile.close(); }