Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .clang-format
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
# ro-Control clang-format configuration
# CI bu dosyayı kullanır — değişiklik yapılırsa tüm kaynak dosyalar yeniden formatlanmalı.
# Kullanım: find src/ -name "*.cpp" -o -name "*.h" | xargs clang-format -i

BasedOnStyle: LLVM
Language: Cpp
ColumnLimit: 80
IndentWidth: 2
TabWidth: 2
UseTab: Never
BreakBeforeBraces: Attach
AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
SortIncludes: true
IncludeBlocks: Preserve
...
8 changes: 6 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,22 @@ jobs:
qt6-qtwayland-devel \
kf6-qqc2-desktop-style \
polkit-devel \
clang-tools-extra
clang-tools-extra \
qt6-qtbase-private-devel

- name: Configure (CMake)
run: |
cmake -B build \
-GNinja \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_TESTS=OFF
-DBUILD_TESTS=ON

- name: Build
run: cmake --build build --parallel

- name: Run tests
run: cd build && ctest --output-on-failure

- name: Check formatting (clang-format)
run: |
find src/ -name "*.cpp" -o -name "*.h" | \
Expand Down
41 changes: 41 additions & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
find_package(Qt6 REQUIRED COMPONENTS Test)

# ─── Detector Tests ──────────────────────────────────────────────────────────
qt_add_executable(test_detector
test_detector.cpp
${CMAKE_SOURCE_DIR}/src/backend/nvidia/detector.cpp
${CMAKE_SOURCE_DIR}/src/backend/system/commandrunner.cpp
)

target_include_directories(test_detector PRIVATE
${CMAKE_SOURCE_DIR}/src
${CMAKE_SOURCE_DIR}/src/backend
)

target_link_libraries(test_detector PRIVATE
Qt6::Core
Qt6::Test
)

add_test(NAME test_detector COMMAND test_detector)

# ─── Monitor Tests ───────────────────────────────────────────────────────────
qt_add_executable(test_monitor
test_monitor.cpp
${CMAKE_SOURCE_DIR}/src/backend/monitor/cpumonitor.cpp
${CMAKE_SOURCE_DIR}/src/backend/monitor/gpumonitor.cpp
${CMAKE_SOURCE_DIR}/src/backend/monitor/rammonitor.cpp
${CMAKE_SOURCE_DIR}/src/backend/system/commandrunner.cpp
)

target_include_directories(test_monitor PRIVATE
${CMAKE_SOURCE_DIR}/src
${CMAKE_SOURCE_DIR}/src/backend
)

target_link_libraries(test_monitor PRIVATE
Qt6::Core
Qt6::Test
)

add_test(NAME test_monitor COMMAND test_monitor)
73 changes: 73 additions & 0 deletions tests/test_detector.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
#include <QTest>

#include "nvidia/detector.h"

class TestDetector : public QObject {
Q_OBJECT

private slots:
// Sınıf oluşturulabiliyor mu?
void testConstruction() {
NvidiaDetector detector;
// Crash olmadan oluşturulabiliyorsa geçer
QVERIFY(true);
}

// GpuInfo struct varsayılan değerleri
void testGpuInfoDefaults() {
NvidiaDetector::GpuInfo info{};
QCOMPARE(info.found, false);
QVERIFY(info.name.isEmpty());
QVERIFY(info.driverVersion.isEmpty());
QCOMPARE(info.driverLoaded, false);
QCOMPARE(info.nouveauActive, false);
}

// detect() çağrılabiliyor mu? (donanım olmadan bile çökmemeli)
void testDetectDoesNotCrash() {
NvidiaDetector detector;
auto info = detector.detect();
// NVIDIA yoksa found=false olmalı, crash olmamalı
Q_UNUSED(info);
QVERIFY(true);
}

// hasNvidiaGpu() — dönüş tipi bool
void testHasNvidiaGpu() {
NvidiaDetector detector;
bool result = detector.hasNvidiaGpu();
// Sonuç true veya false olabilir — önemli olan crash olmaması
Q_UNUSED(result);
QVERIFY(true);
}

// isDriverInstalled() — dönüş tipi bool
void testIsDriverInstalled() {
NvidiaDetector detector;
bool result = detector.isDriverInstalled();
Q_UNUSED(result);
QVERIFY(true);
}

// installedDriverVersion() — boş string veya versiyon döner
void testInstalledDriverVersion() {
NvidiaDetector detector;
QString version = detector.installedDriverVersion();
// Versiyon varsa "xxx.xx.xx" gibi olmalı, yoksa boş string
if (!version.isEmpty()) {
QVERIFY(version.contains(QChar('.')));
}
}

// detect() tutarlılık: found=false ise driverVersion boş olmalı
void testDetectConsistency() {
NvidiaDetector detector;
auto info = detector.detect();
if (!info.found) {
QVERIFY(info.name.isEmpty());
}
}
};

QTEST_MAIN(TestDetector)
#include "test_detector.moc"
108 changes: 108 additions & 0 deletions tests/test_monitor.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
#include <QSignalSpy>
#include <QTest>

#include "monitor/cpumonitor.h"
#include "monitor/gpumonitor.h"
#include "monitor/rammonitor.h"

class TestMonitor : public QObject {
Q_OBJECT

private slots:
// ── CpuMonitor ──────────────────────────────────────────────────────────

void testCpuConstruction() {
CpuMonitor cpu;
QCOMPARE(cpu.load(), 0);
QCOMPARE(cpu.temperature(), 0);
}

void testCpuStartStop() {
CpuMonitor cpu;
cpu.start(500);
// Timer çalışıyor olmalı
QTest::qWait(100);
cpu.stop();
QVERIFY(true); // crash olmadı
}

void testCpuSignals() {
CpuMonitor cpu;
QSignalSpy loadSpy(&cpu, &CpuMonitor::loadChanged);
QSignalSpy tempSpy(&cpu, &CpuMonitor::temperatureChanged);
QVERIFY(loadSpy.isValid());
QVERIFY(tempSpy.isValid());
}

void testCpuLoadRange() {
CpuMonitor cpu;
cpu.start(100);
QTest::qWait(300); // birkaç poll döngüsü bekle
cpu.stop();
// Yük 0-100 arasında olmalı
QVERIFY(cpu.load() >= 0 && cpu.load() <= 100);
}

// ── GpuMonitor ──────────────────────────────────────────────────────────

void testGpuConstruction() {
GpuMonitor gpu;
QCOMPARE(gpu.temperature(), 0);
QCOMPARE(gpu.load(), 0);
QCOMPARE(gpu.vramUsed(), 0);
QCOMPARE(gpu.vramTotal(), 0);
QCOMPARE(gpu.available(), false);
}

void testGpuStartStop() {
GpuMonitor gpu;
gpu.start(500);
QTest::qWait(100);
gpu.stop();
QVERIFY(true);
}

void testGpuSignals() {
GpuMonitor gpu;
QSignalSpy tempSpy(&gpu, &GpuMonitor::temperatureChanged);
QSignalSpy loadSpy(&gpu, &GpuMonitor::loadChanged);
QSignalSpy vramUsedSpy(&gpu, &GpuMonitor::vramUsedChanged);
QSignalSpy vramTotalSpy(&gpu, &GpuMonitor::vramTotalChanged);
QSignalSpy availSpy(&gpu, &GpuMonitor::availableChanged);
QVERIFY(tempSpy.isValid());
QVERIFY(loadSpy.isValid());
QVERIFY(vramUsedSpy.isValid());
QVERIFY(vramTotalSpy.isValid());
QVERIFY(availSpy.isValid());
}

// ── RamMonitor ──────────────────────────────────────────────────────────

void testRamConstruction() {
RamMonitor ram;
QCOMPARE(ram.totalMb(), 0);
QCOMPARE(ram.usedMb(), 0);
QCOMPARE(ram.usedPercent(), 0);
}

void testRamStartStop() {
RamMonitor ram;
ram.start(500);
QTest::qWait(100);
ram.stop();
QVERIFY(true);
}

void testRamSignals() {
RamMonitor ram;
QSignalSpy totalSpy(&ram, &RamMonitor::totalMbChanged);
QSignalSpy usedSpy(&ram, &RamMonitor::usedMbChanged);
QSignalSpy pctSpy(&ram, &RamMonitor::usedPercentChanged);
QVERIFY(totalSpy.isValid());
QVERIFY(usedSpy.isValid());
QVERIFY(pctSpy.isValid());
}
};

QTEST_MAIN(TestMonitor)
#include "test_monitor.moc"