package hudson.plugins.warnings.parser;
import static junit.framework.Assert.*;
import hudson.plugins.analysis.util.model.FileAnnotation;
import hudson.plugins.analysis.util.model.Priority;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import org.junit.Test;
/**
* Tests the class {@link DoxygenParser}.
*/
public class DoxygenParserTest extends ParserTester {
/** Error message. */
private static final String WRONG_NUMBER_OF_WARNINGS_DETECTED = "Wrong number of warnings detected.";
/** The category. */
private static final String WARNING_CATEGORY = DoxygenParser.WARNING_CATEGORY;
/** The type. **/
private static final String WARNING_TYPE = DoxygenParser.WARNING_TYPE;
/**
* Parses a file with Doxygen warnings.
*
* @throws IOException
* if the file could not be read
*/
@SuppressWarnings("PMD.ExcessiveMethodLength")
@Test
public void testWarningsParser() throws IOException {
Collection<FileAnnotation> warnings = new DoxygenParser().parse(openFile());
assertEquals(WRONG_NUMBER_OF_WARNINGS_DETECTED, 21, warnings.size());
Iterator<FileAnnotation> iterator = warnings.iterator();
checkWarning(iterator.next(),
0,
"Output directory `doc/doxygen/framework' does not exist. I have created it for you.",
"",
WARNING_TYPE, WARNING_CATEGORY, Priority.LOW);
checkWarning(iterator.next(),
171,
"reached end of file while inside a dot block!\nThe command that should end the block seems to be missing!",
"/home/user/myproject/component/odesolver/CentralDifferenceSolver.cpp",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
479,
"the name `lcp_lexicolemke.c' supplied as the second argument in the \\file statement is not an input file",
"/home/user/myproject/helper/LCPcalc.cpp",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
65,
"documented function `sofa::core::componentmodel::behavior::BaseController::BaseController' was not declared or defined.",
"/home/user/myproject/core/componentmodel/behavior/BaseController.cpp",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
72,
"no matching class member found for\n void sofa::core::componentmodel::behavior::BaseController::handleEvent(core::objectmodel::Event *event)",
"/home/user/myproject/core/componentmodel/behavior/BaseController.cpp",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
699,
"no uniquely matching class member found for\n template <>\n const char * sofa::defaulttype::Rigid3dTypes::Name()",
"/home/user/myproject/defaulttype/RigidTypes.h",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
1351,
"no matching file member found for \ndefaulttype::RigidDeriv< 3, double > sofa::core::componentmodel::behavior::inertiaForce< defaulttype::RigidCoord< 3, double >, defaulttype::RigidDeriv< 3, double >, objectmodel::BaseContext::Vec3, defaulttype::RigidMass< 3, double >, objectmodel::BaseContext::SpatialVector >(const sofa::defaulttype::SolidTypes::SpatialVector &vframe, const objectmodel::BaseContext::Vec3 &aframe, const defaulttype::RigidMass< 3, double > &mass, const defaulttype::RigidCoord< 3, double > &x, const defaulttype::RigidDeriv< 3, double > &v)\nPossible candidates:\n Deriv inertiaForce(const SV &, const Vec &, const M &, const Coord &, const Deriv &)",
"/home/user/myproject/defaulttype/RigidTypes.h",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
569,
"no uniquely matching class member found for\n template < R >\n SolidTypes< R >::Vec sofa::defaulttype::SolidTypes< R >::mult(const typename sofa::defaulttype::Mat< 3, 3, Real > &m, const typename SolidTypes< R >::Vec &v)\nPossible candidates:\n static Vec sofa::defaulttype::SolidTypes< R >::mult(const Mat &m, const Vec &v) at line 404 of file /home/user/myproject/defaulttype/SolidTypes.h",
"/home/user/myproject/defaulttype/SolidTypes.inl",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
227,
"no uniquely matching class member found for\n template < Real >\n DualQuat< Real >::Vec sofa::helper::DualQuat< Real >::transform(const typename sofa::defaulttype::Vec< 3, Real > &vec)\nPossible candidates:\n Vec sofa::helper::DualQuat< Real >::transform(const Vec &vec) at line 73 of file /home/user/myproject/helper/DualQuat.h",
"/home/user/myproject/helper/DualQuat.inl",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
496,
"no matching file member found for \nvoid sofa::helper::lcp_lexicolemke(int *nn, double *vec, double *q, double *zlem, double *wlem, int *info, int *iparamLCP, double *dparamLCP)\nPossible candidates:\n int lcp_lexicolemke(int dim, double *q, double **M, double *res)\n int lcp_lexicolemke(int dim, double *q, double **M, double **A, double *res)",
"/home/user/myproject/helper/LCPcalc.cpp",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
163,
"Found unknown command `\\notify'",
"/home/user/myproject/core/componentmodel/topology/BaseTopology.h",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
172,
"argument 'sv' of command @param is not found in the argument list of sofa::core::componentmodel::behavior::inertiaForce(const SV &, const Vec &, const M &, const Coord &, const Deriv &)",
"/home/user/myproject/core/componentmodel/behavior/Mass.h",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
97,
"The following parameters of sofa::core::componentmodel::behavior::BaseForceField::addMBKdx(double mFactor, double bFactor, double kFactor) are not documented:\n parameter 'mFactor'\n parameter 'bFactor'\n parameter 'kFactor'",
"/home/user/myproject/core/componentmodel/behavior/BaseForceField.h",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
104,
"The following parameters of sofa::core::componentmodel::behavior::BaseLMConstraint::ConstraintGroup::addConstraint(unsigned int i0, SReal c) are not documented:\n parameter 'i0'",
"/home/user/myproject/core/componentmodel/behavior/BaseLMConstraint.h",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
98,
"explicit link request to 'index' could not be resolved",
"/home/user/myproject/core/componentmodel/behavior/BaseMass.h",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
0, // Actually 1 in the file, but the line number of this kind of messages is irrelevant
"Detected potential recursive class relation between class sofa::core::componentmodel::collision::Contact::Factory and base class Factory< std::string, Contact, std::pair< std::pair< core::CollisionModel *, core::CollisionModel * >, Intersection * > >!",
"",
WARNING_TYPE, WARNING_CATEGORY, Priority.HIGH);
checkWarning(iterator.next(),
96,
"Found unknown command `\\TODO'",
"/home/user/myproject/core/componentmodel/behavior/OdeSolver.h",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
0, // Actually -1 in the file, but the line number of this kind of messages is irrelevant
"Found unknown command `\\TODO'",
"",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
0, // Actually 1 in the file, but the line number of this kind of messages is irrelevant
"Found unknown command `\\TODO'",
"",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
19,
"Unexpected character `\"'",
"/home/user/myproject/helper/SimpleTimer.h",
WARNING_TYPE, WARNING_CATEGORY, Priority.HIGH);
checkWarning(iterator.next(),
0, // Actually 1 in the file, but the line number of this kind of messages is irrelevant
"The following parameters of sofa::component::odesolver::EulerKaapiSolver::v_peq(VecId v, VecId a, double f) are not documented:\n parameter 'v'\n parameter 'a'",
"",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
}
/**
* Parses a warning log with 2 doxygen 1.7.1 messages.
*
* @throws IOException
* if the file could not be read
* @see <a href="http://issues.hudson-ci.org/browse/HUDSON-6971">Issue 6971</a>
*/
@Test
public void issue6971() throws IOException {
Collection<FileAnnotation> warnings = new DoxygenParser().parse(openFile("issue6971.txt"));
assertEquals(WRONG_NUMBER_OF_WARNINGS_DETECTED, 2, warnings.size());
Iterator<FileAnnotation> iterator = warnings.iterator();
checkWarning(iterator.next(),
479,
"the name `lcp_lexicolemke.c' supplied as the second argument in the \\file statement is not an input file",
"/home/user/myproject/helper/LCPcalc.cpp",
WARNING_TYPE, WARNING_CATEGORY, Priority.NORMAL);
checkWarning(iterator.next(),
19,
"Unexpected character `\"'",
"/home/user/myproject/helper/SimpleTimer.h",
WARNING_TYPE, WARNING_CATEGORY, Priority.HIGH);
}
/** {@inheritDoc} */
@Override
protected String getWarningsFile() {
return "doxygen.txt";
}
}