mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-27 20:32:54 +00:00
148 lines
5.8 KiB
C++
148 lines
5.8 KiB
C++
/* This file is part of KDevelop
|
|
Copyright 2012 Olivier de Gaalon <olivier.jg@gmail.com>
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License version 2 as published by the Free Software Foundation.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef CPPJSONTESTS_H
|
|
#define CPPJSONTESTS_H
|
|
|
|
#include <cpptypes.h>
|
|
#include <typeutils.h>
|
|
#include <cppduchain.h>
|
|
#include <templatedeclaration.h>
|
|
#include <templateparameterdeclaration.h>
|
|
|
|
#include <tests/json/jsontesthelpers.h>
|
|
|
|
/**
|
|
* JSON Object Specification:
|
|
* InstantiationObject : Mapping of instantiation strings to DeclTestObjects
|
|
* Instantiation strings are formatted: "<ClassA, ClassB, ...>::<ClassC, ClassD, ...>"
|
|
*
|
|
* Quick Reference:
|
|
* instantiatedFrom : DeclTestObject
|
|
* specializedFrom : DeclTestObject
|
|
* instantiations : InstantiationObject
|
|
* realType : TypeTestObject
|
|
* shortenedType : TypeTestObject
|
|
* templateContext : CtxtTestObject
|
|
* templateParameterDefault : string
|
|
*/
|
|
|
|
namespace Cpp
|
|
{
|
|
|
|
namespace DeclarationTests
|
|
{
|
|
|
|
using namespace JsonTestHelpers;
|
|
using namespace KDevelop;
|
|
|
|
///JSON type: DeclTestObject
|
|
///@returns whether the declaration is instantiated and the declaration from which it is instantiated passes the tests
|
|
DeclarationTest(instantiatedFrom)
|
|
{
|
|
const QString NOT_INSTANTIATED = "\"%1\" is not an instantiated declaration.";
|
|
|
|
TemplateDeclaration *templDecl = dynamic_cast<TemplateDeclaration*>(decl);
|
|
if (!templDecl)
|
|
return NOT_INSTANTIATED.arg(decl->qualifiedIdentifier().toString());
|
|
|
|
Declaration *instFrom = dynamic_cast<Declaration*>(templDecl->instantiatedFrom());
|
|
if (!instFrom)
|
|
return NOT_INSTANTIATED.arg(decl->qualifiedIdentifier().toString());
|
|
|
|
return testObject(instFrom, value, "Declaration's instantiatedFrom");
|
|
}
|
|
///JSON type: DeclTestObject
|
|
///@returns whether the declaration is specialized and the declaration from which it is specialized passes the tests
|
|
DeclarationTest(specializedFrom)
|
|
{
|
|
const QString NOT_SPECIALIZED = "\"%1\" is not a specialized declaration.";
|
|
|
|
TemplateDeclaration *templDecl = dynamic_cast<TemplateDeclaration*>(decl);
|
|
if (!templDecl)
|
|
return NOT_SPECIALIZED.arg(decl->qualifiedIdentifier().toString());
|
|
|
|
Declaration *specFrom = templDecl->specializedFrom().declaration();
|
|
if (!specFrom)
|
|
return NOT_SPECIALIZED.arg(decl->qualifiedIdentifier().toString());
|
|
|
|
return testObject(specFrom, value, "Declaration's specializedFrom");
|
|
}
|
|
///JSON type: InstantiationObject
|
|
///@returns whether the instantiations are correct and the instantiation declaration tests pass
|
|
DeclarationTest(instantiations)
|
|
{
|
|
VERIFY_TYPE(QVariantMap);
|
|
const QString COUNT_ERROR = "Number of instantiations (%1) doesn't match test data (%2).";
|
|
const QString INST_ERROR = "Declaration has instantiation not found in test data: \"%1\".";
|
|
const QString DECL_ERROR = "Declaration instantiated with \"%1\" didn't pass tests.";
|
|
TemplateDeclaration *templDecl = dynamic_cast<TemplateDeclaration*>(decl);
|
|
TemplateDeclaration::InstantiationsHash declInstantiations = templDecl->instantiations();
|
|
QVariantMap testInstantiations = value.toMap();
|
|
if (testInstantiations.size() != declInstantiations.size())
|
|
return COUNT_ERROR.arg(declInstantiations.size()).arg(testInstantiations.size());
|
|
|
|
for (TemplateDeclaration::InstantiationsHash::Iterator it = declInstantiations.begin(); it != declInstantiations.end(); ++it)
|
|
{
|
|
QString instStr = it.key().information().toString();
|
|
if (!testInstantiations.contains(instStr))
|
|
return INST_ERROR.arg(instStr);
|
|
|
|
if (!runTests(testInstantiations[instStr].toMap(), dynamic_cast<Declaration*>(it.value())))
|
|
return DECL_ERROR.arg(instStr);
|
|
}
|
|
return SUCCESS;
|
|
}
|
|
///JSON type: TypeTestObject
|
|
///@returns whether the tests for the declaration's real type pass (see TypeUtils::realType)
|
|
DeclarationTest(realType)
|
|
{
|
|
return testObject(TypeUtils::realType(decl->abstractType()), value, "Declaration's real type");
|
|
}
|
|
///JSON type: TypeTestObject
|
|
///@returns whether the tests for the declaration's shortened type pass (see shortenTypeForViewing)
|
|
DeclarationTest(shortenedType)
|
|
{
|
|
return testObject(shortenTypeForViewing(decl->abstractType()), value, "Declaration's shortened type");
|
|
}
|
|
///JSON type: CtxtTestObject
|
|
///@returns whether the tests for the declaration's templateContext pass
|
|
DeclarationTest(templateContext)
|
|
{
|
|
const QString NOT_A_TEMPLATE_DECL = "Requested template context, but declaration is not a template declaration.";
|
|
TemplateDeclaration *templDecl = dynamic_cast<TemplateDeclaration*>(decl);
|
|
if (!templDecl)
|
|
return NOT_A_TEMPLATE_DECL;
|
|
return testObject(templDecl->templateContext(decl->topContext()), value, "Declaration's template context");
|
|
}
|
|
///JSON type: string
|
|
///@returns whether the template parameter declaration's default argument matches the given value
|
|
DeclarationTest(templateParameterDefault)
|
|
{
|
|
const QString NOT_A_TEMPLATE_PARAM_DECL = "Requested template parameters's default parameter, but declaration is not a template parameter declaration.";
|
|
TemplateParameterDeclaration *templDecl = dynamic_cast<TemplateParameterDeclaration*>(decl);
|
|
if (!templDecl)
|
|
return NOT_A_TEMPLATE_PARAM_DECL;
|
|
return compareValues(templDecl->defaultParameter().toString(), value, "Template parameter declaration's default parameter");
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif //CPPJSONTESTS_H
|