Skip to content

Commit df00474

Browse files
authored
Merge pull request #14 from sandbox-science/testing
Init Unit Tests
2 parents 4f48a2e + 03ff076 commit df00474

File tree

12 files changed

+268
-45
lines changed

12 files changed

+268
-45
lines changed

CMakeLists.txt

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
cmake_minimum_required(VERSION 3.16)
22

33
# Project name
4-
set(TARGET_NAME CodeAstra)
4+
set(TARGET_NAME CodeAstraApp)
5+
set(EXECUTABLE_NAME CodeAstra)
56

67
set(QT_MAJOR_VERSION 6)
78

@@ -47,11 +48,10 @@ endif()
4748
set(CMAKE_PREFIX_PATH ${Qt_DIR})
4849

4950
# Find Qt Widgets
50-
find_package(Qt${QT_MAJOR_VERSION} COMPONENTS Widgets REQUIRED)
51+
find_package(Qt${QT_MAJOR_VERSION} COMPONENTS Widgets Test REQUIRED)
5152

52-
# Add executable and source files
53-
add_executable(${TARGET_NAME}
54-
src/main.cpp
53+
# Create the CodeAstra library
54+
add_library(${TARGET_NAME}
5555
src/MainWindow.cpp
5656
src/CodeEditor.cpp
5757
src/Syntax.cpp
@@ -65,29 +65,42 @@ add_executable(${TARGET_NAME}
6565
include/FileManager.h
6666
)
6767

68+
# Create the executable for the application
69+
add_executable(${EXECUTABLE_NAME}
70+
src/main.cpp
71+
)
72+
73+
# Link the main executable with the CodeAstra library and Qt libraries
74+
target_link_libraries(${EXECUTABLE_NAME} PRIVATE ${TARGET_NAME} Qt${QT_MAJOR_VERSION}::Widgets)
75+
76+
# Add the tests subdirectory
77+
add_subdirectory(tests)
78+
79+
# Qt resource files
6880
qt_add_resources(APP_RESOURCES resources.qrc)
69-
target_sources(${TARGET_NAME} PRIVATE ${APP_RESOURCES})
81+
target_sources(${EXECUTABLE_NAME} PRIVATE ${APP_RESOURCES})
7082

7183
# Compiler flags per OS
7284
if(MSVC)
73-
target_compile_options(${TARGET_NAME} PRIVATE /W4 /WX)
85+
target_compile_options(${EXECUTABLE_NAME} PRIVATE /W4 /WX)
7486
elseif(APPLE)
75-
target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra -pedantic -Werror)
76-
set_target_properties(${TARGET_NAME} PROPERTIES MACOSX_BUNDLE TRUE)
87+
target_compile_options(${EXECUTABLE_NAME} PRIVATE -Wall -Wextra -pedantic -Werror)
88+
set_target_properties(${EXECUTABLE_NAME} PROPERTIES MACOSX_BUNDLE TRUE)
7789
else()
78-
target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra -pedantic -Werror)
90+
target_compile_options(${EXECUTABLE_NAME} PRIVATE -Wall -Wextra -pedantic -Werror)
7991
endif()
8092

8193
# Include directories
82-
target_include_directories(${TARGET_NAME} PRIVATE ${Qt${QT_MAJOR_VERSION}_INCLUDE_DIRS})
94+
target_include_directories(${EXECUTABLE_NAME} PRIVATE ${Qt${QT_MAJOR_VERSION}_INCLUDE_DIRS})
95+
target_include_directories(${EXECUTABLE_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/include)
8396
target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/include)
8497

8598
# Set output names properly for Debug and Release
86-
set_target_properties(${TARGET_NAME} PROPERTIES
99+
set_target_properties(${EXECUTABLE_NAME} PROPERTIES
87100
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}"
88-
DEBUG_OUTPUT_NAME "${TARGET_NAME}d"
89-
RELEASE_OUTPUT_NAME ${TARGET_NAME}
101+
DEBUG_OUTPUT_NAME "${EXECUTABLE_NAME}d"
102+
RELEASE_OUTPUT_NAME ${EXECUTABLE_NAME}
90103
)
91104

92-
# Link necessary Qt libraries
105+
# Link necessary Qt libraries to CodeAstra library
93106
target_link_libraries(${TARGET_NAME} PRIVATE Qt${QT_MAJOR_VERSION}::Widgets)

Makefile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,11 @@ install:
7575
fi \
7676
fi
7777
@echo "$(PROJECT) installed."
78+
79+
test:
80+
@for test in ./build/tests/test_*; do \
81+
if [ -f $$test ]; then \
82+
echo "Running $$test..."; \
83+
$$test; \
84+
fi; \
85+
done

include/FileManager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public slots:
4343
void openFile();
4444
void loadFileInEditor(const QString &filePath);
4545

46+
QString getDirectoryPath() const;
47+
4648
private:
4749
FileManager(CodeEditor *editor, MainWindow *mainWindow);
4850
~FileManager();

include/MainWindow.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ class MainWindow : public QMainWindow
3131
// of the main window, alongside the code editor
3232
void initTree();
3333

34+
QAction *createAction(const QIcon &icon, const QString &text,
35+
const QKeySequence &shortcut, const QString &statusTip,
36+
const std::function<void()> &slot);
37+
3438
private slots:
3539
void showAbout();
3640

@@ -40,10 +44,6 @@ private slots:
4044
void createHelpActions(QMenu *helpMenu);
4145
void createAppActions(QMenu *appMenu);
4246

43-
QAction *createAction(const QIcon &icon, const QString &text,
44-
const QKeySequence &shortcut, const QString &statusTip,
45-
const std::function<void()> &slot);
46-
4747
std::unique_ptr<CodeEditor> m_editor;
4848
std::unique_ptr<Syntax> m_syntax;
4949
std::unique_ptr<Tree> m_tree;

include/Tree.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,18 @@ class Tree : public QObject
2222
Q_OBJECT
2323

2424
public:
25-
explicit Tree(QSplitter *splitter, FileManager *FileManager);
25+
explicit Tree(QSplitter *splitter);
2626
~Tree();
2727

28-
private:
29-
void showContextMenu(const QPoint &pos);
30-
void setupModel();
28+
void initialize(const QString &directory);
29+
void setupModel(const QString &directory);
3130
void setupTree();
3231
void openFile(const QModelIndex &index);
3332

34-
QString getDirectoryPath() const;
33+
private:
34+
void showContextMenu(const QPoint &pos);
3535

3636
std::unique_ptr<QFileIconProvider> m_iconProvider;
3737
std::unique_ptr<QFileSystemModel> m_model;
3838
std::unique_ptr<QTreeView> m_tree;
39-
40-
FileManager * m_FileManager;
4139
};

src/FileManager.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
#include "FileManager.h"
2+
#include "CodeEditor.h"
3+
#include "MainWindow.h"
24

35
#include <QFileDialog>
46
#include <QMessageBox>
57
#include <QTextStream>
68
#include <QFileInfo>
7-
#include "CodeEditor.h"
8-
#include "MainWindow.h"
99

1010
FileManager::FileManager(CodeEditor *editor, MainWindow *mainWindow)
1111
: m_editor(editor), m_mainWindow(mainWindow)
@@ -144,3 +144,10 @@ QString FileManager::getFileExtension() const
144144

145145
return QFileInfo(m_currentFileName).suffix().toLower();
146146
}
147+
148+
QString FileManager::getDirectoryPath() const
149+
{
150+
return QFileDialog::getExistingDirectory(
151+
nullptr, QObject::tr("Open Directory"), QDir::homePath(),
152+
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
153+
}

src/MainWindow.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ void MainWindow::initTree()
4545
QSplitter *splitter = new QSplitter(Qt::Horizontal, this);
4646
setCentralWidget(splitter);
4747

48-
m_tree = std::make_unique<Tree>(splitter, m_fileManager);
48+
m_tree = std::make_unique<Tree>(splitter);
4949

5050
splitter->addWidget(m_editor.get());
5151
splitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
@@ -62,8 +62,13 @@ void MainWindow::createMenuBar()
6262
QMenuBar *menuBar = new QMenuBar(this);
6363

6464
QMenu *fileMenu = menuBar->addMenu("File");
65+
fileMenu->setObjectName("File");
66+
6567
QMenu *helpMenu = menuBar->addMenu("Help");
66-
QMenu *appMenu = menuBar->addMenu("CodeAstra");
68+
helpMenu->setObjectName("Help");
69+
70+
QMenu *appMenu = menuBar->addMenu("CodeAstra");
71+
appMenu->setObjectName("CodeAstra");
6772

6873
createFileActions(fileMenu);
6974
createHelpActions(helpMenu);
@@ -75,6 +80,15 @@ void MainWindow::createMenuBar()
7580
void MainWindow::createFileActions(QMenu *fileMenu)
7681
{
7782
fileMenu->addAction(createAction(QIcon(), tr("&New"), QKeySequence::New, tr("Create a new file"), [this]() { m_fileManager->newFile(); }));
83+
fileMenu->addSeparator();
84+
fileMenu->addAction(createAction(QIcon(), tr("&Open &Project"), QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_O), tr("Open a project"), [this]()
85+
{
86+
QString projectPath = m_fileManager->getDirectoryPath();
87+
if (!projectPath.isEmpty())
88+
{
89+
m_tree->initialize(projectPath);
90+
}
91+
}));
7892
fileMenu->addAction(createAction(QIcon(), tr("&Open"), QKeySequence::Open, tr("Open an existing file"), [this]() { m_fileManager->openFile(); }));
7993
fileMenu->addSeparator();
8094
fileMenu->addAction(createAction(QIcon(), tr("&Save"), QKeySequence::Save, tr("Save the current file"), [this]() { m_fileManager->saveFile(); }));

src/Syntax.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "Syntax.h"
2+
23
#include <QColor>
34
#include <QFont>
45

src/Tree.cpp

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,26 @@
99
#include <QTreeView>
1010
#include <QMenu>
1111

12-
Tree::Tree(QSplitter *splitter, FileManager *FileManager)
12+
Tree::Tree(QSplitter *splitter)
1313
: QObject(splitter),
1414
m_iconProvider(std::make_unique<QFileIconProvider>()),
1515
m_model(std::make_unique<QFileSystemModel>()),
16-
m_tree(std::make_unique<QTreeView>(splitter)),
17-
m_FileManager(FileManager)
16+
m_tree(std::make_unique<QTreeView>(splitter))
1817
{
19-
setupModel();
20-
setupTree();
21-
2218
connect(m_tree.get(), &QTreeView::doubleClicked, this, &Tree::openFile);
2319
}
2420

2521
Tree::~Tree() {}
2622

27-
void Tree::setupModel()
23+
void Tree::initialize(const QString &directory)
2824
{
29-
m_model->setRootPath(getDirectoryPath());
25+
setupModel(directory);
26+
setupTree();
27+
}
28+
29+
void Tree::setupModel(const QString &directory)
30+
{
31+
m_model->setRootPath(directory);
3032
m_model->setIconProvider(m_iconProvider.get());
3133
m_model->setFilter(QDir::AllEntries | QDir::Hidden | QDir::NoDotAndDotDot);
3234
}
@@ -51,13 +53,6 @@ void Tree::setupTree()
5153
connect(m_tree.get(), &QTreeView::customContextMenuRequested, this, &Tree::showContextMenu);
5254
}
5355

54-
QString Tree::getDirectoryPath() const
55-
{
56-
return QFileDialog::getExistingDirectory(
57-
nullptr, QObject::tr("Open Directory"), QDir::homePath(),
58-
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
59-
}
60-
6156
void Tree::openFile(const QModelIndex &index)
6257
{
6358
QString filePath = m_model->filePath(index);

tests/CMakeLists.txt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Enable testing
2+
enable_testing()
3+
4+
# Add individual test executables
5+
add_executable(test_mainwindow
6+
test_mainwindow.cpp
7+
)
8+
9+
# Add test_tree executable
10+
add_executable(test_tree
11+
test_tree.cpp
12+
)
13+
14+
# Link the test with the CodeAstra library and necessary Qt libraries
15+
target_link_libraries(test_mainwindow PRIVATE ${TARGET_NAME} Qt6::Widgets Qt6::Test)
16+
target_link_libraries(test_tree PRIVATE ${TARGET_NAME} Qt6::Widgets Qt6::Test)
17+
18+
# Register each test with CTest
19+
add_test(NAME test_mainwindow COMMAND test_mainwindow)
20+
add_test(NAME test_tree COMMAND test_tree)
21+
22+
# Set the runtime output directory for the test executables
23+
set_target_properties(test_mainwindow PROPERTIES
24+
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/build/tests
25+
)
26+
set_target_properties(test_tree PROPERTIES
27+
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/build/tests
28+
)
29+
30+
set_property(SOURCE test_mainwindow.cpp PROPERTY SKIP_AUTOMOC OFF)
31+
set_property(SOURCE test_tree.cpp PROPERTY SKIP_AUTOMOC OFF)
32+
33+
# Include directories for tests
34+
target_include_directories(test_mainwindow PRIVATE ${CMAKE_SOURCE_DIR}/include)
35+
target_include_directories(test_tree PRIVATE ${CMAKE_SOURCE_DIR}/include)

0 commit comments

Comments
 (0)