Commit e7bf61cf authored by Wolfgang Beck's avatar Wolfgang Beck

Add new unit test to check the icheck build.

parent 163b2ace
......@@ -6,7 +6,8 @@ SUBDIRS += \
fakevim \
# profilereader \
aggregation \
changeset
changeset \
icheckbuild
contains (QT_CONFIG, declarative) {
SUBDIRS += qml
......
This diff is collapsed.
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** Commercial Usage
**
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at http://qt.nokia.com/contact.
**
** Description:
**
** The ParseManager parses and compares to different header files
** of its metadata. This can be used for checking if an Interface
** is implemented complete.
**
** How to use it:
**
** //Parse the interface header
** ParseManager* iParseManager = new ParseManager();
** iParseManager->setIncludePath(iIncludepathlist);
** iParseManager->parse(iFilelist);
**
** //Parse the header that needs to be compared against the interface header
** ParseManager* chParseManager = new ParseManager();
** chIncludepathlist << getQTIncludePath();
** chParseManager->setIncludePath(chIncludepathlist);
** chParseManager->parse(chFilelist);
**
** if(!chParseManager->checkAllMetadatas(iParseManager)){
** cout << "Folowing interface items are missing:" << endl;
** QStringList errorlist = chParseManager->getErrorMsg();
** foreach(QString msg, errorlist){
** cout << (const char *)msg.toLatin1() << endl;
** }
** return -1;
** }
** else
** cout << "Interface is full defined.";
**
**************************************************************************/
#ifndef PARSEMANAGER_H
#define PARSEMANAGER_H
#include <QObject>
#include <QList>
#include <QFuture>
#include <QStringList>
#include "cplusplus/CppDocument.h"
namespace CppTools{
namespace Internal{
class CppPreprocessor;
}
}
namespace CPlusPlus {
class TranslationUnit;
class AST;
class ClassSpecifierAST;
class QPropertyDeclarationAST;
class QEnumDeclarationAST;
class QFlagsDeclarationAST;
class QDeclareFlagsDeclarationAST;
class EnumSpecifierAST;
class Function;
class CLASSLISTITEM
{
public:
CPlusPlus::TranslationUnit* trlUnit;
ClassSpecifierAST* classspec;
};
class CLASSTREE
{
public:
CLASSLISTITEM* highestlevelclass;
QList<CLASSLISTITEM*> classlist;
};
class FUNCTIONITEM
{
public:
const CLASSLISTITEM* highestlevelclass;
CPlusPlus::TranslationUnit* trlUnit;
ClassSpecifierAST* classAst;
QStringList classWichIsNotFound;
CPlusPlus::Function* function;
bool isEqualTo(FUNCTIONITEM* cpfct, bool ignoreName = true);
FUNCTIONITEM()
{
highestlevelclass = 0;
trlUnit = 0;
classAst = 0;
function = 0;
}
};
class PROPERTYITEM
{
public:
const CLASSLISTITEM* highestlevelclass;
QStringList classWichIsNotFound;
QPropertyDeclarationAST *ast;
CPlusPlus::TranslationUnit* trlUnit;
bool readdefined;
FUNCTIONITEM *readFct;
bool writedefined;
FUNCTIONITEM *writeFct;
bool resetdefined;
FUNCTIONITEM *resetFct;
bool notifydefined;
FUNCTIONITEM *notifyFct;
bool foundalldefinedfct;
bool isEqualTo(PROPERTYITEM* cpppt);
PROPERTYITEM()
{
highestlevelclass = 0;
ast = 0;
trlUnit = 0;
readdefined = false;
readFct = 0;
writedefined = false;
writeFct = 0;
resetdefined = false;
resetFct = 0;
notifydefined = false;
notifyFct = 0;
foundalldefinedfct = false;
}
};
class QENUMITEM
{
public:
const CLASSLISTITEM* highestlevelclass;
CPlusPlus::TranslationUnit* trlUnit;
QStringList classWichIsNotFound;
QEnumDeclarationAST* ast;
//an item in this list will be shown like:
//EnumName.EnumItemName.Value
//ConnectionState.disconnected.0
QStringList values;
bool foundallenums;
bool isEqualTo(QENUMITEM *cpenum);
QENUMITEM()
{
highestlevelclass = 0;
trlUnit = 0;
ast = 0;
values.clear();
foundallenums = true;
}
};
class ENUMITEM
{
public:
const CLASSLISTITEM* highestlevelclass;
CPlusPlus::TranslationUnit* trlUnit;
QStringList classWichIsNotFound;
EnumSpecifierAST* ast;
ENUMITEM()
{
highestlevelclass = 0;
trlUnit = 0;
ast = 0;
}
};
class QFLAGITEM
{
public:
const CLASSLISTITEM* highestlevelclass;
CPlusPlus::TranslationUnit* trlUnit;
QStringList classWichIsNotFound;
QFlagsDeclarationAST* ast;
QStringList enumvalues;
bool foundallenums;
bool isEqualTo(QFLAGITEM *cpflag);
QFLAGITEM()
{
highestlevelclass = 0;
trlUnit = 0;
ast = 0;
enumvalues.clear();
foundallenums = true;
}
};
class QDECLAREFLAGSITEM
{
public:
const CLASSLISTITEM* highestlevelclass;
CPlusPlus::TranslationUnit* trlUnit;
QStringList classWichIsNotFound;
QDeclareFlagsDeclarationAST* ast;
QDECLAREFLAGSITEM()
{
highestlevelclass = 0;
trlUnit = 0;
ast = 0;
}
};
class ParseManager : public QObject
{
Q_OBJECT
public:
ParseManager();
virtual ~ParseManager();
void setIncludePath(const QStringList &includePath);
void parse(const QStringList &sourceFiles);
bool checkAllMetadatas(ParseManager* pInterfaceParserManager);
CppTools::Internal::CppPreprocessor *getPreProcessor() { return pCppPreprocessor; }
QList<CLASSTREE*> CreateClassLists();
QStringList getErrorMsg() { return m_errormsgs; }
private:
void parse(CppTools::Internal::CppPreprocessor *preproc, const QStringList &files);
void getBaseClasses(const CLASSLISTITEM* pclass, QList<CLASSLISTITEM*> &baseclasslist, const QList<CLASSLISTITEM*> &allclasslist);
void getElements(QList<FUNCTIONITEM*> &functionlist
, QList<PROPERTYITEM*> &propertylist
, QList<QENUMITEM*> &qenumlist
, QList<ENUMITEM*> &enumlist
, QList<QFLAGITEM*> &qflaglist
, QList<QDECLAREFLAGSITEM*> &qdeclareflaglist
, const QList<CLASSLISTITEM*> classitems
, const CLASSLISTITEM* highestlevelclass);
//<--- for Metadata functions checks
QList<FUNCTIONITEM*> checkMetadataFunctions(const QList<QList<FUNCTIONITEM*> > &classfctlist, const QList<QList<FUNCTIONITEM*> > &iclassfctlist);
bool isMetaObjFunction(FUNCTIONITEM* fct);
QList<FUNCTIONITEM*> containsAllMetadataFunction(const QList<FUNCTIONITEM*> &classfctlist, const QList<FUNCTIONITEM*> &iclassfctlist);
QString getErrorMessage(FUNCTIONITEM* fct);
//--->
//<--- for Q_PROPERTY functions checks
QList<PROPERTYITEM*> checkMetadataProperties(const QList<QList<PROPERTYITEM*> > &classproplist
, const QList<QList<FUNCTIONITEM*> > &classfctlist
, const QList<QList<PROPERTYITEM*> > &iclassproplist
, const QList<QList<FUNCTIONITEM*> > &iclassfctlist);
void assignPropertyFunctions(PROPERTYITEM* prop, const QList<QList<FUNCTIONITEM*> > &fctlookuplist);
QList<PROPERTYITEM*> containsAllPropertyFunction(const QList<PROPERTYITEM*> &classproplist, const QList<PROPERTYITEM*> &iclassproplist);
QString getErrorMessage(PROPERTYITEM* ppt);
//--->
//<--- for Q_ENUMS checks
QList<QENUMITEM*> checkMetadataEnums(const QList<QList<QENUMITEM*> > &classqenumlist
, const QList<QList<ENUMITEM*> > &classenumlist
, const QList<QList<QENUMITEM*> > &iclassqenumlist
, const QList<QList<ENUMITEM*> > &iclassenumlist);
QStringList getEnumValueStringList(ENUMITEM *penum, QString mappedenumname = "");
void assignEnumValues(QENUMITEM* qenum, const QList<QList<ENUMITEM*> > &enumlookuplist);
QList<QENUMITEM*> containsAllEnums(const QList<QENUMITEM*> &classqenumlist, const QList<QENUMITEM*> &iclassqenumlist);
QString getErrorMessage(QENUMITEM* qenum);
//--->
//<--- for QFlags checks --->
QList<QFLAGITEM*> checkMetadataFlags(const QList<QList<QFLAGITEM*> > &classqflaglist
, const QList<QList<QDECLAREFLAGSITEM*> > &classqdeclareflaglist
, const QList<QList<ENUMITEM*> > &classenumlist
, const QList<QList<QFLAGITEM*> > &iclassqflaglist
, const QList<QList<QDECLAREFLAGSITEM*> > &iclassqdeclareflaglist
, const QList<QList<ENUMITEM*> > &iclassenumlist);
void assignFlagValues(QFLAGITEM* qflags, const QList<QList<QDECLAREFLAGSITEM*> > &qdeclareflagslookuplist, const QList<QList<ENUMITEM*> > &enumlookuplist);
QList<QFLAGITEM*> containsAllFlags(const QList<QFLAGITEM*> &classqflaglist, const QList<QFLAGITEM*> &iclassqflaglist);
QString getErrorMessage(QFLAGITEM* pfg);
//--->
private:
// cache
QStringList m_includePaths;
QStringList m_frameworkPaths;
QByteArray m_definedMacros;
CppTools::Internal::CppPreprocessor* pCppPreprocessor;
QString m_strHeaderFile;
QStringList m_errormsgs;
};
}
#endif // PARSEMANAGER_H
REL_PATH_TO_SRC = ../../../src
QT += testlib
SOURCES += \
tst_icheckbuild.cpp
DEFINES += ICHECK_BUILD ICHECK_APP_BUILD
INCLUDEPATH += . \
$$REL_PATH_TO_SRC/../ \
$$REL_PATH_TO_SRC/global \
$$REL_PATH_TO_SRC/plugins \
$$REL_PATH_TO_SRC/libs \
$$REL_PATH_TO_SRC/shared/cplusplus \
$$REL_PATH_TO_SRC/libs/cplusplus
TARGET=tst_$$TARGET
include(./ichecklib.pri)
HEADERS += ./ichecklib.h \
./ichecklib_global.h \
./ParseManager.h
SOURCES += ./ichecklib.cpp \
./ParseManager.cpp
#include "ichecklib.h"
#include "ParseManager.h"
#include <QtCore/QCoreApplication>
#include <QString>
#include <QStringList>
#include <iostream>
#include <QDebug>
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QProcess>
QStringList getQTIncludePath()
{
QStringList ret;
QStringList processevironment = QProcess::systemEnvironment();
foreach(QString item, processevironment){
if(item.indexOf("QTDIR=") == 0){
QString qtpath = item.remove("QTDIR=");
ret << qtpath + "/include/QtCore";
break;
}
}
return ret;
}
ICheckLib::ICheckLib()
: pParseManager(0)
{
}
void ICheckLib::ParseHeader(const QStringList& includePath, const QStringList& filelist)
{
if(pParseManager)
delete pParseManager;
pParseManager = 0;
pParseManager = new CPlusPlus::ParseManager();
pParseManager->setIncludePath(includePath);
pParseManager->parse(filelist);
}
bool ICheckLib::check(const ICheckLib& ichecklib /*ICheckLib from interface header*/)
{
if(pParseManager){
CPlusPlus::ParseManager* cpparsemanager = ichecklib.pParseManager;
return pParseManager->checkAllMetadatas(cpparsemanager);
}
return false;
}
QStringList ICheckLib::getErrorMsg()
{
QStringList ret;
if(pParseManager){
ret.append(pParseManager->getErrorMsg());
}
else
ret << "no file was parsed.";
return ret;
}
#ifndef ICHECKLIB_H
#define ICHECKLIB_H
#include <QStringList>
#include "ichecklib_global.h"
namespace CPlusPlus{
class ParseManager;
}
class ICHECKLIBSHARED_EXPORT ICheckLib {
public:
ICheckLib();
void ParseHeader(const QStringList& includePath, const QStringList& filelist);
bool check(const ICheckLib& ichecklib /*ICheckLib from interface header*/);
QStringList getErrorMsg();
private:
CPlusPlus::ParseManager* pParseManager;
};
#endif // ICHECKLIB_H
# ----------------------------------------------------
# This file is generated by the Qt Visual Studio Add-in.
# ------------------------------------------------------
HEADERS += $$REL_PATH_TO_SRC/shared/cplusplus/Array.h \
$$REL_PATH_TO_SRC/shared/cplusplus/AST.h \
$$REL_PATH_TO_SRC/shared/cplusplus/ASTMatcher.h \
$$REL_PATH_TO_SRC/shared/cplusplus/ASTVisitor.h \
$$REL_PATH_TO_SRC/shared/cplusplus/CheckDeclaration.h \
$$REL_PATH_TO_SRC/shared/cplusplus/CheckDeclarator.h \
$$REL_PATH_TO_SRC/shared/cplusplus/CheckExpression.h \
$$REL_PATH_TO_SRC/shared/cplusplus/CheckName.h \
$$REL_PATH_TO_SRC/shared/cplusplus/CheckSpecifier.h \
$$REL_PATH_TO_SRC/shared/cplusplus/CheckStatement.h \
$$REL_PATH_TO_SRC/shared/cplusplus/Control.h \
$$REL_PATH_TO_SRC/plugins/coreplugin/core_global.h \
$$REL_PATH_TO_SRC/shared/cplusplus/CoreTypes.h \
$$REL_PATH_TO_SRC/shared/cplusplus/CPlusPlusForwardDeclarations.h \
$$REL_PATH_TO_SRC/libs/cplusplus/CppBindings.h \
$$REL_PATH_TO_SRC/libs/cplusplus/CppDocument.h \
$$REL_PATH_TO_SRC/shared/cplusplus/DiagnosticClient.h \
$$REL_PATH_TO_SRC/libs/cplusplus/FastPreprocessor.h \
$$REL_PATH_TO_SRC/shared/cplusplus/FullySpecifiedType.h \
$$REL_PATH_TO_SRC/libs/cplusplus/CheckUndefinedSymbols.h \
$$REL_PATH_TO_SRC/shared/cplusplus/ASTfwd.h \
$$REL_PATH_TO_SRC/libs/cplusplus/LookupContext.h \
$$REL_PATH_TO_SRC/libs/cplusplus/ResolveExpression.h \
$$REL_PATH_TO_SRC/libs/cplusplus/GenTemplateInstance.h \
$$REL_PATH_TO_SRC/shared/cplusplus/Lexer.h \
$$REL_PATH_TO_SRC/shared/cplusplus/Literals.h \
$$REL_PATH_TO_SRC/shared/cplusplus/LiteralTable.h \
$$REL_PATH_TO_SRC/libs/cplusplus/Macro.h \
$$REL_PATH_TO_SRC/shared/cplusplus/MemoryPool.h \
$$REL_PATH_TO_SRC/shared/cplusplus/Name.h \
$$REL_PATH_TO_SRC/libs/cplusplus/NamePrettyPrinter.h \
$$REL_PATH_TO_SRC/shared/cplusplus/Names.h \
$$REL_PATH_TO_SRC/shared/cplusplus/NameVisitor.h \
$$REL_PATH_TO_SRC/shared/cplusplus/ObjectiveCTypeQualifiers.h \
$$REL_PATH_TO_SRC/libs/cplusplus/Overview.h \
$$REL_PATH_TO_SRC/shared/cplusplus/Parser.h \
$$REL_PATH_TO_SRC/libs/cplusplus/pp-cctype.h \
$$REL_PATH_TO_SRC/libs/cplusplus/pp-engine.h \
$$REL_PATH_TO_SRC/libs/cplusplus/pp-macro-expander.h \
$$REL_PATH_TO_SRC/libs/cplusplus/pp-scanner.h \
$$REL_PATH_TO_SRC/libs/cplusplus/pp.h \
$$REL_PATH_TO_SRC/libs/cplusplus/PreprocessorClient.h \
$$REL_PATH_TO_SRC/libs/cplusplus/PreprocessorEnvironment.h \
$$REL_PATH_TO_SRC/libs/utils/qtcassert.h \
$$REL_PATH_TO_SRC/shared/cplusplus/Scope.h \
$$REL_PATH_TO_SRC/shared/cplusplus/Semantic.h \
$$REL_PATH_TO_SRC/shared/cplusplus/SemanticCheck.h \
$$REL_PATH_TO_SRC/shared/cplusplus/Symbol.h \
$$REL_PATH_TO_SRC/shared/cplusplus/Symbols.h \
$$REL_PATH_TO_SRC/shared/cplusplus/SymbolVisitor.h \
$$REL_PATH_TO_SRC/shared/cplusplus/Token.h \
$$REL_PATH_TO_SRC/shared/cplusplus/TranslationUnit.h \
$$REL_PATH_TO_SRC/shared/cplusplus/Type.h \
$$REL_PATH_TO_SRC/shared/cplusplus/TypeMatcher.h \
$$REL_PATH_TO_SRC/libs/cplusplus/TypePrettyPrinter.h \
$$REL_PATH_TO_SRC/shared/cplusplus/TypeVisitor.h
SOURCES += $$REL_PATH_TO_SRC/shared/cplusplus/Array.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/AST.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/ASTMatch0.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/ASTMatcher.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/ASTVisit.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/ASTVisitor.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/CheckDeclaration.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/CheckDeclarator.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/CheckExpression.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/CheckName.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/CheckSpecifier.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/CheckStatement.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/Control.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/CoreTypes.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/CppBindings.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/CppDocument.cpp \
$$REL_PATH_TO_SRC/plugins/cpptools/cppmodelmanager.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/DiagnosticClient.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/FastPreprocessor.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/FullySpecifiedType.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/CheckUndefinedSymbols.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/LookupContext.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/ResolveExpression.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/GenTemplateInstance.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/Keywords.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/Lexer.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/Literals.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/LiteralTable.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/Macro.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/MemoryPool.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/Name.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/NamePrettyPrinter.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/Names.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/NameVisitor.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/ObjectiveCAtKeywords.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/ObjectiveCTypeQualifiers.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/Overview.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/Parser.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/pp-engine.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/pp-macro-expander.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/pp-scanner.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/PreprocessorClient.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/PreprocessorEnvironment.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/Scope.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/Semantic.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/SemanticCheck.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/Symbol.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/Symbols.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/SymbolVisitor.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/Token.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/TranslationUnit.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/Type.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/TypeMatcher.cpp \
$$REL_PATH_TO_SRC/libs/cplusplus/TypePrettyPrinter.cpp \
$$REL_PATH_TO_SRC/shared/cplusplus/TypeVisitor.cpp
#ifndef ICHECKLIB_GLOBAL_H
#define ICHECKLIB_GLOBAL_H
#include <QtCore/qglobal.h>
#ifdef ICHECK_APP_BUILD
# define ICHECKLIBSHARED_EXPORT
#else
# if defined(ICHECKLIB_LIBRARY)
# define ICHECKLIBSHARED_EXPORT Q_DECL_EXPORT
# else
# define ICHECKLIBSHARED_EXPORT Q_DECL_IMPORT
# endif
#endif
#endif // ICHECKLIB_GLOBAL_H
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** Commercial Usage
**
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at http://qt.nokia.com/contact.
**
**************************************************************************/
#include <QtTest/QtTest>
#include "ichecklib.h"
#include <QDebug>
class tst_icheckbuild : public QObject
{
Q_OBJECT
private slots:
void doTests();
};
void tst_icheckbuild::doTests()
{
qDebug() << "icheck build was successful";
}
QTEST_MAIN(tst_icheckbuild)
#include "tst_icheckbuild.moc"
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment