added tests, refactored project structure

- TinyOrm is shared library now in src/ folder
 - added tests/ folder as subdirs project
 - some init tests for QueryBuilder and DatabaseConnection
 - renamed MANGO_DEBUG_SQL to TINYORM_DEBUG_SQL
This commit is contained in:
silverqx
2020-12-25 11:21:11 +01:00
parent 3aee49ce8d
commit a809798e6e
33 changed files with 544 additions and 140 deletions
+2
View File
@@ -0,0 +1,2 @@
TINYORM_SOURCE_TREE = $$PWD
TINYORM_BUILD_TREE = $$shadowed($$PWD)
+28
View File
@@ -62,3 +62,31 @@ struct RelationMethods
tmp notes:
----------
message(-------)
message(XXX config.pri)
message(PWD: $$PWD)
message(OUT_PWD: $$OUT_PWD)
message(_PRO_FILE_PWD_: $$_PRO_FILE_PWD_)
message(INCLUDEPATH: $$INCLUDEPATH)
message(-------)
#include <QDebug>
#include <qt_windows.h>
#include "testorm.h"
int main(int, char *[])
{
// SetConsoleOutputCP(CP_UTF8);
SetConsoleOutputCP(1250);
qDebug() << "";
TestOrm testOrm;
testOrm.run();
qDebug() << "\n";
}
+5 -113
View File
@@ -1,115 +1,7 @@
QT -= gui
QT += sql
TEMPLATE = subdirs
# Configuration
# ---
CONFIG += c++2a strict_c++ console silent
CONFIG -= c++11 app_bundle
SUBDIRS += \
src \
tests \
# Some info output
# ---
CONFIG(debug, debug|release): message( "Project is built in DEBUG mode." )
CONFIG(release, debug|release): message( "Project is built in RELEASE mode." )
# Disable debug output in release mode
CONFIG(release, debug|release) {
message( "Disabling debug output." )
DEFINES += QT_NO_DEBUG_OUTPUT
}
# TinyOrm defines
# ---
DEFINES += PROJECT_TINYORM
# Log queries with time measurement
DEFINES += MANGO_DEBUG_SQL
# Qt defines
# ---
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
#DEFINES += QT_NO_CAST_FROM_ASCII
#DEFINES += QT_RESTRICTED_CAST_FROM_ASCII
DEFINES += QT_NO_CAST_TO_ASCII
DEFINES += QT_NO_CAST_FROM_BYTEARRAY
DEFINES += QT_USE_QSTRINGBUILDER
DEFINES += QT_STRICT_ITERATORS
# WinApi
# ---
# Windows 10 1903 "19H1" - 0x0A000007
DEFINES += NTDDI_VERSION=0x0A000007
# Windows 10 - 0x0A00
DEFINES += _WIN32_WINNT=0x0A00
DEFINES += _WIN32_IE=0x0A00
DEFINES += UNICODE
DEFINES += _UNICODE
DEFINES += WIN32
DEFINES += _WIN32
DEFINES += WIN32_LEAN_AND_MEAN
DEFINES += NOMINMAX
win32-msvc* {
# I don't use -MP flag, because using jom
QMAKE_CXXFLAGS += -guard:cf -permissive- -Zc:ternary
QMAKE_LFLAGS += /guard:cf
QMAKE_LFLAGS_RELEASE += /OPT:REF /OPT:ICF=5
}
win32-g++* {
}
else:win32-msvc* {
# MySQL C library is used by ORM and it uses mysql_ping()
INCLUDEPATH += $$quote(C:/Program Files/MySQL/MySQL Server 8.0/include)
# range-v3
INCLUDEPATH += $$quote(E:/c/qMedia/vcpkg/installed/x64-windows/include)
# boost
INCLUDEPATH += $$quote(E:/c_libs/boost/boost_latest)
LIBS += $$quote(-LC:/Program Files/MySQL/MySQL Server 8.0/lib)
LIBS += libmysql.lib
}
# File version and windows manifest
# ---
win32:VERSION = 0.1.0.0
else:VERSION = 0.1.0
win32-msvc* {
QMAKE_TARGET_PRODUCT = TinyOrm
QMAKE_TARGET_DESCRIPTION = TinyOrm user friendly ORM
QMAKE_TARGET_COMPANY = Crystal Studio
QMAKE_TARGET_COPYRIGHT = Copyright (©) 2020 Crystal Studio
# RC_ICONS = images/qMedia.ico
RC_LANG = 1033
}
# Use Precompiled headers (PCH)
# ---
INCLUDEPATH += $$PWD
PRECOMPILED_HEADER = pch.h
precompile_header:!isEmpty(PRECOMPILED_HEADER) {
DEFINES += USING_PCH
}
HEADERS += pch.h
# Application source files
# ---
SOURCES += main.cpp
include(src/src.pri)
tests.depends = src
+67
View File
@@ -0,0 +1,67 @@
# Configuration
# ---
CONFIG *= c++2a strict_c++ silent warn_on
CONFIG -= c++11 app_bundle
# Qt defines
# ---
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
#DEFINES += QT_NO_CAST_FROM_ASCII
#DEFINES += QT_RESTRICTED_CAST_FROM_ASCII
DEFINES += QT_NO_CAST_TO_ASCII
DEFINES += QT_NO_CAST_FROM_BYTEARRAY
DEFINES += QT_USE_QSTRINGBUILDER
DEFINES += QT_STRICT_ITERATORS
# WinApi
# ---
# Windows 10 1903 "19H1" - 0x0A000007
DEFINES += NTDDI_VERSION=0x0A000007
# Windows 10 - 0x0A00
DEFINES += _WIN32_WINNT=0x0A00
DEFINES += _WIN32_IE=0x0A00
DEFINES += UNICODE
DEFINES += _UNICODE
DEFINES += WIN32
DEFINES += _WIN32
DEFINES += WIN32_LEAN_AND_MEAN
DEFINES += NOMINMAX
# Compilers
# ---
win32-msvc* {
# I don't use -MP flag, because using jom
QMAKE_CXXFLAGS += -guard:cf -permissive- -Zc:ternary
QMAKE_LFLAGS += /guard:cf
QMAKE_LFLAGS_RELEASE += /OPT:REF /OPT:ICF=5
}
# TinyOrm library headers
# ---
INCLUDEPATH += $$PWD/src
# Use Precompiled headers (PCH)
# ---
PRECOMPILED_HEADER = $$quote($$PWD/src/pch.h)
precompile_header:!isEmpty(PRECOMPILED_HEADER) {
DEFINES += USING_PCH
}
HEADERS += $$quote($$PWD/src/pch.h)
-18
View File
@@ -1,18 +0,0 @@
#include <QDebug>
#include <qt_windows.h>
#include "testorm.h"
int main(int, char *[])
{
// SetConsoleOutputCP(CP_UTF8);
SetConsoleOutputCP(1250);
qDebug() << "";
TestOrm testOrm;
testOrm.run();
qDebug() << "\n";
}
+18
View File
@@ -0,0 +1,18 @@
#ifndef TINYORM_EXPORT_H
#define TINYORM_EXPORT_H
#if defined(_MSC_VER) || defined(WIN64) || defined(_WIN64) || defined(__WIN64__) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
# define TINY_DECL_EXPORT __declspec(dllexport)
# define TINY_DECL_IMPORT __declspec(dllimport)
#else
# define TINY_DECL_EXPORT __attribute__((visibility("default")))
# define TINY_DECL_IMPORT __attribute__((visibility("default")))
#endif
#if defined(TINYORM_BUILDING_SHARED)
# define SHAREDLIB_EXPORT TINY_DECL_EXPORT
#else
# define SHAREDLIB_EXPORT TINY_DECL_IMPORT
#endif
#endif // TINYORM_EXPORT_H
+6 -6
View File
@@ -265,7 +265,7 @@ DatabaseConnection::statement(const QString &queryString,
{
auto query = prepareQuery(queryString, bindings);
#ifdef MANGO_DEBUG_SQL
#ifdef TINYORM_DEBUG_SQL
QElapsedTimer timer;
timer.start();
#endif
@@ -274,13 +274,13 @@ DatabaseConnection::statement(const QString &queryString,
if (!ok) {
qDebug() << "Statement in DatabaseConnection::statement() failed :"
<< query.lastError().text();
#ifdef MANGO_DEBUG_SQL
#ifdef TINYORM_DEBUG_SQL
logQuery(query, timer.elapsed());
#else
logQuery(query);
#endif
}
#ifdef MANGO_DEBUG_SQL
#ifdef TINYORM_DEBUG_SQL
else
logQuery(query, timer.elapsed());
#endif
@@ -294,7 +294,7 @@ DatabaseConnection::affectingStatement(const QString &queryString,
{
auto query = prepareQuery(queryString, bindings);
#ifdef MANGO_DEBUG_SQL
#ifdef TINYORM_DEBUG_SQL
QElapsedTimer timer;
timer.start();
#endif
@@ -304,13 +304,13 @@ DatabaseConnection::affectingStatement(const QString &queryString,
if (!ok) {
qDebug() << "Affecting statement in DatabaseConnection::affectingStatement() failed :"
<< query.lastError().text();
#ifdef MANGO_DEBUG_SQL
#ifdef TINYORM_DEBUG_SQL
logQuery(query, timer.elapsed());
#else
logQuery(query);
#endif
}
#ifdef MANGO_DEBUG_SQL
#ifdef TINYORM_DEBUG_SQL
else
logQuery(query, timer.elapsed());
#endif
+1 -1
View File
@@ -13,7 +13,7 @@ namespace MANGO_COMMON_NAMESPACE
namespace Orm
{
class DatabaseConnection final
class SHAREDLIB_EXPORT DatabaseConnection final
{
Q_DISABLE_COPY(DatabaseConnection)
+1 -1
View File
@@ -10,7 +10,7 @@ namespace MANGO_COMMON_NAMESPACE
namespace Orm
{
class Grammar
class SHAREDLIB_EXPORT Grammar
{
public:
/*! Compile a select query into SQL. */
+2
View File
@@ -6,7 +6,9 @@
#include <memory>
#include <any>
#include <typeindex>
#include <optional>
#include "export.h"
#include "orm/tiny/relations/relation.h"
class Torrent;
+3 -1
View File
@@ -8,6 +8,7 @@
#include "orm/expression.h"
#include "orm/ormtypes.h"
// TODO now rename mango to tinyorm silverqx
#ifdef MANGO_COMMON_NAMESPACE
namespace MANGO_COMMON_NAMESPACE
{
@@ -24,7 +25,8 @@ namespace Orm::Query
class JoinClause;
class Builder
class SHAREDLIB_EXPORT Builder
{
public:
Builder(const DatabaseConnection &db, const Grammar &grammar);
+2
View File
@@ -442,7 +442,9 @@ namespace Tiny
template<typename Model, typename ...AllRelations>
BaseModel<Model, AllRelations...>::BaseModel(const QVector<AttributeItem> &attributes)
#ifdef QT_DEBUG
: m_table(&model().u_table)
#endif
{
// Compile time check if a primary key type is supported by a QVariant
qMetaTypeId<typename Model::KeyType>();
View File
+4
View File
@@ -29,6 +29,7 @@ SOURCES += \
$$PWD/torrentpreviewablefileproperty.cpp \
HEADERS += \
$$PWD/export.h \
$$PWD/orm/databaseconnection.h \
$$PWD/orm/entitymanager.h \
$$PWD/orm/expression.h \
@@ -57,3 +58,6 @@ HEADERS += \
$$PWD/torrentpeer.h \
$$PWD/torrentpreviewablefile.h \
$$PWD/torrentpreviewablefileproperty.h \
SUBDIRS += \
$$PWD/src.pro
+80
View File
@@ -0,0 +1,80 @@
QT *= core sql
QT -= gui
TEMPLATE = lib
TARGET = TinyOrm
# Configuration
# ---
include($$TINYORM_SOURCE_TREE/config.pri)
# TinyOrm library specific configuration
# ---
CONFIG *= create_prl
#CONFIG *= create_libtool create_pc
# Some info output
# ---
CONFIG(debug, debug|release): message( "Project is built in DEBUG mode." )
CONFIG(release, debug|release): message( "Project is built in RELEASE mode." )
# Disable debug output in release mode
CONFIG(release, debug|release) {
message( "Disabling debug output." )
DEFINES += QT_NO_DEBUG_OUTPUT
}
# TinyOrm defines
# ---
DEFINES += PROJECT_TINYORM
# Log queries with time measurement
DEFINES += TINYORM_DEBUG_SQL
# Build as shared library
DEFINES += TINYORM_BUILDING_SHARED
# Dependencies include and library paths
# ---
win32-g++* {
}
else:win32-msvc* {
# MySQL C library is used by ORM and it uses mysql_ping()
INCLUDEPATH += $$quote(C:/Program Files/MySQL/MySQL Server 8.0/include)
# range-v3
INCLUDEPATH += $$quote(E:/c/qMedia/vcpkg/installed/x64-windows/include)
# boost
# INCLUDEPATH += $$quote(E:/c_libs/boost/boost_latest)
LIBS += $$quote(-LC:/Program Files/MySQL/MySQL Server 8.0/lib)
LIBS += libmysql.lib
}
# File version and windows manifest
# ---
win32:VERSION = 0.1.0.0
else:VERSION = 0.1.0
win32-msvc* {
QMAKE_TARGET_PRODUCT = TinyOrm
QMAKE_TARGET_DESCRIPTION = TinyOrm user friendly ORM
QMAKE_TARGET_COMPANY = Crystal Studio
QMAKE_TARGET_COPYRIGHT = Copyright (©) 2020 Crystal Studio
# RC_ICONS = images/qMedia.ico
RC_LANG = 1033
}
# TinyOrm library source files
# ---
include(src.pri)
# Default rules for deployment
# ---
release {
win32-msvc*: target.path = c:/optx64/$${TARGET}
!isEmpty(target.path): INSTALLS += target
}
+5
View File
@@ -0,0 +1,5 @@
TEMPLATE = subdirs
SUBDIRS = \
functional \
unit \
+4
View File
@@ -0,0 +1,4 @@
TEMPLATE = subdirs
SUBDIRS = \
orm \
+4
View File
@@ -0,0 +1,4 @@
TEMPLATE = subdirs
SUBDIRS = \
query \
@@ -0,0 +1,4 @@
TEMPLATE = subdirs
SUBDIRS = \
querybuilder
@@ -0,0 +1,3 @@
include($$TINYORM_SOURCE_TREE/tests/config.pri)
SOURCES = tst_querybuilder.cpp
@@ -0,0 +1,48 @@
#include <QtTest>
#include "orm/databaseconnection.h"
#include "orm/grammar.h"
#include "orm/query/querybuilder.h"
class tst_QueryBuilder : public QObject
{
Q_OBJECT
public:
tst_QueryBuilder();
~tst_QueryBuilder();
private slots:
void initTestCase();
void cleanupTestCase();
void test_case1();
};
tst_QueryBuilder::tst_QueryBuilder()
{
}
tst_QueryBuilder::~tst_QueryBuilder()
{
}
void tst_QueryBuilder::initTestCase()
{
}
void tst_QueryBuilder::cleanupTestCase()
{
}
void tst_QueryBuilder::test_case1()
{
}
QTEST_APPLESS_MAIN(tst_QueryBuilder)
#include "tst_querybuilder.moc"
+5
View File
@@ -0,0 +1,5 @@
TEMPLATE = subdirs
SUBDIRS = \
orm \
query \
@@ -0,0 +1,3 @@
include($$TINYORM_SOURCE_TREE/tests/config.pri)
SOURCES = tst_databaseconnection.cpp
@@ -0,0 +1,51 @@
#include <QtTest>
#include "orm/databaseconnection.h"
class tst_DatabaseConnection : public QObject
{
Q_OBJECT
public:
tst_DatabaseConnection();
~tst_DatabaseConnection();
private slots:
void initTestCase();
void cleanupTestCase();
void pingDatabase();
};
tst_DatabaseConnection::tst_DatabaseConnection()
{
}
tst_DatabaseConnection::~tst_DatabaseConnection()
{
}
void tst_DatabaseConnection::initTestCase()
{
}
void tst_DatabaseConnection::cleanupTestCase()
{
}
void tst_DatabaseConnection::pingDatabase()
{
auto &conn = Orm::DatabaseConnection::instance();
const auto result = conn.pingDatabase();
QVERIFY2(result, "Ping database failed.");
}
QTEST_APPLESS_MAIN(tst_DatabaseConnection)
#include "tst_databaseconnection.moc"
@@ -0,0 +1,3 @@
include($$TINYORM_SOURCE_TREE/tests/config.pri)
SOURCES = tst_grammar.cpp
@@ -0,0 +1,47 @@
#include <QtTest>
#include "orm/grammar.h"
class tst_Grammar : public QObject
{
Q_OBJECT
public:
tst_Grammar();
~tst_Grammar();
private slots:
void initTestCase();
void cleanupTestCase();
void test_case1();
};
tst_Grammar::tst_Grammar()
{
}
tst_Grammar::~tst_Grammar()
{
}
void tst_Grammar::initTestCase()
{
}
void tst_Grammar::cleanupTestCase()
{
}
void tst_Grammar::test_case1()
{
}
QTEST_APPLESS_MAIN(tst_Grammar)
#include "tst_grammar.moc"
+5
View File
@@ -0,0 +1,5 @@
TEMPLATE = subdirs
SUBDIRS = \
databaseconnection \
grammar \
+4
View File
@@ -0,0 +1,4 @@
TEMPLATE = subdirs
SUBDIRS = \
querybuilder
@@ -0,0 +1,3 @@
include($$TINYORM_SOURCE_TREE/tests/config.pri)
SOURCES = tst_querybuilder.cpp
@@ -0,0 +1,102 @@
#include <QtTest>
#include "orm/databaseconnection.h"
#include "orm/grammar.h"
#include "orm/query/querybuilder.h"
class tst_QueryBuilder : public QObject
{
Q_OBJECT
public:
tst_QueryBuilder();
~tst_QueryBuilder();
private slots:
void initTestCase();
void cleanupTestCase();
void setDistinct();
void setTable();
void setFrom();
};
tst_QueryBuilder::tst_QueryBuilder()
{
}
tst_QueryBuilder::~tst_QueryBuilder()
{
}
void tst_QueryBuilder::initTestCase()
{
}
void tst_QueryBuilder::cleanupTestCase()
{
}
void tst_QueryBuilder::setDistinct()
{
Orm::QueryBuilder builder(Orm::DatabaseConnection::instance(),
Orm::Grammar());
auto distinct = builder.getDistinct();
QCOMPARE(distinct, false);
builder.distinct();
distinct = builder.getDistinct();
QCOMPARE(distinct, true);
}
void tst_QueryBuilder::setTable()
{
Orm::QueryBuilder builder(Orm::DatabaseConnection::instance(),
Orm::Grammar());
auto table = builder.getTable();
auto tableFrom = builder.getFrom();
const auto &expected = QStringLiteral("");
QCOMPARE(table, expected);
QCOMPARE(tableFrom, expected);
const auto &newTableName = QStringLiteral("table_name");
builder.table(newTableName);
table = builder.getTable();
tableFrom = builder.getFrom();
QCOMPARE(table, newTableName);
QCOMPARE(tableFrom, newTableName);
}
void tst_QueryBuilder::setFrom()
{
Orm::QueryBuilder builder(Orm::DatabaseConnection::instance(),
Orm::Grammar());
auto table = builder.getTable();
auto tableFrom = builder.getFrom();
const auto &expected = QStringLiteral("");
QCOMPARE(table, expected);
QCOMPARE(tableFrom, expected);
const auto &newTableName = QStringLiteral("table_name");
builder.from(newTableName);
table = builder.getTable();
tableFrom = builder.getFrom();
QCOMPARE(table, newTableName);
QCOMPARE(tableFrom, newTableName);
}
QTEST_APPLESS_MAIN(tst_QueryBuilder)
#include "tst_querybuilder.moc"
+4
View File
@@ -0,0 +1,4 @@
TEMPLATE = subdirs
SUBDIRS = \
orm \
+27
View File
@@ -0,0 +1,27 @@
QT *= core sql testlib
QT -= gui
TEMPLATE = app
# Common configuration
# ---
include($$TINYORM_SOURCE_TREE/config.pri)
# Tests specific configuration
# ---
CONFIG *= qt console testcase link_prl
# Link against TinyOrm library
# ---
win32:CONFIG(release, debug|release) {
LIBS += -L$$TINYORM_BUILD_TREE/src/release/ -lTinyOrm0
}
else:win32:CONFIG(debug, debug|release) {
LIBS += -L$$TINYORM_BUILD_TREE/src/debug/ -lTinyOrm0
}
else:unix {
LIBS += -L$$TINYORM_BUILD_TREE/src/ -lTinyOrm0
}
+3
View File
@@ -0,0 +1,3 @@
TEMPLATE = subdirs
SUBDIRS = auto