mirror of
https://github.com/sqlitebrowser/sqlitebrowser.git
synced 2026-02-12 14:48:30 -06:00
Tests: Add unit tests for CSV import
Add a new test class for testing the import functionality. Currently it's only covers some test cases for the CSV import. Since the function to test here (DBBrowserDB::decodeCSV) is part of the DBBrowserDB class, that class has a reference to the main window and the main window basically depends on the entire rest of the project the makefile grew quite a bit unfortunately.
This commit is contained in:
@@ -12,8 +12,8 @@ CONFIG += warn_on
|
||||
# create a unittest option
|
||||
CONFIG(unittest) {
|
||||
CONFIG += qtestlib
|
||||
HEADERS += tests/testsqlobjects.h
|
||||
SOURCES += tests/testsqlobjects.cpp
|
||||
HEADERS += tests/testsqlobjects.h tests/TestImport.h
|
||||
SOURCES += tests/testsqlobjects.cpp tests/TestImport.cpp tests/TestMain.cpp
|
||||
} else {
|
||||
SOURCES += main.cpp
|
||||
}
|
||||
|
||||
98
src/tests/TestImport.cpp
Normal file
98
src/tests/TestImport.cpp
Normal file
@@ -0,0 +1,98 @@
|
||||
#include <QTemporaryFile>
|
||||
#include <QtTest/QTest>
|
||||
|
||||
#include "Application.h"
|
||||
#include "TestImport.h"
|
||||
#include "../sqlitedb.h"
|
||||
|
||||
void TestImport::csvImport()
|
||||
{
|
||||
// Fetch data
|
||||
QFETCH(QString, csv);
|
||||
QFETCH(char, separator);
|
||||
QFETCH(char, quote);
|
||||
QFETCH(int, numfields);
|
||||
QFETCH(QStringList, result);
|
||||
|
||||
// Init basic application
|
||||
int argcount = 1;
|
||||
const char* appname = "sqlb-unittests";
|
||||
Application app(argcount, const_cast<char**>(&appname));
|
||||
|
||||
// Create temporary CSV file
|
||||
QTemporaryFile file;
|
||||
QVERIFY(file.open());
|
||||
file.write(csv.toUtf8());
|
||||
file.flush();
|
||||
|
||||
// Call decodeCSV function
|
||||
DBBrowserDB db;
|
||||
int numfields_read;
|
||||
QStringList retval = db.decodeCSV(file.fileName(), separator, quote, -1, &numfields_read);
|
||||
|
||||
// Check return values
|
||||
QCOMPARE(retval, result);
|
||||
QCOMPARE(numfields_read, numfields);
|
||||
}
|
||||
|
||||
void TestImport::csvImport_data()
|
||||
{
|
||||
QTest::addColumn<QString>("csv");
|
||||
QTest::addColumn<char>("separator");
|
||||
QTest::addColumn<char>("quote");
|
||||
QTest::addColumn<int>("numfields");
|
||||
QTest::addColumn<QStringList>("result");
|
||||
|
||||
QStringList result;
|
||||
result << "a" << "b" << "c" << "d" << "e" << "f" << "g" << "h" << "i";
|
||||
QTest::newRow("commas_noquotes") << "a,b,c\nd,e,f\ng,h,i\n"
|
||||
<< ','
|
||||
<< (char)0
|
||||
<< 3
|
||||
<< result;
|
||||
QTest::newRow("semicolons_noquotes") << "a;b;c\nd;e;f\ng;h;i\n"
|
||||
<< ';'
|
||||
<< (char)0
|
||||
<< 3
|
||||
<< result;
|
||||
QTest::newRow("commas_doublequotes") << "\"a\",\"b\",\"c\"\n\"d\",\"e\",\"f\"\n\"g\",\"h\",\"i\"\n"
|
||||
<< ','
|
||||
<< '"'
|
||||
<< 3
|
||||
<< result;
|
||||
QTest::newRow("noquotes_butquotesset") << "a,b,c\nd,e,f\ng,h,i\n"
|
||||
<< ','
|
||||
<< '"'
|
||||
<< 3
|
||||
<< result;
|
||||
QTest::newRow("windowslinebreaks") << "a,b,c\r\nd,e,f\r\ng,h,i\r\n"
|
||||
<< ','
|
||||
<< (char)0
|
||||
<< 3
|
||||
<< result;
|
||||
|
||||
result.clear();
|
||||
result << "a" << "b" << "c";
|
||||
QTest::newRow("oneline") << "a,b,c"
|
||||
<< ','
|
||||
<< (char)0
|
||||
<< 3
|
||||
<< result;
|
||||
|
||||
result.clear();
|
||||
result << "a,a\"" << "b" << "c" << "d" << "e" << "\"\"f,f";
|
||||
QTest::newRow("manyquotes") << "\"a,a\"\"\",\"b\",\"c\"\n\"d\",\"e\",\"\"\"\"\"f,f\"\n"
|
||||
<< ','
|
||||
<< '"'
|
||||
<< 3
|
||||
<< result;
|
||||
|
||||
result.clear();
|
||||
result << QString::fromUtf8("\u4E18") << QString::fromUtf8("\u4E26") << QString::fromUtf8("\u4E4B");
|
||||
QString csv = QString::fromUtf8("\u4E18") + "," + QString::fromUtf8("\u4E26") + "," + QString::fromUtf8("\u4E4B") + "\n";
|
||||
QTest::newRow("utf8chars") << csv
|
||||
<< ','
|
||||
<< (char)0
|
||||
<< 3
|
||||
<< result;
|
||||
}
|
||||
15
src/tests/TestImport.h
Normal file
15
src/tests/TestImport.h
Normal file
@@ -0,0 +1,15 @@
|
||||
#ifndef __TESTIMPORT_H__
|
||||
#define __TESTIMPORT_H__
|
||||
|
||||
#include <QObject>
|
||||
|
||||
class TestImport : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
void csvImport();
|
||||
void csvImport_data();
|
||||
};
|
||||
|
||||
#endif
|
||||
17
src/tests/TestMain.cpp
Normal file
17
src/tests/TestMain.cpp
Normal file
@@ -0,0 +1,17 @@
|
||||
#include <QtTest/QTest>
|
||||
#include "tests/testsqlobjects.h"
|
||||
#include "tests/TestImport.h"
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int status = 0;
|
||||
{
|
||||
TestTable tc;
|
||||
status |= QTest::qExec(&tc, argc, argv);
|
||||
}
|
||||
{
|
||||
TestImport tc;
|
||||
status |= QTest::qExec(&tc, argc, argv);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
@@ -249,6 +249,3 @@ void TestTable::createTableWithNotLikeConstraint()
|
||||
QVERIFY(tab.fields().at(5)->check() == "value6 NOT BETWEEN 1 AND 100");
|
||||
QVERIFY(tab.fields().at(6)->check() == "NOT EXISTS ( 1 )");
|
||||
}
|
||||
|
||||
QTEST_MAIN(TestTable)
|
||||
//#include "testsqlobjects.moc"
|
||||
|
||||
@@ -8,47 +8,174 @@ if(NOT CMAKE_BUILD_TYPE)
|
||||
endif()
|
||||
|
||||
set(ANTLR_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../libs/antlr-2.7.7)
|
||||
set(QHEXEDIT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../libs/qhexedit)
|
||||
set(QCUSTOMPLOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../libs/qcustomplot-source)
|
||||
|
||||
add_subdirectory(${ANTLR_DIR} ${CMAKE_CURRENT_BINARY_DIR}/antlr)
|
||||
add_subdirectory(${QHEXEDIT_DIR} ${CMAKE_CURRENT_BINARY_DIR}/qcustomplot-source)
|
||||
add_subdirectory(${QCUSTOMPLOT_DIR} ${CMAKE_CURRENT_BINARY_DIR}/qhexedit)
|
||||
|
||||
if(USE_QT5)
|
||||
find_package(Qt5Widgets REQUIRED)
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
else()
|
||||
find_package(Qt4 COMPONENTS QtCore QtTest REQUIRED)
|
||||
find_package(Qt4 COMPONENTS QtTest QtCore QtGui QtNetwork REQUIRED)
|
||||
include(${QT_USE_FILE})
|
||||
add_definitions(${QT_DEFINITIONS})
|
||||
endif()
|
||||
|
||||
set(SQLB_SRC
|
||||
../src/sqlitetypes.cpp
|
||||
../src/grammar/Sqlite3Lexer.cpp
|
||||
../src/grammar/Sqlite3Parser.cpp
|
||||
../src/tests/testsqlobjects.cpp)
|
||||
|
||||
set(SQLB_HDR
|
||||
../src/gen_version.h
|
||||
../src/sqlitedb.h
|
||||
../src/sqlitetypes.h
|
||||
../src/grammar/sqlite3TokenTypes.hpp
|
||||
../src/grammar/Sqlite3Lexer.hpp
|
||||
../src/grammar/Sqlite3Parser.hpp
|
||||
../src/sqlitetypes.h)
|
||||
)
|
||||
|
||||
set(SQLB_MOC_HDR
|
||||
../src/tests/testsqlobjects.h)
|
||||
../src/AboutDialog.h
|
||||
../src/CreateIndexDialog.h
|
||||
../src/EditDialog.h
|
||||
../src/EditTableDialog.h
|
||||
../src/ExportCsvDialog.h
|
||||
../src/ExtendedTableWidget.h
|
||||
../src/FilterTableHeader.h
|
||||
../src/ImportCsvDialog.h
|
||||
../src/MainWindow.h
|
||||
../src/PreferencesDialog.h
|
||||
../src/SQLiteSyntaxHighlighter.h
|
||||
../src/SqlExecutionArea.h
|
||||
../src/VacuumDialog.h
|
||||
../src/sqlitetablemodel.h
|
||||
../src/sqltextedit.h
|
||||
../src/DbStructureModel.h
|
||||
../src/Application.h
|
||||
../src/tests/TestImport.h
|
||||
../src/tests/testsqlobjects.h
|
||||
)
|
||||
|
||||
if(NOT USE_QT5)
|
||||
QT4_WRAP_CPP(SQLB_MOC ${SQLB_MOC_HDR})
|
||||
endif()
|
||||
set(SQLB_SRC
|
||||
../src/AboutDialog.cpp
|
||||
../src/CreateIndexDialog.cpp
|
||||
../src/EditDialog.cpp
|
||||
../src/EditTableDialog.cpp
|
||||
../src/ExportCsvDialog.cpp
|
||||
../src/ExtendedTableWidget.cpp
|
||||
../src/FilterTableHeader.cpp
|
||||
../src/ImportCsvDialog.cpp
|
||||
../src/MainWindow.cpp
|
||||
../src/PreferencesDialog.cpp
|
||||
../src/SQLiteSyntaxHighlighter.cpp
|
||||
../src/SqlExecutionArea.cpp
|
||||
../src/VacuumDialog.cpp
|
||||
../src/sqlitedb.cpp
|
||||
../src/sqlitetablemodel.cpp
|
||||
../src/sqlitetypes.cpp
|
||||
../src/sqltextedit.cpp
|
||||
../src/DbStructureModel.cpp
|
||||
../src/Application.cpp
|
||||
../src/grammar/Sqlite3Lexer.cpp
|
||||
../src/grammar/Sqlite3Parser.cpp
|
||||
../src/tests/TestImport.cpp
|
||||
../src/tests/testsqlobjects.cpp
|
||||
../src/tests/TestMain.cpp
|
||||
)
|
||||
|
||||
include_directories(${ANTLR_DIR})
|
||||
set(SQLB_FORMS
|
||||
../src/AboutDialog.ui
|
||||
../src/CreateIndexDialog.ui
|
||||
../src/EditDialog.ui
|
||||
../src/EditTableDialog.ui
|
||||
../src/ExportCsvDialog.ui
|
||||
../src/ImportCsvDialog.ui
|
||||
../src/MainWindow.ui
|
||||
../src/PreferencesDialog.ui
|
||||
../src/SqlExecutionArea.ui
|
||||
../src/VacuumDialog.ui
|
||||
)
|
||||
|
||||
add_executable(${PROJECT_NAME} ${SQLB_MOC} ${SQLB_HDR} ${SQLB_SRC})
|
||||
set(SQLB_RESOURCES
|
||||
../src/icons/icons.qrc
|
||||
)
|
||||
|
||||
if(USE_QT5)
|
||||
qt5_use_modules(${PROJECT_NAME} Test)
|
||||
set(QT_LIBRARIES "")
|
||||
qt5_wrap_ui(SQLB_FORM_HDR ${SQLB_FORMS})
|
||||
qt5_add_resources(SQLB_RESOURCES_RCC ${SQLB_RESOURCES})
|
||||
else()
|
||||
QT4_WRAP_CPP(SQLB_MOC ${SQLB_MOC_HDR})
|
||||
QT4_WRAP_UI(SQLB_FORM_HDR ${SQLB_FORMS})
|
||||
QT4_ADD_RESOURCES(SQLB_RESOURCES_RCC ${SQLB_RESOURCES})
|
||||
endif()
|
||||
|
||||
add_dependencies(${PROJECT_NAME} antlr)
|
||||
target_link_libraries(${PROJECT_NAME} antlr ${QT_LIBRARIES})
|
||||
# get git version hash
|
||||
file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/../src/gen_version.h
|
||||
"#ifndef __GEN_VERSIONS_H__\n"
|
||||
"#define __GEN_VERSIONS_H__\n"
|
||||
"#define APP_VERSION \"master_git\"\n"
|
||||
"#define MAJOR_VERSION 999\n"
|
||||
"#define MINOR_VERSION 0\n"
|
||||
"#define PATCH_VERSION 0\n"
|
||||
"#endif\n")
|
||||
|
||||
MESSAGE(STATUS "Build type is ${CMAKE_BUILD_TYPE}")
|
||||
#icon and correct libs/subsystem for windows
|
||||
if(WIN32)
|
||||
#enable version check for windows
|
||||
add_definitions(-DCHECKNEWVERSION)
|
||||
|
||||
IF( MINGW )
|
||||
# resource compilation for MinGW
|
||||
ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/sqlbicon.o
|
||||
COMMAND windres -I${CMAKE_CURRENT_SOURCE_DIR} -i${CMAKE_CURRENT_SOURCE_DIR}/src/winapp.rc -o ${CMAKE_CURRENT_BINARY_DIR}/sqlbicon.o )
|
||||
set(SQLB_SRC ${SQLB_SRC} ${CMAKE_CURRENT_BINARY_DIR}/sqlbicon.o)
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-subsystem,windows")
|
||||
set(WIN32_STATIC_LINK -Wl,-Bstatic -lssl -lcrypto -lws2_32)
|
||||
set(ADDITIONAL_LIBS lcms lzma)
|
||||
ELSE( MINGW )
|
||||
set(SQLB_SRC ${SQLB_SRC} ${CMAKE_CURRENT_SOURCE_DIR}src/winapp.rc)
|
||||
ENDIF( MINGW )
|
||||
endif(WIN32)
|
||||
|
||||
# add extra library path for MacOS
|
||||
if(APPLE)
|
||||
find_library(LIBSQLITE sqlite3 HINTS /usr/local/lib /usr/local/opt/sqlite/lib)
|
||||
set(ADDITIONAL_INCLUDE_PATHS /usr/local/include /usr/local/opt/sqlite/include)
|
||||
else(APPLE)
|
||||
find_library(LIBSQLITE sqlite3)
|
||||
endif(APPLE)
|
||||
|
||||
include_directories(
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${ANTLR_DIR}
|
||||
${QHEXEDIT_DIR}
|
||||
${QCUSTOMPLOT_DIR}
|
||||
${ADDITIONAL_INCLUDE_PATHS}
|
||||
../src)
|
||||
|
||||
add_executable(${PROJECT_NAME}
|
||||
${SQLB_HDR}
|
||||
${SQLB_SRC}
|
||||
${SQLB_FORM_HDR}
|
||||
${SQLB_MOC}
|
||||
${SQLB_RESOURCES_RCC})
|
||||
|
||||
if(USE_QT5)
|
||||
qt5_use_modules(${PROJECT_NAME} Gui Widgets Network Test PrintSupport)
|
||||
set(QT_LIBRARIES "")
|
||||
endif()
|
||||
add_dependencies(${PROJECT_NAME} antlr qhexedit qcustomplot)
|
||||
|
||||
link_directories(
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${ANTLR_DIR}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${QHEXEDIT_DIR}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${QCUSTOMPLOT_DIR})
|
||||
|
||||
target_link_libraries(${PROJECT_NAME}
|
||||
antlr
|
||||
qhexedit
|
||||
qcustomplot
|
||||
${QT_LIBRARIES}
|
||||
${WIN32_STATIC_LINK}
|
||||
${LIBSQLITE}
|
||||
${ADDITIONAL_LIBS})
|
||||
|
||||
Reference in New Issue
Block a user