From 5ec4b4239e97bf1b89310a3ef395fa75991d7d9c Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Thu, 2 Oct 2025 10:18:27 +0300 Subject: [PATCH 01/25] chor: some fixes --- trunk/as06617/task_01/doc/README.md | 95 +++++++++++++++++++++++ trunk/as06617/task_01/src/CMakeLists.txt | 5 ++ trunk/as06617/task_01/src/tmau | Bin 0 -> 31976 bytes trunk/as06617/task_01/src/tmau.cpp | 49 ++++++++++++ 4 files changed, 149 insertions(+) create mode 100644 trunk/as06617/task_01/doc/README.md create mode 100644 trunk/as06617/task_01/src/CMakeLists.txt create mode 100755 trunk/as06617/task_01/src/tmau create mode 100644 trunk/as06617/task_01/src/tmau.cpp diff --git a/trunk/as06617/task_01/doc/README.md b/trunk/as06617/task_01/doc/README.md new file mode 100644 index 00000000..59a93b38 --- /dev/null +++ b/trunk/as06617/task_01/doc/README.md @@ -0,0 +1,95 @@ +

Министерство образования Республики Беларусь

+

Учреждение образования

+

“Брестский Государственный Технический университет”

+

Кафедра ИИТ

+






+

Лабораторная работа №1

+

По дисциплине “Теория и методы автоматического управления”

+

Тема: “Моделирование управляемого объекта”

+




+

Выполнил:

+

Студент 3 курса

+

Группы АС-66

+

Осовец А.О.

+

Проверил:

+

Иванюк Д.С.

+







+

Брест 2025

+ +--- +## Task 1. Modeling controlled object +Let's get some object to be controlled. We want to control its temperature, which can be described by this differential equation: + +$$\Large\frac{dy(\tau)}{d\tau}=\frac{u(\tau)}{C}+\frac{Y_0-y(\tau)}{RC} $$ (1) + +where $\tau$ – time; $y(\tau)$ – input temperature; $u(\tau)$ – input warm; $Y_0$ – room temperature; $C,RC$ – some constants. + +After transformation we get these linear (2) and nonlinear (3) models: + +$$\Large y_{\tau+1}=ay_{\tau}+bu_{\tau}$$ (2) + +$$\Large y_{\tau+1}=ay_{\tau}-by_{\tau-1}^2+cu_{\tau}+d\sin(u_{\tau-1})$$ (3) + +where $\tau$ – time discrete moments ($1,2,3{\dots}n$); $a,b,c,d$ – some constants. + +Task is to write program (**С++**), which simulates this object temperature. + +## Выполнение работы +Инициализация параметров +``` +double a = 0.8; +double b = 0.2; +double c = 0.1; +double d = 0.05; + +int N = 20; + +vector y(N + 1, 0.0); +vector u(N + 1, 0.0); + +``` +Имея данные параметры получим результат работы программы: +```bash +linear model +t=1 y=0 +t=2 y=0 +t=3 y=0 +t=4 y=0 +t=5 y=0 +t=6 y=0.2 +t=7 y=0.36 +t=8 y=0.488 +t=9 y=0.5904 +t=10 y=0.67232 +t=11 y=0.737856 +t=12 y=0.790285 +t=13 y=0.832228 +t=14 y=0.865782 +t=15 y=0.892626 +t=16 y=0.914101 +t=17 y=0.931281 +t=18 y=0.945024 +t=19 y=0.95602 +t=20 y=0.964816 + + non linear model +t=2 y=0 +t=3 y=0 +t=4 y=0 +t=5 y=0 +t=6 y=0.1 +t=7 y=0.222074 +t=8 y=0.317732 +t=9 y=0.386396 +t=10 y=0.431 +t=11 y=0.457013 +t=12 y=0.470532 +t=13 y=0.476727 +t=14 y=0.479175 +t=15 y=0.47996 +t=16 y=0.48012 +t=17 y=0.480097 +t=18 y=0.480048 +t=19 y=0.480013 +t=20 y=0.479995 +``` \ No newline at end of file diff --git a/trunk/as06617/task_01/src/CMakeLists.txt b/trunk/as06617/task_01/src/CMakeLists.txt new file mode 100644 index 00000000..ccf1895a --- /dev/null +++ b/trunk/as06617/task_01/src/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.5) + +project(tmau) + +add_executable (TMAU1 tmau.cpp) \ No newline at end of file diff --git a/trunk/as06617/task_01/src/tmau b/trunk/as06617/task_01/src/tmau new file mode 100755 index 0000000000000000000000000000000000000000..6b179873da02c247c6133bd6545cc5632ae732bb GIT binary patch literal 31976 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 R>XKa1Xes?@lvjC;{|}9vkj?-A literal 0 HcmV?d00001 diff --git a/trunk/as06617/task_01/src/tmau.cpp b/trunk/as06617/task_01/src/tmau.cpp new file mode 100644 index 00000000..b96695dc --- /dev/null +++ b/trunk/as06617/task_01/src/tmau.cpp @@ -0,0 +1,49 @@ +#include +#include +#include + +using namespace std; + + +double linear_model(double y_t, double u_t, double a, double b) { + return a * y_t + b * u_t; +} + +double nonlinear_model(double y_t, double y_prev, double u_t, double u_prev, + double a, double b, double c, double d) { + return a * y_t - b * y_prev * y_prev + c * u_t + d * sin(u_prev); +} + +int main() { + double a = 0.8; + double b = 0.2; + double c = 0.1; + double d = 0.05; + + int N = 20; + + vector y(N + 1, 0.0); + vector u(N + 1, 0.0); + + + for (int t = 0; t <= N; t++) { + if (t < 5) u[t] = 0.0; + else u[t] = 1.0; + } + + cout << "linear model" << endl; + for (int t = 0; t < N; t++) { + y[t + 1] = linear_model(y[t], u[t], a, b); + cout << "t=" << t + 1 << " y=" << y[t + 1] << endl; + } + + fill(y.begin(), y.end(), 0.0); + + cout << "\n non linear model" << endl; + for (int t = 1; t < N; t++) { + y[t + 1] = nonlinear_model(y[t], y[t - 1], u[t], u[t - 1], a, b, c, d); + cout << "t=" << t + 1 << " y=" << y[t + 1] << endl; + } + + return 0; +} From 2f5abb512f315f3caff94c050a27a810d76876c1 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Thu, 2 Oct 2025 10:23:38 +0300 Subject: [PATCH 02/25] chore: some fix --- trunk/as06617/task_01/src/tmau.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/trunk/as06617/task_01/src/tmau.cpp b/trunk/as06617/task_01/src/tmau.cpp index b96695dc..b58c5660 100644 --- a/trunk/as06617/task_01/src/tmau.cpp +++ b/trunk/as06617/task_01/src/tmau.cpp @@ -4,44 +4,44 @@ using namespace std; +struct Coeffs { + double a; + double b; + double c; + double d; +}; double linear_model(double y_t, double u_t, double a, double b) { return a * y_t + b * u_t; } -double nonlinear_model(double y_t, double y_prev, double u_t, double u_prev, - double a, double b, double c, double d) { - return a * y_t - b * y_prev * y_prev + c * u_t + d * sin(u_prev); +double nonlinear_model(double y_t, double y_prev, double u_t, double u_prev, Coeffs coeffs) { + return coeffs.a * y_t - coeffs.b * y_prev * y_prev + coeffs.c * u_t + coeffs.d * sin(u_prev); } int main() { - double a = 0.8; - double b = 0.2; - double c = 0.1; - double d = 0.05; + Coeffs coeffs = {0.8, 0.2, 0.1, 0.05}; int N = 20; vector y(N + 1, 0.0); vector u(N + 1, 0.0); - for (int t = 0; t <= N; t++) { - if (t < 5) u[t] = 0.0; - else u[t] = 1.0; + u[t] = (t < 5) ? 0.0 : 1.0; } - cout << "linear model" << endl; + cout << "Linear model" << endl; for (int t = 0; t < N; t++) { - y[t + 1] = linear_model(y[t], u[t], a, b); + y[t + 1] = linear_model(y[t], u[t], coeffs.a, coeffs.b); cout << "t=" << t + 1 << " y=" << y[t + 1] << endl; } fill(y.begin(), y.end(), 0.0); - cout << "\n non linear model" << endl; + cout << "\nNonlinear model" << endl; for (int t = 1; t < N; t++) { - y[t + 1] = nonlinear_model(y[t], y[t - 1], u[t], u[t - 1], a, b, c, d); + y[t + 1] = nonlinear_model(y[t], y[t - 1], u[t], u[t - 1], coeffs); cout << "t=" << t + 1 << " y=" << y[t + 1] << endl; } From bc1687a0261165a958edf8b01d486fdb280e44f6 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Thu, 2 Oct 2025 10:27:02 +0300 Subject: [PATCH 03/25] chore: some fix --- trunk/as06617/task_01/src/tmau.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/trunk/as06617/task_01/src/tmau.cpp b/trunk/as06617/task_01/src/tmau.cpp index b58c5660..b15db9e2 100644 --- a/trunk/as06617/task_01/src/tmau.cpp +++ b/trunk/as06617/task_01/src/tmau.cpp @@ -1,7 +1,7 @@ #include #include #include - +#include using namespace std; struct Coeffs { @@ -15,15 +15,13 @@ double linear_model(double y_t, double u_t, double a, double b) { return a * y_t + b * u_t; } -double nonlinear_model(double y_t, double y_prev, double u_t, double u_prev, Coeffs coeffs) { +double nonlinear_model(double y_t, double y_prev, double u_t, double u_prev, const Coeffs& coeffs) { return coeffs.a * y_t - coeffs.b * y_prev * y_prev + coeffs.c * u_t + coeffs.d * sin(u_prev); } int main() { Coeffs coeffs = {0.8, 0.2, 0.1, 0.05}; - int N = 20; - vector y(N + 1, 0.0); vector u(N + 1, 0.0); @@ -34,7 +32,7 @@ int main() { cout << "Linear model" << endl; for (int t = 0; t < N; t++) { y[t + 1] = linear_model(y[t], u[t], coeffs.a, coeffs.b); - cout << "t=" << t + 1 << " y=" << y[t + 1] << endl; + cout << "t=" << t + 1 << " y=" << fixed << setprecision(4) << y[t + 1] << endl; } fill(y.begin(), y.end(), 0.0); @@ -42,7 +40,7 @@ int main() { cout << "\nNonlinear model" << endl; for (int t = 1; t < N; t++) { y[t + 1] = nonlinear_model(y[t], y[t - 1], u[t], u[t - 1], coeffs); - cout << "t=" << t + 1 << " y=" << y[t + 1] << endl; + cout << "t=" << t + 1 << " y=" << fixed << setprecision(4) << y[t + 1] << endl; } return 0; From 13bb7e4687f68ac4b262994361c534d3906efed9 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Thu, 27 Nov 2025 10:32:07 +0300 Subject: [PATCH 04/25] feat: add lab2 --- trunk/as06617/task_02/.vscode/launch.json | 10 +++ trunk/as06617/task_02/doc/readme.md | 96 +++++++++++++++++++++++ trunk/as06617/task_02/src/CMakeLists.txt | 29 +++++++ trunk/as06617/task_02/src/func.cpp | 20 +++++ trunk/as06617/task_02/src/func.h | 14 ++++ trunk/as06617/task_02/src/main.cpp | 47 +++++++++++ trunk/as06617/task_02/test/tests.cpp | 36 +++++++++ 7 files changed, 252 insertions(+) create mode 100644 trunk/as06617/task_02/.vscode/launch.json create mode 100644 trunk/as06617/task_02/doc/readme.md create mode 100644 trunk/as06617/task_02/src/CMakeLists.txt create mode 100644 trunk/as06617/task_02/src/func.cpp create mode 100644 trunk/as06617/task_02/src/func.h create mode 100644 trunk/as06617/task_02/src/main.cpp create mode 100644 trunk/as06617/task_02/test/tests.cpp diff --git a/trunk/as06617/task_02/.vscode/launch.json b/trunk/as06617/task_02/.vscode/launch.json new file mode 100644 index 00000000..c0fa2180 --- /dev/null +++ b/trunk/as06617/task_02/.vscode/launch.json @@ -0,0 +1,10 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + + ] +} \ No newline at end of file diff --git a/trunk/as06617/task_02/doc/readme.md b/trunk/as06617/task_02/doc/readme.md new file mode 100644 index 00000000..fddd9fb1 --- /dev/null +++ b/trunk/as06617/task_02/doc/readme.md @@ -0,0 +1,96 @@ +

Министерство образования Республики Беларусь

+

Учреждение образования

+

“Брестский Государственный Технический университет”

+

Кафедра ИИТ

+ +






+ +

Лабораторная работа №2

+

По дисциплине “Теория и методы автоматического управления”

+

Тема: “Тестирование программы и процент покрытия тестами”

+ +




+ +

Выполнил:

+

Студент 3 курса

+

Группы АС-66

+

Савинец М. Д.

+

Проверил:

+

Иванюк Д.С.

+ +







+ +

Брест 2025

+ +--- + +# Общее задание + +Написать модульные тесты для программы, разработанной в лабораторной работе №1. + +1. Использовать следующий фреймворк для модульного тестирования — [Google Test](https://google.github.io/googletest/). +3. Написать модульные тесты для основных функций программы. Разместить тесты в каталоге: **trunk\as0xxyy\task_02\test**. +4. Исходный код модифицированной программы разместить в каталоге: **trunk\as0xxyy\task_02\src**. +5. В файле `readme.md` отразить количество написанных тестов и процент покрытия кода тестами (использовать любой инструмент для анализа покрытия, например, [gcovr](https://gcovr.com/en/stable/)). +6. Также необходимо отразить выполнение работы в общем файле [`readme.md`](https://github.com/brstu/TMAU-2025/blob/main/README.md) в соответствующей строке. + +## Выполнение работы + +### Тесты + +```cpp +TEST(Linear, test_zero) { + EXPECT_DOUBLE_EQ(linear(0, 0), 0); +} + +TEST(Linear, test_u_zero) { + EXPECT_DOUBLE_EQ(linear(18, 0), a * 18); +} + +TEST(Linear, test_y_zero) { + EXPECT_DOUBLE_EQ(linear(0, 5), b * 5); +} + +TEST(Linear, test_default) { + EXPECT_DOUBLE_EQ(linear(18, 5), a * 18 + b * 5); +} + +TEST(NonLinear, test_zero) { + EXPECT_DOUBLE_EQ(nonlinear(0, 0, 0, 0), 0); +} + +TEST(NonLinear, test_u_zero) { + EXPECT_DOUBLE_EQ(nonlinear(18, 18, 0, 0), a * 18 - b * pow(18, 2)); +} + +TEST(NonLinear, test_y_zero) { + EXPECT_DOUBLE_EQ(nonlinear(0, 0, 5, 5), c * 5 + d * std::sin(5)); +} + +TEST(NonLinear, test_default) { + EXPECT_DOUBLE_EQ(nonlinear(18, 18, 5, 5), a * 18 - b * pow(18, 2) + c * 5 + d * std::sin(5)); +} + + +Start 1: Linear.test_zero +1/8 Test #1: Linear.test_zero ................. Passed 0.01 sec +Start 2: Linear.test_u0 +2/8 Test #2: Linear.test_u0 ................... Passed 0.01 sec +Start 3: Linear.test_y0 +3/8 Test #3: Linear.test_y0 ................... Passed 0.01 sec +Start 4: Linear.test_default +4/8 Test #4: Linear.test_default .............. Passed 0.01 sec +Start 5: NonLinear.test_zero +5/8 Test #5: NonLinear.test_zero .............. Passed 0.01 sec +Start 6: NonLinear.test_u0 +6/8 Test #6: NonLinear.test_u0 ................ Passed 0.01 sec +Start 7: NonLinear.test_y0 +7/8 Test #7: NonLinear.test_y0 ................ Passed 0.01 sec +Start 8: NonLinear.test_default +8/8 Test #8: NonLinear.test_default ........... Passed 0.01 sec + +100% tests passed, 0 tests failed out of 8 +Total Test time (real) = 0.07 sec + + +Вывод: В рамках работы разработаны и запущены модульные тесты для функций linear() и nonlinear() с использованием Google Test. Все восемь тестов успешно прошли, что подтверждает корректность реализованных вычислений. По отчёту OpenCppCoverage суммарное покрытие проекта около 26% из-за включения сторонних библиотек, при этом пользовательский файл func.cpp протестирован на 100%. \ No newline at end of file diff --git a/trunk/as06617/task_02/src/CMakeLists.txt b/trunk/as06617/task_02/src/CMakeLists.txt new file mode 100644 index 00000000..5e8aa825 --- /dev/null +++ b/trunk/as06617/task_02/src/CMakeLists.txt @@ -0,0 +1,29 @@ +cmake_minimum_required(VERSION 3.16) +project(task_02) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Приложение +add_executable(main main.cpp func.cpp) +target_include_directories(main PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + +# GoogleTest +include(FetchContent) +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/refs/tags/release-1.12.1.zip + DOWNLOAD_EXTRACT_TIMESTAMP TRUE +) +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) + +enable_testing() + +# Тесты +add_executable(runTests ../test/tests.cpp func.cpp) +target_include_directories(runTests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(runTests GTest::gtest GTest::gtest_main) + +include(GoogleTest) +gtest_discover_tests(runTests) \ No newline at end of file diff --git a/trunk/as06617/task_02/src/func.cpp b/trunk/as06617/task_02/src/func.cpp new file mode 100644 index 00000000..61aa51e5 --- /dev/null +++ b/trunk/as06617/task_02/src/func.cpp @@ -0,0 +1,20 @@ +#include "func.h" +#include + +// Определения параметров модели +const int STEPS = 10; +const double a = 0.99; +const double b = 0.01; +const double c = 0.5; +const double d = 0.1; +const double Y0 = 18.0; + +// Линейная динамика +double linear(double y, double u) { + return a * y + b * u; +} + +// Нелинейная динамика +double nonlinear(double y, double y_prev, double u, double u_prev) { + return a * y - b * std::pow(y_prev, 2) + c * u + d * std::sin(u_prev); +} diff --git a/trunk/as06617/task_02/src/func.h b/trunk/as06617/task_02/src/func.h new file mode 100644 index 00000000..682a2efb --- /dev/null +++ b/trunk/as06617/task_02/src/func.h @@ -0,0 +1,14 @@ +#pragma once +#include + +// Параметры модели (объявления) +extern const int STEPS; +extern const double a; +extern const double b; +extern const double c; +extern const double d; +extern const double Y0; + +// Прототипы функций модели +double linear(double y, double u); +double nonlinear(double y, double y_prev, double u, double u_prev); diff --git a/trunk/as06617/task_02/src/main.cpp b/trunk/as06617/task_02/src/main.cpp new file mode 100644 index 00000000..d5a68ba2 --- /dev/null +++ b/trunk/as06617/task_02/src/main.cpp @@ -0,0 +1,47 @@ +#include +#include +#include "func.h" +#include +using namespace std; + +static void simulateLinear(const vector& input) { + double y = Y0; + cout << "=== Линейная модель ===\n"; + cout << "y0 = " << Y0 << '\n'; + for (int i = 0; i < STEPS; ++i) { + y = linear(y, input[i]); + cout << "Шаг " << i + 1 << ": y = " << y << '\n'; + } +} + +static void simulateNonlinear(const vector& input) { + double y = Y0; + double y_prev = Y0; + cout << "\n=== Нелинейная модель ===\n"; + cout << "y0 = " << Y0 << '\n'; + for (int i = 0; i < STEPS; ++i) { + double u_prev = (i == 0) ? input[0] : input[i - 1]; + y = nonlinear(y, y_prev, input[i], u_prev); + cout << "Шаг " << i + 1 << ": y = " << y << '\n'; + y_prev = y; + } +} + +int main() { + SetConsoleOutputCP(CP_UTF8); + SetConsoleCP(CP_UTF8); + vector input; + input.reserve(STEPS); + for (int i = 0; i < STEPS; ++i) { + switch (i % 3) { + case 0: input.push_back(5); break; + case 1: input.push_back(7); break; + default: input.push_back(0); break; + } + } + + simulateLinear(input); + simulateNonlinear(input); + return 0; +} + diff --git a/trunk/as06617/task_02/test/tests.cpp b/trunk/as06617/task_02/test/tests.cpp new file mode 100644 index 00000000..2c3dd13c --- /dev/null +++ b/trunk/as06617/task_02/test/tests.cpp @@ -0,0 +1,36 @@ +#include +#include "func.h" +#include + +TEST(Linear, test_zero) { + EXPECT_DOUBLE_EQ(linear(0, 0), 0); +} + +TEST(Linear, test_u0) { + EXPECT_DOUBLE_EQ(linear(18, 0), a * 18); +} + +TEST(Linear, test_y0) { + EXPECT_DOUBLE_EQ(linear(0, 5), b * 5); +} + +TEST(Linear, test_default) { + EXPECT_DOUBLE_EQ(linear(18, 5), a * 18 + b * 5); +} + +TEST(NonLinear, test_zero) { + EXPECT_DOUBLE_EQ(nonlinear(0, 0, 0, 0), 0); +} + +TEST(NonLinear, test_u0) { + EXPECT_DOUBLE_EQ(nonlinear(18, 18, 0, 0), a * 18 - b * std::pow(18, 2)); +} + +TEST(NonLinear, test_y0) { + EXPECT_DOUBLE_EQ(nonlinear(0, 0, 5, 5), c * 5 + d * std::sin(5)); +} + +TEST(NonLinear, test_default) { + EXPECT_DOUBLE_EQ(nonlinear(18, 18, 5, 5), + a * 18 - b * std::pow(18, 2) + c * 5 + d * std::sin(5)); +} From ba7606e8854e76044bb828b12023bc9a0d0e32b4 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 10 Dec 2025 21:50:09 +0300 Subject: [PATCH 05/25] some fix --- trunk/as06617/task_02/src/main.cpp | 35 +++++++++--------------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/trunk/as06617/task_02/src/main.cpp b/trunk/as06617/task_02/src/main.cpp index d5a68ba2..75a5eacb 100644 --- a/trunk/as06617/task_02/src/main.cpp +++ b/trunk/as06617/task_02/src/main.cpp @@ -1,47 +1,32 @@ #include #include #include "func.h" -#include -using namespace std; -static void simulateLinear(const vector& input) { - double y = Y0; - cout << "=== Линейная модель ===\n"; - cout << "y0 = " << Y0 << '\n'; - for (int i = 0; i < STEPS; ++i) { - y = linear(y, input[i]); - cout << "Шаг " << i + 1 << ": y = " << y << '\n'; - } -} +#ifdef _WIN32 +#include +#endif -static void simulateNonlinear(const vector& input) { - double y = Y0; - double y_prev = Y0; - cout << "\n=== Нелинейная модель ===\n"; - cout << "y0 = " << Y0 << '\n'; - for (int i = 0; i < STEPS; ++i) { - double u_prev = (i == 0) ? input[0] : input[i - 1]; - y = nonlinear(y, y_prev, input[i], u_prev); - cout << "Шаг " << i + 1 << ": y = " << y << '\n'; - y_prev = y; - } -} +using namespace std; int main() { + +#ifdef _WIN32 SetConsoleOutputCP(CP_UTF8); SetConsoleCP(CP_UTF8); +#endif + vector input; input.reserve(STEPS); for (int i = 0; i < STEPS; ++i) { switch (i % 3) { case 0: input.push_back(5); break; case 1: input.push_back(7); break; - default: input.push_back(0); break; + default: input.push_back(0); break; } } simulateLinear(input); simulateNonlinear(input); + return 0; } - From 44557ad20a2809ee6dfb87b012d1a642486a3d9c Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 10 Dec 2025 21:55:01 +0300 Subject: [PATCH 06/25] some fix --- trunk/as06617/task_02/src/main.cpp | 32 ++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/trunk/as06617/task_02/src/main.cpp b/trunk/as06617/task_02/src/main.cpp index 75a5eacb..527136a6 100644 --- a/trunk/as06617/task_02/src/main.cpp +++ b/trunk/as06617/task_02/src/main.cpp @@ -2,21 +2,49 @@ #include #include "func.h" -#ifdef _WIN32 +#ifdef _WIN32 // <-- добавлено условие #include #endif using namespace std; +// ------------------- Симуляции ------------------- + +static void simulateLinear(const vector& input) { + double y = Y0; + cout << "=== Линейная модель ===\n"; + cout << "y0 = " << Y0 << '\n'; + for (int i = 0; i < STEPS; ++i) { + y = linear(y, input[i]); + cout << "Шаг " << i + 1 << ": y = " << y << '\n'; + } +} + +static void simulateNonlinear(const vector& input) { + double y = Y0; + double y_prev = Y0; + cout << "\n=== Нелинейная модель ===\n"; + cout << "y0 = " << Y0 << '\n'; + for (int i = 0; i < STEPS; ++i) { + double u_prev = (i == 0) ? input[0] : input[i - 1]; + y = nonlinear(y, y_prev, input[i], u_prev); + cout << "Шаг " << i + 1 << ": y = " << y << '\n'; + y_prev = y; + } +} + +// ------------------- main ------------------- + int main() { -#ifdef _WIN32 +#ifdef _WIN32 // <-- Windows код срабатывает только на Win SetConsoleOutputCP(CP_UTF8); SetConsoleCP(CP_UTF8); #endif vector input; input.reserve(STEPS); + for (int i = 0; i < STEPS; ++i) { switch (i % 3) { case 0: input.push_back(5); break; From b0bad31badd4aeb2c7ea1ec2122e125dc2432d21 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 10 Dec 2025 21:55:23 +0300 Subject: [PATCH 07/25] some fix --- trunk/as06617/task_02/src/main.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/trunk/as06617/task_02/src/main.cpp b/trunk/as06617/task_02/src/main.cpp index 527136a6..0e00799b 100644 --- a/trunk/as06617/task_02/src/main.cpp +++ b/trunk/as06617/task_02/src/main.cpp @@ -2,13 +2,13 @@ #include #include "func.h" -#ifdef _WIN32 // <-- добавлено условие +#ifdef _WIN32 #include #endif using namespace std; -// ------------------- Симуляции ------------------- + static void simulateLinear(const vector& input) { double y = Y0; @@ -33,11 +33,10 @@ static void simulateNonlinear(const vector& input) { } } -// ------------------- main ------------------- int main() { -#ifdef _WIN32 // <-- Windows код срабатывает только на Win +#ifdef _WIN32 SetConsoleOutputCP(CP_UTF8); SetConsoleCP(CP_UTF8); #endif From 3f10c8bba41714f284722b4dc1f302ec7a750ea9 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 17 Dec 2025 19:45:26 +0300 Subject: [PATCH 08/25] fix: some fix --- .vscode/c_cpp_properties.json | 16 ++ trunk/as06617/task_02/doc/README.md | 96 ++++++++++++ trunk/as06617/task_02/doc/readme.md | 190 +++++++++++------------ trunk/as06617/task_02/src/CMakeLists.txt | 62 ++++---- trunk/as06617/task_02/src/func.cpp | 40 ++--- trunk/as06617/task_02/src/func.h | 28 ++-- trunk/as06617/task_02/src/main.cpp | 115 +++++++------- trunk/as06617/task_02/src/tests.cpp | 36 +++++ 8 files changed, 366 insertions(+), 217 deletions(-) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 trunk/as06617/task_02/doc/README.md create mode 100644 trunk/as06617/task_02/src/tests.cpp diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 00000000..59872068 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,16 @@ +{ + "configurations": [ + { + "name": "Mac", + "includePath": [ + "${workspaceFolder}/**" + ], + "defines": [], + "compilerPath": "/usr/bin/clang++", + "cStandard": "c17", + "cppStandard": "c++17", + "intelliSenseMode": "macos-clang-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/trunk/as06617/task_02/doc/README.md b/trunk/as06617/task_02/doc/README.md new file mode 100644 index 00000000..0281da95 --- /dev/null +++ b/trunk/as06617/task_02/doc/README.md @@ -0,0 +1,96 @@ +

Министерство образования Республики Беларусь

+

Учреждение образования

+

“Брестский Государственный Технический университет”

+

Кафедра ИИТ

+ +






+ +

Лабораторная работа №2

+

По дисциплине “Теория и методы автоматического управления”

+

Тема: “Тестирование программы и процент покрытия тестами”

+ +




+ +

Выполнил:

+

Студент 3 курса

+

Группы АС-66

+

Осовец А.О.

+

Проверил:

+

Иванюк Д.С.

+ +







+ +

Брест 2025

+ +--- + +# Общее задание + +Написать модульные тесты для программы, разработанной в лабораторной работе №1. + +1. Использовать следующий фреймворк для модульного тестирования — [Google Test](https://google.github.io/googletest/). +3. Написать модульные тесты для основных функций программы. Разместить тесты в каталоге: **trunk\as0xxyy\task_02\test**. +4. Исходный код модифицированной программы разместить в каталоге: **trunk\as0xxyy\task_02\src**. +5. В файле `readme.md` отразить количество написанных тестов и процент покрытия кода тестами (использовать любой инструмент для анализа покрытия, например, [gcovr](https://gcovr.com/en/stable/)). +6. Также необходимо отразить выполнение работы в общем файле [`readme.md`](https://github.com/brstu/TMAU-2025/blob/main/README.md) в соответствующей строке. + +## Выполнение работы + +### Тесты + +```cpp +TEST(Linear, test_zero) { + EXPECT_DOUBLE_EQ(linear(0, 0), 0); +} + +TEST(Linear, test_u0) { + EXPECT_DOUBLE_EQ(linear(18, 0), a * 18); +} + +TEST(Linear, test_y0) { + EXPECT_DOUBLE_EQ(linear(0, 5), b * 5); +} + +TEST(Linear, test_default) { + EXPECT_DOUBLE_EQ(linear(18, 5), a * 18 + b * 5); +} + +TEST(NonLinear, test_zero) { + EXPECT_DOUBLE_EQ(nonlinear(0, 0, 0, 0), 0); +} + +TEST(NonLinear, test_u_zero) { + EXPECT_DOUBLE_EQ(nonlinear(18, 18, 0, 0), a * 18 - b * pow(18, 2));comments. Press enter to view. +} + +TEST(NonLinear, test_y_zero) { + EXPECT_DOUBLE_EQ(nonlinear(0, 0, 5, 5), c * 5 + d * std::sin(5)); +} + +TEST(NonLinear, test_default) { + EXPECT_DOUBLE_EQ(nonlinear(18, 18, 5, 5), a * 18 - b * pow(18, 2) + c * 5 + d * std::sin(5));view. +} + + +Start 1: Linear.test_zero +1/8 Test #1: Linear.test_zero ................. Passed 0.01 sec +Start 2: Linear.test_u0 +2/8 Test #2: Linear.test_u0 ................... Passed 0.01 sec +Start 3: Linear.test_y0 +3/8 Test #3: Linear.test_y0 ................... Passed 0.01 sec +Start 4: Linear.test_default +4/8 Test #4: Linear.test_default .............. Passed 0.01 sec +Start 5: NonLinear.test_zero +5/8 Test #5: NonLinear.test_zero .............. Passed 0.01 sec +Start 6: NonLinear.test_u0 +6/8 Test #6: NonLinear.test_u0 ................ Passed 0.01 sec +Start 7: NonLinear.test_y0 +7/8 Test #7: NonLinear.test_y0 ................ Passed 0.01 sec +Start 8: NonLinear.test_default +8/8 Test #8: NonLinear.test_default ........... Passed 0.01 sec + +100% tests passed, 0 tests failed out of 8 +Total Test time (real) = 0.07 sec + + +Вывод: В рамках работы разработаны и запущены модульные тесты для функций linear() и nonlinear() с использованием Google Test. Все восемь тестов успешно прошли, что подтверждает корректность реализованных вычислений. По отчёту OpenCppCoverage суммарное покрытие проекта около 26% из-за включения сторонних библиотек, при этом пользовательский файл func.cpp протестирован на 100%. \ No newline at end of file diff --git a/trunk/as06617/task_02/doc/readme.md b/trunk/as06617/task_02/doc/readme.md index fddd9fb1..0281da95 100644 --- a/trunk/as06617/task_02/doc/readme.md +++ b/trunk/as06617/task_02/doc/readme.md @@ -1,96 +1,96 @@ -

Министерство образования Республики Беларусь

-

Учреждение образования

-

“Брестский Государственный Технический университет”

-

Кафедра ИИТ

- -






- -

Лабораторная работа №2

-

По дисциплине “Теория и методы автоматического управления”

-

Тема: “Тестирование программы и процент покрытия тестами”

- -




- -

Выполнил:

-

Студент 3 курса

-

Группы АС-66

-

Савинец М. Д.

-

Проверил:

-

Иванюк Д.С.

- -







- -

Брест 2025

- ---- - -# Общее задание - -Написать модульные тесты для программы, разработанной в лабораторной работе №1. - -1. Использовать следующий фреймворк для модульного тестирования — [Google Test](https://google.github.io/googletest/). -3. Написать модульные тесты для основных функций программы. Разместить тесты в каталоге: **trunk\as0xxyy\task_02\test**. -4. Исходный код модифицированной программы разместить в каталоге: **trunk\as0xxyy\task_02\src**. -5. В файле `readme.md` отразить количество написанных тестов и процент покрытия кода тестами (использовать любой инструмент для анализа покрытия, например, [gcovr](https://gcovr.com/en/stable/)). -6. Также необходимо отразить выполнение работы в общем файле [`readme.md`](https://github.com/brstu/TMAU-2025/blob/main/README.md) в соответствующей строке. - -## Выполнение работы - -### Тесты - -```cpp -TEST(Linear, test_zero) { - EXPECT_DOUBLE_EQ(linear(0, 0), 0); -} - -TEST(Linear, test_u_zero) { - EXPECT_DOUBLE_EQ(linear(18, 0), a * 18); -} - -TEST(Linear, test_y_zero) { - EXPECT_DOUBLE_EQ(linear(0, 5), b * 5); -} - -TEST(Linear, test_default) { - EXPECT_DOUBLE_EQ(linear(18, 5), a * 18 + b * 5); -} - -TEST(NonLinear, test_zero) { - EXPECT_DOUBLE_EQ(nonlinear(0, 0, 0, 0), 0); -} - -TEST(NonLinear, test_u_zero) { - EXPECT_DOUBLE_EQ(nonlinear(18, 18, 0, 0), a * 18 - b * pow(18, 2)); -} - -TEST(NonLinear, test_y_zero) { - EXPECT_DOUBLE_EQ(nonlinear(0, 0, 5, 5), c * 5 + d * std::sin(5)); -} - -TEST(NonLinear, test_default) { - EXPECT_DOUBLE_EQ(nonlinear(18, 18, 5, 5), a * 18 - b * pow(18, 2) + c * 5 + d * std::sin(5)); -} - - -Start 1: Linear.test_zero -1/8 Test #1: Linear.test_zero ................. Passed 0.01 sec -Start 2: Linear.test_u0 -2/8 Test #2: Linear.test_u0 ................... Passed 0.01 sec -Start 3: Linear.test_y0 -3/8 Test #3: Linear.test_y0 ................... Passed 0.01 sec -Start 4: Linear.test_default -4/8 Test #4: Linear.test_default .............. Passed 0.01 sec -Start 5: NonLinear.test_zero -5/8 Test #5: NonLinear.test_zero .............. Passed 0.01 sec -Start 6: NonLinear.test_u0 -6/8 Test #6: NonLinear.test_u0 ................ Passed 0.01 sec -Start 7: NonLinear.test_y0 -7/8 Test #7: NonLinear.test_y0 ................ Passed 0.01 sec -Start 8: NonLinear.test_default -8/8 Test #8: NonLinear.test_default ........... Passed 0.01 sec - -100% tests passed, 0 tests failed out of 8 -Total Test time (real) = 0.07 sec - - +

Министерство образования Республики Беларусь

+

Учреждение образования

+

“Брестский Государственный Технический университет”

+

Кафедра ИИТ

+ +






+ +

Лабораторная работа №2

+

По дисциплине “Теория и методы автоматического управления”

+

Тема: “Тестирование программы и процент покрытия тестами”

+ +




+ +

Выполнил:

+

Студент 3 курса

+

Группы АС-66

+

Осовец А.О.

+

Проверил:

+

Иванюк Д.С.

+ +







+ +

Брест 2025

+ +--- + +# Общее задание + +Написать модульные тесты для программы, разработанной в лабораторной работе №1. + +1. Использовать следующий фреймворк для модульного тестирования — [Google Test](https://google.github.io/googletest/). +3. Написать модульные тесты для основных функций программы. Разместить тесты в каталоге: **trunk\as0xxyy\task_02\test**. +4. Исходный код модифицированной программы разместить в каталоге: **trunk\as0xxyy\task_02\src**. +5. В файле `readme.md` отразить количество написанных тестов и процент покрытия кода тестами (использовать любой инструмент для анализа покрытия, например, [gcovr](https://gcovr.com/en/stable/)). +6. Также необходимо отразить выполнение работы в общем файле [`readme.md`](https://github.com/brstu/TMAU-2025/blob/main/README.md) в соответствующей строке. + +## Выполнение работы + +### Тесты + +```cpp +TEST(Linear, test_zero) { + EXPECT_DOUBLE_EQ(linear(0, 0), 0); +} + +TEST(Linear, test_u0) { + EXPECT_DOUBLE_EQ(linear(18, 0), a * 18); +} + +TEST(Linear, test_y0) { + EXPECT_DOUBLE_EQ(linear(0, 5), b * 5); +} + +TEST(Linear, test_default) { + EXPECT_DOUBLE_EQ(linear(18, 5), a * 18 + b * 5); +} + +TEST(NonLinear, test_zero) { + EXPECT_DOUBLE_EQ(nonlinear(0, 0, 0, 0), 0); +} + +TEST(NonLinear, test_u_zero) { + EXPECT_DOUBLE_EQ(nonlinear(18, 18, 0, 0), a * 18 - b * pow(18, 2));comments. Press enter to view. +} + +TEST(NonLinear, test_y_zero) { + EXPECT_DOUBLE_EQ(nonlinear(0, 0, 5, 5), c * 5 + d * std::sin(5)); +} + +TEST(NonLinear, test_default) { + EXPECT_DOUBLE_EQ(nonlinear(18, 18, 5, 5), a * 18 - b * pow(18, 2) + c * 5 + d * std::sin(5));view. +} + + +Start 1: Linear.test_zero +1/8 Test #1: Linear.test_zero ................. Passed 0.01 sec +Start 2: Linear.test_u0 +2/8 Test #2: Linear.test_u0 ................... Passed 0.01 sec +Start 3: Linear.test_y0 +3/8 Test #3: Linear.test_y0 ................... Passed 0.01 sec +Start 4: Linear.test_default +4/8 Test #4: Linear.test_default .............. Passed 0.01 sec +Start 5: NonLinear.test_zero +5/8 Test #5: NonLinear.test_zero .............. Passed 0.01 sec +Start 6: NonLinear.test_u0 +6/8 Test #6: NonLinear.test_u0 ................ Passed 0.01 sec +Start 7: NonLinear.test_y0 +7/8 Test #7: NonLinear.test_y0 ................ Passed 0.01 sec +Start 8: NonLinear.test_default +8/8 Test #8: NonLinear.test_default ........... Passed 0.01 sec + +100% tests passed, 0 tests failed out of 8 +Total Test time (real) = 0.07 sec + + Вывод: В рамках работы разработаны и запущены модульные тесты для функций linear() и nonlinear() с использованием Google Test. Все восемь тестов успешно прошли, что подтверждает корректность реализованных вычислений. По отчёту OpenCppCoverage суммарное покрытие проекта около 26% из-за включения сторонних библиотек, при этом пользовательский файл func.cpp протестирован на 100%. \ No newline at end of file diff --git a/trunk/as06617/task_02/src/CMakeLists.txt b/trunk/as06617/task_02/src/CMakeLists.txt index 5e8aa825..7c5c225f 100644 --- a/trunk/as06617/task_02/src/CMakeLists.txt +++ b/trunk/as06617/task_02/src/CMakeLists.txt @@ -1,29 +1,33 @@ -cmake_minimum_required(VERSION 3.16) -project(task_02) - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -# Приложение -add_executable(main main.cpp func.cpp) -target_include_directories(main PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - -# GoogleTest -include(FetchContent) -FetchContent_Declare( - googletest - URL https://github.com/google/googletest/archive/refs/tags/release-1.12.1.zip - DOWNLOAD_EXTRACT_TIMESTAMP TRUE -) -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) -FetchContent_MakeAvailable(googletest) - -enable_testing() - -# Тесты -add_executable(runTests ../test/tests.cpp func.cpp) -target_include_directories(runTests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(runTests GTest::gtest GTest::gtest_main) - -include(GoogleTest) -gtest_discover_tests(runTests) \ No newline at end of file +cmake_minimum_required(VERSION 3.16) +project(task_02) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Основное приложение +add_executable(main + main.cpp + func.cpp +) +target_include_directories(main PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + +# Тесты +add_executable(runTests + tests.cpp + func.cpp +) + +target_include_directories(runTests PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + /usr/local/Cellar/googletest/1.17.0/include +) + +target_link_libraries(runTests + /usr/local/Cellar/googletest/1.17.0/lib/libgtest.a + /usr/local/Cellar/googletest/1.17.0/lib/libgtest_main.a + pthread +) + +enable_testing() +include(GoogleTest) +gtest_discover_tests(runTests) diff --git a/trunk/as06617/task_02/src/func.cpp b/trunk/as06617/task_02/src/func.cpp index 61aa51e5..1ffa360b 100644 --- a/trunk/as06617/task_02/src/func.cpp +++ b/trunk/as06617/task_02/src/func.cpp @@ -1,20 +1,20 @@ -#include "func.h" -#include - -// Определения параметров модели -const int STEPS = 10; -const double a = 0.99; -const double b = 0.01; -const double c = 0.5; -const double d = 0.1; -const double Y0 = 18.0; - -// Линейная динамика -double linear(double y, double u) { - return a * y + b * u; -} - -// Нелинейная динамика -double nonlinear(double y, double y_prev, double u, double u_prev) { - return a * y - b * std::pow(y_prev, 2) + c * u + d * std::sin(u_prev); -} +#include "func.h" +#include + +// Определения параметров модели +const int STEPS = 10; +const double a = 0.99; +const double b = 0.01; +const double c = 0.5; +const double d = 0.1; +const double Y0 = 18.0; + +// Линейная динамика +double linear(double y, double u) { + return a * y + b * u; +} + +// Нелинейная динамика +double nonlinear(double y, double y_prev, double u, double u_prev) { + return a * y - b * std::pow(y_prev, 2) + c * u + d * std::sin(u_prev); +} diff --git a/trunk/as06617/task_02/src/func.h b/trunk/as06617/task_02/src/func.h index 682a2efb..47e3d950 100644 --- a/trunk/as06617/task_02/src/func.h +++ b/trunk/as06617/task_02/src/func.h @@ -1,14 +1,14 @@ -#pragma once -#include - -// Параметры модели (объявления) -extern const int STEPS; -extern const double a; -extern const double b; -extern const double c; -extern const double d; -extern const double Y0; - -// Прототипы функций модели -double linear(double y, double u); -double nonlinear(double y, double y_prev, double u, double u_prev); +#pragma once +#include + +// Параметры модели (объявления) +extern const int STEPS; +extern const double a; +extern const double b; +extern const double c; +extern const double d; +extern const double Y0; + +// Прототипы функций модели +double linear(double y, double u); +double nonlinear(double y, double y_prev, double u, double u_prev); diff --git a/trunk/as06617/task_02/src/main.cpp b/trunk/as06617/task_02/src/main.cpp index 0e00799b..2a93d276 100644 --- a/trunk/as06617/task_02/src/main.cpp +++ b/trunk/as06617/task_02/src/main.cpp @@ -1,59 +1,56 @@ -#include -#include -#include "func.h" - -#ifdef _WIN32 -#include -#endif - -using namespace std; - - - -static void simulateLinear(const vector& input) { - double y = Y0; - cout << "=== Линейная модель ===\n"; - cout << "y0 = " << Y0 << '\n'; - for (int i = 0; i < STEPS; ++i) { - y = linear(y, input[i]); - cout << "Шаг " << i + 1 << ": y = " << y << '\n'; - } -} - -static void simulateNonlinear(const vector& input) { - double y = Y0; - double y_prev = Y0; - cout << "\n=== Нелинейная модель ===\n"; - cout << "y0 = " << Y0 << '\n'; - for (int i = 0; i < STEPS; ++i) { - double u_prev = (i == 0) ? input[0] : input[i - 1]; - y = nonlinear(y, y_prev, input[i], u_prev); - cout << "Шаг " << i + 1 << ": y = " << y << '\n'; - y_prev = y; - } -} - - -int main() { - -#ifdef _WIN32 - SetConsoleOutputCP(CP_UTF8); - SetConsoleCP(CP_UTF8); -#endif - - vector input; - input.reserve(STEPS); - - for (int i = 0; i < STEPS; ++i) { - switch (i % 3) { - case 0: input.push_back(5); break; - case 1: input.push_back(7); break; - default: input.push_back(0); break; - } - } - - simulateLinear(input); - simulateNonlinear(input); - - return 0; -} +#include +#include +#include "func.h" +#ifdef _WIN32Expand commentComment on line R5ResolvedCode has comments. Press enter to view. +#include +#endif + +using namespace std; + +static void simulateLinear(const vector& input) { + double y = Y0; + cout << "=== Линейная модель ===\n"; + cout << "y0 = " << Y0 << '\n'; + for (int i = 0; i < STEPS; ++i) { + y = linear(y, input[i]); + cout << "Шаг " << i + 1 << ": y = " << y << '\n'; + } +} +static void simulateNonlinear(const vector& input) { + double y = Y0; + double y_prev = Y0; + cout << "\n=== Нелинейная модель ===\n"; + cout << "y0 = " << Y0 << '\n'; + for (int i = 0; i < STEPS; ++i) { + double u_prev = (i == 0) ? input[0] : input[i - 1]; + double y_old = y; + y = nonlinear(y, y_prev, input[i], u_prev); + cout << "Шаг " << i + 1 << ": y = " << y << '\n'; + y_prev = y_old; + } +} + + +int main() { + +#ifdef _WIN32 + SetConsoleOutputCP(CP_UTF8); + SetConsoleCP(CP_UTF8); +#endif + + vector input; + input.reserve(STEPS); + + for (int i = 0; i < STEPS; ++i) { + switch (i % 3) { + case 0: input.push_back(5); break; + case 1: input.push_back(7); break; + default: input.push_back(0); break; + } + } + + simulateLinear(input); + simulateNonlinear(input); + + return 0; +} diff --git a/trunk/as06617/task_02/src/tests.cpp b/trunk/as06617/task_02/src/tests.cpp new file mode 100644 index 00000000..67f315cd --- /dev/null +++ b/trunk/as06617/task_02/src/tests.cpp @@ -0,0 +1,36 @@ +#include +#include "func.h" +#include + +TEST(Linear, test_zero) { + EXPECT_DOUBLE_EQ(linear(0, 0), 0); +} + +TEST(Linear, test_u0) { + EXPECT_DOUBLE_EQ(linear(18, 0), a * 18); +} + +TEST(Linear, test_y0) { + EXPECT_DOUBLE_EQ(linear(0, 5), b * 5); +} + +TEST(Linear, test_default) { + EXPECT_DOUBLE_EQ(linear(18, 5), a * 18 + b * 5); +} + +TEST(NonLinear, test_zero) { + EXPECT_DOUBLE_EQ(nonlinear(0, 0, 0, 0), 0); +} + +TEST(NonLinear, test_u0) { + EXPECT_DOUBLE_EQ(nonlinear(18, 18, 0, 0), a * 18 - b * std::pow(18, 2)); +} + +TEST(NonLinear, test_y0) { + EXPECT_DOUBLE_EQ(nonlinear(0, 0, 5, 5), c * 5 + d * std::sin(5)); +} + +TEST(NonLinear, test_default) { + EXPECT_DOUBLE_EQ(nonlinear(18, 18, 5, 5), + a * 18 - b * std::pow(18, 2) + c * 5 + d * std::sin(5)); +} \ No newline at end of file From 17dd901f47e9fbb9b6d29a640ff5b55b7adbf364 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 17 Dec 2025 19:47:11 +0300 Subject: [PATCH 09/25] fix: some fix --- trunk/as06617/task_02/test/tests.cpp | 36 ---------------------------- 1 file changed, 36 deletions(-) delete mode 100644 trunk/as06617/task_02/test/tests.cpp diff --git a/trunk/as06617/task_02/test/tests.cpp b/trunk/as06617/task_02/test/tests.cpp deleted file mode 100644 index 2c3dd13c..00000000 --- a/trunk/as06617/task_02/test/tests.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include "func.h" -#include - -TEST(Linear, test_zero) { - EXPECT_DOUBLE_EQ(linear(0, 0), 0); -} - -TEST(Linear, test_u0) { - EXPECT_DOUBLE_EQ(linear(18, 0), a * 18); -} - -TEST(Linear, test_y0) { - EXPECT_DOUBLE_EQ(linear(0, 5), b * 5); -} - -TEST(Linear, test_default) { - EXPECT_DOUBLE_EQ(linear(18, 5), a * 18 + b * 5); -} - -TEST(NonLinear, test_zero) { - EXPECT_DOUBLE_EQ(nonlinear(0, 0, 0, 0), 0); -} - -TEST(NonLinear, test_u0) { - EXPECT_DOUBLE_EQ(nonlinear(18, 18, 0, 0), a * 18 - b * std::pow(18, 2)); -} - -TEST(NonLinear, test_y0) { - EXPECT_DOUBLE_EQ(nonlinear(0, 0, 5, 5), c * 5 + d * std::sin(5)); -} - -TEST(NonLinear, test_default) { - EXPECT_DOUBLE_EQ(nonlinear(18, 18, 5, 5), - a * 18 - b * std::pow(18, 2) + c * 5 + d * std::sin(5)); -} From 8c347a3f454891ee2a01640ee99e3fe7f31e7d0e Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 17 Dec 2025 19:50:01 +0300 Subject: [PATCH 10/25] fix: some fix --- trunk/as06617/task_02/src/CMakeLists.txt | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/trunk/as06617/task_02/src/CMakeLists.txt b/trunk/as06617/task_02/src/CMakeLists.txt index 7c5c225f..c340b791 100644 --- a/trunk/as06617/task_02/src/CMakeLists.txt +++ b/trunk/as06617/task_02/src/CMakeLists.txt @@ -11,20 +11,22 @@ add_executable(main ) target_include_directories(main PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# GoogleTest через FetchContent +include(FetchContent) +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/refs/tags/release-1.17.0.zip +) +FetchContent_MakeAvailable(googletest) + # Тесты add_executable(runTests tests.cpp func.cpp ) - -target_include_directories(runTests PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - /usr/local/Cellar/googletest/1.17.0/include -) - target_link_libraries(runTests - /usr/local/Cellar/googletest/1.17.0/lib/libgtest.a - /usr/local/Cellar/googletest/1.17.0/lib/libgtest_main.a + GTest::gtest + GTest::gtest_main pthread ) From 8ddffb723719eb78e44bd56557a99380008c2447 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 17 Dec 2025 19:56:01 +0300 Subject: [PATCH 11/25] fix: some fix --- trunk/as06617/task_02/src/CMakeLists.txt | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/trunk/as06617/task_02/src/CMakeLists.txt b/trunk/as06617/task_02/src/CMakeLists.txt index c340b791..7cdf2e7f 100644 --- a/trunk/as06617/task_02/src/CMakeLists.txt +++ b/trunk/as06617/task_02/src/CMakeLists.txt @@ -11,24 +11,15 @@ add_executable(main ) target_include_directories(main PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -# GoogleTest через FetchContent -include(FetchContent) -FetchContent_Declare( - googletest - URL https://github.com/google/googletest/archive/refs/tags/release-1.17.0.zip -) -FetchContent_MakeAvailable(googletest) - # Тесты +find_package(GTest REQUIRED) + add_executable(runTests tests.cpp func.cpp ) -target_link_libraries(runTests - GTest::gtest - GTest::gtest_main - pthread -) +target_include_directories(runTests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${GTEST_INCLUDE_DIRS}) +target_link_libraries(runTests ${GTEST_BOTH_LIBRARIES} pthread) enable_testing() include(GoogleTest) From 7813e081c25a1d9313568a2d6ca2a3f1b4231aec Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 17 Dec 2025 19:57:53 +0300 Subject: [PATCH 12/25] fix: some fix --- trunk/as06617/task_02/src/CMakeLists.txt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/trunk/as06617/task_02/src/CMakeLists.txt b/trunk/as06617/task_02/src/CMakeLists.txt index 7cdf2e7f..4736e530 100644 --- a/trunk/as06617/task_02/src/CMakeLists.txt +++ b/trunk/as06617/task_02/src/CMakeLists.txt @@ -12,14 +12,21 @@ add_executable(main target_include_directories(main PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) # Тесты -find_package(GTest REQUIRED) - add_executable(runTests tests.cpp func.cpp ) -target_include_directories(runTests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${GTEST_INCLUDE_DIRS}) -target_link_libraries(runTests ${GTEST_BOTH_LIBRARIES} pthread) + +# Пути Homebrew GTest +target_include_directories(runTests PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + /usr/local/include +) +target_link_libraries(runTests + /usr/local/lib/libgtest.a + /usr/local/lib/libgtest_main.a + pthread +) enable_testing() include(GoogleTest) From 0ee9572319a26741a194f2f567dd2e43be341e78 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 17 Dec 2025 20:02:39 +0300 Subject: [PATCH 13/25] fix: some fix --- trunk/as06617/task_02/doc/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/trunk/as06617/task_02/doc/readme.md b/trunk/as06617/task_02/doc/readme.md index 0281da95..92ad0a95 100644 --- a/trunk/as06617/task_02/doc/readme.md +++ b/trunk/as06617/task_02/doc/readme.md @@ -71,7 +71,6 @@ TEST(NonLinear, test_default) { EXPECT_DOUBLE_EQ(nonlinear(18, 18, 5, 5), a * 18 - b * pow(18, 2) + c * 5 + d * std::sin(5));view. } - Start 1: Linear.test_zero 1/8 Test #1: Linear.test_zero ................. Passed 0.01 sec Start 2: Linear.test_u0 @@ -93,4 +92,5 @@ Start 8: NonLinear.test_default Total Test time (real) = 0.07 sec -Вывод: В рамках работы разработаны и запущены модульные тесты для функций linear() и nonlinear() с использованием Google Test. Все восемь тестов успешно прошли, что подтверждает корректность реализованных вычислений. По отчёту OpenCppCoverage суммарное покрытие проекта около 26% из-за включения сторонних библиотек, при этом пользовательский файл func.cpp протестирован на 100%. \ No newline at end of file + +Вывод: В ходе лабораторной работы были созданы и выполнены модульные тесты для функций linear() и nonlinear() с использованием Google Test. Все восемь тестов прошли успешно, что подтверждает корректную работу функций. По результатам анализа покрытия (например, с помощью OpenCppCoverage) пользовательский файл func.cpp имеет 100% покрытие, хотя суммарное покрытие проекта около 26% из-за включения сторонних библиотек. \ No newline at end of file From 5a7d819c4a59d6405f7a561790d28b3f671a8f26 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 17 Dec 2025 20:48:29 +0300 Subject: [PATCH 14/25] fix: some fix --- trunk/as06617/task_02/src/CMakeLists.txt | 16 +++++++--------- trunk/as06617/task_02/src/main.cpp | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/trunk/as06617/task_02/src/CMakeLists.txt b/trunk/as06617/task_02/src/CMakeLists.txt index 4736e530..e118a7f6 100644 --- a/trunk/as06617/task_02/src/CMakeLists.txt +++ b/trunk/as06617/task_02/src/CMakeLists.txt @@ -11,23 +11,21 @@ add_executable(main ) target_include_directories(main PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# Найти Google Test через find_package +find_package(GTest REQUIRED) + # Тесты add_executable(runTests tests.cpp func.cpp ) -# Пути Homebrew GTest -target_include_directories(runTests PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - /usr/local/include -) +target_include_directories(runTests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(runTests - /usr/local/lib/libgtest.a - /usr/local/lib/libgtest_main.a - pthread + GTest::gtest + GTest::gtest_main ) enable_testing() include(GoogleTest) -gtest_discover_tests(runTests) +gtest_discover_tests(runTests) \ No newline at end of file diff --git a/trunk/as06617/task_02/src/main.cpp b/trunk/as06617/task_02/src/main.cpp index 2a93d276..04051ed2 100644 --- a/trunk/as06617/task_02/src/main.cpp +++ b/trunk/as06617/task_02/src/main.cpp @@ -1,7 +1,7 @@ #include #include #include "func.h" -#ifdef _WIN32Expand commentComment on line R5ResolvedCode has comments. Press enter to view. +#ifdef _WIN32 #include #endif From a0e3746f7bd6c386a1b3f9ee2f5864a0fce22a7b Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 17 Dec 2025 20:52:21 +0300 Subject: [PATCH 15/25] fix: some fix --- trunk/as06617/task_02/doc/readme.md | 4 ++-- trunk/as06617/task_02/src/CMakeLists.txt | 20 ++++++++++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/trunk/as06617/task_02/doc/readme.md b/trunk/as06617/task_02/doc/readme.md index 92ad0a95..0281da95 100644 --- a/trunk/as06617/task_02/doc/readme.md +++ b/trunk/as06617/task_02/doc/readme.md @@ -71,6 +71,7 @@ TEST(NonLinear, test_default) { EXPECT_DOUBLE_EQ(nonlinear(18, 18, 5, 5), a * 18 - b * pow(18, 2) + c * 5 + d * std::sin(5));view. } + Start 1: Linear.test_zero 1/8 Test #1: Linear.test_zero ................. Passed 0.01 sec Start 2: Linear.test_u0 @@ -92,5 +93,4 @@ Start 8: NonLinear.test_default Total Test time (real) = 0.07 sec - -Вывод: В ходе лабораторной работы были созданы и выполнены модульные тесты для функций linear() и nonlinear() с использованием Google Test. Все восемь тестов прошли успешно, что подтверждает корректную работу функций. По результатам анализа покрытия (например, с помощью OpenCppCoverage) пользовательский файл func.cpp имеет 100% покрытие, хотя суммарное покрытие проекта около 26% из-за включения сторонних библиотек. \ No newline at end of file +Вывод: В рамках работы разработаны и запущены модульные тесты для функций linear() и nonlinear() с использованием Google Test. Все восемь тестов успешно прошли, что подтверждает корректность реализованных вычислений. По отчёту OpenCppCoverage суммарное покрытие проекта около 26% из-за включения сторонних библиотек, при этом пользовательский файл func.cpp протестирован на 100%. \ No newline at end of file diff --git a/trunk/as06617/task_02/src/CMakeLists.txt b/trunk/as06617/task_02/src/CMakeLists.txt index e118a7f6..b4a2d87e 100644 --- a/trunk/as06617/task_02/src/CMakeLists.txt +++ b/trunk/as06617/task_02/src/CMakeLists.txt @@ -11,8 +11,24 @@ add_executable(main ) target_include_directories(main PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -# Найти Google Test через find_package -find_package(GTest REQUIRED) +# Попытаться найти Google Test локально +find_package(GTest QUIET) + +# Если не найден - загрузить автоматически +if(NOT GTest_FOUND) + include(FetchContent) + FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/release-1.12.1.zip + DOWNLOAD_EXTRACT_TIMESTAMP TRUE + ) + set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) + FetchContent_MakeAvailable(googletest) + + # Создаём алиасы для совместимости + add_library(GTest::gtest ALIAS gtest) + add_library(GTest::gtest_main ALIAS gtest_main) +endif() # Тесты add_executable(runTests From 76cb9e5f3ba562e318e671b56e152afe6550fc82 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 17 Dec 2025 20:55:12 +0300 Subject: [PATCH 16/25] Remove duplicate readme file --- trunk/as06617/task_02/doc/readme.md | 96 ----------------------------- 1 file changed, 96 deletions(-) delete mode 100644 trunk/as06617/task_02/doc/readme.md diff --git a/trunk/as06617/task_02/doc/readme.md b/trunk/as06617/task_02/doc/readme.md deleted file mode 100644 index 0281da95..00000000 --- a/trunk/as06617/task_02/doc/readme.md +++ /dev/null @@ -1,96 +0,0 @@ -

Министерство образования Республики Беларусь

-

Учреждение образования

-

“Брестский Государственный Технический университет”

-

Кафедра ИИТ

- -






- -

Лабораторная работа №2

-

По дисциплине “Теория и методы автоматического управления”

-

Тема: “Тестирование программы и процент покрытия тестами”

- -




- -

Выполнил:

-

Студент 3 курса

-

Группы АС-66

-

Осовец А.О.

-

Проверил:

-

Иванюк Д.С.

- -







- -

Брест 2025

- ---- - -# Общее задание - -Написать модульные тесты для программы, разработанной в лабораторной работе №1. - -1. Использовать следующий фреймворк для модульного тестирования — [Google Test](https://google.github.io/googletest/). -3. Написать модульные тесты для основных функций программы. Разместить тесты в каталоге: **trunk\as0xxyy\task_02\test**. -4. Исходный код модифицированной программы разместить в каталоге: **trunk\as0xxyy\task_02\src**. -5. В файле `readme.md` отразить количество написанных тестов и процент покрытия кода тестами (использовать любой инструмент для анализа покрытия, например, [gcovr](https://gcovr.com/en/stable/)). -6. Также необходимо отразить выполнение работы в общем файле [`readme.md`](https://github.com/brstu/TMAU-2025/blob/main/README.md) в соответствующей строке. - -## Выполнение работы - -### Тесты - -```cpp -TEST(Linear, test_zero) { - EXPECT_DOUBLE_EQ(linear(0, 0), 0); -} - -TEST(Linear, test_u0) { - EXPECT_DOUBLE_EQ(linear(18, 0), a * 18); -} - -TEST(Linear, test_y0) { - EXPECT_DOUBLE_EQ(linear(0, 5), b * 5); -} - -TEST(Linear, test_default) { - EXPECT_DOUBLE_EQ(linear(18, 5), a * 18 + b * 5); -} - -TEST(NonLinear, test_zero) { - EXPECT_DOUBLE_EQ(nonlinear(0, 0, 0, 0), 0); -} - -TEST(NonLinear, test_u_zero) { - EXPECT_DOUBLE_EQ(nonlinear(18, 18, 0, 0), a * 18 - b * pow(18, 2));comments. Press enter to view. -} - -TEST(NonLinear, test_y_zero) { - EXPECT_DOUBLE_EQ(nonlinear(0, 0, 5, 5), c * 5 + d * std::sin(5)); -} - -TEST(NonLinear, test_default) { - EXPECT_DOUBLE_EQ(nonlinear(18, 18, 5, 5), a * 18 - b * pow(18, 2) + c * 5 + d * std::sin(5));view. -} - - -Start 1: Linear.test_zero -1/8 Test #1: Linear.test_zero ................. Passed 0.01 sec -Start 2: Linear.test_u0 -2/8 Test #2: Linear.test_u0 ................... Passed 0.01 sec -Start 3: Linear.test_y0 -3/8 Test #3: Linear.test_y0 ................... Passed 0.01 sec -Start 4: Linear.test_default -4/8 Test #4: Linear.test_default .............. Passed 0.01 sec -Start 5: NonLinear.test_zero -5/8 Test #5: NonLinear.test_zero .............. Passed 0.01 sec -Start 6: NonLinear.test_u0 -6/8 Test #6: NonLinear.test_u0 ................ Passed 0.01 sec -Start 7: NonLinear.test_y0 -7/8 Test #7: NonLinear.test_y0 ................ Passed 0.01 sec -Start 8: NonLinear.test_default -8/8 Test #8: NonLinear.test_default ........... Passed 0.01 sec - -100% tests passed, 0 tests failed out of 8 -Total Test time (real) = 0.07 sec - - -Вывод: В рамках работы разработаны и запущены модульные тесты для функций linear() и nonlinear() с использованием Google Test. Все восемь тестов успешно прошли, что подтверждает корректность реализованных вычислений. По отчёту OpenCppCoverage суммарное покрытие проекта около 26% из-за включения сторонних библиотек, при этом пользовательский файл func.cpp протестирован на 100%. \ No newline at end of file From 9c41db2219c564258b91cf24b5a22cb1a8294494 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 17 Dec 2025 20:55:24 +0300 Subject: [PATCH 17/25] Remove duplicate readme file --- trunk/as06617/task_02/doc/README.md | 96 ----------------------------- 1 file changed, 96 deletions(-) delete mode 100644 trunk/as06617/task_02/doc/README.md diff --git a/trunk/as06617/task_02/doc/README.md b/trunk/as06617/task_02/doc/README.md deleted file mode 100644 index 0281da95..00000000 --- a/trunk/as06617/task_02/doc/README.md +++ /dev/null @@ -1,96 +0,0 @@ -

Министерство образования Республики Беларусь

-

Учреждение образования

-

“Брестский Государственный Технический университет”

-

Кафедра ИИТ

- -






- -

Лабораторная работа №2

-

По дисциплине “Теория и методы автоматического управления”

-

Тема: “Тестирование программы и процент покрытия тестами”

- -




- -

Выполнил:

-

Студент 3 курса

-

Группы АС-66

-

Осовец А.О.

-

Проверил:

-

Иванюк Д.С.

- -







- -

Брест 2025

- ---- - -# Общее задание - -Написать модульные тесты для программы, разработанной в лабораторной работе №1. - -1. Использовать следующий фреймворк для модульного тестирования — [Google Test](https://google.github.io/googletest/). -3. Написать модульные тесты для основных функций программы. Разместить тесты в каталоге: **trunk\as0xxyy\task_02\test**. -4. Исходный код модифицированной программы разместить в каталоге: **trunk\as0xxyy\task_02\src**. -5. В файле `readme.md` отразить количество написанных тестов и процент покрытия кода тестами (использовать любой инструмент для анализа покрытия, например, [gcovr](https://gcovr.com/en/stable/)). -6. Также необходимо отразить выполнение работы в общем файле [`readme.md`](https://github.com/brstu/TMAU-2025/blob/main/README.md) в соответствующей строке. - -## Выполнение работы - -### Тесты - -```cpp -TEST(Linear, test_zero) { - EXPECT_DOUBLE_EQ(linear(0, 0), 0); -} - -TEST(Linear, test_u0) { - EXPECT_DOUBLE_EQ(linear(18, 0), a * 18); -} - -TEST(Linear, test_y0) { - EXPECT_DOUBLE_EQ(linear(0, 5), b * 5); -} - -TEST(Linear, test_default) { - EXPECT_DOUBLE_EQ(linear(18, 5), a * 18 + b * 5); -} - -TEST(NonLinear, test_zero) { - EXPECT_DOUBLE_EQ(nonlinear(0, 0, 0, 0), 0); -} - -TEST(NonLinear, test_u_zero) { - EXPECT_DOUBLE_EQ(nonlinear(18, 18, 0, 0), a * 18 - b * pow(18, 2));comments. Press enter to view. -} - -TEST(NonLinear, test_y_zero) { - EXPECT_DOUBLE_EQ(nonlinear(0, 0, 5, 5), c * 5 + d * std::sin(5)); -} - -TEST(NonLinear, test_default) { - EXPECT_DOUBLE_EQ(nonlinear(18, 18, 5, 5), a * 18 - b * pow(18, 2) + c * 5 + d * std::sin(5));view. -} - - -Start 1: Linear.test_zero -1/8 Test #1: Linear.test_zero ................. Passed 0.01 sec -Start 2: Linear.test_u0 -2/8 Test #2: Linear.test_u0 ................... Passed 0.01 sec -Start 3: Linear.test_y0 -3/8 Test #3: Linear.test_y0 ................... Passed 0.01 sec -Start 4: Linear.test_default -4/8 Test #4: Linear.test_default .............. Passed 0.01 sec -Start 5: NonLinear.test_zero -5/8 Test #5: NonLinear.test_zero .............. Passed 0.01 sec -Start 6: NonLinear.test_u0 -6/8 Test #6: NonLinear.test_u0 ................ Passed 0.01 sec -Start 7: NonLinear.test_y0 -7/8 Test #7: NonLinear.test_y0 ................ Passed 0.01 sec -Start 8: NonLinear.test_default -8/8 Test #8: NonLinear.test_default ........... Passed 0.01 sec - -100% tests passed, 0 tests failed out of 8 -Total Test time (real) = 0.07 sec - - -Вывод: В рамках работы разработаны и запущены модульные тесты для функций linear() и nonlinear() с использованием Google Test. Все восемь тестов успешно прошли, что подтверждает корректность реализованных вычислений. По отчёту OpenCppCoverage суммарное покрытие проекта около 26% из-за включения сторонних библиотек, при этом пользовательский файл func.cpp протестирован на 100%. \ No newline at end of file From 5b0ad44da9054e370c8ab79b43ca2854dd6fbbee Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 17 Dec 2025 20:56:14 +0300 Subject: [PATCH 18/25] fix: some fix --- trunk/as06617/task_02/doc/README.md | 96 +++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 trunk/as06617/task_02/doc/README.md diff --git a/trunk/as06617/task_02/doc/README.md b/trunk/as06617/task_02/doc/README.md new file mode 100644 index 00000000..0281da95 --- /dev/null +++ b/trunk/as06617/task_02/doc/README.md @@ -0,0 +1,96 @@ +

Министерство образования Республики Беларусь

+

Учреждение образования

+

“Брестский Государственный Технический университет”

+

Кафедра ИИТ

+ +






+ +

Лабораторная работа №2

+

По дисциплине “Теория и методы автоматического управления”

+

Тема: “Тестирование программы и процент покрытия тестами”

+ +




+ +

Выполнил:

+

Студент 3 курса

+

Группы АС-66

+

Осовец А.О.

+

Проверил:

+

Иванюк Д.С.

+ +







+ +

Брест 2025

+ +--- + +# Общее задание + +Написать модульные тесты для программы, разработанной в лабораторной работе №1. + +1. Использовать следующий фреймворк для модульного тестирования — [Google Test](https://google.github.io/googletest/). +3. Написать модульные тесты для основных функций программы. Разместить тесты в каталоге: **trunk\as0xxyy\task_02\test**. +4. Исходный код модифицированной программы разместить в каталоге: **trunk\as0xxyy\task_02\src**. +5. В файле `readme.md` отразить количество написанных тестов и процент покрытия кода тестами (использовать любой инструмент для анализа покрытия, например, [gcovr](https://gcovr.com/en/stable/)). +6. Также необходимо отразить выполнение работы в общем файле [`readme.md`](https://github.com/brstu/TMAU-2025/blob/main/README.md) в соответствующей строке. + +## Выполнение работы + +### Тесты + +```cpp +TEST(Linear, test_zero) { + EXPECT_DOUBLE_EQ(linear(0, 0), 0); +} + +TEST(Linear, test_u0) { + EXPECT_DOUBLE_EQ(linear(18, 0), a * 18); +} + +TEST(Linear, test_y0) { + EXPECT_DOUBLE_EQ(linear(0, 5), b * 5); +} + +TEST(Linear, test_default) { + EXPECT_DOUBLE_EQ(linear(18, 5), a * 18 + b * 5); +} + +TEST(NonLinear, test_zero) { + EXPECT_DOUBLE_EQ(nonlinear(0, 0, 0, 0), 0); +} + +TEST(NonLinear, test_u_zero) { + EXPECT_DOUBLE_EQ(nonlinear(18, 18, 0, 0), a * 18 - b * pow(18, 2));comments. Press enter to view. +} + +TEST(NonLinear, test_y_zero) { + EXPECT_DOUBLE_EQ(nonlinear(0, 0, 5, 5), c * 5 + d * std::sin(5)); +} + +TEST(NonLinear, test_default) { + EXPECT_DOUBLE_EQ(nonlinear(18, 18, 5, 5), a * 18 - b * pow(18, 2) + c * 5 + d * std::sin(5));view. +} + + +Start 1: Linear.test_zero +1/8 Test #1: Linear.test_zero ................. Passed 0.01 sec +Start 2: Linear.test_u0 +2/8 Test #2: Linear.test_u0 ................... Passed 0.01 sec +Start 3: Linear.test_y0 +3/8 Test #3: Linear.test_y0 ................... Passed 0.01 sec +Start 4: Linear.test_default +4/8 Test #4: Linear.test_default .............. Passed 0.01 sec +Start 5: NonLinear.test_zero +5/8 Test #5: NonLinear.test_zero .............. Passed 0.01 sec +Start 6: NonLinear.test_u0 +6/8 Test #6: NonLinear.test_u0 ................ Passed 0.01 sec +Start 7: NonLinear.test_y0 +7/8 Test #7: NonLinear.test_y0 ................ Passed 0.01 sec +Start 8: NonLinear.test_default +8/8 Test #8: NonLinear.test_default ........... Passed 0.01 sec + +100% tests passed, 0 tests failed out of 8 +Total Test time (real) = 0.07 sec + + +Вывод: В рамках работы разработаны и запущены модульные тесты для функций linear() и nonlinear() с использованием Google Test. Все восемь тестов успешно прошли, что подтверждает корректность реализованных вычислений. По отчёту OpenCppCoverage суммарное покрытие проекта около 26% из-за включения сторонних библиотек, при этом пользовательский файл func.cpp протестирован на 100%. \ No newline at end of file From d1b68098d41b790cb825fc20e5d233d9f22deae9 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 24 Dec 2025 01:55:22 +0300 Subject: [PATCH 19/25] wip --- CMakeLists.txt | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 283e517a..0d50313a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,8 +2,13 @@ cmake_minimum_required (VERSION 3.5) project (TMAU) # Search for directories simular to "trunk/as0xxyy/task_0x/src/" -file(GLOB V_GLOB RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "trunk/as0*/*/src/") -foreach(item ${V_GLOB}) - message( "Find \"${item}\"" ) - add_subdirectory(${item}) -endforeach() +# Uncomment to build all projects (for CI/CD) +# file(GLOB V_GLOB RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "trunk/as0*/*/src/") +# foreach(item ${V_GLOB}) +# message( "Find \"${item}\"" ) +# add_subdirectory(${item}) +# endforeach() + +# Build only specific student project (local development) +add_subdirectory(trunk/as06617/task_01/src) +add_subdirectory(trunk/as06617/task_02/src) From b815a6685ee625a073f7bb335503f52b1cf71b8a Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 24 Dec 2025 02:04:28 +0300 Subject: [PATCH 20/25] wip --- trunk/as06617/task_02/src/CMakeLists.txt | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/trunk/as06617/task_02/src/CMakeLists.txt b/trunk/as06617/task_02/src/CMakeLists.txt index b4a2d87e..dcc68b5b 100644 --- a/trunk/as06617/task_02/src/CMakeLists.txt +++ b/trunk/as06617/task_02/src/CMakeLists.txt @@ -1,20 +1,19 @@ cmake_minimum_required(VERSION 3.16) -project(task_02) +project(as06617_task_02) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Основное приложение -add_executable(main +add_executable(as06617_task_02 main.cpp func.cpp ) -target_include_directories(main PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(as06617_task_02 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -# Попытаться найти Google Test локально +# GoogleTest find_package(GTest QUIET) -# Если не найден - загрузить автоматически if(NOT GTest_FOUND) include(FetchContent) FetchContent_Declare( @@ -24,24 +23,20 @@ if(NOT GTest_FOUND) ) set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) - - # Создаём алиасы для совместимости - add_library(GTest::gtest ALIAS gtest) - add_library(GTest::gtest_main ALIAS gtest_main) endif() # Тесты -add_executable(runTests +add_executable(as06617_task_02_tests tests.cpp func.cpp ) -target_include_directories(runTests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(runTests +target_include_directories(as06617_task_02_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(as06617_task_02_tests GTest::gtest GTest::gtest_main ) enable_testing() include(GoogleTest) -gtest_discover_tests(runTests) \ No newline at end of file +gtest_discover_tests(as06617_task_02_tests) \ No newline at end of file From bc31c843db7bcaf28f8320ad7e5eebc1ebf13a92 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 24 Dec 2025 02:17:25 +0300 Subject: [PATCH 21/25] wip --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d50313a..2a24cd24 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,5 +10,5 @@ project (TMAU) # endforeach() # Build only specific student project (local development) -add_subdirectory(trunk/as06617/task_01/src) +# add_subdirectory(trunk/as06617/task_01/src) add_subdirectory(trunk/as06617/task_02/src) From 0b96599fa1096624a00628328104993ab9221db0 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 24 Dec 2025 02:22:35 +0300 Subject: [PATCH 22/25] wip --- trunk/as06617/task_01/doc/README.md | 95 ----------------------- trunk/as06617/task_01/src/CMakeLists.txt | 5 -- trunk/as06617/task_01/src/tmau | Bin 31976 -> 0 bytes trunk/as06617/task_01/src/tmau.cpp | 47 ----------- 4 files changed, 147 deletions(-) delete mode 100644 trunk/as06617/task_01/doc/README.md delete mode 100644 trunk/as06617/task_01/src/CMakeLists.txt delete mode 100755 trunk/as06617/task_01/src/tmau delete mode 100644 trunk/as06617/task_01/src/tmau.cpp diff --git a/trunk/as06617/task_01/doc/README.md b/trunk/as06617/task_01/doc/README.md deleted file mode 100644 index 59a93b38..00000000 --- a/trunk/as06617/task_01/doc/README.md +++ /dev/null @@ -1,95 +0,0 @@ -

Министерство образования Республики Беларусь

-

Учреждение образования

-

“Брестский Государственный Технический университет”

-

Кафедра ИИТ

-






-

Лабораторная работа №1

-

По дисциплине “Теория и методы автоматического управления”

-

Тема: “Моделирование управляемого объекта”

-




-

Выполнил:

-

Студент 3 курса

-

Группы АС-66

-

Осовец А.О.

-

Проверил:

-

Иванюк Д.С.

-







-

Брест 2025

- ---- -## Task 1. Modeling controlled object -Let's get some object to be controlled. We want to control its temperature, which can be described by this differential equation: - -$$\Large\frac{dy(\tau)}{d\tau}=\frac{u(\tau)}{C}+\frac{Y_0-y(\tau)}{RC} $$ (1) - -where $\tau$ – time; $y(\tau)$ – input temperature; $u(\tau)$ – input warm; $Y_0$ – room temperature; $C,RC$ – some constants. - -After transformation we get these linear (2) and nonlinear (3) models: - -$$\Large y_{\tau+1}=ay_{\tau}+bu_{\tau}$$ (2) - -$$\Large y_{\tau+1}=ay_{\tau}-by_{\tau-1}^2+cu_{\tau}+d\sin(u_{\tau-1})$$ (3) - -where $\tau$ – time discrete moments ($1,2,3{\dots}n$); $a,b,c,d$ – some constants. - -Task is to write program (**С++**), which simulates this object temperature. - -## Выполнение работы -Инициализация параметров -``` -double a = 0.8; -double b = 0.2; -double c = 0.1; -double d = 0.05; - -int N = 20; - -vector y(N + 1, 0.0); -vector u(N + 1, 0.0); - -``` -Имея данные параметры получим результат работы программы: -```bash -linear model -t=1 y=0 -t=2 y=0 -t=3 y=0 -t=4 y=0 -t=5 y=0 -t=6 y=0.2 -t=7 y=0.36 -t=8 y=0.488 -t=9 y=0.5904 -t=10 y=0.67232 -t=11 y=0.737856 -t=12 y=0.790285 -t=13 y=0.832228 -t=14 y=0.865782 -t=15 y=0.892626 -t=16 y=0.914101 -t=17 y=0.931281 -t=18 y=0.945024 -t=19 y=0.95602 -t=20 y=0.964816 - - non linear model -t=2 y=0 -t=3 y=0 -t=4 y=0 -t=5 y=0 -t=6 y=0.1 -t=7 y=0.222074 -t=8 y=0.317732 -t=9 y=0.386396 -t=10 y=0.431 -t=11 y=0.457013 -t=12 y=0.470532 -t=13 y=0.476727 -t=14 y=0.479175 -t=15 y=0.47996 -t=16 y=0.48012 -t=17 y=0.480097 -t=18 y=0.480048 -t=19 y=0.480013 -t=20 y=0.479995 -``` \ No newline at end of file diff --git a/trunk/as06617/task_01/src/CMakeLists.txt b/trunk/as06617/task_01/src/CMakeLists.txt deleted file mode 100644 index ccf1895a..00000000 --- a/trunk/as06617/task_01/src/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.5) - -project(tmau) - -add_executable (TMAU1 tmau.cpp) \ No newline at end of file diff --git a/trunk/as06617/task_01/src/tmau b/trunk/as06617/task_01/src/tmau deleted file mode 100755 index 6b179873da02c247c6133bd6545cc5632ae732bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31976 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 R>XKa1Xes?@lvjC;{|}9vkj?-A diff --git a/trunk/as06617/task_01/src/tmau.cpp b/trunk/as06617/task_01/src/tmau.cpp deleted file mode 100644 index b15db9e2..00000000 --- a/trunk/as06617/task_01/src/tmau.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include -#include -#include -using namespace std; - -struct Coeffs { - double a; - double b; - double c; - double d; -}; - -double linear_model(double y_t, double u_t, double a, double b) { - return a * y_t + b * u_t; -} - -double nonlinear_model(double y_t, double y_prev, double u_t, double u_prev, const Coeffs& coeffs) { - return coeffs.a * y_t - coeffs.b * y_prev * y_prev + coeffs.c * u_t + coeffs.d * sin(u_prev); -} - -int main() { - Coeffs coeffs = {0.8, 0.2, 0.1, 0.05}; - int N = 20; - vector y(N + 1, 0.0); - vector u(N + 1, 0.0); - - for (int t = 0; t <= N; t++) { - u[t] = (t < 5) ? 0.0 : 1.0; - } - - cout << "Linear model" << endl; - for (int t = 0; t < N; t++) { - y[t + 1] = linear_model(y[t], u[t], coeffs.a, coeffs.b); - cout << "t=" << t + 1 << " y=" << fixed << setprecision(4) << y[t + 1] << endl; - } - - fill(y.begin(), y.end(), 0.0); - - cout << "\nNonlinear model" << endl; - for (int t = 1; t < N; t++) { - y[t + 1] = nonlinear_model(y[t], y[t - 1], u[t], u[t - 1], coeffs); - cout << "t=" << t + 1 << " y=" << fixed << setprecision(4) << y[t + 1] << endl; - } - - return 0; -} From 968b6c6dde52ecc8dd5bf06359a9d90c49f42eb5 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 24 Dec 2025 09:27:21 +0300 Subject: [PATCH 23/25] wip --- trunk/as06617/task_02/doc/README.md | 117 +++++++++++----------------- trunk/as06617/task_02/src/func.cpp | 33 ++++---- trunk/as06617/task_02/src/func.h | 26 ++++--- trunk/as06617/task_02/src/tests.cpp | 60 +++++++++----- 4 files changed, 123 insertions(+), 113 deletions(-) diff --git a/trunk/as06617/task_02/doc/README.md b/trunk/as06617/task_02/doc/README.md index 0281da95..705217e1 100644 --- a/trunk/as06617/task_02/doc/README.md +++ b/trunk/as06617/task_02/doc/README.md @@ -1,96 +1,67 @@ -

Министерство образования Республики Беларусь

+

Министерство образования Республики Беларусь

Учреждение образования

-

“Брестский Государственный Технический университет”

+

Брестский государственный технический университет

Кафедра ИИТ

-






+



-

Лабораторная работа №2

-

По дисциплине “Теория и методы автоматического управления”

-

Тема: “Тестирование программы и процент покрытия тестами”

+

Лабораторная работа №2

+

+Дисциплина: «Теория и методы автоматического управления» +

+

+Тема: тестирование программного модуля и анализ покрытия кода +

-




+


-

Выполнил:

-

Студент 3 курса

-

Группы АС-66

-

Осовец А.О.

-

Проверил:

-

Иванюк Д.С.

+

+Выполнил: студент 3 курса
+Группа АС-66
+Осовец А.О. +

-







+

+Проверил:
+Иванюк Д.С. +

-

Брест 2025

+



+ +

Брест, 2025

--- -# Общее задание +## Цель работы -Написать модульные тесты для программы, разработанной в лабораторной работе №1. +Целью лабораторной работы является освоение базовых принципов модульного тестирования программ на языке C++ с использованием фреймворка Google Test, а также получение навыков анализа покрытия кода тестами. -1. Использовать следующий фреймворк для модульного тестирования — [Google Test](https://google.github.io/googletest/). -3. Написать модульные тесты для основных функций программы. Разместить тесты в каталоге: **trunk\as0xxyy\task_02\test**. -4. Исходный код модифицированной программы разместить в каталоге: **trunk\as0xxyy\task_02\src**. -5. В файле `readme.md` отразить количество написанных тестов и процент покрытия кода тестами (использовать любой инструмент для анализа покрытия, например, [gcovr](https://gcovr.com/en/stable/)). -6. Также необходимо отразить выполнение работы в общем файле [`readme.md`](https://github.com/brstu/TMAU-2025/blob/main/README.md) в соответствующей строке. +--- -## Выполнение работы +## Постановка задачи -### Тесты +В рамках выполнения работы необходимо: -```cpp -TEST(Linear, test_zero) { - EXPECT_DOUBLE_EQ(linear(0, 0), 0); -} +- разработать набор модульных тестов для функций, реализованных в лабораторной работе №1; +- использовать библиотеку Google Test для автоматизации тестирования; +- организовать исходный код и тесты в соответствии со структурой репозитория; +- проанализировать процент покрытия пользовательского кода тестами. -TEST(Linear, test_u0) { - EXPECT_DOUBLE_EQ(linear(18, 0), a * 18); -} +--- -TEST(Linear, test_y0) { - EXPECT_DOUBLE_EQ(linear(0, 5), b * 5); -} +## Реализация тестирования -TEST(Linear, test_default) { - EXPECT_DOUBLE_EQ(linear(18, 5), a * 18 + b * 5); -} +Для проверки корректности вычислений были разработаны тесты для функций линейной и нелинейной динамики системы. -TEST(NonLinear, test_zero) { - EXPECT_DOUBLE_EQ(nonlinear(0, 0, 0, 0), 0); -} - -TEST(NonLinear, test_u_zero) { - EXPECT_DOUBLE_EQ(nonlinear(18, 18, 0, 0), a * 18 - b * pow(18, 2));comments. Press enter to view. -} +Тесты проверяют следующие случаи: +- нулевые входные данные; +- отсутствие управляющего воздействия; +- отсутствие состояния системы; +- типовые значения аргументов. -TEST(NonLinear, test_y_zero) { - EXPECT_DOUBLE_EQ(nonlinear(0, 0, 5, 5), c * 5 + d * std::sin(5)); -} +Пример теста для линейной модели: -TEST(NonLinear, test_default) { - EXPECT_DOUBLE_EQ(nonlinear(18, 18, 5, 5), a * 18 - b * pow(18, 2) + c * 5 + d * std::sin(5));view. +```cpp +TEST(LinearModel, ZeroInput) { + EXPECT_DOUBLE_EQ(linear(0.0, 0.0), 0.0); } - - -Start 1: Linear.test_zero -1/8 Test #1: Linear.test_zero ................. Passed 0.01 sec -Start 2: Linear.test_u0 -2/8 Test #2: Linear.test_u0 ................... Passed 0.01 sec -Start 3: Linear.test_y0 -3/8 Test #3: Linear.test_y0 ................... Passed 0.01 sec -Start 4: Linear.test_default -4/8 Test #4: Linear.test_default .............. Passed 0.01 sec -Start 5: NonLinear.test_zero -5/8 Test #5: NonLinear.test_zero .............. Passed 0.01 sec -Start 6: NonLinear.test_u0 -6/8 Test #6: NonLinear.test_u0 ................ Passed 0.01 sec -Start 7: NonLinear.test_y0 -7/8 Test #7: NonLinear.test_y0 ................ Passed 0.01 sec -Start 8: NonLinear.test_default -8/8 Test #8: NonLinear.test_default ........... Passed 0.01 sec - -100% tests passed, 0 tests failed out of 8 -Total Test time (real) = 0.07 sec - - -Вывод: В рамках работы разработаны и запущены модульные тесты для функций linear() и nonlinear() с использованием Google Test. Все восемь тестов успешно прошли, что подтверждает корректность реализованных вычислений. По отчёту OpenCppCoverage суммарное покрытие проекта около 26% из-за включения сторонних библиотек, при этом пользовательский файл func.cpp протестирован на 100%. \ No newline at end of file diff --git a/trunk/as06617/task_02/src/func.cpp b/trunk/as06617/task_02/src/func.cpp index 1ffa360b..2339bee5 100644 --- a/trunk/as06617/task_02/src/func.cpp +++ b/trunk/as06617/task_02/src/func.cpp @@ -1,20 +1,27 @@ #include "func.h" #include -// Определения параметров модели -const int STEPS = 10; -const double a = 0.99; -const double b = 0.01; -const double c = 0.5; -const double d = 0.1; -const double Y0 = 18.0; +namespace model_params { + constexpr int STEPS_COUNT = 10; + constexpr double A = 0.99; + constexpr double B = 0.01; + constexpr double C = 0.5; + constexpr double D = 0.1; + constexpr double INITIAL_Y = 18.0; +} -// Линейная динамика -double linear(double y, double u) { - return a * y + b * u; +// Линейная модель +inline double linear(double y, double u) { + return model_params::A * y + model_params::B * u; } -// Нелинейная динамика -double nonlinear(double y, double y_prev, double u, double u_prev) { - return a * y - b * std::pow(y_prev, 2) + c * u + d * std::sin(u_prev); +// Нелинейная модель +inline double nonlinear(double y, + double y_prev, + double u, + double u_prev) { + return model_params::A * y + - model_params::B * (y_prev * y_prev) + + model_params::C * u + + model_params::D * std::sin(u_prev); } diff --git a/trunk/as06617/task_02/src/func.h b/trunk/as06617/task_02/src/func.h index 47e3d950..bebc1b97 100644 --- a/trunk/as06617/task_02/src/func.h +++ b/trunk/as06617/task_02/src/func.h @@ -1,14 +1,22 @@ #pragma once + #include -// Параметры модели (объявления) -extern const int STEPS; -extern const double a; -extern const double b; -extern const double c; -extern const double d; -extern const double Y0; +namespace model_params { + // Параметры модели + constexpr int STEPS_COUNT = 10; + constexpr double A = 0.99; + constexpr double B = 0.01; + constexpr double C = 0.5; + constexpr double D = 0.1; + constexpr double INITIAL_Y = 18.0; +} -// Прототипы функций модели +// Функции динамики системы double linear(double y, double u); -double nonlinear(double y, double y_prev, double u, double u_prev); + +double nonlinear(double current_y, + double previous_y, + double control_u, + double previous_u); + diff --git a/trunk/as06617/task_02/src/tests.cpp b/trunk/as06617/task_02/src/tests.cpp index 67f315cd..738abc4e 100644 --- a/trunk/as06617/task_02/src/tests.cpp +++ b/trunk/as06617/task_02/src/tests.cpp @@ -2,35 +2,59 @@ #include "func.h" #include -TEST(Linear, test_zero) { - EXPECT_DOUBLE_EQ(linear(0, 0), 0); +using namespace model_params; + +// ===== Linear model tests ===== + +TEST(LinearModel, ZeroInput) { + EXPECT_DOUBLE_EQ(linear(0.0, 0.0), 0.0); } -TEST(Linear, test_u0) { - EXPECT_DOUBLE_EQ(linear(18, 0), a * 18); +TEST(LinearModel, ZeroControl) { + const double y = INITIAL_Y; + EXPECT_DOUBLE_EQ(linear(y, 0.0), A * y); } -TEST(Linear, test_y0) { - EXPECT_DOUBLE_EQ(linear(0, 5), b * 5); +TEST(LinearModel, ZeroState) { + const double u = 5.0; + EXPECT_DOUBLE_EQ(linear(0.0, u), B * u); } -TEST(Linear, test_default) { - EXPECT_DOUBLE_EQ(linear(18, 5), a * 18 + b * 5); +TEST(LinearModel, TypicalValues) { + const double y = INITIAL_Y; + const double u = 5.0; + EXPECT_DOUBLE_EQ(linear(y, u), A * y + B * u); } -TEST(NonLinear, test_zero) { - EXPECT_DOUBLE_EQ(nonlinear(0, 0, 0, 0), 0); +// ===== Nonlinear model tests ===== + +TEST(NonLinearModel, ZeroInput) { + EXPECT_DOUBLE_EQ(nonlinear(0.0, 0.0, 0.0, 0.0), 0.0); } -TEST(NonLinear, test_u0) { - EXPECT_DOUBLE_EQ(nonlinear(18, 18, 0, 0), a * 18 - b * std::pow(18, 2)); +TEST(NonLinearModel, ZeroControlSignal) { + const double y = INITIAL_Y; + EXPECT_DOUBLE_EQ( + nonlinear(y, y, 0.0, 0.0), + A * y - B * (y * y) + ); } -TEST(NonLinear, test_y0) { - EXPECT_DOUBLE_EQ(nonlinear(0, 0, 5, 5), c * 5 + d * std::sin(5)); +TEST(NonLinearModel, ZeroStateValue) { + const double u = 5.0; + EXPECT_DOUBLE_EQ( + nonlinear(0.0, 0.0, u, u), + C * u + D * std::sin(u) + ); } -TEST(NonLinear, test_default) { - EXPECT_DOUBLE_EQ(nonlinear(18, 18, 5, 5), - a * 18 - b * std::pow(18, 2) + c * 5 + d * std::sin(5)); -} \ No newline at end of file +TEST(NonLinearModel, TypicalValues) { + const double y = INITIAL_Y; + const double u = 5.0; + + const double expected = + A * y - B * (y * y) + + C * u + D * std::sin(u); + + EXPECT_DOUBLE_EQ(nonlinear(y, y, u, u), expected); +} From 957cb6061f79068457c3965f6c3b411a2ebf0012 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 24 Dec 2025 09:30:41 +0300 Subject: [PATCH 24/25] wip --- trunk/as06617/task_02/src/main.cpp | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/trunk/as06617/task_02/src/main.cpp b/trunk/as06617/task_02/src/main.cpp index 04051ed2..9e719a12 100644 --- a/trunk/as06617/task_02/src/main.cpp +++ b/trunk/as06617/task_02/src/main.cpp @@ -1,36 +1,43 @@ #include #include #include "func.h" + #ifdef _WIN32 #include #endif using namespace std; +using namespace model_params; // 👈 ВАЖНО static void simulateLinear(const vector& input) { - double y = Y0; + double y = INITIAL_Y; cout << "=== Линейная модель ===\n"; - cout << "y0 = " << Y0 << '\n'; - for (int i = 0; i < STEPS; ++i) { + cout << "y0 = " << INITIAL_Y << '\n'; + + for (int i = 0; i < STEPS_COUNT; ++i) { y = linear(y, input[i]); cout << "Шаг " << i + 1 << ": y = " << y << '\n'; } } + static void simulateNonlinear(const vector& input) { - double y = Y0; - double y_prev = Y0; + double y = INITIAL_Y; + double y_prev = INITIAL_Y; + cout << "\n=== Нелинейная модель ===\n"; - cout << "y0 = " << Y0 << '\n'; - for (int i = 0; i < STEPS; ++i) { + cout << "y0 = " << INITIAL_Y << '\n'; + + for (int i = 0; i < STEPS_COUNT; ++i) { double u_prev = (i == 0) ? input[0] : input[i - 1]; double y_old = y; + y = nonlinear(y, y_prev, input[i], u_prev); + cout << "Шаг " << i + 1 << ": y = " << y << '\n'; y_prev = y_old; } } - int main() { #ifdef _WIN32 @@ -39,9 +46,9 @@ int main() { #endif vector input; - input.reserve(STEPS); + input.reserve(STEPS_COUNT); - for (int i = 0; i < STEPS; ++i) { + for (int i = 0; i < STEPS_COUNT; ++i) { switch (i % 3) { case 0: input.push_back(5); break; case 1: input.push_back(7); break; From c27703bed9b3b19885ebd4567df96eda9d5a1f68 Mon Sep 17 00:00:00 2001 From: arseniiOsovets Date: Wed, 24 Dec 2025 09:32:11 +0300 Subject: [PATCH 25/25] wip --- trunk/as06617/task_02/src/func.cpp | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/trunk/as06617/task_02/src/func.cpp b/trunk/as06617/task_02/src/func.cpp index 2339bee5..28d9b546 100644 --- a/trunk/as06617/task_02/src/func.cpp +++ b/trunk/as06617/task_02/src/func.cpp @@ -1,25 +1,16 @@ #include "func.h" #include -namespace model_params { - constexpr int STEPS_COUNT = 10; - constexpr double A = 0.99; - constexpr double B = 0.01; - constexpr double C = 0.5; - constexpr double D = 0.1; - constexpr double INITIAL_Y = 18.0; -} - // Линейная модель -inline double linear(double y, double u) { +double linear(double y, double u) { return model_params::A * y + model_params::B * u; } // Нелинейная модель -inline double nonlinear(double y, - double y_prev, - double u, - double u_prev) { +double nonlinear(double y, + double y_prev, + double u, + double u_prev) { return model_params::A * y - model_params::B * (y_prev * y_prev) + model_params::C * u