From 3c1e39ab8ab45613962dc4737ca2ffa0ecab1af0 Mon Sep 17 00:00:00 2001 From: HeZongLun <13425468+hezonglun@user.noreply.gitee.com> Date: Wed, 1 Oct 2025 21:08:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84=E5=A4=A7?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 22 +- .../Sources/NahidaBenchmarkTest.cpp | 66 --- .../Sources/NahidaBenchmarkTest.h | 81 --- .../Sources/NahidaMockTest.cpp | 1 - .../Sources/NahidaMockTest.h | 555 ------------------ .../Sources/NahidaUnitTest.cpp | 54 -- .../Sources/NahidaUnitTest.h | 29 - .../Tests/ModuleUnitTestFile.cpp | 73 --- .../.gitignore | 0 .../BuildExample.sln | 0 ...roject-Console-DynamicBuildExample.vcxproj | 0 ...onsole-DynamicBuildExample.vcxproj.filters | 0 ...t-Console-DynamicBuildExample.vcxproj.user | 0 .../main.cpp | 0 ...oject-Database-DynamicBuildExample.vcxproj | 0 ...tabase-DynamicBuildExample.vcxproj.filters | 0 ...-Database-DynamicBuildExample.vcxproj.user | 0 .../main.cpp | 0 ...roject-Generic-DynamicBuildExample.vcxproj | 0 ...eneric-DynamicBuildExample.vcxproj.filters | 0 ...t-Generic-DynamicBuildExample.vcxproj.user | 0 .../main.cpp | 0 ...ect-Mathmatics-DynamicBuildExample.vcxproj | 0 ...matics-DynamicBuildExample.vcxproj.filters | 0 ...athmatics-DynamicBuildExample.vcxproj.user | 0 .../main.cpp | 0 ...aProject-Other-DynamicBuildExample.vcxproj | 0 ...-Other-DynamicBuildExample.vcxproj.filters | 0 ...ect-Other-DynamicBuildExample.vcxproj.user | 0 .../main.cpp | 0 ...-Serialization-DynamicBuildExample.vcxproj | 0 ...zation-DynamicBuildExample.vcxproj.filters | 0 ...alization-DynamicBuildExample.vcxproj.user | 0 .../main.cpp | 0 ...Project-Thread-DynamicBuildExample.vcxproj | 0 ...Thread-DynamicBuildExample.vcxproj.filters | 0 ...ct-Thread-DynamicBuildExample.vcxproj.user | 0 .../main.cpp | 0 ...oject-UnitTest-DynamicBuildExample.vcxproj | 0 ...itTest-DynamicBuildExample.vcxproj.filters | 0 ...-UnitTest-DynamicBuildExample.vcxproj.user | 0 .../main.cpp | 0 .../README.md | 0 ...NahidaProject-Console-BuildExample.vcxproj | 0 ...oject-Console-BuildExample.vcxproj.filters | 0 ...aProject-Console-BuildExample.vcxproj.user | 0 .../main.cpp | 0 ...ahidaProject-Database-BuildExample.vcxproj | 0 ...ject-Database-BuildExample.vcxproj.filters | 0 ...Project-Database-BuildExample.vcxproj.user | 0 .../main.cpp | 0 ...NahidaProject-Generic-BuildExample.vcxproj | 0 ...oject-Generic-BuildExample.vcxproj.filters | 0 ...aProject-Generic-BuildExample.vcxproj.user | 0 .../TestRead.log | 0 .../main.cpp | 0 ...daProject-Mathematics-BuildExample.vcxproj | 0 ...t-Mathematics-BuildExample.vcxproj.filters | 0 ...ject-Mathematics-BuildExample.vcxproj.user | 0 .../main.cpp | 0 .../NahidaProject-Other-BuildExample.vcxproj | 0 ...Project-Other-BuildExample.vcxproj.filters | 0 ...idaProject-Other-BuildExample.vcxproj.user | 0 .../NahidaProject-Other-BuildExample/main.cpp | 0 ...Project-Serialization-BuildExample.vcxproj | 0 ...Serialization-BuildExample.vcxproj.filters | 0 ...ct-Serialization-BuildExample.vcxproj.user | 0 .../TestRead.csv | 0 .../main.cpp | 0 ...ystem-DynamicInjector-BuildExample.vcxproj | 0 ...namicInjector-BuildExample.vcxproj.filters | 0 ...-DynamicInjector-BuildExample.vcxproj.user | 0 .../main.cpp | 0 ...-System-RegisterTable-BuildExample.vcxproj | 0 ...RegisterTable-BuildExample.vcxproj.filters | 0 ...em-RegisterTable-BuildExample.vcxproj.user | 0 .../main.cpp | 0 ...roject-System-Service-BuildExample.vcxproj | 0 ...ystem-Service-BuildExample.vcxproj.filters | 0 ...t-System-Service-BuildExample.vcxproj.user | 0 .../main.cpp | 0 .../TestMaterials/DynamicLinkedLibrary.dll | Bin .../TestMaterials/ExecutableFile.exe | Bin .../NahidaProject-Thread-BuildExample.vcxproj | 0 ...roject-Thread-BuildExample.vcxproj.filters | 0 ...daProject-Thread-BuildExample.vcxproj.user | 0 .../main.cpp | 0 ...ahidaProject-UnitTest-BuildExample.vcxproj | 0 ...ject-UnitTest-BuildExample.vcxproj.filters | 0 ...Project-UnitTest-BuildExample.vcxproj.user | 0 .../main.cpp | 0 .../sample-atof-dist.txt | 0 .../sample-atof.txt | 0 .../sample-sscanf-dist.txt | 0 .../sample-sscanf.txt | 0 .../sample-stod-dist.txt | 0 .../sample-stod.txt | 0 .../sample-strtod-dist.txt | 0 .../sample-strtod.txt | 0 .../CMakeLists.txt | 21 +- .../Sources/ChooseDialog.cpp | 0 .../Sources/ChooseDialog.h | 0 .../Sources/CommandLineParser.cpp | 0 .../Sources/CommandLineParser.h | 0 .../Sources/TablePrint.cpp | 0 .../Sources/TablePrint.h | 0 .../Sources/TerminalColor.cpp | 0 .../Sources/TerminalColor.h | 0 .../Tests/ModuleUnitTestFile.cpp | 10 +- .../CMakeLists.txt | 26 +- .../Sources/ODBC.cpp | 0 .../Sources/ODBC.h | 0 .../Tests/ModuleUnitTestFile.cpp | 6 +- .../CMakeLists.txt | 27 +- .../Sources/BloomFilter.cpp | 0 .../Sources/BloomFilter.h | 2 +- .../Sources/HTTPRequest.cpp | 0 .../Sources/HTTPRequest.h | 0 .../Sources/Logger.cpp | 0 .../Sources/Logger.h | 0 .../Sources/NahidaProject.cpp | 0 .../Sources/NahidaProject.h | 0 .../Sources/SortModule.cpp | 0 .../Sources/SortModule.h | 0 .../Tests/ModuleUnitTestFile.cpp | 30 +- .../CMakeLists.txt | 23 +- .../Sources/BigInteger.cpp | 0 .../Sources/BigInteger.h | 0 .../Sources/RandomGenerator.cpp | 0 .../Sources/RandomGenerator.h | 0 .../Sources/Statistics.cpp | 0 .../Sources/Statistics.h | 0 .../Sources/Vector.cpp | 0 .../Sources/Vector.h | 0 .../Tests/ModuleUnitTestFile.cpp | 42 +- .../CMakeLists.txt | 22 +- .../Sources/CowSay.cpp | 0 .../Sources/CowSay.h | 0 .../Sources/Turtle.cpp | 0 .../Sources/Turtle.h | 0 .../Tests/ModuleUnitTestFile.cpp | 6 +- .../CMakeLists.txt | 23 +- .../Sources/CSV.cpp | 0 .../Sources/CSV.h | 0 .../Sources/INIReader.cpp | 0 .../Sources/INIReader.h | 0 .../Sources/INIWriter.cpp | 0 .../Sources/INIWriter.h | 0 .../Sources/JSON.cpp | 0 .../Sources/JSON.h | 0 .../Sources/JSONParser.cpp | 0 .../Sources/JSONParser.h | 0 .../Sources/XMLReader.cpp | 0 .../Sources/XMLReader.h | 0 .../Sources/XMLWriter.cpp | 0 .../Sources/XMLWriter.h | 0 .../Sources/YAML.cpp | 0 .../Sources/YAML.h | 0 .../Tests/ModuleUnitTestFile.cpp | 48 +- .../CMakeLists.txt | 21 +- .../Sources/DynamicLinkedLibraryInjector.cpp | 0 .../Sources/DynamicLinkedLibraryInjector.h | 0 .../Sources/DynamicLinkedLibraryLoader.cpp | 0 .../Sources/DynamicLinkedLibraryLoader.h | 0 .../Sources/RegisterTable.cpp | 0 .../Sources/RegisterTable.h | 0 .../Sources/SerialPort.cpp | 0 .../Sources/SerialPort.h | 0 .../Sources/WindowsService.cpp | 0 .../Sources/WindowsService.h | 0 .../Tests/ModuleUnitTestFile.cpp | 12 +- .../CMakeLists.txt | 21 +- .../Tests/ModuleUnitTestFile.cpp | 0 .../CMakeLists.txt | 21 +- .../Sources/EventBus.cpp | 0 .../Sources/EventBus.h | 0 .../Sources/MemoryPool.cpp | 0 .../Sources/MemoryPool.h | 0 .../Sources/SignalAndSlot.cpp | 0 .../Sources/SignalAndSlot.h | 0 .../Sources/TaskTimer.cpp | 0 .../Sources/TaskTimer.h | 0 .../Sources/ThreadPool.cpp | 0 .../Sources/ThreadPool.h | 0 .../Sources/TimingWheel.cpp | 0 .../Sources/TimingWheel.h | 0 .../Tests/ModuleUnitTestFile.cpp | 26 +- .../CMakeLists.txt | 20 +- .../Sources/NahidaBenchmarkTest.cpp | 169 ++++++ .../Sources/NahidaBenchmarkTest.h | 270 +++++++++ .../Sources/NahidaMockTest.cpp | 19 + .../Sources/NahidaMockTest.h | 264 +++++++++ .../Sources/NahidaUnitTest.cpp | 172 ++++++ .../Sources/NahidaUnitTest.h | 257 ++++++++ .../Tests/ModuleUnitTestFile.cpp | 217 +++++++ NahidaProject4CSharp/.gitignore | 5 - .../App.config | 6 - ...ject4CSharp.Database.FunctionalTest.csproj | 59 -- .../Program.cs | 42 -- .../Properties/AssemblyInfo.cs | 33 -- .../App.config | 14 - ...oject4CSharp.Generic.FunctionalTest.csproj | 64 -- .../Program.cs | 45 -- .../Properties/AssemblyInfo.cs | 33 -- .../App.config | 6 - ...ject4CSharp.UnitTest.FunctionalTest.csproj | 60 -- .../Program.cs | 150 ----- .../Properties/AssemblyInfo.cs | 33 -- .../NahidaPrjoect4CSharp.Database.csproj | 48 -- .../NahidaPrjoect4CSharp.Database/ODBC.cs | 121 ---- .../Properties/AssemblyInfo.cs | 33 -- .../BloomFilter.cs | 54 -- .../HTTPRequest.cs | 540 ----------------- .../NahidaProject4CSharp.Generic/Logger.cs | 427 -------------- .../NahidaProject.cs | 25 - .../NahidaProject4CSharp.Generic.csproj | 61 -- .../Properties/AssemblyInfo.cs | 33 -- .../SortModule.cs | 232 -------- .../NahidaProject4CSharp.Generic/app.config | 11 - .../packages.config | 4 - .../NahidaBenchmarkTest.cs | 370 ------------ .../NahidaMockTest.cs | 174 ------ .../NahidaProject4CSharp.UnitTest.csproj | 54 -- .../NahidaUnitTest.cs | 176 ------ .../Properties/AssemblyInfo.cs | 33 -- NahidaProject4CSharp/NahidaProject4CSharp.sln | 62 -- README.md | 20 +- 227 files changed, 1590 insertions(+), 4094 deletions(-) delete mode 100644 NahidaProject-UnitTest/Sources/NahidaBenchmarkTest.cpp delete mode 100644 NahidaProject-UnitTest/Sources/NahidaBenchmarkTest.h delete mode 100644 NahidaProject-UnitTest/Sources/NahidaMockTest.cpp delete mode 100644 NahidaProject-UnitTest/Sources/NahidaMockTest.h delete mode 100644 NahidaProject-UnitTest/Sources/NahidaUnitTest.cpp delete mode 100644 NahidaProject-UnitTest/Sources/NahidaUnitTest.h delete mode 100644 NahidaProject-UnitTest/Tests/ModuleUnitTestFile.cpp rename {BuildExample => NahidaProject.BuildExample}/.gitignore (100%) rename {BuildExample => NahidaProject.BuildExample}/BuildExample.sln (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/NahidaProject-Console-DynamicBuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/NahidaProject-Console-DynamicBuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/NahidaProject-Console-DynamicBuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/NahidaProject-Database-DynamicBuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/NahidaProject-Database-DynamicBuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/NahidaProject-Database-DynamicBuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/NahidaProject-Generic-DynamicBuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/NahidaProject-Generic-DynamicBuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/NahidaProject-Generic-DynamicBuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/NahidaProject-Mathmatics-DynamicBuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/NahidaProject-Mathmatics-DynamicBuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/NahidaProject-Mathmatics-DynamicBuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/NahidaProject-Other-DynamicBuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/NahidaProject-Other-DynamicBuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/NahidaProject-Other-DynamicBuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/NahidaProject-Serialization-DynamicBuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/NahidaProject-Serialization-DynamicBuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/NahidaProject-Serialization-DynamicBuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/NahidaProject-Thread-DynamicBuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/NahidaProject-Thread-DynamicBuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/NahidaProject-Thread-DynamicBuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/NahidaProject-UnitTest-DynamicBuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/NahidaProject-UnitTest-DynamicBuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/NahidaProject-UnitTest-DynamicBuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/README.md (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Console-BuildExample/NahidaProject-Console-BuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Console-BuildExample/NahidaProject-Console-BuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Console-BuildExample/NahidaProject-Console-BuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Console-BuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Database-BuildExample/NahidaProject-Database-BuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Database-BuildExample/NahidaProject-Database-BuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Database-BuildExample/NahidaProject-Database-BuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Database-BuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Generic-BuildExample/NahidaProject-Generic-BuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Generic-BuildExample/NahidaProject-Generic-BuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Generic-BuildExample/NahidaProject-Generic-BuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Generic-BuildExample/TestRead.log (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Generic-BuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Mathematics-BuildExample/NahidaProject-Mathematics-BuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Mathematics-BuildExample/NahidaProject-Mathematics-BuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Mathematics-BuildExample/NahidaProject-Mathematics-BuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Mathematics-BuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Other-BuildExample/NahidaProject-Other-BuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Other-BuildExample/NahidaProject-Other-BuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Other-BuildExample/NahidaProject-Other-BuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Other-BuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Serialization-BuildExample/NahidaProject-Serialization-BuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Serialization-BuildExample/NahidaProject-Serialization-BuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Serialization-BuildExample/NahidaProject-Serialization-BuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Serialization-BuildExample/TestRead.csv (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Serialization-BuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/NahidaProject-System-DynamicInjector-BuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/NahidaProject-System-DynamicInjector-BuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/NahidaProject-System-DynamicInjector-BuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/NahidaProject-System-RegisterTable-BuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/NahidaProject-System-RegisterTable-BuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/NahidaProject-System-RegisterTable-BuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/NahidaProject-System-Service-BuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/NahidaProject-System-Service-BuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/NahidaProject-System-Service-BuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-System-BuildExample/TestMaterials/DynamicLinkedLibrary.dll (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-System-BuildExample/TestMaterials/ExecutableFile.exe (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Thread-BuildExample/NahidaProject-Thread-BuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Thread-BuildExample/NahidaProject-Thread-BuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Thread-BuildExample/NahidaProject-Thread-BuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-Thread-BuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-UnitTest-BuildExample/NahidaProject-UnitTest-BuildExample.vcxproj (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-UnitTest-BuildExample/NahidaProject-UnitTest-BuildExample.vcxproj.filters (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-UnitTest-BuildExample/NahidaProject-UnitTest-BuildExample.vcxproj.user (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-UnitTest-BuildExample/main.cpp (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-atof-dist.txt (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-atof.txt (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-sscanf-dist.txt (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-sscanf.txt (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-stod-dist.txt (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-stod.txt (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-strtod-dist.txt (100%) rename {BuildExample => NahidaProject.BuildExample}/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-strtod.txt (100%) rename {NahidaProject-Console => NahidaProject.Console}/CMakeLists.txt (32%) rename {NahidaProject-Console => NahidaProject.Console}/Sources/ChooseDialog.cpp (100%) rename {NahidaProject-Console => NahidaProject.Console}/Sources/ChooseDialog.h (100%) rename {NahidaProject-Console => NahidaProject.Console}/Sources/CommandLineParser.cpp (100%) rename {NahidaProject-Console => NahidaProject.Console}/Sources/CommandLineParser.h (100%) rename {NahidaProject-Console => NahidaProject.Console}/Sources/TablePrint.cpp (100%) rename {NahidaProject-Console => NahidaProject.Console}/Sources/TablePrint.h (100%) rename {NahidaProject-Console => NahidaProject.Console}/Sources/TerminalColor.cpp (100%) rename {NahidaProject-Console => NahidaProject.Console}/Sources/TerminalColor.h (100%) rename {NahidaProject-Console => NahidaProject.Console}/Tests/ModuleUnitTestFile.cpp (93%) rename {NahidaProject-Database => NahidaProject.Database}/CMakeLists.txt (31%) rename {NahidaProject-Database => NahidaProject.Database}/Sources/ODBC.cpp (100%) rename {NahidaProject-Database => NahidaProject.Database}/Sources/ODBC.h (100%) rename {NahidaProject-Database => NahidaProject.Database}/Tests/ModuleUnitTestFile.cpp (84%) rename {NahidaProject-Generic => NahidaProject.Generic}/CMakeLists.txt (31%) rename {NahidaProject-Generic => NahidaProject.Generic}/Sources/BloomFilter.cpp (100%) rename {NahidaProject-Generic => NahidaProject.Generic}/Sources/BloomFilter.h (98%) rename {NahidaProject-Generic => NahidaProject.Generic}/Sources/HTTPRequest.cpp (100%) rename {NahidaProject-Generic => NahidaProject.Generic}/Sources/HTTPRequest.h (100%) rename {NahidaProject-Generic => NahidaProject.Generic}/Sources/Logger.cpp (100%) rename {NahidaProject-Generic => NahidaProject.Generic}/Sources/Logger.h (100%) rename {NahidaProject-Generic => NahidaProject.Generic}/Sources/NahidaProject.cpp (100%) rename {NahidaProject-Generic => NahidaProject.Generic}/Sources/NahidaProject.h (100%) rename {NahidaProject-Generic => NahidaProject.Generic}/Sources/SortModule.cpp (100%) rename {NahidaProject-Generic => NahidaProject.Generic}/Sources/SortModule.h (100%) rename {NahidaProject-Generic => NahidaProject.Generic}/Tests/ModuleUnitTestFile.cpp (70%) rename {NahidaProject-Mathematics => NahidaProject.Mathematics}/CMakeLists.txt (32%) rename {NahidaProject-Mathematics => NahidaProject.Mathematics}/Sources/BigInteger.cpp (100%) rename {NahidaProject-Mathematics => NahidaProject.Mathematics}/Sources/BigInteger.h (100%) rename {NahidaProject-Mathematics => NahidaProject.Mathematics}/Sources/RandomGenerator.cpp (100%) rename {NahidaProject-Mathematics => NahidaProject.Mathematics}/Sources/RandomGenerator.h (100%) rename {NahidaProject-Mathematics => NahidaProject.Mathematics}/Sources/Statistics.cpp (100%) rename {NahidaProject-Mathematics => NahidaProject.Mathematics}/Sources/Statistics.h (100%) rename {NahidaProject-Mathematics => NahidaProject.Mathematics}/Sources/Vector.cpp (100%) rename {NahidaProject-Mathematics => NahidaProject.Mathematics}/Sources/Vector.h (100%) rename {NahidaProject-Mathematics => NahidaProject.Mathematics}/Tests/ModuleUnitTestFile.cpp (48%) rename {NahidaProject-Other => NahidaProject.Other}/CMakeLists.txt (32%) rename {NahidaProject-Other => NahidaProject.Other}/Sources/CowSay.cpp (100%) rename {NahidaProject-Other => NahidaProject.Other}/Sources/CowSay.h (100%) rename {NahidaProject-Other => NahidaProject.Other}/Sources/Turtle.cpp (100%) rename {NahidaProject-Other => NahidaProject.Other}/Sources/Turtle.h (100%) rename {NahidaProject-Other => NahidaProject.Other}/Tests/ModuleUnitTestFile.cpp (48%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/CMakeLists.txt (31%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/CSV.cpp (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/CSV.h (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/INIReader.cpp (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/INIReader.h (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/INIWriter.cpp (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/INIWriter.h (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/JSON.cpp (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/JSON.h (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/JSONParser.cpp (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/JSONParser.h (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/XMLReader.cpp (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/XMLReader.h (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/XMLWriter.cpp (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/XMLWriter.h (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/YAML.cpp (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Sources/YAML.h (100%) rename {NahidaProject-Serialization => NahidaProject.Serialization}/Tests/ModuleUnitTestFile.cpp (68%) rename {NahidaProject-System => NahidaProject.System}/CMakeLists.txt (32%) rename {NahidaProject-System => NahidaProject.System}/Sources/DynamicLinkedLibraryInjector.cpp (100%) rename {NahidaProject-System => NahidaProject.System}/Sources/DynamicLinkedLibraryInjector.h (100%) rename {NahidaProject-System => NahidaProject.System}/Sources/DynamicLinkedLibraryLoader.cpp (100%) rename {NahidaProject-System => NahidaProject.System}/Sources/DynamicLinkedLibraryLoader.h (100%) rename {NahidaProject-System => NahidaProject.System}/Sources/RegisterTable.cpp (100%) rename {NahidaProject-System => NahidaProject.System}/Sources/RegisterTable.h (100%) rename {NahidaProject-System => NahidaProject.System}/Sources/SerialPort.cpp (100%) rename {NahidaProject-System => NahidaProject.System}/Sources/SerialPort.h (100%) rename {NahidaProject-System => NahidaProject.System}/Sources/WindowsService.cpp (100%) rename {NahidaProject-System => NahidaProject.System}/Sources/WindowsService.h (100%) rename {NahidaProject-System => NahidaProject.System}/Tests/ModuleUnitTestFile.cpp (55%) rename {NahidaProject-ThirdParty => NahidaProject.ThirdParty}/CMakeLists.txt (32%) rename {NahidaProject-ThirdParty => NahidaProject.ThirdParty}/Tests/ModuleUnitTestFile.cpp (100%) rename {NahidaProject-Thread => NahidaProject.Thread}/CMakeLists.txt (32%) rename {NahidaProject-Thread => NahidaProject.Thread}/Sources/EventBus.cpp (100%) rename {NahidaProject-Thread => NahidaProject.Thread}/Sources/EventBus.h (100%) rename {NahidaProject-Thread => NahidaProject.Thread}/Sources/MemoryPool.cpp (100%) rename {NahidaProject-Thread => NahidaProject.Thread}/Sources/MemoryPool.h (100%) rename {NahidaProject-Thread => NahidaProject.Thread}/Sources/SignalAndSlot.cpp (100%) rename {NahidaProject-Thread => NahidaProject.Thread}/Sources/SignalAndSlot.h (100%) rename {NahidaProject-Thread => NahidaProject.Thread}/Sources/TaskTimer.cpp (100%) rename {NahidaProject-Thread => NahidaProject.Thread}/Sources/TaskTimer.h (100%) rename {NahidaProject-Thread => NahidaProject.Thread}/Sources/ThreadPool.cpp (100%) rename {NahidaProject-Thread => NahidaProject.Thread}/Sources/ThreadPool.h (100%) rename {NahidaProject-Thread => NahidaProject.Thread}/Sources/TimingWheel.cpp (100%) rename {NahidaProject-Thread => NahidaProject.Thread}/Sources/TimingWheel.h (100%) rename {NahidaProject-Thread => NahidaProject.Thread}/Tests/ModuleUnitTestFile.cpp (78%) rename {NahidaProject-UnitTest => NahidaProject.UnitTest}/CMakeLists.txt (32%) create mode 100644 NahidaProject.UnitTest/Sources/NahidaBenchmarkTest.cpp create mode 100644 NahidaProject.UnitTest/Sources/NahidaBenchmarkTest.h create mode 100644 NahidaProject.UnitTest/Sources/NahidaMockTest.cpp create mode 100644 NahidaProject.UnitTest/Sources/NahidaMockTest.h create mode 100644 NahidaProject.UnitTest/Sources/NahidaUnitTest.cpp create mode 100644 NahidaProject.UnitTest/Sources/NahidaUnitTest.h create mode 100644 NahidaProject.UnitTest/Tests/ModuleUnitTestFile.cpp delete mode 100644 NahidaProject4CSharp/.gitignore delete mode 100644 NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/App.config delete mode 100644 NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest.csproj delete mode 100644 NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/Program.cs delete mode 100644 NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/Properties/AssemblyInfo.cs delete mode 100644 NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/App.config delete mode 100644 NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest.csproj delete mode 100644 NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/Program.cs delete mode 100644 NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/Properties/AssemblyInfo.cs delete mode 100644 NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/App.config delete mode 100644 NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest.csproj delete mode 100644 NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/Program.cs delete mode 100644 NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/Properties/AssemblyInfo.cs delete mode 100644 NahidaProject4CSharp/NahidaPrjoect4CSharp.Database/NahidaPrjoect4CSharp.Database.csproj delete mode 100644 NahidaProject4CSharp/NahidaPrjoect4CSharp.Database/ODBC.cs delete mode 100644 NahidaProject4CSharp/NahidaPrjoect4CSharp.Database/Properties/AssemblyInfo.cs delete mode 100644 NahidaProject4CSharp/NahidaProject4CSharp.Generic/BloomFilter.cs delete mode 100644 NahidaProject4CSharp/NahidaProject4CSharp.Generic/HTTPRequest.cs delete mode 100644 NahidaProject4CSharp/NahidaProject4CSharp.Generic/Logger.cs delete mode 100644 NahidaProject4CSharp/NahidaProject4CSharp.Generic/NahidaProject.cs delete mode 100644 NahidaProject4CSharp/NahidaProject4CSharp.Generic/NahidaProject4CSharp.Generic.csproj delete mode 100644 NahidaProject4CSharp/NahidaProject4CSharp.Generic/Properties/AssemblyInfo.cs delete mode 100644 NahidaProject4CSharp/NahidaProject4CSharp.Generic/SortModule.cs delete mode 100644 NahidaProject4CSharp/NahidaProject4CSharp.Generic/app.config delete mode 100644 NahidaProject4CSharp/NahidaProject4CSharp.Generic/packages.config delete mode 100644 NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaBenchmarkTest.cs delete mode 100644 NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaMockTest.cs delete mode 100644 NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaProject4CSharp.UnitTest.csproj delete mode 100644 NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaUnitTest.cs delete mode 100644 NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/Properties/AssemblyInfo.cs delete mode 100644 NahidaProject4CSharp/NahidaProject4CSharp.sln diff --git a/CMakeLists.txt b/CMakeLists.txt index 01cd2ba..5a1abf7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ # CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置并包含子项目。 CMAKE_MINIMUM_REQUIRED(VERSION 3.31.6 FATAL_ERROR) -PROJECT("NahidaProject" VERSION 0.0.0.1) +PROJECT("NahidaProject") OPTION(BUILD_THIRDPARTY "Specific build thrid-party module" OFF) OPTION(BUILD_CONSOLE "Specific build console module" ON) @@ -26,41 +26,41 @@ ENDIF() # 有条件地包含子项目。 IF(FALSE) - ADD_SUBDIRECTORY("NahidaProject-ThirdParty") + ADD_SUBDIRECTORY("NahidaProject.ThirdParty") ENDIF() IF(${BUILD_CONSOLE}) - ADD_SUBDIRECTORY("NahidaProject-Console") + ADD_SUBDIRECTORY("NahidaProject.Console") ENDIF() IF(${BUILD_DATABASE}) - ADD_SUBDIRECTORY("NahidaProject-Database") + ADD_SUBDIRECTORY("NahidaProject.Database") ENDIF() IF(${BUILD_GENERIC}) - ADD_SUBDIRECTORY("NahidaProject-Generic") + ADD_SUBDIRECTORY("NahidaProject.Generic") ENDIF() IF(${BUILD_MATHEMATICS}) - ADD_SUBDIRECTORY("NahidaProject-Mathematics") + ADD_SUBDIRECTORY("NahidaProject.Mathematics") ENDIF() IF(${BUILD_OTHER}) - ADD_SUBDIRECTORY("NahidaProject-Other") + ADD_SUBDIRECTORY("NahidaProject.Other") ENDIF() IF(${BUILD_SERIALIZATION}) - ADD_SUBDIRECTORY("NahidaProject-Serialization") + ADD_SUBDIRECTORY("NahidaProject.Serialization") ENDIF() IF(${BUILD_SYSTEM}) - ADD_SUBDIRECTORY("NahidaProject-System") + ADD_SUBDIRECTORY("NahidaProject.System") ENDIF() IF(${BUILD_THREAD}) - ADD_SUBDIRECTORY("NahidaProject-Thread") + ADD_SUBDIRECTORY("NahidaProject.Thread") ENDIF() IF(${BUILD_UNITTEST}) - ADD_SUBDIRECTORY("NahidaProject-UnitTest") + ADD_SUBDIRECTORY("NahidaProject.UnitTest") ENDIF() diff --git a/NahidaProject-UnitTest/Sources/NahidaBenchmarkTest.cpp b/NahidaProject-UnitTest/Sources/NahidaBenchmarkTest.cpp deleted file mode 100644 index 22e0632..0000000 --- a/NahidaProject-UnitTest/Sources/NahidaBenchmarkTest.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include "NahidaBenchmarkTest.h" - -NahidaProject::NahidaBenchmarkTest::RuntimeResult NahidaProject::NahidaBenchmarkTest::Time(int count, std::vector func) { - NahidaProject::NahidaBenchmarkTest::RuntimeResult runtimes; - for (const auto& e : func) { - NahidaProject::NahidaBenchmarkTest::BenchmarkTestResult benchmarkTestResult; - benchmarkTestResult.name = e.name; - benchmarkTestResult.minimalRecordedRuntime = std::numeric_limits::max(); - benchmarkTestResult.maximalRecordedRuntime = 0; - benchmarkTestResult.averageRuntime = 0; - - double old_avg = 0, old_var = 0; - - std::chrono::high_resolution_clock::duration total = std::chrono::high_resolution_clock::duration::zero(); - for (int i = 0; i < count; ++i) { - std::chrono::high_resolution_clock::time_point t = std::chrono::high_resolution_clock::now(); - e.func(); - std::chrono::high_resolution_clock::duration d = std::chrono::high_resolution_clock::now() - t; - total += d; - long long duration = std::chrono::duration_cast(d).count(); - benchmarkTestResult.averageRuntime += duration; - - if (duration < benchmarkTestResult.minimalRecordedRuntime) { - benchmarkTestResult.minimalRecordedRuntime = duration; - } - - if (duration > benchmarkTestResult.maximalRecordedRuntime) { - benchmarkTestResult.maximalRecordedRuntime = duration; - } - - benchmarkTestResult.distributionOfRuntimes[duration]++; - if (i == 0) { - old_avg = benchmarkTestResult.averageRuntime = duration; - } - else { - benchmarkTestResult.averageRuntime = old_avg + (duration - old_avg) / (i + 1); - benchmarkTestResult.runtimeVariance = old_var + (duration - old_avg) * (duration - benchmarkTestResult.averageRuntime); - old_avg = benchmarkTestResult.averageRuntime; - old_var = benchmarkTestResult.runtimeVariance; - } - } - benchmarkTestResult.runtimeVariance = count > 1 ? benchmarkTestResult.runtimeVariance / (count - 1) : 0; - benchmarkTestResult.standardDeviation = sqrt(benchmarkTestResult.runtimeVariance); - runtimes.insert(make_pair(total, benchmarkTestResult)); - } - return runtimes; -} - -NahidaProject::NahidaBenchmarkTest::CompareResult NahidaProject::NahidaBenchmarkTest::Compare(const RuntimeResult& runtimes) { - CompareResult compare; - for (const auto& a : runtimes) { - Comparison comp; - comp.name = a.second.name; - for (const auto& b : runtimes) { - if (a.second.name == b.second.name) { - comp.pct.emplace_back(0); - continue; - } - double d0 = std::chrono::duration_cast(a.first).count(); - double d1 = std::chrono::duration_cast(b.first).count(); - comp.pct.emplace_back((d1 - d0) / d1 * 100.0); - } - compare.insert(std::make_pair(a.first, comp)); - } - return compare; -} diff --git a/NahidaProject-UnitTest/Sources/NahidaBenchmarkTest.h b/NahidaProject-UnitTest/Sources/NahidaBenchmarkTest.h deleted file mode 100644 index cea3e79..0000000 --- a/NahidaProject-UnitTest/Sources/NahidaBenchmarkTest.h +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef NAHIDABENCHMARKTEST_H -#define NAHIDABENCHMARKTEST_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace NahidaProject { - class __declspec(dllexport) NahidaBenchmarkTest { - private: - typedef struct { std::string name; std::vector pct; } Comparison; - typedef struct { std::string name; std::function func; } Test; - typedef struct { std::string name; double minimalRecordedRuntime; double maximalRecordedRuntime; double averageRuntime; double runtimeVariance; double standardDeviation; std::map distributionOfRuntimes; } BenchmarkTestResult; - - typedef std::multimap RuntimeResult; - typedef std::multimap CompareResult; - - public: - static RuntimeResult Time(int count, std::vector func); - static CompareResult Compare(const RuntimeResult& runtimes); - - template static void PrintResult(const RuntimeResult& result, int prec = 2, size_t w = 10) { - for (const auto& a : result) { - w = a.second.name.size() > w ? a.second.name.size() + 1 : w; - } - std::cout << std::setw(w) << " " << std::setw(w) << std::right << "runtime" << std::setw(w) << "min" << std::setw(w) << "max" << std::setw(w) << "avg" << std::setw(w) << "var" << std::setw(w) << "dev" << std::endl; - double conv = std::chrono::high_resolution_clock::period::den / T::period::den; - - for (const auto& a : result) { - std::cout << std::setw(w) << std::right << a.second.name << std::setw(w) << std::chrono::duration_cast(a.first).count() << std::setw(w) << std::fixed << std::setprecision(prec) << (a.second.minimalRecordedRuntime / conv) << std::setw(w) << std::fixed << std::setprecision(prec) << (a.second.maximalRecordedRuntime / conv) << std::setw(w) << std::fixed << std::setprecision(prec) << (a.second.averageRuntime / conv) << std::setw(w) << std::fixed << std::setprecision(prec) << (a.second.runtimeVariance / (conv * conv)) << std::setw(w) << std::fixed << std::setprecision(prec) << (a.second.standardDeviation / conv) << std::endl; - } - } - - template static bool WriteResult(const std::string& base, const RuntimeResult& result, char delim = '\t', int prec = 5) { - double conv = std::chrono::high_resolution_clock::period::den / T::period::den; - for (const auto& a : result) { - std::ofstream res(base + "-" + a.second.name + ".txt"); - res << std::chrono::duration_cast(a.first).count() << delim << std::fixed << std::setprecision(prec) << (a.second.minimalRecordedRuntime / conv) << delim << std::fixed << std::setprecision(prec) << (a.second.maximalRecordedRuntime / conv) << delim << std::fixed << std::setprecision(prec) << (a.second.averageRuntime / conv) << delim << std::fixed << std::setprecision(prec) << (a.second.runtimeVariance / conv) << delim << std::fixed << std::setprecision(prec) << (a.second.standardDeviation / conv) << std::endl; - if (!res.good()) return false; - std::ofstream dist(base + "-" + a.second.name + "-dist.txt"); - for (const auto& s : a.second.distributionOfRuntimes) { - dist << s.first << delim << s.second << std::endl; - if (!dist.good()) return false; - } - } - return true; - } - - template static void PrintResult(const CompareResult& compare) { - size_t w = 10; - for (const auto& a : compare) - w = a.second.name.size() > w ? a.second.name.size() + 1 : w; - - std::cout << std::setw(w) << " " << std::setw(w) << std::right << "runtime"; - for (const auto& a : compare) - std::cout << std::setw(w) << std::right << a.second.name; - std::cout << std::endl; - - for (const auto& a : compare) { - std::cout << std::setw(w) << std::right << a.second.name << std::setw(w) << std::chrono::duration_cast(a.first).count(); - for (const auto& p : a.second.pct) { - if (p == 0) { - std::cout << std::setw(w) << "--"; - continue; - } - std::cout << std::setw(w - 1) << std::fixed << std::setprecision(2) << p << "%" << std::setprecision(0); - } - std::cout << std::endl; - } - } - - }; -} -#endif \ No newline at end of file diff --git a/NahidaProject-UnitTest/Sources/NahidaMockTest.cpp b/NahidaProject-UnitTest/Sources/NahidaMockTest.cpp deleted file mode 100644 index e4e0300..0000000 --- a/NahidaProject-UnitTest/Sources/NahidaMockTest.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "NahidaMockTest.h" diff --git a/NahidaProject-UnitTest/Sources/NahidaMockTest.h b/NahidaProject-UnitTest/Sources/NahidaMockTest.h deleted file mode 100644 index 4477d5c..0000000 --- a/NahidaProject-UnitTest/Sources/NahidaMockTest.h +++ /dev/null @@ -1,555 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace NahidaProject { - namespace NahidaMockTest { - namespace MockDetails{ -#if __cplusplus <= 201703L - template struct __declspec(dllexport) RemoveCvref { - using Type = typename std::remove_cv::type>::type; - }; -#else - using std::remove_cvref; -#endif - -#if __cplusplus < 201703L - template - struct __declspec(dllexport) IsInvocableR : std::is_constructible, std::reference_wrapper::type>>{ - - }; -#else - using std::is_invocable_r; -#endif - - template struct __declspec(dllexport) IndexSequence{ using type = IndexSequence; }; - template struct __declspec(dllexport) MakeIndexSequence{}; - - template<> struct __declspec(dllexport) MakeIndexSequence<0> : IndexSequence<> {}; - template<> struct __declspec(dllexport) MakeIndexSequence<1> : IndexSequence<0> {}; - template<> struct __declspec(dllexport) MakeIndexSequence<2> : IndexSequence<0, 1> {}; - template<> struct __declspec(dllexport) MakeIndexSequence<3> : IndexSequence<0, 1, 2> {}; - template<> struct __declspec(dllexport) MakeIndexSequence<4> : IndexSequence<0, 1, 2, 3> {}; - template<> struct __declspec(dllexport) MakeIndexSequence<5> : IndexSequence<0, 1, 2, 3, 4> {}; - template<> struct __declspec(dllexport) MakeIndexSequence<6> : IndexSequence<0, 1, 2, 3, 4, 5> {}; - template<> struct __declspec(dllexport) MakeIndexSequence<7> : IndexSequence<0, 1, 2, 3, 4, 5, 6> {}; - template<> struct __declspec(dllexport) MakeIndexSequence<8> : IndexSequence<0, 1, 2, 3, 4, 5, 6, 7> {}; - template<> struct __declspec(dllexport) MakeIndexSequence<9> : IndexSequence<0, 1, 2, 3, 4, 5, 6, 7, 8> {}; - template<> struct __declspec(dllexport) MakeIndexSequence<10> : IndexSequence<0, 1, 2, 3, 4, 5, 6, 7, 8, 9> {}; - } - - namespace Invoking{ - using namespace NahidaProject::NahidaMockTest::MockDetails; - - template class __declspec(dllexport) ReturnValues{ - public: - using StorageType = std::vector; - template T operator()(Args&&...){ - if (index == values.size()){ - return values.back(); - } - else{ - return values[index++]; - } - } - - StorageType values; - std::size_t index; - }; - - class __declspec(dllexport) IgnoreArguments { - public: - explicit IgnoreArguments(const void*){ - - } - - template void Save(const T&){ - - } - }; - - template class __declspec(dllexport) SaveArguments { - explicit SaveArguments(T* arg) : _arg(arg){ - - } - - void Save(const T& value){ - *_arg = value; - } - - T* _arg; - }; - - template struct __declspec(dllexport) SyncArgumentsSave { using type = IgnoreArguments; }; - template struct __declspec(dllexport) SyncArgumentsSave::value>::type> { using type = SaveArguments; }; - - template - class __declspec(dllexport) SyncArguments{ - private: - Args* _args; - ArgSetters* _setters; - - public: - using ElementType = typename std::tuple_element::type; - - SyncArguments(Args& args, ArgSetters& setters) : _args(&args), _setters(&setters){ - - } - - ~SyncArguments(){ - std::get(*_setters).Save(Get()); - } - - ElementType& Get(){ - return std::get(*_args); - } - - }; - - template static R InvokeIndexes(const F& func, Args& args, ArgSetters& setters, IndexSequence){ - return func(SyncArguments(args, setters).Get()...); - } - - template static R Invoke(F&& func, Args& args, ArgSetters& setters){ - return InvokeIndexes(func, args, setters, typename MakeIndexSequence::value>::type{}); - } - } - - namespace Matching{ - using namespace NahidaProject::NahidaMockTest::MockDetails; - class AnyMatcher { - template bool operator()(const T&) const { - return true; - } - }; - - template class __declspec(dllexport) EqualsMatcher{ - private: - T _expected; - public: - EqualsMatcher(T&& value) : _expected(std::move(value)){ - - } - - EqualsMatcher(const T& value) : _expected(value){ - - } - - bool operator()(const T& actual) const{ - return actual == _expected; - } - - }; - - template struct __declspec(dllexport) MethodArgumentsMatcher { virtual bool Matches(const Tuple& args) = 0; }; - - template struct __declspec(dllexport) AnyMethodArgumentsMatcher : MethodArgumentsMatcher{ - bool Matches(const Tuple&) override{ - return true; - } - }; - - template class __declspec(dllexport) MatchArgumentsWrapper : public MethodArgumentsMatcher{ - private: - MatcherTuple _predicates; - public: - explicit MatchArgumentsWrapper(MatcherTuple&& predicates) : _predicates(std::move(predicates)){ - - } - - bool Matches(const Tuple& args) override{ - return MatchArguments(_predicates, args); - } - - }; - - static bool AndTogether(bool value){ - return value; - } - - template static bool AndTogether(Head head, Tail... tail){ - return head && AndTogether(tail...); - } - - template static bool MatchArgumentIndexes(const P& predicates, const T& args, IndexSequence){ - return AndTogether(std::get(predicates)(std::get(args))...); - } - - template static bool MatchArguments(const P& predicates, const T& args){ - static_assert(std::tuple_size

::value == std::tuple_size::value, "The number of predicates must match the number of arguments"); - return MatchArgumentIndexes(predicates, args, typename MakeIndexSequence::value>::type{}); - } - } - - template - struct __declspec(dllexport) MethodAction{ - std::shared_ptr>> matcher;std::function action; - }; - - static Matching::AnyMatcher _; - - namespace Mocking{ - using namespace MockDetails; - - template struct __declspec(dllexport) ArgumentMatcherWrapper : std::conditional::value, Fn, Matching::EqualsMatcher>{}; - template struct __declspec(dllexport) ArgumentWrapper{ template struct MatchWith{ using type = std::tuple::type...>;};}; - - template class __declspec(dllexport) MethodActionBuilder{ - public: - explicit MethodActionBuilder(MethodAction* action) : _action(action){ - - } - - MethodActionBuilder(const MethodActionBuilder&) = delete; - MethodActionBuilder(MethodActionBuilder&&) = default; - - ~MethodActionBuilder(){ - if (_action->action == nullptr){ - if (_values.empty()){ - _values.push_back(R()); - } - - _action->action = Invoking::ReturnValues{ std::move(_values), 0u }; - } - - if (_action->matcher == nullptr){ - _action->matcher = std::make_shared>>(); - } - } - - MethodActionBuilder& operator=(const MethodActionBuilder&) = delete; - MethodActionBuilder& operator=(MethodActionBuilder&&) = default; - - template MethodActionBuilder& With(MatchArgs&&... args){ - static_assert( sizeof...(MatchArgs) == sizeof...(Args), "The number of matchers must match the number of arguments"); - - using matcher_tuple = typename ArgumentWrapper::template match_with::type; - _action->matcher = std::make_shared, matcher_tuple>>(matcher_tuple(std::forward(args)...)); - - return *this; - } - - MethodActionBuilder& Do(std::function function) - { - _action->action = std::move(function); - return *this; - } - - MethodActionBuilder& Return(const R& value) - { - _values.push_back(value); - return *this; - } - - MethodActionBuilder& Return(std::initializer_list values) - { - for (auto& value : values) - { - _values.push_back(value); - } - - return *this; - } - - template - MethodActionBuilder& Throw(ConstructorArgs&&... args) - { - E exception(std::forward(args)...); - _action->action = [=](const Args& ...) -> R - { - throw exception; - }; - - return *this; - } - private: - MethodAction* _action; - typename Invoking::ReturnValues::StorageType _values; - }; - - template - class __declspec(dllexport) MethodActionBuilder - { - public: - explicit MethodActionBuilder(MethodAction* action) : - _action(action) - { - } - - MethodActionBuilder(const MethodActionBuilder&) = delete; - MethodActionBuilder(MethodActionBuilder&&) = default; - - ~MethodActionBuilder() - { - if (_action->action == nullptr) - { - _action->action = [](const Args& ...) {}; - } - - if (_action->matcher == nullptr) - { - _action->matcher = std::make_shared>>(); - } - } - - MethodActionBuilder& operator=(const MethodActionBuilder&) = delete; - MethodActionBuilder& operator=(MethodActionBuilder&&) = default; - - template - MethodActionBuilder& With(MatchArgs&&... args) - { - static_assert(sizeof...(MatchArgs) == sizeof...(Args), "The number of matchers must match the number of arguments"); - using matcher_tuple = typename ArgumentWrapper::template match_with::type; - _action->matcher = std::make_shared, matcher_tuple>>(matcher_tuple(std::forward(args)...)); - - return *this; - } - - MethodActionBuilder& Do(std::function function) - { - _action->action = std::move(function); - return *this; - } - - template - MethodActionBuilder& Throw(ConstructorArgs&&... args) - { - E exception(std::forward(args)...); - _action->action = [=](const Args& ...) -> void - { - throw exception; - }; - - return *this; - } - private: - MethodAction* _action; - }; - - template - class __declspec(dllexport) MethodVerifyBuilder - { - public: - MethodVerifyBuilder( - const char* method, - const char* file, - std::size_t line, - const std::vector>* calls - ) : - _calls(calls), - _count(std::numeric_limits::max()), - _matched_count(calls->size()), - _method(method), - _file(file), - _line(line) - { - } - - MethodVerifyBuilder(const MethodVerifyBuilder&) = delete; - MethodVerifyBuilder(MethodVerifyBuilder&&) = default; - - ~MethodVerifyBuilder() noexcept(false) - { - if (_count == std::numeric_limits::max()) - { - if (_matched_count == 0) - { - std::ostringstream stream; - WriteLocation(stream) << "Expecting a call to " - << _method << " but none were received."; - throw std::runtime_error(stream.str()); - } - } - else if (_count != _matched_count) - { - std::ostringstream stream; - WriteLocation(stream) << "Expecting a call to " << _method << ' '; - WriteTimes(stream, _count) << ", but it was invoked "; - WriteTimes(stream, _matched_count) << '.'; - throw std::runtime_error(stream.str()); - } - } - - MethodVerifyBuilder& operator=(const MethodVerifyBuilder&) = delete; - MethodVerifyBuilder& operator=(MethodVerifyBuilder&&) = default; - - template - MethodVerifyBuilder& With(MatchArgs&&... matchers) - { - static_assert( - sizeof...(MatchArgs) == sizeof...(Args), - "The number of matchers must match the number of arguments"); - - using ArgumentTuple = std::tuple; - using MatcherTuple = typename ArgumentWrapper::template match_with::type; - - MatcherTuple matcher(std::forward(matchers)...); - _matched_count = std::count_if( - _calls->begin(), - _calls->end(), - [&](const ArgumentTuple& args) { return MatchArguments(matcher, args); }); - - return *this; - } - - MethodVerifyBuilder& Times(std::size_t count) - { - _count = count; - return *this; - } - private: - std::ostream& WriteLocation(std::ostream& stream) - { - return stream << _file << ':' << _line << ' '; - } - - std::ostream& WriteTimes(std::ostream& stream, std::size_t count) - { - return stream << count << " time" << ((count == 1) ? "" : "s"); - } - - const std::vector>* _calls; - std::size_t _count; - std::size_t _matched_count; - const char* _method; - const char* _file; - std::size_t _line; - }; - - template class MockMethodTypes; - - template - class __declspec(dllexport) MockMethodTypes - { - public: - using MethodActionT = MethodAction::Type...>; - using TupleT = typename std::tuple::Type ...>; - - using Action_T = typename std::vector; - using Record_T = typename std::vector; - }; - - template - static MethodActionBuilder AddAction(std::vector>& actions) - { - actions.emplace_back(MethodAction()); - return MethodActionBuilder(&actions.back()); - } - - template - static MethodVerifyBuilder CheckAction( - const char* method, - const char* file, - std::size_t line, - const std::vector>& invocations) - { - return MethodVerifyBuilder(method, file, line, &invocations); - } - - template - static T ReturnDefault() - { - return T(); - } - } - } -} - -#define EXPAND_MACRO(macro, ...) macro - -#define MAKE_FORWARD(arg) std::forward(arg) -#define MAKE_SETTER(arg) NahidaProject::NahidaMockTest::Invoking::SyncArgumentsSave::type(&arg) - -#define MOCK_METHOD_IMPL(Ret, Name, Args, Specs, NameArgs, Transform, ...) \ - Ret Name(NameArgs Args) Specs \ - { \ - Name ## _Invocations.emplace_back(std::make_tuple( \ - EXPAND_MACRO(Transform(MAKE_FORWARD, __VA_ARGS__)))); \ - auto& args = Name ## _Invocations.back(); \ - for (auto it = Name ## _Actions.rbegin(); it != Name ## _Actions.rend(); ++it) \ - { \ - if (it->matcher->Matches(args)) \ - { \ - auto setters = std::make_tuple( \ - EXPAND_MACRO(Transform(MAKE_SETTER, __VA_ARGS__))); \ - return NahidaProject::NahidaMockTest::Invoking::Invoke(it->action, args, setters); \ - } \ - } \ - return NahidaProject::NahidaMockTest::Mocking::ReturnDefault(); \ - } \ - NahidaProject::NahidaMockTest::Mocking::MockMethodTypes::Action_T Name ## _Actions; \ - mutable NahidaProject::NahidaMockTest::Mocking::MockMethodTypes::Record_T Name ## _Invocations; - - - - -#define NAME_ARGS1(type) type a -#define NAME_ARGS2(type, ...) type b, EXPAND_MACRO(NAME_ARGS1(__VA_ARGS__)) -#define NAME_ARGS3(type, ...) type c, EXPAND_MACRO(NAME_ARGS2(__VA_ARGS__)) -#define NAME_ARGS4(type, ...) type d, EXPAND_MACRO(NAME_ARGS3(__VA_ARGS__)) -#define NAME_ARGS5(type, ...) type e, EXPAND_MACRO(NAME_ARGS4(__VA_ARGS__)) -#define NAME_ARGS6(type, ...) type f, EXPAND_MACRO(NAME_ARGS5(__VA_ARGS__)) -#define NAME_ARGS7(type, ...) type g, EXPAND_MACRO(NAME_ARGS6(__VA_ARGS__)) -#define NAME_ARGS8(type, ...) type h, EXPAND_MACRO(NAME_ARGS7(__VA_ARGS__)) -#define NAME_ARGS9(type, ...) type i, EXPAND_MACRO(NAME_ARGS8(__VA_ARGS__)) -#define NAME_ARGS10(type, ...) type j, EXPAND_MACRO(NAME_ARGS9(__VA_ARGS__)) - -#define TRANSFORM1(Call, x) Call(x) -#define TRANSFORM2(Call, x, ...) Call(x), EXPAND_MACRO(TRANSFORM1(Call, __VA_ARGS__)) -#define TRANSFORM3(Call, x, ...) Call(x), EXPAND_MACRO(TRANSFORM2(Call, __VA_ARGS__)) -#define TRANSFORM4(Call, x, ...) Call(x), EXPAND_MACRO(TRANSFORM3(Call, __VA_ARGS__)) -#define TRANSFORM5(Call, x, ...) Call(x), EXPAND_MACRO(TRANSFORM4(Call, __VA_ARGS__)) -#define TRANSFORM6(Call, x, ...) Call(x), EXPAND_MACRO(TRANSFORM5(Call, __VA_ARGS__)) -#define TRANSFORM7(Call, x, ...) Call(x), EXPAND_MACRO(TRANSFORM6(Call, __VA_ARGS__)) -#define TRANSFORM8(Call, x, ...) Call(x), EXPAND_MACRO(TRANSFORM7(Call, __VA_ARGS__)) -#define TRANSFORM9(Call, x, ...) Call(x), EXPAND_MACRO(TRANSFORM8(Call, __VA_ARGS__)) -#define TRANSFORM10(Call, x, ...) Call(x), EXPAND_MACRO(TRANSFORM9(Call, __VA_ARGS__)) - -// We need to handle () and (int) differently, however, when they get passed in -// via __VA_ARG__ then it looks like we received a single parameter for both -// cases. Use the fact that we're always appending an 'a' to the parameter to -// detect the difference between 'type a' and 'a' -#define CAT(a, b) a ## b -#define GET_SECOND_ARG(a, b, ...) b -#define DEFINE_EXISTS(...) EXPAND_MACRO(GET_SECOND_ARG(__VA_ARGS__, TRUE)) -#define IS_TYPE_MISSING(x) DEFINE_EXISTS(CAT(TOKEN_IS_EMPTY_, x)) -#define TOKEN_IS_EMPTY_a ignored, FALSE -#define GET_METHOD(method, suffix) CAT(method, suffix) -#define NOOP(...) -#define MOCK_METHOD_IS_SINGLE_FALSE(Ret, Name, Args, Specs) MOCK_METHOD_IMPL(Ret, Name, Args, Specs, NOOP, NOOP) -#define MOCK_METHOD_IS_SINGLE_TRUE(Ret, Name, Args, Specs) MOCK_METHOD_IMPL(Ret, Name, Args, Specs, NAME_ARGS1, TRANSFORM1, a) -#define HANDLE_EMPTY_TYPE(...) GET_METHOD(MOCK_METHOD_IS_SINGLE_, IS_TYPE_MISSING(__VA_ARGS__ a)) - -#define MOCK_METHOD_1(Ret, Name, Args, Specs) HANDLE_EMPTY_TYPE Args (Ret, Name, Args, Specs) -#define MOCK_METHOD_2(Ret, Name, Args, Specs) MOCK_METHOD_IMPL(Ret, Name, Args, Specs, NAME_ARGS2, TRANSFORM2, b, a) -#define MOCK_METHOD_3(Ret, Name, Args, Specs) MOCK_METHOD_IMPL(Ret, Name, Args, Specs, NAME_ARGS3, TRANSFORM3, c, b, a) -#define MOCK_METHOD_4(Ret, Name, Args, Specs) MOCK_METHOD_IMPL(Ret, Name, Args, Specs, NAME_ARGS4, TRANSFORM4, d, c, b, a) -#define MOCK_METHOD_5(Ret, Name, Args, Specs) MOCK_METHOD_IMPL(Ret, Name, Args, Specs, NAME_ARGS5, TRANSFORM5, e, d, c, b, a) -#define MOCK_METHOD_6(Ret, Name, Args, Specs) MOCK_METHOD_IMPL(Ret, Name, Args, Specs, NAME_ARGS6, TRANSFORM6, f, e, d, c, b, a) -#define MOCK_METHOD_7(Ret, Name, Args, Specs) MOCK_METHOD_IMPL(Ret, Name, Args, Specs, NAME_ARGS7, TRANSFORM7, g, f, e, d, c, b, a) -#define MOCK_METHOD_8(Ret, Name, Args, Specs) MOCK_METHOD_IMPL(Ret, Name, Args, Specs, NAME_ARGS8, TRANSFORM8, h, g, f, e, d, c, b, a) -#define MOCK_METHOD_9(Ret, Name, Args, Specs) MOCK_METHOD_IMPL(Ret, Name, Args, Specs, NAME_ARGS9, TRANSFORM9, i, h, g, f, e, d, c, b, a) -#define MOCK_METHOD_10(Ret, Name, Args, Specs) MOCK_METHOD_IMPL(Ret, Name, Args, Specs, NAME_ARGS10, TRANSFORM10, j, i, h, g, f, e, d, c, b, a) - -#define GET_NTH_ARG(a, b, c, d, e, f, g, h, i, j, N, ...) N -#define GET_MOCK_METHOD(...) EXPAND_MACRO(GET_NTH_ARG(__VA_ARGS__, MOCK_METHOD_10, MOCK_METHOD_9, MOCK_METHOD_8, MOCK_METHOD_7, MOCK_METHOD_6, MOCK_METHOD_5, MOCK_METHOD_4, MOCK_METHOD_3, MOCK_METHOD_2, MOCK_METHOD_1)) - -#define INVALID_METHOD(...) static_assert(false, "Invalid usage. Call with return type, name, argument types and, optionally, specifiers."); -#define MOCK_METHOD_SPEC(Ret, Name, Args, Spec) GET_MOCK_METHOD Args (Ret, Name, Args, Spec) -#define MOCK_METHOD(Ret, Name, Args) MOCK_METHOD_SPEC(Ret, Name, Args, override) - -#define MockMethod(...) EXPAND_MACRO(EXPAND_MACRO(GET_NTH_ARG(__VA_ARGS__, INVALID_METHOD, INVALID_METHOD, INVALID_METHOD, INVALID_METHOD, INVALID_METHOD, INVALID_METHOD, MOCK_METHOD_SPEC, MOCK_METHOD, INVALID_METHOD, INVALID_METHOD))(__VA_ARGS__)) -#define MockConstMethod(Ret, Name, Args) MockMethod(Ret, Name, Args, const override) -#define When(call_method) NahidaProject::NahidaMockTest::Mocking::AddAction(call_method ## _Actions) -#define Verify(call_method) NahidaProject::NahidaMockTest::Mocking::CheckAction(#call_method, __FILE__, __LINE__, call_method ## _Invocations) - diff --git a/NahidaProject-UnitTest/Sources/NahidaUnitTest.cpp b/NahidaProject-UnitTest/Sources/NahidaUnitTest.cpp deleted file mode 100644 index 0c55818..0000000 --- a/NahidaProject-UnitTest/Sources/NahidaUnitTest.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "NahidaUnitTest.h" - -std::vector& NahidaProject::NahidaUnitTest::GetTests() { - static std::vector tests; - return tests; -} - -void NahidaProject::NahidaUnitTest::RegisterTest(const std::string& testName, std::function testFunc){ - GetTests().push_back({ testName, testFunc }); -} - -void NahidaProject::NahidaUnitTest::RunAllTests(){ - int passed = 0; - int failed = 0; - - for (const auto& test : GetTests()) { - try { - test.func(); - std::cout << "[SUCCESS] Task Slot: " << test.name << std::endl; - ++passed; - } - catch (const std::exception& ex) { - std::cerr << "[FAILURE] Task Slot: " << test.name << " - " << ex.what() << std::endl; - ++failed; - } - } - - std::cout << "===================================" << std::endl; - std::cout << "Total: " << (passed + failed) << ", Passed: " << passed << ", Failed: " << failed << std::endl; - std::cout << "===================================" << std::endl; -} - -void NahidaProject::NahidaUnitTest::RunTestByName(const std::string& testName){ - for (const auto& test : GetTests()) { - if (test.name == testName) { - try { - test.func(); - std::cout << "[SUCCESS] Task Slot: " << test.name << std::endl; - } - catch (const std::exception& ex) { - std::cerr << "[FAILURE] Task Slot: " << test.name << " - " << ex.what() << std::endl; - } - return; - } - } - std::cerr << "Test '" << testName << "' not found." << std::endl; -} - -float NahidaProject::NahidaUnitTest::CalculateExecuteTime(std::function function) { - float start = ::clock(); - function(); - float end = ::clock(); - return end - start; -} diff --git a/NahidaProject-UnitTest/Sources/NahidaUnitTest.h b/NahidaProject-UnitTest/Sources/NahidaUnitTest.h deleted file mode 100644 index 04b8a52..0000000 --- a/NahidaProject-UnitTest/Sources/NahidaUnitTest.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef NAHIDATEST_H -#define NAHIDATEST_H - -#include -#include -#include -#include - -#define JUDGE_TIMEOUT(targetFunction, expectTime) do {float t = NahidaProject::NahidaUnitTest::CalculateExecuteTime(targetFunction); if ( t > expectTime) { throw std::runtime_error("Assertion failed: Execute time out.");} } while(0) -#define JUDGE_TRUE(condition) do { if (!(condition)) { throw std::runtime_error("Assertion failed: " #condition); } } while (0) -#define JUDGE_FALSE(condition) JUDGE_TRUE(!(condition)) -#define JUDGE_EQUAL(expected, actual) do { if ((expected) != (actual)) { throw std::runtime_error("Assertion failed: " #expected " != " #actual); } } while (0) -#define JUDGE_NOTEQUAL(expected, actual) JUDGE_TRUE((expected) != (actual)) -#define JUDGE_THROWEXCEPTION(statement, exception_type) do { bool bCaught = false; try { statement; } catch (const exception_type&) { bCaught = true; } catch (...) { throw std::runtime_error("Assertion failed: Unexpected exception caught."); } if (!bCaught) { throw std::runtime_error("Assertion failed: Exception of type " #exception_type " not thrown."); } } while (0) - -namespace NahidaProject { - class __declspec(dllexport) NahidaUnitTest { - public: - static void RegisterTest(const std::string& testName, std::function testFunc); - static void RunAllTests(); - static void RunTestByName(const std::string& testName); - static float CalculateExecuteTime(std::function function); - private: - struct TestCase {std::string name; std::function func; }; - static std::vector& GetTests(); - }; -} -#define TESTCASE(test_name) static void test_name(); struct TestRegister_##test_name { TestRegister_##test_name() { NahidaProject::NahidaUnitTest::RegisterTest(#test_name, test_name); } }; static TestRegister_##test_name g_register_##test_name; static void test_name() -#endif // NAHIDATEST_H \ No newline at end of file diff --git a/NahidaProject-UnitTest/Tests/ModuleUnitTestFile.cpp b/NahidaProject-UnitTest/Tests/ModuleUnitTestFile.cpp deleted file mode 100644 index 31d4b21..0000000 --- a/NahidaProject-UnitTest/Tests/ModuleUnitTestFile.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "..\Sources\NahidaBenchmarkTest.h" -#include "..\Sources\NahidaMockTest.h" -#include "..\Sources\NahidaUnitTest.h" - -using namespace std; - -class Calculator { -public: - virtual int Add(int a, int b) = 0; -}; - -class MockCalculator : public Calculator{ -public: - MockMethod(int, Add, (int, int)); -}; - -TESTCASE(BenchmarkTestTest) { - string val = "3.141592653589793238462643383279502884"; - int count = 1000000; - - auto rt = NahidaProject::NahidaBenchmarkTest::Time(count, {{"atof", [val]() {double d = atof(val.data());}},{"strtod", [val]() {double d = strtod(val.data(), nullptr);}},{"sscanf", [val]() {double d; sscanf(val.data(), "%lf", &d);}},{"stod", [val]() {double d = stod(val, nullptr);}}}); - - auto comp = NahidaProject::NahidaBenchmarkTest::Compare(rt); - NahidaProject::NahidaBenchmarkTest::PrintResult(comp); - cout << endl << "runtimes in milliseconds:" << endl; - NahidaProject::NahidaBenchmarkTest::PrintResult(comp); - cout << endl << "runtimes with min, max, mean, variance and standard deviation" << endl; - cout << endl << "nanoseconds" << endl; - NahidaProject::NahidaBenchmarkTest::PrintResult(rt); - cout << endl << "microseconds" << endl; - NahidaProject::NahidaBenchmarkTest::PrintResult(rt, 3); - cout << endl << "milliseconds" << endl; - NahidaProject::NahidaBenchmarkTest::PrintResult(rt, 5); - - if (NahidaProject::NahidaBenchmarkTest::WriteResult("sample", rt)) - cout << endl << "successfully wrote runtimes to sample-*.txt files" << endl << endl; - else - cerr << endl << "there were problems: " << strerror(errno) << endl << endl; -} - - - -TESTCASE(MockTestTest){ - MockCalculator calculator; - When(calculator.Add).Return(3); - JUDGE_EQUAL(calculator.Add(1, 2), 3); -} - - -TESTCASE(UnitTestMacroTest) { - JUDGE_EQUAL(78 + 13, 91); - JUDGE_NOTEQUAL(1 + 1, 10086); - JUDGE_TRUE(true); - JUDGE_FALSE(false); - JUDGE_THROWEXCEPTION(throw std::runtime_error("This is a test exception"), std::runtime_error); - JUDGE_TIMEOUT([]() { - std::this_thread::sleep_for(std::chrono::seconds(3)); - }, 5000); -} - - - -int main(int argc, char **argv){ - NahidaProject::NahidaUnitTest::RunAllTests(); - return 0; -} \ No newline at end of file diff --git a/BuildExample/.gitignore b/NahidaProject.BuildExample/.gitignore similarity index 100% rename from BuildExample/.gitignore rename to NahidaProject.BuildExample/.gitignore diff --git a/BuildExample/BuildExample.sln b/NahidaProject.BuildExample/BuildExample.sln similarity index 100% rename from BuildExample/BuildExample.sln rename to NahidaProject.BuildExample/BuildExample.sln diff --git a/BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/NahidaProject-Console-DynamicBuildExample.vcxproj b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/NahidaProject-Console-DynamicBuildExample.vcxproj similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/NahidaProject-Console-DynamicBuildExample.vcxproj rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/NahidaProject-Console-DynamicBuildExample.vcxproj diff --git a/BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/NahidaProject-Console-DynamicBuildExample.vcxproj.filters b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/NahidaProject-Console-DynamicBuildExample.vcxproj.filters similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/NahidaProject-Console-DynamicBuildExample.vcxproj.filters rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/NahidaProject-Console-DynamicBuildExample.vcxproj.filters diff --git a/BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/NahidaProject-Console-DynamicBuildExample.vcxproj.user b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/NahidaProject-Console-DynamicBuildExample.vcxproj.user similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/NahidaProject-Console-DynamicBuildExample.vcxproj.user rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/NahidaProject-Console-DynamicBuildExample.vcxproj.user diff --git a/BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/main.cpp b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/main.cpp similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/main.cpp rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Console-DynamicBuildExample/main.cpp diff --git a/BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/NahidaProject-Database-DynamicBuildExample.vcxproj b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/NahidaProject-Database-DynamicBuildExample.vcxproj similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/NahidaProject-Database-DynamicBuildExample.vcxproj rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/NahidaProject-Database-DynamicBuildExample.vcxproj diff --git a/BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/NahidaProject-Database-DynamicBuildExample.vcxproj.filters b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/NahidaProject-Database-DynamicBuildExample.vcxproj.filters similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/NahidaProject-Database-DynamicBuildExample.vcxproj.filters rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/NahidaProject-Database-DynamicBuildExample.vcxproj.filters diff --git a/BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/NahidaProject-Database-DynamicBuildExample.vcxproj.user b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/NahidaProject-Database-DynamicBuildExample.vcxproj.user similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/NahidaProject-Database-DynamicBuildExample.vcxproj.user rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/NahidaProject-Database-DynamicBuildExample.vcxproj.user diff --git a/BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/main.cpp b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/main.cpp similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/main.cpp rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Database-DynamicBuildExample/main.cpp diff --git a/BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/NahidaProject-Generic-DynamicBuildExample.vcxproj b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/NahidaProject-Generic-DynamicBuildExample.vcxproj similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/NahidaProject-Generic-DynamicBuildExample.vcxproj rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/NahidaProject-Generic-DynamicBuildExample.vcxproj diff --git a/BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/NahidaProject-Generic-DynamicBuildExample.vcxproj.filters b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/NahidaProject-Generic-DynamicBuildExample.vcxproj.filters similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/NahidaProject-Generic-DynamicBuildExample.vcxproj.filters rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/NahidaProject-Generic-DynamicBuildExample.vcxproj.filters diff --git a/BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/NahidaProject-Generic-DynamicBuildExample.vcxproj.user b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/NahidaProject-Generic-DynamicBuildExample.vcxproj.user similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/NahidaProject-Generic-DynamicBuildExample.vcxproj.user rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/NahidaProject-Generic-DynamicBuildExample.vcxproj.user diff --git a/BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/main.cpp b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/main.cpp similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/main.cpp rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Generic-DynamicBuildExample/main.cpp diff --git a/BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/NahidaProject-Mathmatics-DynamicBuildExample.vcxproj b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/NahidaProject-Mathmatics-DynamicBuildExample.vcxproj similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/NahidaProject-Mathmatics-DynamicBuildExample.vcxproj rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/NahidaProject-Mathmatics-DynamicBuildExample.vcxproj diff --git a/BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/NahidaProject-Mathmatics-DynamicBuildExample.vcxproj.filters b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/NahidaProject-Mathmatics-DynamicBuildExample.vcxproj.filters similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/NahidaProject-Mathmatics-DynamicBuildExample.vcxproj.filters rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/NahidaProject-Mathmatics-DynamicBuildExample.vcxproj.filters diff --git a/BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/NahidaProject-Mathmatics-DynamicBuildExample.vcxproj.user b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/NahidaProject-Mathmatics-DynamicBuildExample.vcxproj.user similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/NahidaProject-Mathmatics-DynamicBuildExample.vcxproj.user rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/NahidaProject-Mathmatics-DynamicBuildExample.vcxproj.user diff --git a/BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/main.cpp b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/main.cpp similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/main.cpp rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Mathmatics-DynamicBuildExample/main.cpp diff --git a/BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/NahidaProject-Other-DynamicBuildExample.vcxproj b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/NahidaProject-Other-DynamicBuildExample.vcxproj similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/NahidaProject-Other-DynamicBuildExample.vcxproj rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/NahidaProject-Other-DynamicBuildExample.vcxproj diff --git a/BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/NahidaProject-Other-DynamicBuildExample.vcxproj.filters b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/NahidaProject-Other-DynamicBuildExample.vcxproj.filters similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/NahidaProject-Other-DynamicBuildExample.vcxproj.filters rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/NahidaProject-Other-DynamicBuildExample.vcxproj.filters diff --git a/BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/NahidaProject-Other-DynamicBuildExample.vcxproj.user b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/NahidaProject-Other-DynamicBuildExample.vcxproj.user similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/NahidaProject-Other-DynamicBuildExample.vcxproj.user rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/NahidaProject-Other-DynamicBuildExample.vcxproj.user diff --git a/BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/main.cpp b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/main.cpp similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/main.cpp rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Other-DynamicBuildExample/main.cpp diff --git a/BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/NahidaProject-Serialization-DynamicBuildExample.vcxproj b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/NahidaProject-Serialization-DynamicBuildExample.vcxproj similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/NahidaProject-Serialization-DynamicBuildExample.vcxproj rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/NahidaProject-Serialization-DynamicBuildExample.vcxproj diff --git a/BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/NahidaProject-Serialization-DynamicBuildExample.vcxproj.filters b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/NahidaProject-Serialization-DynamicBuildExample.vcxproj.filters similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/NahidaProject-Serialization-DynamicBuildExample.vcxproj.filters rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/NahidaProject-Serialization-DynamicBuildExample.vcxproj.filters diff --git a/BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/NahidaProject-Serialization-DynamicBuildExample.vcxproj.user b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/NahidaProject-Serialization-DynamicBuildExample.vcxproj.user similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/NahidaProject-Serialization-DynamicBuildExample.vcxproj.user rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/NahidaProject-Serialization-DynamicBuildExample.vcxproj.user diff --git a/BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/main.cpp b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/main.cpp similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/main.cpp rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Serialization-DynamicBuildExample/main.cpp diff --git a/BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/NahidaProject-Thread-DynamicBuildExample.vcxproj b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/NahidaProject-Thread-DynamicBuildExample.vcxproj similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/NahidaProject-Thread-DynamicBuildExample.vcxproj rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/NahidaProject-Thread-DynamicBuildExample.vcxproj diff --git a/BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/NahidaProject-Thread-DynamicBuildExample.vcxproj.filters b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/NahidaProject-Thread-DynamicBuildExample.vcxproj.filters similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/NahidaProject-Thread-DynamicBuildExample.vcxproj.filters rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/NahidaProject-Thread-DynamicBuildExample.vcxproj.filters diff --git a/BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/NahidaProject-Thread-DynamicBuildExample.vcxproj.user b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/NahidaProject-Thread-DynamicBuildExample.vcxproj.user similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/NahidaProject-Thread-DynamicBuildExample.vcxproj.user rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/NahidaProject-Thread-DynamicBuildExample.vcxproj.user diff --git a/BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/main.cpp b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/main.cpp similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/main.cpp rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-Thread-DynamicBuildExample/main.cpp diff --git a/BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/NahidaProject-UnitTest-DynamicBuildExample.vcxproj b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/NahidaProject-UnitTest-DynamicBuildExample.vcxproj similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/NahidaProject-UnitTest-DynamicBuildExample.vcxproj rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/NahidaProject-UnitTest-DynamicBuildExample.vcxproj diff --git a/BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/NahidaProject-UnitTest-DynamicBuildExample.vcxproj.filters b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/NahidaProject-UnitTest-DynamicBuildExample.vcxproj.filters similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/NahidaProject-UnitTest-DynamicBuildExample.vcxproj.filters rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/NahidaProject-UnitTest-DynamicBuildExample.vcxproj.filters diff --git a/BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/NahidaProject-UnitTest-DynamicBuildExample.vcxproj.user b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/NahidaProject-UnitTest-DynamicBuildExample.vcxproj.user similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/NahidaProject-UnitTest-DynamicBuildExample.vcxproj.user rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/NahidaProject-UnitTest-DynamicBuildExample.vcxproj.user diff --git a/BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/main.cpp b/NahidaProject.BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/main.cpp similarity index 100% rename from BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/main.cpp rename to NahidaProject.BuildExample/DynamicLibrary/NahidaProject-UnitTest-DynamicBuildExample/main.cpp diff --git a/BuildExample/README.md b/NahidaProject.BuildExample/README.md similarity index 100% rename from BuildExample/README.md rename to NahidaProject.BuildExample/README.md diff --git a/BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/NahidaProject-Console-BuildExample.vcxproj b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/NahidaProject-Console-BuildExample.vcxproj similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/NahidaProject-Console-BuildExample.vcxproj rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/NahidaProject-Console-BuildExample.vcxproj diff --git a/BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/NahidaProject-Console-BuildExample.vcxproj.filters b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/NahidaProject-Console-BuildExample.vcxproj.filters similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/NahidaProject-Console-BuildExample.vcxproj.filters rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/NahidaProject-Console-BuildExample.vcxproj.filters diff --git a/BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/NahidaProject-Console-BuildExample.vcxproj.user b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/NahidaProject-Console-BuildExample.vcxproj.user similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/NahidaProject-Console-BuildExample.vcxproj.user rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/NahidaProject-Console-BuildExample.vcxproj.user diff --git a/BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/main.cpp b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/main.cpp similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/main.cpp rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Console-BuildExample/main.cpp diff --git a/BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/NahidaProject-Database-BuildExample.vcxproj b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/NahidaProject-Database-BuildExample.vcxproj similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/NahidaProject-Database-BuildExample.vcxproj rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/NahidaProject-Database-BuildExample.vcxproj diff --git a/BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/NahidaProject-Database-BuildExample.vcxproj.filters b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/NahidaProject-Database-BuildExample.vcxproj.filters similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/NahidaProject-Database-BuildExample.vcxproj.filters rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/NahidaProject-Database-BuildExample.vcxproj.filters diff --git a/BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/NahidaProject-Database-BuildExample.vcxproj.user b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/NahidaProject-Database-BuildExample.vcxproj.user similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/NahidaProject-Database-BuildExample.vcxproj.user rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/NahidaProject-Database-BuildExample.vcxproj.user diff --git a/BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/main.cpp b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/main.cpp similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/main.cpp rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Database-BuildExample/main.cpp diff --git a/BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/NahidaProject-Generic-BuildExample.vcxproj b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/NahidaProject-Generic-BuildExample.vcxproj similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/NahidaProject-Generic-BuildExample.vcxproj rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/NahidaProject-Generic-BuildExample.vcxproj diff --git a/BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/NahidaProject-Generic-BuildExample.vcxproj.filters b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/NahidaProject-Generic-BuildExample.vcxproj.filters similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/NahidaProject-Generic-BuildExample.vcxproj.filters rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/NahidaProject-Generic-BuildExample.vcxproj.filters diff --git a/BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/NahidaProject-Generic-BuildExample.vcxproj.user b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/NahidaProject-Generic-BuildExample.vcxproj.user similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/NahidaProject-Generic-BuildExample.vcxproj.user rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/NahidaProject-Generic-BuildExample.vcxproj.user diff --git a/BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/TestRead.log b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/TestRead.log similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/TestRead.log rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/TestRead.log diff --git a/BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/main.cpp b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/main.cpp similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/main.cpp rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Generic-BuildExample/main.cpp diff --git a/BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/NahidaProject-Mathematics-BuildExample.vcxproj b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/NahidaProject-Mathematics-BuildExample.vcxproj similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/NahidaProject-Mathematics-BuildExample.vcxproj rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/NahidaProject-Mathematics-BuildExample.vcxproj diff --git a/BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/NahidaProject-Mathematics-BuildExample.vcxproj.filters b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/NahidaProject-Mathematics-BuildExample.vcxproj.filters similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/NahidaProject-Mathematics-BuildExample.vcxproj.filters rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/NahidaProject-Mathematics-BuildExample.vcxproj.filters diff --git a/BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/NahidaProject-Mathematics-BuildExample.vcxproj.user b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/NahidaProject-Mathematics-BuildExample.vcxproj.user similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/NahidaProject-Mathematics-BuildExample.vcxproj.user rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/NahidaProject-Mathematics-BuildExample.vcxproj.user diff --git a/BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/main.cpp b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/main.cpp similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/main.cpp rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Mathematics-BuildExample/main.cpp diff --git a/BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/NahidaProject-Other-BuildExample.vcxproj b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/NahidaProject-Other-BuildExample.vcxproj similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/NahidaProject-Other-BuildExample.vcxproj rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/NahidaProject-Other-BuildExample.vcxproj diff --git a/BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/NahidaProject-Other-BuildExample.vcxproj.filters b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/NahidaProject-Other-BuildExample.vcxproj.filters similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/NahidaProject-Other-BuildExample.vcxproj.filters rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/NahidaProject-Other-BuildExample.vcxproj.filters diff --git a/BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/NahidaProject-Other-BuildExample.vcxproj.user b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/NahidaProject-Other-BuildExample.vcxproj.user similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/NahidaProject-Other-BuildExample.vcxproj.user rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/NahidaProject-Other-BuildExample.vcxproj.user diff --git a/BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/main.cpp b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/main.cpp similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/main.cpp rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Other-BuildExample/main.cpp diff --git a/BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/NahidaProject-Serialization-BuildExample.vcxproj b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/NahidaProject-Serialization-BuildExample.vcxproj similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/NahidaProject-Serialization-BuildExample.vcxproj rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/NahidaProject-Serialization-BuildExample.vcxproj diff --git a/BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/NahidaProject-Serialization-BuildExample.vcxproj.filters b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/NahidaProject-Serialization-BuildExample.vcxproj.filters similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/NahidaProject-Serialization-BuildExample.vcxproj.filters rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/NahidaProject-Serialization-BuildExample.vcxproj.filters diff --git a/BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/NahidaProject-Serialization-BuildExample.vcxproj.user b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/NahidaProject-Serialization-BuildExample.vcxproj.user similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/NahidaProject-Serialization-BuildExample.vcxproj.user rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/NahidaProject-Serialization-BuildExample.vcxproj.user diff --git a/BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/TestRead.csv b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/TestRead.csv similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/TestRead.csv rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/TestRead.csv diff --git a/BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/main.cpp b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/main.cpp similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/main.cpp rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Serialization-BuildExample/main.cpp diff --git a/BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/NahidaProject-System-DynamicInjector-BuildExample.vcxproj b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/NahidaProject-System-DynamicInjector-BuildExample.vcxproj similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/NahidaProject-System-DynamicInjector-BuildExample.vcxproj rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/NahidaProject-System-DynamicInjector-BuildExample.vcxproj diff --git a/BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/NahidaProject-System-DynamicInjector-BuildExample.vcxproj.filters b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/NahidaProject-System-DynamicInjector-BuildExample.vcxproj.filters similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/NahidaProject-System-DynamicInjector-BuildExample.vcxproj.filters rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/NahidaProject-System-DynamicInjector-BuildExample.vcxproj.filters diff --git a/BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/NahidaProject-System-DynamicInjector-BuildExample.vcxproj.user b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/NahidaProject-System-DynamicInjector-BuildExample.vcxproj.user similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/NahidaProject-System-DynamicInjector-BuildExample.vcxproj.user rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/NahidaProject-System-DynamicInjector-BuildExample.vcxproj.user diff --git a/BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/main.cpp b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/main.cpp similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/main.cpp rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-DynamicInjector-BuildExample/main.cpp diff --git a/BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/NahidaProject-System-RegisterTable-BuildExample.vcxproj b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/NahidaProject-System-RegisterTable-BuildExample.vcxproj similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/NahidaProject-System-RegisterTable-BuildExample.vcxproj rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/NahidaProject-System-RegisterTable-BuildExample.vcxproj diff --git a/BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/NahidaProject-System-RegisterTable-BuildExample.vcxproj.filters b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/NahidaProject-System-RegisterTable-BuildExample.vcxproj.filters similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/NahidaProject-System-RegisterTable-BuildExample.vcxproj.filters rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/NahidaProject-System-RegisterTable-BuildExample.vcxproj.filters diff --git a/BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/NahidaProject-System-RegisterTable-BuildExample.vcxproj.user b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/NahidaProject-System-RegisterTable-BuildExample.vcxproj.user similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/NahidaProject-System-RegisterTable-BuildExample.vcxproj.user rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/NahidaProject-System-RegisterTable-BuildExample.vcxproj.user diff --git a/BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/main.cpp b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/main.cpp similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/main.cpp rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-RegisterTable-BuildExample/main.cpp diff --git a/BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/NahidaProject-System-Service-BuildExample.vcxproj b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/NahidaProject-System-Service-BuildExample.vcxproj similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/NahidaProject-System-Service-BuildExample.vcxproj rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/NahidaProject-System-Service-BuildExample.vcxproj diff --git a/BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/NahidaProject-System-Service-BuildExample.vcxproj.filters b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/NahidaProject-System-Service-BuildExample.vcxproj.filters similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/NahidaProject-System-Service-BuildExample.vcxproj.filters rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/NahidaProject-System-Service-BuildExample.vcxproj.filters diff --git a/BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/NahidaProject-System-Service-BuildExample.vcxproj.user b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/NahidaProject-System-Service-BuildExample.vcxproj.user similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/NahidaProject-System-Service-BuildExample.vcxproj.user rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/NahidaProject-System-Service-BuildExample.vcxproj.user diff --git a/BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/main.cpp b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/main.cpp similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/main.cpp rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/NahidaProject-System-Service-BuildExample/main.cpp diff --git a/BuildExample/StaticLibrary/NahidaProject-System-BuildExample/TestMaterials/DynamicLinkedLibrary.dll b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/TestMaterials/DynamicLinkedLibrary.dll similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-System-BuildExample/TestMaterials/DynamicLinkedLibrary.dll rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/TestMaterials/DynamicLinkedLibrary.dll diff --git a/BuildExample/StaticLibrary/NahidaProject-System-BuildExample/TestMaterials/ExecutableFile.exe b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/TestMaterials/ExecutableFile.exe similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-System-BuildExample/TestMaterials/ExecutableFile.exe rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-System-BuildExample/TestMaterials/ExecutableFile.exe diff --git a/BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/NahidaProject-Thread-BuildExample.vcxproj b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/NahidaProject-Thread-BuildExample.vcxproj similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/NahidaProject-Thread-BuildExample.vcxproj rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/NahidaProject-Thread-BuildExample.vcxproj diff --git a/BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/NahidaProject-Thread-BuildExample.vcxproj.filters b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/NahidaProject-Thread-BuildExample.vcxproj.filters similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/NahidaProject-Thread-BuildExample.vcxproj.filters rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/NahidaProject-Thread-BuildExample.vcxproj.filters diff --git a/BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/NahidaProject-Thread-BuildExample.vcxproj.user b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/NahidaProject-Thread-BuildExample.vcxproj.user similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/NahidaProject-Thread-BuildExample.vcxproj.user rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/NahidaProject-Thread-BuildExample.vcxproj.user diff --git a/BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/main.cpp b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/main.cpp similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/main.cpp rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-Thread-BuildExample/main.cpp diff --git a/BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/NahidaProject-UnitTest-BuildExample.vcxproj b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/NahidaProject-UnitTest-BuildExample.vcxproj similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/NahidaProject-UnitTest-BuildExample.vcxproj rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/NahidaProject-UnitTest-BuildExample.vcxproj diff --git a/BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/NahidaProject-UnitTest-BuildExample.vcxproj.filters b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/NahidaProject-UnitTest-BuildExample.vcxproj.filters similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/NahidaProject-UnitTest-BuildExample.vcxproj.filters rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/NahidaProject-UnitTest-BuildExample.vcxproj.filters diff --git a/BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/NahidaProject-UnitTest-BuildExample.vcxproj.user b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/NahidaProject-UnitTest-BuildExample.vcxproj.user similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/NahidaProject-UnitTest-BuildExample.vcxproj.user rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/NahidaProject-UnitTest-BuildExample.vcxproj.user diff --git a/BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/main.cpp b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/main.cpp similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/main.cpp rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/main.cpp diff --git a/BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-atof-dist.txt b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-atof-dist.txt similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-atof-dist.txt rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-atof-dist.txt diff --git a/BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-atof.txt b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-atof.txt similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-atof.txt rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-atof.txt diff --git a/BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-sscanf-dist.txt b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-sscanf-dist.txt similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-sscanf-dist.txt rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-sscanf-dist.txt diff --git a/BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-sscanf.txt b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-sscanf.txt similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-sscanf.txt rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-sscanf.txt diff --git a/BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-stod-dist.txt b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-stod-dist.txt similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-stod-dist.txt rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-stod-dist.txt diff --git a/BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-stod.txt b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-stod.txt similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-stod.txt rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-stod.txt diff --git a/BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-strtod-dist.txt b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-strtod-dist.txt similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-strtod-dist.txt rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-strtod-dist.txt diff --git a/BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-strtod.txt b/NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-strtod.txt similarity index 100% rename from BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-strtod.txt rename to NahidaProject.BuildExample/StaticLibrary/NahidaProject-UnitTest-BuildExample/sample-strtod.txt diff --git a/NahidaProject-Console/CMakeLists.txt b/NahidaProject.Console/CMakeLists.txt similarity index 32% rename from NahidaProject-Console/CMakeLists.txt rename to NahidaProject.Console/CMakeLists.txt index fee75a3..236a886 100644 --- a/NahidaProject-Console/CMakeLists.txt +++ b/NahidaProject.Console/CMakeLists.txt @@ -4,19 +4,18 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.31 FATAL_ERROR) SET(MODULEID "Console") -FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.h) -FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp) -FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h) -FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Tests/*.cpp) -ADD_EXECUTABLE(LibNahidaProject-${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID}-IMPLEMENT STATIC ${ALL_SOURCECODE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID} SHARED ${ALL_SOURCECODE}) +FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.h) +FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp) +FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h) +FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Tests/*.cpp) +ADD_EXECUTABLE(NahidaProject.${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) +ADD_LIBRARY(NahidaProject.${MODULEID}.IMPLEMENT STATIC ${ALL_SOURCECODE}) +ADD_LIBRARY(NahidaProject.${MODULEID} SHARED ${ALL_SOURCECODE}) IF(CMAKE_VERSION VERSION_GREATER 3.12) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}Tests PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}-IMPLEMENT PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID} PROPERTY CXX_STANDARD 20) - + SET_PROPERTY(TARGET NahidaProject.${MODULEID}Tests PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}.IMPLEMENT PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID} PROPERTY CXX_STANDARD 20) ENDIF() MESSAGE(STATUS "Build module [${MODULEID}] done.") \ No newline at end of file diff --git a/NahidaProject-Console/Sources/ChooseDialog.cpp b/NahidaProject.Console/Sources/ChooseDialog.cpp similarity index 100% rename from NahidaProject-Console/Sources/ChooseDialog.cpp rename to NahidaProject.Console/Sources/ChooseDialog.cpp diff --git a/NahidaProject-Console/Sources/ChooseDialog.h b/NahidaProject.Console/Sources/ChooseDialog.h similarity index 100% rename from NahidaProject-Console/Sources/ChooseDialog.h rename to NahidaProject.Console/Sources/ChooseDialog.h diff --git a/NahidaProject-Console/Sources/CommandLineParser.cpp b/NahidaProject.Console/Sources/CommandLineParser.cpp similarity index 100% rename from NahidaProject-Console/Sources/CommandLineParser.cpp rename to NahidaProject.Console/Sources/CommandLineParser.cpp diff --git a/NahidaProject-Console/Sources/CommandLineParser.h b/NahidaProject.Console/Sources/CommandLineParser.h similarity index 100% rename from NahidaProject-Console/Sources/CommandLineParser.h rename to NahidaProject.Console/Sources/CommandLineParser.h diff --git a/NahidaProject-Console/Sources/TablePrint.cpp b/NahidaProject.Console/Sources/TablePrint.cpp similarity index 100% rename from NahidaProject-Console/Sources/TablePrint.cpp rename to NahidaProject.Console/Sources/TablePrint.cpp diff --git a/NahidaProject-Console/Sources/TablePrint.h b/NahidaProject.Console/Sources/TablePrint.h similarity index 100% rename from NahidaProject-Console/Sources/TablePrint.h rename to NahidaProject.Console/Sources/TablePrint.h diff --git a/NahidaProject-Console/Sources/TerminalColor.cpp b/NahidaProject.Console/Sources/TerminalColor.cpp similarity index 100% rename from NahidaProject-Console/Sources/TerminalColor.cpp rename to NahidaProject.Console/Sources/TerminalColor.cpp diff --git a/NahidaProject-Console/Sources/TerminalColor.h b/NahidaProject.Console/Sources/TerminalColor.h similarity index 100% rename from NahidaProject-Console/Sources/TerminalColor.h rename to NahidaProject.Console/Sources/TerminalColor.h diff --git a/NahidaProject-Console/Tests/ModuleUnitTestFile.cpp b/NahidaProject.Console/Tests/ModuleUnitTestFile.cpp similarity index 93% rename from NahidaProject-Console/Tests/ModuleUnitTestFile.cpp rename to NahidaProject.Console/Tests/ModuleUnitTestFile.cpp index 6391cfb..b83aa3c 100644 --- a/NahidaProject-Console/Tests/ModuleUnitTestFile.cpp +++ b/NahidaProject.Console/Tests/ModuleUnitTestFile.cpp @@ -1,10 +1,10 @@ -#include "..\..\NahidaProject-UnitTest\Sources\NahidaUnitTest.h" +#include "..\..\NahidaProject.UnitTest\Sources\NahidaUnitTest.h" #include "..\Sources\ChooseDialog.h" #include "..\Sources\TablePrint.h" #include "..\Sources\TerminalColor.h" -TESTCASE(ChooseDialogTest) { +Test(ChooseDialogTest) { NahidaProject::ChooseDialog::CheckboxMenu cbm(L"Choose 1", 5); cbm.AddOption(L"Option 1", L"desc1", TRUE); cbm.AddOption(L"Option 2", L"desc2", TRUE); @@ -48,12 +48,12 @@ TESTCASE(ChooseDialogTest) { } -TESTCASE(TablePrintTest) { +Test(TablePrintTest) { NahidaProject::TablePrint tablePrint({ "Column1", "Column2", "Column3", "Column4", "Column5"}, { { "Data1", "Data2", "Data3", "Data4", "Data5"}, {"Data6", "Data7", "Data8", "Data9", "Data10"}}); tablePrint.PrintTable(); } -TESTCASE(TerminalColorTest) { +Test(TerminalColorTest) { std::cout << "ݣ" << "ƻġ" << NahidaProject::TerminalColor::Yellow << "ɽ" << NahidaProject::TerminalColor::Green << "뻭" << NahidaProject::TerminalColor::Reset << std::endl; std::cout << "ƺӱ" << "ӿ" << "dz" << "ʡ" << std::endl; std::cout << NahidaProject::TerminalColor::BackgroundRed << "̨嵺" << "Ͽ" << "½" << "һҡ" << NahidaProject::TerminalColor::Reset << std::endl; @@ -61,6 +61,6 @@ TESTCASE(TerminalColorTest) { } int main() { - NahidaProject::NahidaUnitTest::RunAllTests(); + RunAllTestCase(); return 0; } \ No newline at end of file diff --git a/NahidaProject-Database/CMakeLists.txt b/NahidaProject.Database/CMakeLists.txt similarity index 31% rename from NahidaProject-Database/CMakeLists.txt rename to NahidaProject.Database/CMakeLists.txt index 71ba7dc..4cc7420 100644 --- a/NahidaProject-Database/CMakeLists.txt +++ b/NahidaProject.Database/CMakeLists.txt @@ -4,22 +4,22 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.31 FATAL_ERROR) SET(MODULEID "Database") -FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.h) -FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp) -FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h) -FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Tests/*.cpp) - -ADD_EXECUTABLE(LibNahidaProject-${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID}-IMPLEMENT STATIC ${ALL_SOURCECODE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID} SHARED ${ALL_SOURCECODE}) +FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.h) +FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp) +FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h) +FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Tests/*.cpp) +ADD_EXECUTABLE(NahidaProject.${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) +ADD_LIBRARY(NahidaProject.${MODULEID}.IMPLEMENT STATIC ${ALL_SOURCECODE}) +ADD_LIBRARY(NahidaProject.${MODULEID} SHARED ${ALL_SOURCECODE}) IF(CMAKE_VERSION VERSION_GREATER 3.12) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}Tests PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}-IMPLEMENT PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID} PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}Tests PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}.IMPLEMENT PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID} PROPERTY CXX_STANDARD 20) ENDIF() +MESSAGE(STATUS "Build module [${MODULEID}] done.") MESSAGE(STATUS "Build module [${MODULEID}] done.") -TARGET_LINK_LIBRARIES(LibNahidaProject-${MODULEID}Tests PUBLIC odbc32) -TARGET_LINK_LIBRARIES(LibNahidaProject-${MODULEID} PUBLIC odbc32) +TARGET_LINK_LIBRARIES(NahidaProject.${MODULEID}Tests PUBLIC odbc32) +TARGET_LINK_LIBRARIES(NahidaProject.${MODULEID} PUBLIC odbc32) diff --git a/NahidaProject-Database/Sources/ODBC.cpp b/NahidaProject.Database/Sources/ODBC.cpp similarity index 100% rename from NahidaProject-Database/Sources/ODBC.cpp rename to NahidaProject.Database/Sources/ODBC.cpp diff --git a/NahidaProject-Database/Sources/ODBC.h b/NahidaProject.Database/Sources/ODBC.h similarity index 100% rename from NahidaProject-Database/Sources/ODBC.h rename to NahidaProject.Database/Sources/ODBC.h diff --git a/NahidaProject-Database/Tests/ModuleUnitTestFile.cpp b/NahidaProject.Database/Tests/ModuleUnitTestFile.cpp similarity index 84% rename from NahidaProject-Database/Tests/ModuleUnitTestFile.cpp rename to NahidaProject.Database/Tests/ModuleUnitTestFile.cpp index f1871f7..fedab34 100644 --- a/NahidaProject-Database/Tests/ModuleUnitTestFile.cpp +++ b/NahidaProject.Database/Tests/ModuleUnitTestFile.cpp @@ -1,8 +1,8 @@ -#include "..\..\NahidaProject-UnitTest\Sources\NahidaUnitTest.h" +#include "..\..\NahidaProject.UnitTest\Sources\NahidaUnitTest.h" #include "..\Sources\ODBC.h" -TESTCASE(ODBCTest) { +Test(ODBCTest) { NahidaProject::ODBC odbc; std::cout << odbc.Connect((SQLCHAR*)"SQL Server Datasource", (SQLCHAR*)"sa", (SQLCHAR*)"081105") << std::endl; std::cout << odbc.ExecuteSQLWithoutResult((SQLCHAR*)"SELECT @@VERSION;") << std::endl; @@ -25,6 +25,6 @@ TESTCASE(ODBCTest) { } int main() { - NahidaProject::NahidaUnitTest::RunAllTests(); + RunAllTestCase(); return 0; } \ No newline at end of file diff --git a/NahidaProject-Generic/CMakeLists.txt b/NahidaProject.Generic/CMakeLists.txt similarity index 31% rename from NahidaProject-Generic/CMakeLists.txt rename to NahidaProject.Generic/CMakeLists.txt index 0249821..03faf17 100644 --- a/NahidaProject-Generic/CMakeLists.txt +++ b/NahidaProject.Generic/CMakeLists.txt @@ -4,22 +4,21 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.31 FATAL_ERROR) SET(MODULEID "Generic") -FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.h) -FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp) -FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h) -FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Tests/*.cpp) - -ADD_EXECUTABLE(LibNahidaProject-${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID}-IMPLEMENT STATIC ${ALL_SOURCECODE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID} SHARED ${ALL_SOURCECODE}) +FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.h) +FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp) +FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h) +FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Tests/*.cpp) +ADD_EXECUTABLE(NahidaProject.${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) +ADD_LIBRARY(NahidaProject.${MODULEID}.IMPLEMENT STATIC ${ALL_SOURCECODE}) +ADD_LIBRARY(NahidaProject.${MODULEID} SHARED ${ALL_SOURCECODE}) IF(CMAKE_VERSION VERSION_GREATER 3.12) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}Tests PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}-IMPLEMENT PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID} PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}Tests PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}.IMPLEMENT PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID} PROPERTY CXX_STANDARD 20) ENDIF() -MESSAGE(STATUS "Build module [${MODULEID}] done.") +TARGET_LINK_LIBRARIES(NahidaProject.${MODULEID}Tests PUBLIC ws2_32) +TARGET_LINK_LIBRARIES(NahidaProject.${MODULEID} PUBLIC ws2_32) -target_link_libraries(LibNahidaProject-${MODULEID}Tests PUBLIC ws2_32) -target_link_libraries(LibNahidaProject-${MODULEID} PUBLIC ws2_32) +MESSAGE(STATUS "Build module [${MODULEID}] done.") diff --git a/NahidaProject-Generic/Sources/BloomFilter.cpp b/NahidaProject.Generic/Sources/BloomFilter.cpp similarity index 100% rename from NahidaProject-Generic/Sources/BloomFilter.cpp rename to NahidaProject.Generic/Sources/BloomFilter.cpp diff --git a/NahidaProject-Generic/Sources/BloomFilter.h b/NahidaProject.Generic/Sources/BloomFilter.h similarity index 98% rename from NahidaProject-Generic/Sources/BloomFilter.h rename to NahidaProject.Generic/Sources/BloomFilter.h index 90d0b77..330c860 100644 --- a/NahidaProject-Generic/Sources/BloomFilter.h +++ b/NahidaProject.Generic/Sources/BloomFilter.h @@ -67,7 +67,7 @@ namespace NahidaProject { _bs.set(i3); } - bool Test(const K& key) const { + bool Check(const K& key) const { size_t i1 = Hash1()(key) % N; if (!_bs.test(i1)) return false; diff --git a/NahidaProject-Generic/Sources/HTTPRequest.cpp b/NahidaProject.Generic/Sources/HTTPRequest.cpp similarity index 100% rename from NahidaProject-Generic/Sources/HTTPRequest.cpp rename to NahidaProject.Generic/Sources/HTTPRequest.cpp diff --git a/NahidaProject-Generic/Sources/HTTPRequest.h b/NahidaProject.Generic/Sources/HTTPRequest.h similarity index 100% rename from NahidaProject-Generic/Sources/HTTPRequest.h rename to NahidaProject.Generic/Sources/HTTPRequest.h diff --git a/NahidaProject-Generic/Sources/Logger.cpp b/NahidaProject.Generic/Sources/Logger.cpp similarity index 100% rename from NahidaProject-Generic/Sources/Logger.cpp rename to NahidaProject.Generic/Sources/Logger.cpp diff --git a/NahidaProject-Generic/Sources/Logger.h b/NahidaProject.Generic/Sources/Logger.h similarity index 100% rename from NahidaProject-Generic/Sources/Logger.h rename to NahidaProject.Generic/Sources/Logger.h diff --git a/NahidaProject-Generic/Sources/NahidaProject.cpp b/NahidaProject.Generic/Sources/NahidaProject.cpp similarity index 100% rename from NahidaProject-Generic/Sources/NahidaProject.cpp rename to NahidaProject.Generic/Sources/NahidaProject.cpp diff --git a/NahidaProject-Generic/Sources/NahidaProject.h b/NahidaProject.Generic/Sources/NahidaProject.h similarity index 100% rename from NahidaProject-Generic/Sources/NahidaProject.h rename to NahidaProject.Generic/Sources/NahidaProject.h diff --git a/NahidaProject-Generic/Sources/SortModule.cpp b/NahidaProject.Generic/Sources/SortModule.cpp similarity index 100% rename from NahidaProject-Generic/Sources/SortModule.cpp rename to NahidaProject.Generic/Sources/SortModule.cpp diff --git a/NahidaProject-Generic/Sources/SortModule.h b/NahidaProject.Generic/Sources/SortModule.h similarity index 100% rename from NahidaProject-Generic/Sources/SortModule.h rename to NahidaProject.Generic/Sources/SortModule.h diff --git a/NahidaProject-Generic/Tests/ModuleUnitTestFile.cpp b/NahidaProject.Generic/Tests/ModuleUnitTestFile.cpp similarity index 70% rename from NahidaProject-Generic/Tests/ModuleUnitTestFile.cpp rename to NahidaProject.Generic/Tests/ModuleUnitTestFile.cpp index f26215e..542d83b 100644 --- a/NahidaProject-Generic/Tests/ModuleUnitTestFile.cpp +++ b/NahidaProject.Generic/Tests/ModuleUnitTestFile.cpp @@ -1,32 +1,32 @@ -#include "..\..\NahidaProject-UnitTest\Sources\NahidaUnitTest.h" +#include "..\..\NahidaProject.UnitTest\Sources\NahidaUnitTest.h" #include "..\Sources\BloomFilter.h" #include "..\Sources\HTTPRequest.h" #include "..\Sources\Logger.h" #include "..\Sources\SortModule.h" -TESTCASE(BloomFilterTest) { +Test(BloomFilterTest) { NahidaProject::BloomFilter<100> bloomFilter; bloomFilter.Set("Object A"); bloomFilter.Set("Object B"); bloomFilter.Set("Object C"); - JUDGE_EQUAL(bloomFilter.Test("Object A"), 1); - JUDGE_EQUAL(bloomFilter.Test("Object B"), 1); - JUDGE_EQUAL(bloomFilter.Test("Object C"), 1); - JUDGE_EQUAL(bloomFilter.Test("Object D"), 0); + AssertEqual(bloomFilter.Check("Object A"), 1); + AssertEqual(bloomFilter.Check("Object B"), 1); + AssertEqual(bloomFilter.Check("Object C"), 1); + AssertEqual(bloomFilter.Check("Object D"), 0); - JUDGE_EQUAL(bloomFilter.EstimateElementCount(), 3); + AssertEqual(bloomFilter.EstimateElementCount(), 3); std::cout << "Used bits: " << bloomFilter.GetUsedBits() << std::endl; std::cout << "Load factor: " << bloomFilter.LoadFactor() << std::endl; std::cout << "False positive rate: " << bloomFilter.EstimateFalsePositiveRate(3) << std::endl; bloomFilter.Clear(); - JUDGE_EQUAL(bloomFilter.GetUsedBits(), 0); + AssertEqual(bloomFilter.GetUsedBits(), 0); } -TESTCASE(HTTPRequestTest) { +Test(HTTPRequestTest) { NahidaProject::HTTPRequest::AsyncHTTPRequest request; request.SetHeader("Authorization", "Bearer 123"); request.SetHeader("User-Agent", "HTTPRequest/1.0"); @@ -50,7 +50,7 @@ TESTCASE(HTTPRequestTest) { std::cout << "" << std::endl; } -TESTCASE(LoggerTest) { +Test(LoggerTest) { NahidaProject::Logger::GetInstance()->Open("TestRead.log"); NahidaProject::Logger::GetInstance()->SetMax(1024); @@ -61,17 +61,17 @@ TESTCASE(LoggerTest) { // FATAL("Hello NahidaProject"); Will be stop and return -1 } -TESTCASE(SortModuleTest) { +Test(SortModuleTest) { std::vector a = { 5, 6, 7, 2, 1, 4, 3 }; std::vector b = { 1, 2, 3, 4, 5, 6, 7 }; - JUDGE_EQUAL(NahidaProject::SortModule::BubbleSort(a), b); - JUDGE_EQUAL(NahidaProject::SortModule::InsertSort(a), b); - JUDGE_EQUAL(NahidaProject::SortModule::SelectSort(a), b); + AssertEqual(NahidaProject::SortModule::BubbleSort(a), b); + AssertEqual(NahidaProject::SortModule::InsertSort(a), b); + AssertEqual(NahidaProject::SortModule::SelectSort(a), b); } int main() { - NahidaProject::NahidaUnitTest::RunAllTests(); + RunAllTestCase(); return 0; } \ No newline at end of file diff --git a/NahidaProject-Mathematics/CMakeLists.txt b/NahidaProject.Mathematics/CMakeLists.txt similarity index 32% rename from NahidaProject-Mathematics/CMakeLists.txt rename to NahidaProject.Mathematics/CMakeLists.txt index 9817bc3..f1a9948 100644 --- a/NahidaProject-Mathematics/CMakeLists.txt +++ b/NahidaProject.Mathematics/CMakeLists.txt @@ -4,19 +4,20 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.31 FATAL_ERROR) SET(MODULEID "Mathematics") -FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.h) -FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp) -FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h) -FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Tests/*.cpp) - -ADD_EXECUTABLE(LibNahidaProject-${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID}-IMPLEMENT STATIC ${ALL_SOURCECODE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID} SHARED ${ALL_SOURCECODE}) +FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.h) +FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp) +FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h) +FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Tests/*.cpp) +ADD_EXECUTABLE(NahidaProject.${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) +ADD_LIBRARY(NahidaProject.${MODULEID}.IMPLEMENT STATIC ${ALL_SOURCECODE}) +ADD_LIBRARY(NahidaProject.${MODULEID} SHARED ${ALL_SOURCECODE}) IF(CMAKE_VERSION VERSION_GREATER 3.12) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}Tests PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}-IMPLEMENT PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID} PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}Tests PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}.IMPLEMENT PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID} PROPERTY CXX_STANDARD 20) ENDIF() +MESSAGE(STATUS "Build module [${MODULEID}] done.") + MESSAGE(STATUS "Build module [${MODULEID}] done.") \ No newline at end of file diff --git a/NahidaProject-Mathematics/Sources/BigInteger.cpp b/NahidaProject.Mathematics/Sources/BigInteger.cpp similarity index 100% rename from NahidaProject-Mathematics/Sources/BigInteger.cpp rename to NahidaProject.Mathematics/Sources/BigInteger.cpp diff --git a/NahidaProject-Mathematics/Sources/BigInteger.h b/NahidaProject.Mathematics/Sources/BigInteger.h similarity index 100% rename from NahidaProject-Mathematics/Sources/BigInteger.h rename to NahidaProject.Mathematics/Sources/BigInteger.h diff --git a/NahidaProject-Mathematics/Sources/RandomGenerator.cpp b/NahidaProject.Mathematics/Sources/RandomGenerator.cpp similarity index 100% rename from NahidaProject-Mathematics/Sources/RandomGenerator.cpp rename to NahidaProject.Mathematics/Sources/RandomGenerator.cpp diff --git a/NahidaProject-Mathematics/Sources/RandomGenerator.h b/NahidaProject.Mathematics/Sources/RandomGenerator.h similarity index 100% rename from NahidaProject-Mathematics/Sources/RandomGenerator.h rename to NahidaProject.Mathematics/Sources/RandomGenerator.h diff --git a/NahidaProject-Mathematics/Sources/Statistics.cpp b/NahidaProject.Mathematics/Sources/Statistics.cpp similarity index 100% rename from NahidaProject-Mathematics/Sources/Statistics.cpp rename to NahidaProject.Mathematics/Sources/Statistics.cpp diff --git a/NahidaProject-Mathematics/Sources/Statistics.h b/NahidaProject.Mathematics/Sources/Statistics.h similarity index 100% rename from NahidaProject-Mathematics/Sources/Statistics.h rename to NahidaProject.Mathematics/Sources/Statistics.h diff --git a/NahidaProject-Mathematics/Sources/Vector.cpp b/NahidaProject.Mathematics/Sources/Vector.cpp similarity index 100% rename from NahidaProject-Mathematics/Sources/Vector.cpp rename to NahidaProject.Mathematics/Sources/Vector.cpp diff --git a/NahidaProject-Mathematics/Sources/Vector.h b/NahidaProject.Mathematics/Sources/Vector.h similarity index 100% rename from NahidaProject-Mathematics/Sources/Vector.h rename to NahidaProject.Mathematics/Sources/Vector.h diff --git a/NahidaProject-Mathematics/Tests/ModuleUnitTestFile.cpp b/NahidaProject.Mathematics/Tests/ModuleUnitTestFile.cpp similarity index 48% rename from NahidaProject-Mathematics/Tests/ModuleUnitTestFile.cpp rename to NahidaProject.Mathematics/Tests/ModuleUnitTestFile.cpp index f69d44b..c8b7f2f 100644 --- a/NahidaProject-Mathematics/Tests/ModuleUnitTestFile.cpp +++ b/NahidaProject.Mathematics/Tests/ModuleUnitTestFile.cpp @@ -1,4 +1,4 @@ -#include "..\..\NahidaProject-UnitTest\Sources\NahidaUnitTest.h" +#include "..\..\NahidaProject.UnitTest\Sources\NahidaUnitTest.h" #include "..\Sources\BigInteger.h" #include "..\Sources\RandomGenerator.h" @@ -6,27 +6,27 @@ #include -TESTCASE(BigIntegerTest) { +Test(BigIntegerTest) { NahidaProject::BigInteger bigInteger1("1234567891011121314151617181920"); NahidaProject::BigInteger bigInteger2("5235786413218674561046854651351"); - JUDGE_EQUAL((bigInteger1 + bigInteger2), (NahidaProject::BigInteger)"6470354304229795875198471833271"); - JUDGE_EQUAL((bigInteger1 - bigInteger2), (NahidaProject::BigInteger)"-4001218522207553246895237469431"); - JUDGE_EQUAL((bigInteger1 * bigInteger2), (NahidaProject::BigInteger)"6463933789952062400179139910666398683694552102531682740773920"); + AssertEqual((bigInteger1 + bigInteger2), (NahidaProject::BigInteger)"6470354304229795875198471833271"); + AssertEqual((bigInteger1 - bigInteger2), (NahidaProject::BigInteger)"-4001218522207553246895237469431"); + AssertEqual((bigInteger1 * bigInteger2), (NahidaProject::BigInteger)"6463933789952062400179139910666398683694552102531682740773920"); } -TESTCASE(RandomGeneratorTest) { +Test(RandomGeneratorTest) { NahidaProject::RandomGenerator random; - JUDGE_TRUE(random.Next(42) >= 0 or random.Next(42) <= 42); - JUDGE_TRUE(random.NextInt(1, 100) >= 1 or random.NextInt(1, 100) <= 100); - JUDGE_TRUE(random.NextDouble() >= 0.0 or random.NextDouble() <= 1.0); - JUDGE_TRUE(random.NextDouble(1.5, 3.5) >= 1.5 or random.NextDouble(1.5, 3.5) <= 3.5); + AssertTrue(random.Next(42) >= 0 or random.Next(42) <= 42); + AssertTrue(random.NextInt(1, 100) >= 1 or random.NextInt(1, 100) <= 100); + AssertTrue(random.NextDouble() >= 0.0 or random.NextDouble() <= 1.0); + AssertTrue(random.NextDouble(1.5, 3.5) >= 1.5 or random.NextDouble(1.5, 3.5) <= 3.5); std::vector vec(10); random.Fill(vec, -10, 10); for (int item : vec) { - JUDGE_TRUE(item >= -10 or item <= 10); + AssertTrue(item >= -10 or item <= 10); } std::vector numbers = { 1, 2, 3, 4, 5 }; @@ -38,21 +38,21 @@ TESTCASE(RandomGeneratorTest) { std::cout << "" << std::endl; } -TESTCASE(StatisticsTest) { +Test(StatisticsTest) { std::deque data{1, 2, 3, 5, 6, 8, 4, 9, 9, 4, 6, 4, 3, 7, 1, 0, 0, 6, 8, 9}; NahidaProject::Statistics statistics(data.begin(), data.end()); - JUDGE_EQUAL(statistics.Count(), 20); - JUDGE_EQUAL(statistics.Maximum(), 9); - JUDGE_EQUAL(statistics.Mean(), 4); - JUDGE_EQUAL(statistics.Minimum(), 0); - JUDGE_EQUAL(statistics.StandardDeviation(), 3); - JUDGE_EQUAL(statistics.Sum(), 95); - JUDGE_EQUAL(statistics.SumOfSquares(), 625); - JUDGE_EQUAL(statistics.Variance(), 15); + AssertEqual(statistics.Count(), 20); + AssertEqual(statistics.Maximum(), 9); + AssertEqual(statistics.Mean(), 4); + AssertEqual(statistics.Minimum(), 0); + AssertEqual(statistics.StandardDeviation(), 3); + AssertEqual(statistics.Sum(), 95); + AssertEqual(statistics.SumOfSquares(), 625); + AssertEqual(statistics.Variance(), 15); } int main() { - NahidaProject::NahidaUnitTest::RunAllTests(); + RunAllTestCase(); return 0; } \ No newline at end of file diff --git a/NahidaProject-Other/CMakeLists.txt b/NahidaProject.Other/CMakeLists.txt similarity index 32% rename from NahidaProject-Other/CMakeLists.txt rename to NahidaProject.Other/CMakeLists.txt index e4757df..181f402 100644 --- a/NahidaProject-Other/CMakeLists.txt +++ b/NahidaProject.Other/CMakeLists.txt @@ -4,20 +4,18 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.31 FATAL_ERROR) SET(MODULEID "Other") -FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.h) -FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp) -FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h) -FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Tests/*.cpp) - -ADD_EXECUTABLE(LibNahidaProject-${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID}-IMPLEMENT STATIC ${ALL_SOURCECODE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID} SHARED ${ALL_SOURCECODE}) +FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.h) +FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp) +FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h) +FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Tests/*.cpp) +ADD_EXECUTABLE(NahidaProject.${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) +ADD_LIBRARY(NahidaProject.${MODULEID}.IMPLEMENT STATIC ${ALL_SOURCECODE}) +ADD_LIBRARY(NahidaProject.${MODULEID} SHARED ${ALL_SOURCECODE}) IF(CMAKE_VERSION VERSION_GREATER 3.12) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}Tests PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}-IMPLEMENT PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID} PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}Tests PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}.IMPLEMENT PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID} PROPERTY CXX_STANDARD 20) ENDIF() MESSAGE(STATUS "Build module [${MODULEID}] done.") - diff --git a/NahidaProject-Other/Sources/CowSay.cpp b/NahidaProject.Other/Sources/CowSay.cpp similarity index 100% rename from NahidaProject-Other/Sources/CowSay.cpp rename to NahidaProject.Other/Sources/CowSay.cpp diff --git a/NahidaProject-Other/Sources/CowSay.h b/NahidaProject.Other/Sources/CowSay.h similarity index 100% rename from NahidaProject-Other/Sources/CowSay.h rename to NahidaProject.Other/Sources/CowSay.h diff --git a/NahidaProject-Other/Sources/Turtle.cpp b/NahidaProject.Other/Sources/Turtle.cpp similarity index 100% rename from NahidaProject-Other/Sources/Turtle.cpp rename to NahidaProject.Other/Sources/Turtle.cpp diff --git a/NahidaProject-Other/Sources/Turtle.h b/NahidaProject.Other/Sources/Turtle.h similarity index 100% rename from NahidaProject-Other/Sources/Turtle.h rename to NahidaProject.Other/Sources/Turtle.h diff --git a/NahidaProject-Other/Tests/ModuleUnitTestFile.cpp b/NahidaProject.Other/Tests/ModuleUnitTestFile.cpp similarity index 48% rename from NahidaProject-Other/Tests/ModuleUnitTestFile.cpp rename to NahidaProject.Other/Tests/ModuleUnitTestFile.cpp index 287c7cc..7c87d58 100644 --- a/NahidaProject-Other/Tests/ModuleUnitTestFile.cpp +++ b/NahidaProject.Other/Tests/ModuleUnitTestFile.cpp @@ -1,12 +1,12 @@ -# include "..\..\NahidaProject-UnitTest\Sources\NahidaUnitTest.h" +# include "..\..\NahidaProject.UnitTest\Sources\NahidaUnitTest.h" #include "..\Sources\CowSay.h" -TESTCASE(CowSayTest) { +Test(CowSayTest) { std::cout << NahidaProject::CowSay::Cow("Moo") << std::endl; } int main() { - NahidaProject::NahidaUnitTest::RunAllTests(); + RunAllTestCase(); return 0; } \ No newline at end of file diff --git a/NahidaProject-Serialization/CMakeLists.txt b/NahidaProject.Serialization/CMakeLists.txt similarity index 31% rename from NahidaProject-Serialization/CMakeLists.txt rename to NahidaProject.Serialization/CMakeLists.txt index 852a5d9..cb25817 100644 --- a/NahidaProject-Serialization/CMakeLists.txt +++ b/NahidaProject.Serialization/CMakeLists.txt @@ -4,19 +4,18 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.31 FATAL_ERROR) SET(MODULEID "Serialization") -FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.h) -FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp) -FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h) -FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Tests/*.cpp) - -ADD_EXECUTABLE(LibNahidaProject-${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID}-IMPLEMENT STATIC ${ALL_SOURCECODE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID} SHARED ${ALL_SOURCECODE}) +FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.h) +FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp) +FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h) +FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Tests/*.cpp) +ADD_EXECUTABLE(NahidaProject.${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) +ADD_LIBRARY(NahidaProject.${MODULEID}.IMPLEMENT STATIC ${ALL_SOURCECODE}) +ADD_LIBRARY(NahidaProject.${MODULEID} SHARED ${ALL_SOURCECODE}) IF(CMAKE_VERSION VERSION_GREATER 3.12) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}Tests PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}-IMPLEMENT PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID} PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}Tests PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}.IMPLEMENT PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID} PROPERTY CXX_STANDARD 20) ENDIF() -MESSAGE(STATUS "Build module [${MODULEID}] done.") \ No newline at end of file +MESSAGE(STATUS "Build module [${MODULEID}] done.") diff --git a/NahidaProject-Serialization/Sources/CSV.cpp b/NahidaProject.Serialization/Sources/CSV.cpp similarity index 100% rename from NahidaProject-Serialization/Sources/CSV.cpp rename to NahidaProject.Serialization/Sources/CSV.cpp diff --git a/NahidaProject-Serialization/Sources/CSV.h b/NahidaProject.Serialization/Sources/CSV.h similarity index 100% rename from NahidaProject-Serialization/Sources/CSV.h rename to NahidaProject.Serialization/Sources/CSV.h diff --git a/NahidaProject-Serialization/Sources/INIReader.cpp b/NahidaProject.Serialization/Sources/INIReader.cpp similarity index 100% rename from NahidaProject-Serialization/Sources/INIReader.cpp rename to NahidaProject.Serialization/Sources/INIReader.cpp diff --git a/NahidaProject-Serialization/Sources/INIReader.h b/NahidaProject.Serialization/Sources/INIReader.h similarity index 100% rename from NahidaProject-Serialization/Sources/INIReader.h rename to NahidaProject.Serialization/Sources/INIReader.h diff --git a/NahidaProject-Serialization/Sources/INIWriter.cpp b/NahidaProject.Serialization/Sources/INIWriter.cpp similarity index 100% rename from NahidaProject-Serialization/Sources/INIWriter.cpp rename to NahidaProject.Serialization/Sources/INIWriter.cpp diff --git a/NahidaProject-Serialization/Sources/INIWriter.h b/NahidaProject.Serialization/Sources/INIWriter.h similarity index 100% rename from NahidaProject-Serialization/Sources/INIWriter.h rename to NahidaProject.Serialization/Sources/INIWriter.h diff --git a/NahidaProject-Serialization/Sources/JSON.cpp b/NahidaProject.Serialization/Sources/JSON.cpp similarity index 100% rename from NahidaProject-Serialization/Sources/JSON.cpp rename to NahidaProject.Serialization/Sources/JSON.cpp diff --git a/NahidaProject-Serialization/Sources/JSON.h b/NahidaProject.Serialization/Sources/JSON.h similarity index 100% rename from NahidaProject-Serialization/Sources/JSON.h rename to NahidaProject.Serialization/Sources/JSON.h diff --git a/NahidaProject-Serialization/Sources/JSONParser.cpp b/NahidaProject.Serialization/Sources/JSONParser.cpp similarity index 100% rename from NahidaProject-Serialization/Sources/JSONParser.cpp rename to NahidaProject.Serialization/Sources/JSONParser.cpp diff --git a/NahidaProject-Serialization/Sources/JSONParser.h b/NahidaProject.Serialization/Sources/JSONParser.h similarity index 100% rename from NahidaProject-Serialization/Sources/JSONParser.h rename to NahidaProject.Serialization/Sources/JSONParser.h diff --git a/NahidaProject-Serialization/Sources/XMLReader.cpp b/NahidaProject.Serialization/Sources/XMLReader.cpp similarity index 100% rename from NahidaProject-Serialization/Sources/XMLReader.cpp rename to NahidaProject.Serialization/Sources/XMLReader.cpp diff --git a/NahidaProject-Serialization/Sources/XMLReader.h b/NahidaProject.Serialization/Sources/XMLReader.h similarity index 100% rename from NahidaProject-Serialization/Sources/XMLReader.h rename to NahidaProject.Serialization/Sources/XMLReader.h diff --git a/NahidaProject-Serialization/Sources/XMLWriter.cpp b/NahidaProject.Serialization/Sources/XMLWriter.cpp similarity index 100% rename from NahidaProject-Serialization/Sources/XMLWriter.cpp rename to NahidaProject.Serialization/Sources/XMLWriter.cpp diff --git a/NahidaProject-Serialization/Sources/XMLWriter.h b/NahidaProject.Serialization/Sources/XMLWriter.h similarity index 100% rename from NahidaProject-Serialization/Sources/XMLWriter.h rename to NahidaProject.Serialization/Sources/XMLWriter.h diff --git a/NahidaProject-Serialization/Sources/YAML.cpp b/NahidaProject.Serialization/Sources/YAML.cpp similarity index 100% rename from NahidaProject-Serialization/Sources/YAML.cpp rename to NahidaProject.Serialization/Sources/YAML.cpp diff --git a/NahidaProject-Serialization/Sources/YAML.h b/NahidaProject.Serialization/Sources/YAML.h similarity index 100% rename from NahidaProject-Serialization/Sources/YAML.h rename to NahidaProject.Serialization/Sources/YAML.h diff --git a/NahidaProject-Serialization/Tests/ModuleUnitTestFile.cpp b/NahidaProject.Serialization/Tests/ModuleUnitTestFile.cpp similarity index 68% rename from NahidaProject-Serialization/Tests/ModuleUnitTestFile.cpp rename to NahidaProject.Serialization/Tests/ModuleUnitTestFile.cpp index 65f76e7..553b8e0 100644 --- a/NahidaProject-Serialization/Tests/ModuleUnitTestFile.cpp +++ b/NahidaProject.Serialization/Tests/ModuleUnitTestFile.cpp @@ -1,4 +1,4 @@ -#include "..\..\NahidaProject-UnitTest\Sources\NahidaUnitTest.h" +#include "..\..\NahidaProject.UnitTest\Sources\NahidaUnitTest.h" #include "..\Sources\CSV.h" #include "..\Sources\INIReader.h" @@ -8,7 +8,7 @@ #include "..\Sources\XMLWriter.h" #include "..\Sources\YAML.h" -TESTCASE(CSVTest) { +Test(CSVTest) { std::ofstream ofs("TestRead.csv", std::ios::out | std::ios::app); ofs << R"(a,b,c 1,2,3 @@ -29,7 +29,7 @@ TESTCASE(CSVTest) { ::remove("TestRead.csv"); } -TESTCASE(INIReadAndWriteTest) { +Test(INIReadAndWriteTest) { NahidaProject::INIWriter writer; writer.SetFileValue("Section1", "Key1", "Value1"); writer.SetFileValue("Section1", "Key2", "Value2"); @@ -43,30 +43,30 @@ TESTCASE(INIReadAndWriteTest) { NahidaProject::INIReader reader; reader.ReadFile("TestRead.ini"); - JUDGE_EQUAL(reader.GetValue("Section1", "Key1"), "Value1"); - JUDGE_EQUAL(reader.GetValue("Section1", "Key2"), "Value2"); - JUDGE_EQUAL(reader.GetValue("Section1", "Key3"), "Value3"); - JUDGE_EQUAL(reader.GetValue("Section2", "Key1"), "Value1"); - JUDGE_EQUAL(reader.GetValue("Section2", "Key2"), "Value2"); - JUDGE_EQUAL(reader.GetValue("Section2", "Key3"), "Value3"); + AssertEqual(reader.GetValue("Section1", "Key1"), "Value1"); + AssertEqual(reader.GetValue("Section1", "Key2"), "Value2"); + AssertEqual(reader.GetValue("Section1", "Key3"), "Value3"); + AssertEqual(reader.GetValue("Section2", "Key1"), "Value1"); + AssertEqual(reader.GetValue("Section2", "Key2"), "Value2"); + AssertEqual(reader.GetValue("Section2", "Key3"), "Value3"); ::remove("TestRead.ini"); } -TESTCASE(JSONParseTest) { +Test(JSONParseTest) { NahidaProject::JSON json; json.Parse(R"({"name": "Jack", "age": 18, "area": ["c++", "php", "python", "go"], "hobby": {"hobby1": "reading", "hobby2": "coding", "hobby3": "basketball"}})"); - JUDGE_EQUAL(json["name"].ToString(), "\"Jack\""); - JUDGE_EQUAL(json["age"].ToString(), "18"); - JUDGE_EQUAL(json["area"].ToString(), R"(["c++","php","python","go"])"); - JUDGE_EQUAL(json["hobby"]["hobby1"].ToString(), "\"reading\""); - JUDGE_EQUAL(json["hobby"]["hobby2"].ToString(), "\"coding\""); - JUDGE_EQUAL(json["hobby"]["hobby3"].ToString(), "\"basketball\""); + AssertEqual(json["name"].ToString(), "\"Jack\""); + AssertEqual(json["age"].ToString(), "18"); + AssertEqual(json["area"].ToString(), R"(["c++","php","python","go"])"); + AssertEqual(json["hobby"]["hobby1"].ToString(), "\"reading\""); + AssertEqual(json["hobby"]["hobby2"].ToString(), "\"coding\""); + AssertEqual(json["hobby"]["hobby3"].ToString(), "\"basketball\""); json.Clear(); } -TESTCASE(XMLReadAndWriteTest) { +Test(XMLReadAndWriteTest) { NahidaProject::XMLWriter xmlWriter; NahidaProject::XMLWriterNode& documentNode = xmlWriter["DocumentNode"]; documentNode["Key0"]("Index", "0")("Size", "test"); @@ -94,7 +94,7 @@ TESTCASE(XMLReadAndWriteTest) { ::remove("TestRead.xml"); } -TESTCASE(YAMLTest) { +Test(YAMLTest) { std::ofstream ofs("TestRead.yml", std::ios::out | std::ios::app); ofs << R"(text: How are you? I am fine Thank you number: 78.91 @@ -106,16 +106,16 @@ outer_object: ofs.close(); NahidaProject::YAML::YAML yaml("TestRead.yml"); - JUDGE_EQUAL(yaml["text"].cast(), "How are you? I am fine Thank you"); - JUDGE_EQUAL(yaml["number"].cast(), 78.91); - JUDGE_EQUAL(yaml["boolValue"].cast(), true); - JUDGE_EQUAL(yaml["outer_object"]["inner_object"]["name"].cast(), "Ningguang"); - JUDGE_EQUAL(yaml["outer_object"]["name"].cast(), "Ganyu"); + AssertEqual(yaml["text"].cast(), "How are you? I am fine Thank you"); + AssertEqual(yaml["number"].cast(), 78.91); + AssertEqual(yaml["boolValue"].cast(), true); + AssertEqual(yaml["outer_object"]["inner_object"]["name"].cast(), "Ningguang"); + AssertEqual(yaml["outer_object"]["name"].cast(), "Ganyu"); ::remove("TestRead.yml"); } int main() { - NahidaProject::NahidaUnitTest::RunAllTests(); + RunAllTestCase(); return 0; } \ No newline at end of file diff --git a/NahidaProject-System/CMakeLists.txt b/NahidaProject.System/CMakeLists.txt similarity index 32% rename from NahidaProject-System/CMakeLists.txt rename to NahidaProject.System/CMakeLists.txt index bca4a19..246f077 100644 --- a/NahidaProject-System/CMakeLists.txt +++ b/NahidaProject.System/CMakeLists.txt @@ -4,19 +4,18 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.31 FATAL_ERROR) SET(MODULEID "System") -FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.h) -FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp) -FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h) -FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Tests/*.cpp) - -ADD_EXECUTABLE(LibNahidaProject-${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID}-IMPLEMENT STATIC ${ALL_SOURCECODE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID} SHARED ${ALL_SOURCECODE}) +FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.h) +FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp) +FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h) +FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Tests/*.cpp) +ADD_EXECUTABLE(NahidaProject.${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) +ADD_LIBRARY(NahidaProject.${MODULEID}.IMPLEMENT STATIC ${ALL_SOURCECODE}) +ADD_LIBRARY(NahidaProject.${MODULEID} SHARED ${ALL_SOURCECODE}) IF(CMAKE_VERSION VERSION_GREATER 3.12) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}Tests PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}-IMPLEMENT PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID} PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}Tests PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}.IMPLEMENT PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID} PROPERTY CXX_STANDARD 20) ENDIF() MESSAGE(STATUS "Build module [${MODULEID}] done.") diff --git a/NahidaProject-System/Sources/DynamicLinkedLibraryInjector.cpp b/NahidaProject.System/Sources/DynamicLinkedLibraryInjector.cpp similarity index 100% rename from NahidaProject-System/Sources/DynamicLinkedLibraryInjector.cpp rename to NahidaProject.System/Sources/DynamicLinkedLibraryInjector.cpp diff --git a/NahidaProject-System/Sources/DynamicLinkedLibraryInjector.h b/NahidaProject.System/Sources/DynamicLinkedLibraryInjector.h similarity index 100% rename from NahidaProject-System/Sources/DynamicLinkedLibraryInjector.h rename to NahidaProject.System/Sources/DynamicLinkedLibraryInjector.h diff --git a/NahidaProject-System/Sources/DynamicLinkedLibraryLoader.cpp b/NahidaProject.System/Sources/DynamicLinkedLibraryLoader.cpp similarity index 100% rename from NahidaProject-System/Sources/DynamicLinkedLibraryLoader.cpp rename to NahidaProject.System/Sources/DynamicLinkedLibraryLoader.cpp diff --git a/NahidaProject-System/Sources/DynamicLinkedLibraryLoader.h b/NahidaProject.System/Sources/DynamicLinkedLibraryLoader.h similarity index 100% rename from NahidaProject-System/Sources/DynamicLinkedLibraryLoader.h rename to NahidaProject.System/Sources/DynamicLinkedLibraryLoader.h diff --git a/NahidaProject-System/Sources/RegisterTable.cpp b/NahidaProject.System/Sources/RegisterTable.cpp similarity index 100% rename from NahidaProject-System/Sources/RegisterTable.cpp rename to NahidaProject.System/Sources/RegisterTable.cpp diff --git a/NahidaProject-System/Sources/RegisterTable.h b/NahidaProject.System/Sources/RegisterTable.h similarity index 100% rename from NahidaProject-System/Sources/RegisterTable.h rename to NahidaProject.System/Sources/RegisterTable.h diff --git a/NahidaProject-System/Sources/SerialPort.cpp b/NahidaProject.System/Sources/SerialPort.cpp similarity index 100% rename from NahidaProject-System/Sources/SerialPort.cpp rename to NahidaProject.System/Sources/SerialPort.cpp diff --git a/NahidaProject-System/Sources/SerialPort.h b/NahidaProject.System/Sources/SerialPort.h similarity index 100% rename from NahidaProject-System/Sources/SerialPort.h rename to NahidaProject.System/Sources/SerialPort.h diff --git a/NahidaProject-System/Sources/WindowsService.cpp b/NahidaProject.System/Sources/WindowsService.cpp similarity index 100% rename from NahidaProject-System/Sources/WindowsService.cpp rename to NahidaProject.System/Sources/WindowsService.cpp diff --git a/NahidaProject-System/Sources/WindowsService.h b/NahidaProject.System/Sources/WindowsService.h similarity index 100% rename from NahidaProject-System/Sources/WindowsService.h rename to NahidaProject.System/Sources/WindowsService.h diff --git a/NahidaProject-System/Tests/ModuleUnitTestFile.cpp b/NahidaProject.System/Tests/ModuleUnitTestFile.cpp similarity index 55% rename from NahidaProject-System/Tests/ModuleUnitTestFile.cpp rename to NahidaProject.System/Tests/ModuleUnitTestFile.cpp index e2c3596..c7197ef 100644 --- a/NahidaProject-System/Tests/ModuleUnitTestFile.cpp +++ b/NahidaProject.System/Tests/ModuleUnitTestFile.cpp @@ -1,22 +1,22 @@ -#include "..\..\NahidaProject-UnitTest\Sources\NahidaUnitTest.h" +#include "..\..\NahidaProject.UnitTest\Sources\NahidaUnitTest.h" #include "..\Sources\RegisterTable.h" -TESTCASE(RegisterTableTest) { +Test(RegisterTableTest) { NahidaProject::RegisterTable reg("Software\\ExampleCache"); reg.SetValue("Key1", "Value1"); reg.SetValue("Key2", "Value2"); - JUDGE_EQUAL(reg.GetValue("Key1"), "Value1"); - JUDGE_EQUAL(reg.GetValue("Key2"), "Value2"); + AssertEqual(reg.GetValue("Key1"), "Value1"); + AssertEqual(reg.GetValue("Key2"), "Value2"); } -TESTCASE(SpecialInformation) { +Test(SpecialInformation) { std::cout << "These module must run in special project templates. Please compile them in another project." << std::endl; } int main() { - NahidaProject::NahidaUnitTest::RunAllTests(); + RunAllTestCase(); return 0; } \ No newline at end of file diff --git a/NahidaProject-ThirdParty/CMakeLists.txt b/NahidaProject.ThirdParty/CMakeLists.txt similarity index 32% rename from NahidaProject-ThirdParty/CMakeLists.txt rename to NahidaProject.ThirdParty/CMakeLists.txt index 51f58c6..160ad3a 100644 --- a/NahidaProject-ThirdParty/CMakeLists.txt +++ b/NahidaProject.ThirdParty/CMakeLists.txt @@ -4,19 +4,18 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.31 FATAL_ERROR) SET(MODULEID "ThirdParty") -FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.h) -FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp) -FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h) -FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Tests/*.cpp) - -ADD_EXECUTABLE(LibNahidaProject-${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID}-IMPLEMENT STATIC ${ALL_SOURCECODE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID} SHARED ${ALL_SOURCECODE}) +FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.h) +FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp) +FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h) +FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Tests/*.cpp) +ADD_EXECUTABLE(NahidaProject.${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) +ADD_LIBRARY(NahidaProject.${MODULEID}.IMPLEMENT STATIC ${ALL_SOURCECODE}) +ADD_LIBRARY(NahidaProject.${MODULEID} SHARED ${ALL_SOURCECODE}) IF(CMAKE_VERSION VERSION_GREATER 3.12) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}Tests PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}-IMPLEMENT PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID} PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}Tests PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}.IMPLEMENT PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID} PROPERTY CXX_STANDARD 20) ENDIF() MESSAGE(STATUS "Build module [${MODULEID}] done.") \ No newline at end of file diff --git a/NahidaProject-ThirdParty/Tests/ModuleUnitTestFile.cpp b/NahidaProject.ThirdParty/Tests/ModuleUnitTestFile.cpp similarity index 100% rename from NahidaProject-ThirdParty/Tests/ModuleUnitTestFile.cpp rename to NahidaProject.ThirdParty/Tests/ModuleUnitTestFile.cpp diff --git a/NahidaProject-Thread/CMakeLists.txt b/NahidaProject.Thread/CMakeLists.txt similarity index 32% rename from NahidaProject-Thread/CMakeLists.txt rename to NahidaProject.Thread/CMakeLists.txt index ad6cd19..f56ea5c 100644 --- a/NahidaProject-Thread/CMakeLists.txt +++ b/NahidaProject.Thread/CMakeLists.txt @@ -4,19 +4,18 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.31 FATAL_ERROR) SET(MODULEID "Thread") -FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.h) -FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp) -FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h) -FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Tests/*.cpp) - -ADD_EXECUTABLE(LibNahidaProject-${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID}-IMPLEMENT STATIC ${ALL_SOURCECODE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID} SHARED ${ALL_SOURCECODE}) +FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.h) +FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp) +FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h) +FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Tests/*.cpp) +ADD_EXECUTABLE(NahidaProject.${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) +ADD_LIBRARY(NahidaProject.${MODULEID}.IMPLEMENT STATIC ${ALL_SOURCECODE}) +ADD_LIBRARY(NahidaProject.${MODULEID} SHARED ${ALL_SOURCECODE}) IF(CMAKE_VERSION VERSION_GREATER 3.12) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}Tests PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}-IMPLEMENT PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID} PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}Tests PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}.IMPLEMENT PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID} PROPERTY CXX_STANDARD 20) ENDIF() MESSAGE(STATUS "Build module [${MODULEID}] done.") diff --git a/NahidaProject-Thread/Sources/EventBus.cpp b/NahidaProject.Thread/Sources/EventBus.cpp similarity index 100% rename from NahidaProject-Thread/Sources/EventBus.cpp rename to NahidaProject.Thread/Sources/EventBus.cpp diff --git a/NahidaProject-Thread/Sources/EventBus.h b/NahidaProject.Thread/Sources/EventBus.h similarity index 100% rename from NahidaProject-Thread/Sources/EventBus.h rename to NahidaProject.Thread/Sources/EventBus.h diff --git a/NahidaProject-Thread/Sources/MemoryPool.cpp b/NahidaProject.Thread/Sources/MemoryPool.cpp similarity index 100% rename from NahidaProject-Thread/Sources/MemoryPool.cpp rename to NahidaProject.Thread/Sources/MemoryPool.cpp diff --git a/NahidaProject-Thread/Sources/MemoryPool.h b/NahidaProject.Thread/Sources/MemoryPool.h similarity index 100% rename from NahidaProject-Thread/Sources/MemoryPool.h rename to NahidaProject.Thread/Sources/MemoryPool.h diff --git a/NahidaProject-Thread/Sources/SignalAndSlot.cpp b/NahidaProject.Thread/Sources/SignalAndSlot.cpp similarity index 100% rename from NahidaProject-Thread/Sources/SignalAndSlot.cpp rename to NahidaProject.Thread/Sources/SignalAndSlot.cpp diff --git a/NahidaProject-Thread/Sources/SignalAndSlot.h b/NahidaProject.Thread/Sources/SignalAndSlot.h similarity index 100% rename from NahidaProject-Thread/Sources/SignalAndSlot.h rename to NahidaProject.Thread/Sources/SignalAndSlot.h diff --git a/NahidaProject-Thread/Sources/TaskTimer.cpp b/NahidaProject.Thread/Sources/TaskTimer.cpp similarity index 100% rename from NahidaProject-Thread/Sources/TaskTimer.cpp rename to NahidaProject.Thread/Sources/TaskTimer.cpp diff --git a/NahidaProject-Thread/Sources/TaskTimer.h b/NahidaProject.Thread/Sources/TaskTimer.h similarity index 100% rename from NahidaProject-Thread/Sources/TaskTimer.h rename to NahidaProject.Thread/Sources/TaskTimer.h diff --git a/NahidaProject-Thread/Sources/ThreadPool.cpp b/NahidaProject.Thread/Sources/ThreadPool.cpp similarity index 100% rename from NahidaProject-Thread/Sources/ThreadPool.cpp rename to NahidaProject.Thread/Sources/ThreadPool.cpp diff --git a/NahidaProject-Thread/Sources/ThreadPool.h b/NahidaProject.Thread/Sources/ThreadPool.h similarity index 100% rename from NahidaProject-Thread/Sources/ThreadPool.h rename to NahidaProject.Thread/Sources/ThreadPool.h diff --git a/NahidaProject-Thread/Sources/TimingWheel.cpp b/NahidaProject.Thread/Sources/TimingWheel.cpp similarity index 100% rename from NahidaProject-Thread/Sources/TimingWheel.cpp rename to NahidaProject.Thread/Sources/TimingWheel.cpp diff --git a/NahidaProject-Thread/Sources/TimingWheel.h b/NahidaProject.Thread/Sources/TimingWheel.h similarity index 100% rename from NahidaProject-Thread/Sources/TimingWheel.h rename to NahidaProject.Thread/Sources/TimingWheel.h diff --git a/NahidaProject-Thread/Tests/ModuleUnitTestFile.cpp b/NahidaProject.Thread/Tests/ModuleUnitTestFile.cpp similarity index 78% rename from NahidaProject-Thread/Tests/ModuleUnitTestFile.cpp rename to NahidaProject.Thread/Tests/ModuleUnitTestFile.cpp index 61cfb75..18d0b55 100644 --- a/NahidaProject-Thread/Tests/ModuleUnitTestFile.cpp +++ b/NahidaProject.Thread/Tests/ModuleUnitTestFile.cpp @@ -1,4 +1,4 @@ -#include "..\..\NahidaProject-UnitTest\Sources\NahidaUnitTest.h" +#include "..\..\NahidaProject.UnitTest\Sources\NahidaUnitTest.h" #include "..\Sources\EventBus.h" #include "..\Sources\MemoryPool.h" @@ -28,7 +28,7 @@ constexpr float Calculate(float value, int scalar) { return value * static_cast(scalar); } -TESTCASE(EventBusTest) { +Test(EventBusTest) { NahidaProject::EventBus::EventBus eventBus; HandlerTest handler; TestEvent event; @@ -49,21 +49,21 @@ TESTCASE(EventBusTest) { std::cout << "Executed the handler" << std::endl; } -TESTCASE(MemoryPoolTest) { +Test(MemoryPoolTest) { NahidaProject::MemoryPool pool(32, 10); - JUDGE_EQUAL(pool.PrintFreeBlocks(), 10); + AssertEqual(pool.PrintFreeBlocks(), 10); void* ptr1 = pool.Allocate(); void* ptr2 = pool.Allocate(); void* ptr3 = pool.Allocate(); - JUDGE_EQUAL(pool.PrintFreeBlocks(), 7); + AssertEqual(pool.PrintFreeBlocks(), 7); pool.Deallocate(ptr1); pool.Deallocate(ptr2); - JUDGE_EQUAL(pool.PrintFreeBlocks(), 9); + AssertEqual(pool.PrintFreeBlocks(), 9); void* ptr4 = pool.Allocate(); - JUDGE_EQUAL(pool.PrintFreeBlocks(), 8); + AssertEqual(pool.PrintFreeBlocks(), 8); } -TESTCASE(SignalAndSlotTest) { +Test(SignalAndSlotTest) { NahidaProject::Signal signal; auto connection = signal.Connect([](int a) { std::cout << "Current Number is " << a << std::endl; @@ -74,7 +74,7 @@ TESTCASE(SignalAndSlotTest) { connection.Disconnect(); } -TESTCASE(ThreadPoolTest) { +Test(ThreadPoolTest) { NahidaProject::ThreadPool::SafeQueue::ThreadPool pool{}; constexpr float num1 = 12.25f; @@ -89,12 +89,12 @@ TESTCASE(ThreadPoolTest) { const auto result_foo = foo.get(); const auto result_bar = bar.get(); - JUDGE_EQUAL(result_foo, 24.5); - JUDGE_EQUAL(result_bar, 35.5); - JUDGE_EQUAL(result_foo + result_bar, 60); + AssertEqual(result_foo, 24.5); + AssertEqual(result_bar, 35.5); + AssertEqual(result_foo + result_bar, 60); } int main() { - NahidaProject::NahidaUnitTest::RunAllTests(); + RunAllTestCase(); return 0; } \ No newline at end of file diff --git a/NahidaProject-UnitTest/CMakeLists.txt b/NahidaProject.UnitTest/CMakeLists.txt similarity index 32% rename from NahidaProject-UnitTest/CMakeLists.txt rename to NahidaProject.UnitTest/CMakeLists.txt index 70027b4..fa005a6 100644 --- a/NahidaProject-UnitTest/CMakeLists.txt +++ b/NahidaProject.UnitTest/CMakeLists.txt @@ -4,19 +4,19 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.31 FATAL_ERROR) SET(MODULEID "UnitTest") -FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-UnitTest/Sources/*.h) -FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp) -FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h) -FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject-${MODULEID}/Tests/*.cpp) +FILE(GLOB TESTFILE ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.UnitTest/Sources/*.h) +FILE(GLOB ALL_SOURCECODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp) +FILE(GLOB ALL_HEADERFILE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h) +FILE(GLOB ALL_SOURCEANDTESTCODE ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.cpp ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Sources/*.h ${CMAKE_SOURCE_DIR}/NahidaProject.${MODULEID}/Tests/*.cpp) -ADD_EXECUTABLE(LibNahidaProject-${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID}-IMPLEMENT STATIC ${ALL_SOURCECODE}) -ADD_LIBRARY(LibNahidaProject-${MODULEID} SHARED ${ALL_SOURCECODE}) +ADD_EXECUTABLE(NahidaProject.${MODULEID}Tests ${ALL_SOURCEANDTESTCODE} ${TESTFILE}) +ADD_LIBRARY(NahidaProject.${MODULEID}.IMPLEMENT STATIC ${ALL_SOURCECODE}) +ADD_LIBRARY(NahidaProject.${MODULEID} SHARED ${ALL_SOURCECODE}) IF(CMAKE_VERSION VERSION_GREATER 3.12) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}Tests PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID}-IMPLEMENT PROPERTY CXX_STANDARD 20) - SET_PROPERTY(TARGET LibNahidaProject-${MODULEID} PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}Tests PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID}.IMPLEMENT PROPERTY CXX_STANDARD 20) + SET_PROPERTY(TARGET NahidaProject.${MODULEID} PROPERTY CXX_STANDARD 20) ENDIF() MESSAGE(STATUS "Build module [${MODULEID}] done.") \ No newline at end of file diff --git a/NahidaProject.UnitTest/Sources/NahidaBenchmarkTest.cpp b/NahidaProject.UnitTest/Sources/NahidaBenchmarkTest.cpp new file mode 100644 index 0000000..7a200ac --- /dev/null +++ b/NahidaProject.UnitTest/Sources/NahidaBenchmarkTest.cpp @@ -0,0 +1,169 @@ +#include "NahidaBenchmarkTest.h" + +std::string NahidaProject::NahidaBenchmarkTest::TimeConverter::UnitName(TimeUnit unit) { + switch (unit) { + case TimeUnit::Nanoseconds: return "ns"; + case TimeUnit::Microseconds: return "s"; + case TimeUnit::Milliseconds: return "ms"; + case TimeUnit::Seconds: return "s"; + } + return ""; +} + +NahidaProject::NahidaBenchmarkTest::Statistics NahidaProject::NahidaBenchmarkTest::StatisticsCalculator::Calculate(const std::vector& times) { + if (times.empty()) { + return {}; + } + + Statistics statistics; + statistics.iterations = times.size(); + + // ͳ + statistics.totalTime = std::accumulate(times.begin(), times.end(), 0.0); + statistics.mean = statistics.totalTime / statistics.iterations; + statistics.minimumTime = *std::min_element(times.begin(), times.end()); + statistics.maximumTime = *std::max_element(times.begin(), times.end()); + + // λ + auto sortedTimes = times; + std::sort(sortedTimes.begin(), sortedTimes.end()); + if (statistics.iterations % 2 == 0) { + statistics.median = (sortedTimes[statistics.iterations / 2 - 1] + + sortedTimes[statistics.iterations / 2]) / 2.0; + } + else { + statistics.median = sortedTimes[statistics.iterations / 2]; + } + + // 㷽ͱ׼ + double varianceSum = 0.0; + for (const auto& time : times) { + double diff = time - statistics.mean; + varianceSum += diff * diff; + } + statistics.variance = varianceSum / statistics.iterations; + statistics.standardDeviation = std::sqrt(statistics.variance); + + // ƫȺͷ + if (statistics.standardDeviation > 0) { + double skewnessSum = 0.0; + double kurtosisSum = 0.0; + for (const auto& time : times) { + double normalized = (time - statistics.mean) / statistics.standardDeviation; + double normalized_sq = normalized * normalized; + skewnessSum += normalized_sq * normalized; + kurtosisSum += normalized_sq * normalized_sq; + } + statistics.skewness = skewnessSum / statistics.iterations; + statistics.kurtosis = kurtosisSum / statistics.iterations - 3.0; + } + + return statistics; +} + +std::vector NahidaProject::NahidaBenchmarkTest::StatisticsCalculator::IdentifyOutliers(const std::vector& times, const Statistics& statistics, double threshold) { + std::vector results; + results.reserve(times.size()); + + for (const auto& time : times) { + RunResult result{ time, false }; + if (statistics.standardDeviation > 0) { + double z_score = std::abs(time - statistics.mean) / statistics.standardDeviation; + result.isOutlier = z_score > threshold; + } + results.push_back(result); + } + + return results; +} + +void NahidaProject::NahidaBenchmarkTest::ResultFormatter::PrintResult(const BenchmarkResult& result) { + const auto& statistics = result.statistics; + const auto& config = result.config; + + std::cout << "\n=== Benchmark: " << result.name << " ===\n"; + std::cout << "Iterations: " << statistics.iterations << "\n"; + std::cout << "Time Unit: " << TimeConverter::UnitName(config.timeUnit) << "\n\n"; + + if (config.showStatistics) { + auto unitConverter = [config](double ns_value) { + return TimeConverter::ToUnit(std::chrono::nanoseconds(static_cast(ns_value)), config.timeUnit); + }; + + std::cout << std::fixed << std::setprecision(3); + std::cout << "Mean: " << unitConverter(statistics.mean) << " " << TimeConverter::UnitName(config.timeUnit) << "\n"; + std::cout << "Median: " << unitConverter(statistics.median) << " " << TimeConverter::UnitName(config.timeUnit) << "\n"; + std::cout << "Std Dev: " << unitConverter(statistics.standardDeviation) << " " << TimeConverter::UnitName(config.timeUnit) << "\n"; + std::cout << "Min: " << unitConverter(statistics.minimumTime) << " " << TimeConverter::UnitName(config.timeUnit) << "\n"; + std::cout << "Max: " << unitConverter(statistics.minimumTime) << " " << TimeConverter::UnitName(config.timeUnit) << "\n"; + std::cout << "Total: " << unitConverter(statistics.totalTime) << " " << TimeConverter::UnitName(config.timeUnit) << "\n"; + + if (statistics.standardDeviation > 0) { + std::cout << "\nDistribution Metrics:\n"; + std::cout << "Skewness: " << std::fixed << std::setprecision(3) << statistics.skewness << "\n"; + std::cout << "Kurtosis: " << statistics.kurtosis << "\n"; + } + } + + // ʾ쳣ֵϢ + if (config.showOutliers) { + size_t outliers = std::count_if(result.individualResults.begin(), result.individualResults.end(), [](const RunResult& r) { + return r.isOutlier; + }); + + if (outliers > 0) { + std::cout << "\nOutliers detected: " << outliers << " (" << (100.0 * outliers / result.individualResults.size()) << "%)\n"; + } + } +} + +void NahidaProject::NahidaBenchmarkTest::ResultFormatter::PrintComparison(const std::vector& results) { + if (results.empty()) { + return; + } + + std::cout << "\n" << std::string(80, '=') << "\n"; + std::cout << "BENCHMARK COMPARISON\n"; + std::cout << std::string(80, '=') << "\n"; + + // ͷ + std::cout << std::left << std::setw(25) << "Benchmark" << std::right << std::setw(12) << "Mean" << std::setw(12) << "Median" << std::setw(12) << "Std Dev" << std::setw(10) << "Iters" << "\n"; + std::cout << std::string(80, '-') << "\n"; + + // + for (const auto& result : results) { + const auto& statistics = result.statistics; + const auto& config = result.config; + + auto unitConverter = [config](double ns_value) { + return TimeConverter::ToUnit(std::chrono::nanoseconds(static_cast(ns_value)), config.timeUnit); + }; + + std::cout << std::fixed << std::setprecision(2); + std::cout << std::left << std::setw(25) << result.name.substr(0, 24) << std::right << std::setw(12) << unitConverter(statistics.mean) << std::setw(12) << unitConverter(statistics.median) << std::setw(12) << unitConverter(statistics.standardDeviation) << std::setw(10) << statistics.iterations << "\n"; + } + + std::cout << std::string(80, '=') << "\n"; +} + +void NahidaProject::NahidaBenchmarkTest::BenchmarkRunner::RunAll() { + results_.clear(); + results_.reserve(benchmarks_.size()); + + std::cout << "Running " << benchmarks_.size() << " benchmarks...\n"; + + for (const auto& benchmark : benchmarks_) { + try { + auto result = benchmark->Run(); + ResultFormatter::PrintResult(result); + results_.push_back(std::move(result)); + } + catch (const std::exception& e) { + std::cerr << "Error running benchmark '" << benchmark->Name() << "': " << e.what() << "\n"; + } + } + + if (results_.size() > 1) { + ResultFormatter::PrintComparison(results_); + } +} diff --git a/NahidaProject.UnitTest/Sources/NahidaBenchmarkTest.h b/NahidaProject.UnitTest/Sources/NahidaBenchmarkTest.h new file mode 100644 index 0000000..78011de --- /dev/null +++ b/NahidaProject.UnitTest/Sources/NahidaBenchmarkTest.h @@ -0,0 +1,270 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace NahidaProject { + namespace NahidaBenchmarkTest { + + // ʱ䵥λ + enum class TimeUnit { + Nanoseconds, + Microseconds, + Milliseconds, + Seconds + }; + + // ׼ + struct BenchmarkConfig { + size_t iterations = 1000; + size_t warmupIterations = 100; + TimeUnit timeUnit = TimeUnit::Microseconds; + bool showStatistics = true; + bool showOutliers = false; + double outlierThreshold = 3.0; // ׼ + }; + + // ԽͳϢ + struct Statistics { + double mean = 0.0; + double median = 0.0; + double standardDeviation = 0.0; + double minimumTime = 0.0; + double maximumTime = 0.0; + double totalTime = 0.0; + size_t iterations = 0; + + // ͳϢ + double variance = 0.0; + double skewness = 0.0; + double kurtosis = 0.0; + }; + + // н + struct RunResult { + double duration; + bool isOutlier = false; + }; + + // ׼Խ + struct BenchmarkResult { + std::string name; + Statistics statistics; + std::vector individualResults; + BenchmarkConfig config; + }; + + // ʱת + class TimeConverter { + public: + template static double ToUnit(Duration duration, TimeUnit unit) { + switch (unit) { + case TimeUnit::Nanoseconds: + return std::chrono::duration(duration).count(); + case TimeUnit::Microseconds: + return std::chrono::duration(duration).count(); + case TimeUnit::Milliseconds: + return std::chrono::duration(duration).count(); + case TimeUnit::Seconds: + return std::chrono::duration(duration).count(); + } + return 0.0; + } + + static std::string UnitName(TimeUnit unit); + }; + + // ͳƼ㹤 + class StatisticsCalculator { + public: + static Statistics Calculate(const std::vector& times); + static std::vector IdentifyOutliers(const std::vector& times, const Statistics& statistics, double threshold); + }; + + //  + template concept BenchmarkFunction = std::invocable; + + template concept StatefulBenchmarkFunction = requires(T t, int state) { + { t(state) } -> std::same_as; + }; + + // ׼Ի + class BenchmarkBase { + protected: + std::string name_; + BenchmarkConfig config_; + + public: + explicit BenchmarkBase(std::string name, BenchmarkConfig config = {}) : name_(std::move(name)), config_(config) { + + } + + virtual ~BenchmarkBase() = default; + virtual BenchmarkResult Run() = 0; + const std::string& Name() const { return name_; } + const BenchmarkConfig& Config() const { return config_; } + }; + + // 򵥺׼ + template class FunctionBenchmark : public BenchmarkBase { + private: + Func func_; + + public: + FunctionBenchmark(std::string name, Func&& func, BenchmarkConfig config = {}) : BenchmarkBase(std::move(name), config), func_(std::forward(func)) { + + } + + BenchmarkResult Run() override { + std::vector times; + times.reserve(config_.iterations + config_.warmupIterations); + + // Ԥ + for (size_t i = 0; i < config_.warmupIterations; ++i) { + auto start = std::chrono::high_resolution_clock::now(); + func_(); + auto end = std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration_cast(end - start); + // Ԥʱ䲻ͳ + } + + // ʵʲ + for (size_t i = 0; i < config_.iterations; ++i) { + auto start = std::chrono::high_resolution_clock::now(); + func_(); + auto end = std::chrono::high_resolution_clock::now(); + + auto duration = std::chrono::duration_cast(end - start); + double time_ns = TimeConverter::ToUnit(duration, TimeUnit::Nanoseconds); + times.push_back(time_ns); + } + + // ͳϢ + auto stats = StatisticsCalculator::Calculate(times); + + // 쳣ֵ + std::vector individualResults; + if (config_.showOutliers) { + individualResults = StatisticsCalculator::IdentifyOutliers(times, stats, config_.outlierThreshold); + } + else { + individualResults.reserve(times.size()); + for (const auto& time : times) { + individualResults.emplace_back(RunResult{ time, false }); + } + } + + return BenchmarkResult{ name_, stats, std::move(individualResults), config_ }; + } + }; + + // ״̬Ļ׼ + template class StatefulBenchmark : public BenchmarkBase { + private: + Func func_; + int state_ = 42; // Ĭ״̬ + + public: + StatefulBenchmark(std::string name, Func&& func, int initial_state = 42, + BenchmarkConfig config = {}) + : BenchmarkBase(std::move(name), config), + func_(std::forward(func)), + state_(initial_state) { + } + + BenchmarkResult Run() override { + std::vector times; + times.reserve(config_.iterations + config_.warmupIterations); + + // Ԥ + for (size_t i = 0; i < config_.warmupIterations; ++i) { + auto start = std::chrono::high_resolution_clock::now(); + func_(state_); + auto end = std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration_cast(end - start); + // Ԥʱ䲻ͳ + } + + // ʵʲ + for (size_t i = 0; i < config_.iterations; ++i) { + auto start = std::chrono::high_resolution_clock::now(); + func_(state_); + auto end = std::chrono::high_resolution_clock::now(); + + auto duration = std::chrono::duration_cast(end - start); + double time_ns = TimeConverter::ToUnit(duration, TimeUnit::Nanoseconds); + times.push_back(time_ns); + } + + // ͳϢ + auto stats = StatisticsCalculator::Calculate(times); + + // 쳣ֵ + std::vector individualResults; + if (config_.showOutliers) { + individualResults = StatisticsCalculator::IdentifyOutliers(times, stats, config_.outlierThreshold); + } + else { + individualResults.reserve(times.size()); + for (const auto& time : times) { + individualResults.emplace_back(RunResult{ time, false }); + } + } + + return BenchmarkResult{ name_, stats, std::move(individualResults), config_ }; + } + }; + + // ʽ + class ResultFormatter { + public: + static void PrintResult(const BenchmarkResult& result); + static void PrintComparison(const std::vector& results); + }; + + // ׼ע + class BenchmarkRunner { + private: + std::vector> benchmarks_; + std::vector results_; + + public: + template + void RegisterBenchmark(std::string name, Func&& func, BenchmarkConfig config = {}) { + benchmarks_.push_back(std::make_unique>(std::move(name), std::forward(func), config)); + } + + template + void RegisterStatefulBenchmark(std::string name, Func&& func, int initial_state = 42, BenchmarkConfig config = {}) { + benchmarks_.push_back(std::make_unique>(std::move(name), std::forward(func), initial_state, config)); + } + + void RunAll(); + + const std::vector& GetResults() const { + return results_; + } + }; + + // ȫĬ + inline BenchmarkRunner& GetDefaultRunner() { + static BenchmarkRunner runner; + return runner; + } + + } // namespace benchmark +} + +// ݺ궨 +#define BENCHMARK(name) static void benchmark_##name(); static struct benchmark_registrar_##name { benchmark_registrar_##name() { NahidaProject::NahidaBenchmarkTest::GetDefaultRunner().RegisterBenchmark(#name, benchmark_##name); } } registrar_##name; static void benchmark_##name() \ No newline at end of file diff --git a/NahidaProject.UnitTest/Sources/NahidaMockTest.cpp b/NahidaProject.UnitTest/Sources/NahidaMockTest.cpp new file mode 100644 index 0000000..cfd35d6 --- /dev/null +++ b/NahidaProject.UnitTest/Sources/NahidaMockTest.cpp @@ -0,0 +1,19 @@ +#include "NahidaMockTest.h" + +void NahidaProject::NahidaMockTest::Assertion::Fail(const std::string& message, std::source_location location) { + std::cerr << "Assertion failed at " << location.file_name() << ":" << location.line() << " - " << message << std::endl; + throw std::runtime_error(message); +} + +void NahidaProject::NahidaMockTest::Assertion::That(bool condition, const std::string& message, std::source_location location) { + if (!condition) { + Fail(message, location); + } +} + +void NahidaProject::NahidaMockTest::TestRunner::PrintSummary() { + std::cout << "\nTest Summary:" << std::endl; + std::cout << "Total: " << testCount_ << std::endl; + std::cout << "Passed: " << passedCount_ << std::endl; + std::cout << "Failed: " << failedCount_ << std::endl; +} diff --git a/NahidaProject.UnitTest/Sources/NahidaMockTest.h b/NahidaProject.UnitTest/Sources/NahidaMockTest.h new file mode 100644 index 0000000..2144bf7 --- /dev/null +++ b/NahidaProject.UnitTest/Sources/NahidaMockTest.h @@ -0,0 +1,264 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace NahidaProject { + namespace NahidaMockTest { + + //  + template concept Callable = std::is_invocable_v; + template concept InvocableWith = std::is_invocable_v; + + // ƥ + template class Matcher { + public: + virtual ~Matcher() = default; + virtual bool Matches(const T& value) const = 0; + virtual std::string Describe() const = 0; + }; + + // ƥ + template class EqualMatcher : public Matcher { + private: + T expected_; + + public: + explicit EqualMatcher(const T& expected) : expected_(expected) {} + + bool Matches(const T& value) const override { + return value == expected_; + } + + std::string Describe() const override { + return "eq(" + std::to_string(expected_) + ")"; + } + }; + + // ƥ + template class AnyMatcher : public Matcher { + public: + bool Matches(const T&) const override { + return true; + } + + std::string Describe() const override { + return "any()"; + } + }; + + // ƥ + template auto Equal(const T& value) { + return std::make_unique>(value); + } + + template auto Any() { + return std::make_unique>(); + } + + // ü¼ + template struct CallRecord { + std::tuple arguments; + std::source_location location; + + CallRecord(std::tuple args, std::source_location loc = std::source_location::current()) : arguments(std::move(args)), location(loc) { + + } + }; + + // + template class Expectation { + private: + std::function action_; + std::vector>>> matchers_; + size_t minimumCalls_{ 1 }; + size_t maximumCalls_{ 1 }; + size_t actualCalls_{ 0 }; + + public: + Expectation() = default; + + template Expectation& WillReturn(Action&& action) requires InvocableWith { + action_ = std::forward(action); + return *this; + } + + Expectation& Times(size_t count) { + minimumCalls_ = count; + maximumCalls_ = count; + return *this; + } + + Expectation& Times(size_t min, size_t max) { + minimumCalls_ = min; + maximumCalls_ = max; + return *this; + } + + template Expectation& With(Matchers&&... matchers) { + (matchers_.push_back(std::forward(matchers)), ...); + return *this; + } + + bool Matches(const std::tuple& args) const { + if (matchers_.empty()) { + return true; + } + + return true; + } + + ReturnType Invoke(Args... args) { + ++actualCalls_; + if (action_) { + return action_(args...); + } + if constexpr (!std::is_void_v) { + return ReturnType{}; + } + } + + bool Verify() const { + return actualCalls_ >= minimumCalls_ && actualCalls_ <= maximumCalls_; + } + + size_t GetActualCalls() const { + return actualCalls_; + } + + size_t GetMinimumCalls() const { + return minimumCalls_; + } + + size_t GetMaximumCalls() const { + return maximumCalls_; + } + + }; + + // Mock + class MockObject { + protected: + mutable std::vector verificationErrors_; + + public: + virtual ~MockObject() = default; + + virtual bool Verify() const { + return verificationErrors_.empty(); + } + + virtual void Reset() { + verificationErrors_.clear(); + } + + const std::vector& GetVerificationErrors() const { + return verificationErrors_; + } + }; + + // Mock + template + class MockMethod { + private: + std::vector>> expectations_; + std::vector> callHistory_; + + public: + template + Expectation& expect(Matchers&&... matchers) { + auto expectation = std::make_unique>(); + if constexpr (sizeof...(Matchers) > 0) { + expectation->with(std::forward(matchers)...); + } + expectations_.push_back(std::move(expectation)); + return *expectations_.back(); + } + + ReturnType operator()(Args... args) { + callHistory_.emplace_back(std::make_tuple(args...)); + + for (auto& expectation : expectations_) { + if (expectation->Matches(std::make_tuple(args...))) { + return expectation->Invoke(args...); + } + } + + throw std::runtime_error("No matching expectation found"); + } + + bool Verify() const { + for (const auto& expectation : expectations_) { + if (!expectation->Verify()) { + return false; + } + } + return true; + } + + size_t GetCallCount() const { + return callHistory_.size(); + } + + const std::vector>& GetCallHistory() const { + return callHistory_; + } + }; + + // Զ + class Assertion { + public: + static void Fail(const std::string& message, std::source_location location = std::source_location::current()); + + template static void Equal(const T& expected, const T& actual, std::source_location location = std::source_location::current()) { + if (!(expected == actual)) { + Fail("Expected: " + std::to_string(expected) + ", Actual: " + std::to_string(actual), location); + } + } + + static void That(bool condition, const std::string& message, std::source_location location = std::source_location::current()); + }; + + // + class TestRunner { + private: + static inline int testCount_ = 0; + static inline int passedCount_ = 0; + static inline int failedCount_ = 0; + + public: + template static void RunTest(const std::string& name, TestFunc&& test_func) { + ++testCount_; + try { + test_func(); + ++passedCount_; + std::cout << "[PASS] " << name << std::endl; + } + catch (const std::exception& e) { + ++failedCount_; + std::cout << "[FAIL] " << name << " - " << e.what() << std::endl; + } + } + + static void PrintSummary(); + }; + + } // namespace mock +} + +// 궨ʹ +#define MockMethod(return_type, method_name, ...) NahidaProject::NahidaMockTest::MockMethod method_name##_; +#define ExpectCall(mock_obj, method_name) mock_obj.method_name##_.expect() +#define MockAssertEqual(expected, actual) NahidaProject::NahidaMockTest::Assertion::equal(expected, actual) +#define MockAssertTrue(condition) NahidaProject::NahidaMockTest::Assertion::That(condition, "Condition is false") +#define RunTest(name, func) NahidaProject::NahidaMockTest::TestRunner::RunTest(name, func) +#define TestSummary() NahidaProject::NahidaMockTest::TestRunner::PrintSummary() \ No newline at end of file diff --git a/NahidaProject.UnitTest/Sources/NahidaUnitTest.cpp b/NahidaProject.UnitTest/Sources/NahidaUnitTest.cpp new file mode 100644 index 0000000..5bd9206 --- /dev/null +++ b/NahidaProject.UnitTest/Sources/NahidaUnitTest.cpp @@ -0,0 +1,172 @@ +#include "NahidaUnitTest.h" +#include + +NahidaProject::NahidaUnitTest::TestRegistry* NahidaProject::NahidaUnitTest::TestRegistry::instance_ = nullptr; + +NahidaProject::NahidaUnitTest::TestRegistry& NahidaProject::NahidaUnitTest::TestRegistry::GetInstance() { + if (!instance_) { + instance_ = new TestRegistry(); + } + return *instance_; +} + +void NahidaProject::NahidaUnitTest::TestRegistry::RegisterTest(std::unique_ptr test) { + tests.push_back(std::move(test)); +} + +const std::vector>& NahidaProject::NahidaUnitTest::TestRegistry::GetTests() const { + return tests; +} + +void NahidaProject::NahidaUnitTest::TestRegistry::Clear() { + tests.clear(); +} + +void NahidaProject::NahidaUnitTest::TestRunner::RunAllTests() { + auto& registry = NahidaProject::NahidaUnitTest::TestRegistry::GetInstance(); + const auto& tests = registry.GetTests(); + + std::cout << "Running " << tests.size() << " tests...\n\n"; + + for (const auto& test : tests) { + NahidaProject::NahidaUnitTest::TestInformation info(test->GetName(), test->GetFile(), test->GetLine()); + + auto start_time = std::chrono::high_resolution_clock::now(); + + try { + test->Run(); + info.result = NahidaProject::NahidaUnitTest::TestResult::PASSED; + passedTest++; + } + catch (const AssertionException& e) { + info.result = NahidaProject::NahidaUnitTest::TestResult::FAILED; + info.message = e.GetMessage() + " at " + e.GetFile() + ":" + std::to_string(e.GetLine()); + failedTest++; + } + catch (const std::exception& e) { + info.result = NahidaProject::NahidaUnitTest::TestResult::FAILED; + info.message = "Exception: " + std::string(e.what()); + failedTest++; + } + catch (...) { + info.result = NahidaProject::NahidaUnitTest::TestResult::FAILED; + info.message = "Unknown exception thrown"; + failedTest++; + } + + auto end_time = std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration_cast(end_time - start_time); + info.duration_ms = duration.count() / 1000.0; + + results.push_back(info); + + switch (info.result) { + case TestResult::PASSED: + std::cout << "[SUCCESS] " << info.name << " (" << info.duration_ms << " ms)\n"; + break; + case TestResult::FAILED: + std::cout << "[FAILURE] " << info.name << " - " << info.message << "\n"; + break; + case TestResult::SKIPPED: + std::cout << "[SKIPPED] " << info.name << "\n"; + skippedTest++; + break; + } + } +} + +void NahidaProject::NahidaUnitTest::Assert::_AssertTrue(bool condition, const std::string & message, const std::source_location & location) { + if (!condition) { + std::ostringstream oss; + oss << "Expected true, but was false"; + if (!message.empty()) { + oss << " (" << message << ")"; + } + throw AssertionException(oss.str(), location.file_name(), location.line()); + } +} + + void NahidaProject::NahidaUnitTest::Assert::_AssertFalse(bool condition, const std::string & message, const std::source_location & location) { + if (condition) { + std::ostringstream oss; + oss << "Expected false, but was true"; + if (!message.empty()) { + oss << " (" << message << ")"; + } + throw AssertionException(oss.str(), location.file_name(), location.line()); + } +} + +void NahidaProject::NahidaUnitTest::Assert::_Fail(const std::string & message, const std::source_location & location) { + std::ostringstream oss; + oss << "Test failed"; + if (!message.empty()) { + oss << ": " << message; + } + throw AssertionException(oss.str(), location.file_name(), location.line()); +} + +void NahidaProject::NahidaUnitTest::Assert::_NoThrow(std::function func, const std::string& message, const std::source_location& location) { + try { + func(); + } + catch (...) { + std::ostringstream oss; + oss << "Expected no exception but exception was thrown"; + if (!message.empty()) { + oss << " (" << message << ")"; + } + throw AssertionException(oss.str(), location.file_name(), location.line()); + } +} + +void NahidaProject::NahidaUnitTest::TestRunner::PrintResults() const { + std::cout << "\n" << std::string(50, '=') << "\n"; + std::cout << "Test Results Summary:\n"; + std::cout << std::string(50, '=') << "\n"; + std::cout << "Total: " << results.size() << "\n"; + std::cout << "Passed: " << passedTest << "\n"; + std::cout << "Failed: " << failedTest << "\n"; + std::cout << "Skipped: " << skippedTest << "\n"; + + if (failedTest > 0) { + std::cout << "\nFailed Tests:\n"; + std::cout << std::string(30, '-') << "\n"; + for (const auto& result : results) { + if (result.result == TestResult::FAILED) { + std::cout << result.name << " - " << result.message << "\n"; + } + } + } + + std::cout << "\nExecution time: " << std::accumulate(results.begin(), results.end(), 0.0, [](double sum, const TestInformation& info) { return sum + info.duration_ms; }) << " ms\n"; +} + + +void NahidaProject::NahidaUnitTest::TestSuite::AddTest(std::unique_ptr test) { + tests.push_back(std::move(test)); +} + +const std::vector>& NahidaProject::NahidaUnitTest::TestSuite::GetTests() const { + return tests; +} + +const std::string& NahidaProject::NahidaUnitTest::TestSuite::GetName() const { + return name; +} + +const std::vector& NahidaProject::NahidaUnitTest::TestRunner::GetResults() const { + return results; +} + +int NahidaProject::NahidaUnitTest::TestRunner::GetPassedCount() const { + return passedTest; +} + +int NahidaProject::NahidaUnitTest::TestRunner::GetFailedCount() const { + return failedTest; +} + +int NahidaProject::NahidaUnitTest::TestRunner::GetSkippedCount() const { + return skippedTest; +} \ No newline at end of file diff --git a/NahidaProject.UnitTest/Sources/NahidaUnitTest.h b/NahidaProject.UnitTest/Sources/NahidaUnitTest.h new file mode 100644 index 0000000..18f6648 --- /dev/null +++ b/NahidaProject.UnitTest/Sources/NahidaUnitTest.h @@ -0,0 +1,257 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace NahidaProject { + namespace NahidaUnitTest { + // Խö + enum class __declspec(dllexport) TestResult { PASSED, FAILED, SKIPPED }; + + // Ϣṹ + class __declspec(dllexport) TestInformation { + public: + std::string name; + std::string file; + int line; + TestResult result = TestResult::PASSED; + std::string message; + double duration_ms = 0.0; + + TestInformation(const std::string& n, const std::string& f, int l) : name(n), file(f), line(l) { + } + }; + + // Ի + class __declspec(dllexport) TestCase { + public: + virtual ~TestCase() = default; + virtual void Run() = 0; + virtual std::string GetName() const = 0; + virtual std::string GetFile() const = 0; + virtual int GetLine() const = 0; + }; + + // ע + class __declspec(dllexport) TestRegistry { + private: + static TestRegistry* instance_; + std::vector> tests; + + public: + static TestRegistry& GetInstance(); + void RegisterTest(std::unique_ptr test); + const std::vector>& GetTests() const; + void Clear(); + }; + + // + class __declspec(dllexport) TestRunner { + private: + std::vector results; + int passedTest = 0; + int failedTest = 0; + int skippedTest = 0; + + public: + void RunAllTests(); + void PrintResults() const; + const std::vector& GetResults() const; + int GetPassedCount() const; + int GetFailedCount() const; + int GetSkippedCount() const; + }; + + // 쳣 + class __declspec(dllexport) AssertionException : public std::exception { + private: + std::string message; + std::string file; + int line; + + public: + AssertionException(const std::string& msg, const std::string& file, int line) : message(message), file(file), line(line) { + + } + + const char* what() const noexcept override { + return message.c_str(); + } + + const std::string& GetFile() const { return file; } + int GetLine() const { return line; } + const std::string& GetMessage() const { return message; } + }; + + // Թ + class __declspec(dllexport) Assert { + public: + template static void _Equal(const T& expected, const U& actual, const std::string& message = "", const std::source_location& location = std::source_location::current()) { + if (!(expected == actual)) { + std::ostringstream oss; + oss << "Expected: " << expected << ", Actual: " << actual; + if (!message.empty()) { + oss << " (" << message << ")"; + } + throw AssertionException(oss.str(), location.file_name(), location.line()); + } + } + + template static void _NotEqual(const T& expected, const U& actual, const std::string& message = "", const std::source_location& location = std::source_location::current()) { + if (!(expected != actual)) { + std::ostringstream oss; + oss << "Expected not equal to: " << expected << ", but was equal"; + if (!message.empty()) { + oss << " (" << message << ")"; + } + throw AssertionException(oss.str(), location.file_name(), location.line()); + } + } + + static void _AssertTrue(bool condition, const std::string& message = "", const std::source_location& location = std::source_location::current()); + static void _AssertFalse(bool condition, const std::string& message = "", const std::source_location& location = std::source_location::current()); + static void _Fail(const std::string& message = "", const std::source_location& location = std::source_location::current()); + + template static void _Throws(std::function func, const std::string& message = "", const std::source_location& location = std::source_location::current()) { + try { + func(); + std::ostringstream oss; + oss << "Expected exception of type " << typeid(T).name() << " but no exception was thrown"; + if (!message.empty()) { + oss << " (" << message << ")"; + } + throw AssertionException(oss.str(), location.file_name(), location.line()); + } + catch (const T&) { + // Expected exception - test passes + } + catch (...) { + std::ostringstream oss; + oss << "Expected exception of type " << typeid(T).name() << " but different exception was thrown"; + if (!message.empty()) { + oss << " (" << message << ")"; + } + throw AssertionException(oss.str(), location.file_name(), location.line()); + } + } + + static void _NoThrow(std::function func, const std::string& message = "", const std::source_location& location = std::source_location::current()); + }; + + // ģ + template class __declspec(dllexport) ConcreteTestCase : public TestCase { + private: + std::string name; + std::string file; + int line; + std::function testFunction; + + public: + ConcreteTestCase(const std::string& name, const std::string& file, int line, std::function testFunction) : name(name), file(file), line(line), testFunction(testFunction) { + + } + + void Run() override { + T fixture; + testFunction(fixture); + } + + std::string GetName() const override { return name; } + std::string GetFile() const override { return file; } + int GetLine() const override { return line; } + }; + + // ޼о߲ + class __declspec(dllexport) SimpleTestCase : public TestCase { + private: + std::string name; + std::string file; + int line; + std::function testFunction; + + public: + SimpleTestCase(const std::string& name, const std::string& file, int line, std::function testFunction) : name(name), file(file), line(line), testFunction(testFunction) { + + } + + void Run() override { + testFunction(); + } + + std::string GetName() const override { return name; } + std::string GetFile() const override { return file; } + int GetLine() const override { return line; } + }; + + // Լо߻ + class __declspec(dllexport) TestFixture { + public: + virtual ~TestFixture() = default; + virtual void SetUp() {} + virtual void TearDown() {} + }; + + // ׼ + class __declspec(dllexport) TestSuite { + private: + std::string name; + std::vector> tests; + + public: + explicit TestSuite(const std::string& name) : name(name) {} + + void AddTest(std::unique_ptr test); + const std::vector>& GetTests() const; + const std::string& GetName() const; + }; + } +} + +// 궨 +#define Test(test_name) \ + void test_name##_impl(); \ + static struct test_name##_registrar { \ + test_name##_registrar() { \ + NahidaProject::NahidaUnitTest::TestRegistry::GetInstance().RegisterTest(std::make_unique(#test_name, __FILE__, __LINE__, test_name##_impl)); \ + } \ + } test_name##_registrar_instance; \ + void test_name##_impl() + +#define TestFixture(fixture_class, test_name) \ + void fixture_class##_##test_name##_impl(fixture_class&); \ + static struct fixture_class##_##test_name##_registrar { \ + fixture_class##_##test_name##_registrar() { \ + NahidaProject::NahidaUnitTest::TestRegistry::GetInstance().RegisterTest( \ + std::make_unique>( \ + #fixture_class "." #test_name, __FILE__, __LINE__, \ + fixture_class##_##test_name##_impl)); \ + } \ + } fixture_class##_##test_name##_registrar_instance; \ + void fixture_class##_##test_name##_impl(fixture_class& fixture) { fixture.SetUp(); + +#define TestFixtureEnd fixture.TearDown(); } + +#define TestSuite(suite_name) static NahidaProject::NahidaUnitTest::TestSuite suite_name##_suite(#suite_name); +#define AddTestToSuite(suite_name, test_name) suite_name##_suite.AddTest(std::make_unique(#test_name, __FILE__, __LINE__, test_name##_impl)); + +// Ժ +#define AssertEqual(expected, actual) NahidaProject::NahidaUnitTest::Assert::_Equal(expected, actual) +#define AssertNotEqual(expected, actual) NahidaProject::NahidaUnitTest::Assert::_NotEqual(expected, actual) +#define AssertTrue(condition) NahidaProject::NahidaUnitTest::Assert::_AssertTrue(condition); +#define AssertFalse(condition) NahidaProject::NahidaUnitTest::Assert::_AssertFalse(condition) +#define AssertThrows(expression, exception_type) NahidaProject::NahidaUnitTest::Assert::_Throws([&]() { expression; }) +#define Assert_NoThrows(expression) NahidaProject::NahidaUnitTest::Assert::_NoThrow([&]() { expression; }) +#define Failure() NahidaProject::NahidaUnitTest::Assert::_Fail() +#define AssertEqualMessage(expected, actual, message) NahidaProject::NahidaUnitTest::Assert::_Equal(expected, actual, message) +#define AssertTrueMessage(condition, message) NahidaProject::NahidaUnitTest::Assert::_AssertTrue(condition, message) + +// вԵĺ +#define RunAllTestCase() do { NahidaProject::NahidaUnitTest::TestRunner runner; runner.RunAllTests(); runner.PrintResults(); return runner.GetFailedCount() > 0 ? 1 : 0; } while(0) \ No newline at end of file diff --git a/NahidaProject.UnitTest/Tests/ModuleUnitTestFile.cpp b/NahidaProject.UnitTest/Tests/ModuleUnitTestFile.cpp new file mode 100644 index 0000000..7fae9a8 --- /dev/null +++ b/NahidaProject.UnitTest/Tests/ModuleUnitTestFile.cpp @@ -0,0 +1,217 @@ +#include "..\Sources\NahidaBenchmarkTest.h" +#include "..\Sources\NahidaMockTest.h" +#include "..\Sources\NahidaUnitTest.h" + +#include +#include + +using namespace std; + +Test(UnitTestMacroTest) { + AssertEqual(78 + 13, 91); + AssertNotEqual(1 + 1, 10086); + AssertTrue(true); + AssertFalse(false); + AssertThrows(throw std::runtime_error("This is a test exception"), std::runtime_error); +} + +class VectorFixture : public NahidaProject::NahidaUnitTest::TestFixture { +public: + std::vector exampleVector; + + void SetUp() override { + exampleVector = { 1, 2, 3, 4, 5 }; + } + + void TearDown() override { + exampleVector.clear(); + } +}; + +TestFixture(VectorFixture, SizeTest) + AssertEqual(fixture.exampleVector.size(), 5); + fixture.exampleVector.push_back(6); + AssertEqual(fixture.exampleVector.size(), 6); +TestFixtureEnd + +TestFixture(VectorFixture, ElementTest) + AssertEqual(fixture.exampleVector[0], 1); + AssertEqual(fixture.exampleVector[4], 5); + AssertTrue(fixture.exampleVector.front() == 1); + AssertTrue(fixture.exampleVector.back() == 5); + AssertFalse(false); +TestFixtureEnd + +void test_vector_push_back() { + std::vector v; + for (int i = 0; i < 1000; ++i) { + v.push_back(i); + } +} + +void test_vector_reserve_push_back() { + std::vector v; + v.reserve(1000); + for (int i = 0; i < 1000; ++i) { + v.push_back(i); + } +} + +void test_sort_random_data(int seed) { + std::mt19937 gen(seed); + std::uniform_int_distribution<> dis(1, 10000); + + std::vector data(1000); + std::generate(data.begin(), data.end(), [&]() { return dis(gen); }); + + std::sort(data.begin(), data.end()); +} + +void test_sort_sorted_data(int size) { + std::vector data(size); + std::iota(data.begin(), data.end(), 1); + std::sort(data.begin(), data.end()); +} + +void test_sleep_function() { + std::this_thread::sleep_for(std::chrono::microseconds(100)); +} + +// ʾӿ +class DatabaseInterface { +public: + virtual ~DatabaseInterface() = default; + virtual bool connect(const std::string& host, int port) = 0; + virtual std::string query(const std::string& sql) = 0; + virtual void disconnect() = 0; +}; + +// Mock ʵ +class MockDatabase : public DatabaseInterface, public NahidaProject::NahidaMockTest::MockObject { +public: + MockMethod(bool, connect, const std::string&, int) + MockMethod(std::string, query, const std::string&) + MockMethod(void, disconnect) + + bool connect(const std::string& host, int port) override { + return connect_(host, port); + } + + std::string query(const std::string& sql) override { + return query_(sql); + } + + void disconnect() override { + disconnect_(); + } + + bool Verify() const override { + return connect_.Verify() && query_.Verify() && disconnect_.Verify(); + } + +}; + +// Եķ +class UserService { +private: + DatabaseInterface& db_; + +public: + explicit UserService(DatabaseInterface& db) : db_(db) {} + + bool authenticate_user(const std::string& username, const std::string& password) { + if (!db_.connect("localhost", 5432)) { + return false; + } + + std::string sql = "SELECT * FROM users WHERE username='" + username + "'"; + std::string result = db_.query(sql); + + db_.disconnect(); + return !result.empty(); + } +}; + +// +void test_user_authentication_success() { + MockDatabase mock_db; + + // + ExpectCall(mock_db, connect).WillReturn([](const std::string&, int) { return true; }).Times(1); + ExpectCall(mock_db, query).WillReturn([](const std::string&) { return "user_data"; }).Times(1); + ExpectCall(mock_db, disconnect).Times(1); + + // ִв + UserService service(mock_db); + bool result = service.authenticate_user("john", "password123"); + + // ֤ + //MockAssertTrue(result); + MockAssertTrue(mock_db.Verify()); +} + +void test_database_connection_failure() { + MockDatabase mock_db; + + // + ExpectCall(mock_db, connect).WillReturn([](const std::string&, int) { return false; }).Times(1); + + // ִв + UserService service(mock_db); + bool result = service.authenticate_user("john", "password123"); + + // ֤ + //MockAssertTrue(result); + MockAssertTrue(mock_db.Verify()); +} + +void test_empty_query_result() { + MockDatabase mock_db; + + // + ExpectCall(mock_db, connect).WillReturn([](const std::string&, int) { return true; }).Times(1); + ExpectCall(mock_db, query).WillReturn([](const std::string&) { return ""; }).Times(1); + ExpectCall(mock_db, disconnect).Times(1); + + // ִв + UserService service(mock_db); + bool result = service.authenticate_user("john", "password123"); + + // ֤ + //MockAssertTrue(result); + MockAssertTrue(mock_db.Verify()); +} + +int main(int argc, char **argv){ + // һֻеԪԡ׼ԡģеһֲԡ + RunAllTestCase(); + + NahidaProject::NahidaBenchmarkTest::BenchmarkRunner runner; + + // ע᲻ͬĻ׼ + NahidaProject::NahidaBenchmarkTest::BenchmarkConfig config1{ 1000, 100, NahidaProject::NahidaBenchmarkTest::TimeUnit::Microseconds, true, true, 2.0 }; + NahidaProject::NahidaBenchmarkTest::BenchmarkConfig config2{ 500, 50, NahidaProject::NahidaBenchmarkTest::TimeUnit::Microseconds, true, false, 2.0 }; + + runner.RegisterBenchmark("VectorPushBack", test_vector_push_back, config1); + runner.RegisterBenchmark("VectorReservePushBack", test_vector_reserve_push_back, config1); + runner.RegisterStatefulBenchmark("SortRandomData", test_sort_random_data, 42, config2); + runner.RegisterStatefulBenchmark("SortSortedData", test_sort_sorted_data, 1000, config2); + runner.RegisterBenchmark("SleepFunction", test_sleep_function, config1); + + // в + runner.RunAll(); + + // ȡнһ + const auto& results = runner.GetResults(); + std::cout << "\nCompleted " << results.size() << " benchmarks successfully.\n"; + + + std::cout << "Running Mock Framework Tests..." << std::endl; + + RunTest("User Authentication Success", test_user_authentication_success); + RunTest("Database Connection Failure", test_database_connection_failure); + RunTest("Empty Query Result", test_empty_query_result); + + TestSummary(); + return 0; +} \ No newline at end of file diff --git a/NahidaProject4CSharp/.gitignore b/NahidaProject4CSharp/.gitignore deleted file mode 100644 index acdf449..0000000 --- a/NahidaProject4CSharp/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -### Microsoft Visual Studio ### -.vs -bin -obj -package \ No newline at end of file diff --git a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/App.config b/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/App.config deleted file mode 100644 index 193aecc..0000000 --- a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest.csproj b/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest.csproj deleted file mode 100644 index 5f68240..0000000 --- a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest.csproj +++ /dev/null @@ -1,59 +0,0 @@ - - - - - Debug - AnyCPU - {B4085054-7471-4BD3-936C-03A77D5A6526} - Exe - NahidaProject4CSharp.Database.FunctionalTest - NahidaProject4CSharp.Database.FunctionalTest - v4.8 - 512 - true - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - {7f4fc760-8efb-463e-9013-997296ddc298} - NahidaPrjoect4CSharp.Database - - - - \ No newline at end of file diff --git a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/Program.cs b/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/Program.cs deleted file mode 100644 index edf78c7..0000000 --- a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/Program.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Odbc; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NahidaPrjoect4CSharp.Database; - -namespace NahidaProject4CSharp.Database.FunctionalTest -{ - internal class Program - { - static void Main(string[] args) - { - string connectionString = "your_connection_string_here"; - using (ODBC helper = new ODBC(connectionString)) - { - helper.OpenConnection(); - helper.BeginTransaction(); - - try - { - // 执行查询 - DataTable result = helper.ExecuteQuery("SELECT * FROM your_table WHERE your_column = ?", new OdbcParameter("your_column", 1)); - - // 执行非查询命令 - int rowsAffected = helper.ExecuteNonQuery("UPDATE your_table SET your_column = ? WHERE another_column = ?", new OdbcParameter("your_column", 1), new OdbcParameter("another_column", 1)); - - // 提交事务 - helper.CommitTransaction(); - } - catch (Exception ex) - { - // 回滚事务 - helper.RollbackTransaction(); - Console.WriteLine("Error: " + ex.Message); - } - } - } - } -} diff --git a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/Properties/AssemblyInfo.cs b/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/Properties/AssemblyInfo.cs deleted file mode 100644 index 2f2e16c..0000000 --- a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Database.FunctionalTest/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// 有关程序集的一般信息由以下 -// 控制。更改这些特性值可修改 -// 与程序集关联的信息。 -[assembly: AssemblyTitle("NahidaProject4CSharp.Database.FunctionalTest")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("NahidaProject4CSharp.Database.FunctionalTest")] -[assembly: AssemblyCopyright("Copyright © 2025")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 将 ComVisible 设置为 false 会使此程序集中的类型 -//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 -//请将此类型的 ComVisible 特性设置为 true。 -[assembly: ComVisible(false)] - -// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID -[assembly: Guid("b4085054-7471-4bd3-936c-03a77d5a6526")] - -// 程序集的版本信息由下列四个值组成: -// -// 主版本 -// 次版本 -// 生成号 -// 修订号 -// -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/App.config b/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/App.config deleted file mode 100644 index 91126fc..0000000 --- a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/App.config +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest.csproj b/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest.csproj deleted file mode 100644 index 5b66c1c..0000000 --- a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest.csproj +++ /dev/null @@ -1,64 +0,0 @@ - - - - - latest - Debug - AnyCPU - {CEAF0071-F049-4618-B7F4-762EA18EB0CC} - Exe - NahidaProject4CSharp.Generic.FunctionalTest - NahidaProject4CSharp.Generic.FunctionalTest - v4.8 - 512 - true - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - {41576b57-fea7-407e-9417-7b6b6b8078b1} - NahidaProject4CSharp.Generic - - - {ac8f58ae-96fa-49a3-8b24-0674ddfef2f7} - NahidaProject4CSharp.UnitTest - - - - \ No newline at end of file diff --git a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/Program.cs b/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/Program.cs deleted file mode 100644 index 8aa6178..0000000 --- a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/Program.cs +++ /dev/null @@ -1,45 +0,0 @@ -using NahidaProject4CSharp.UnitTest.NahidaUnitTest; -using System.Reflection; - -namespace NahidaProject4CSharp.Generic.FunctionalTest -{ - - public class TestClass - { - - [Test] - public void BloomFilterTest() - { - var bloomFilter = new BloomFilter(1000, 5); - - bloomFilter.Add("apple"); - bloomFilter.Add("banana"); - - Assert.IsTrue(bloomFilter.Contains("apple")); - Assert.IsTrue(bloomFilter.Contains("banana")); - Assert.IsTrue(bloomFilter.Contains("cherry")); - } - - [Test] - public void LoggerTest() - { - var logger = Logger.Instance; - - logger.Debug("This is a debug message"); - logger.Information("This is a message"); - logger.Warning("This is a warning message"); - logger.Error("This is a error message"); - } - } - - - internal class Program - { - static void Main(string[] args) - { - var assemblyRunner = new TestRunner(); - assemblyRunner.RunTests(Assembly.GetExecutingAssembly()); - assemblyRunner.PrintResults(); - } - } -} diff --git a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/Properties/AssemblyInfo.cs b/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/Properties/AssemblyInfo.cs deleted file mode 100644 index e9438c5..0000000 --- a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.Generic.FunctionalTest/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// 有关程序集的一般信息由以下 -// 控制。更改这些特性值可修改 -// 与程序集关联的信息。 -[assembly: AssemblyTitle("NahidaProject4CSharp.Generic.FunctionalTest")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("NahidaProject4CSharp.Generic.FunctionalTest")] -[assembly: AssemblyCopyright("Copyright © 2025")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 将 ComVisible 设置为 false 会使此程序集中的类型 -//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 -//请将此类型的 ComVisible 特性设置为 true。 -[assembly: ComVisible(false)] - -// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID -[assembly: Guid("ceaf0071-f049-4618-b7f4-762ea18eb0cc")] - -// 程序集的版本信息由下列四个值组成: -// -// 主版本 -// 次版本 -// 生成号 -// 修订号 -// -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/App.config b/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/App.config deleted file mode 100644 index 193aecc..0000000 --- a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest.csproj b/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest.csproj deleted file mode 100644 index e07cbf9..0000000 --- a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest.csproj +++ /dev/null @@ -1,60 +0,0 @@ - - - - - latest - Debug - AnyCPU - {2DA61D72-1C90-4E5A-9FB3-69E1B5200F33} - Exe - NahidaProject4CSharp.UnitTest.FunctionalTest - NahidaProject4CSharp.UnitTest.FunctionalTest - v4.8 - 512 - true - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - {ac8f58ae-96fa-49a3-8b24-0674ddfef2f7} - NahidaProject4CSharp.UnitTest - - - - \ No newline at end of file diff --git a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/Program.cs b/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/Program.cs deleted file mode 100644 index 3ace5a2..0000000 --- a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/Program.cs +++ /dev/null @@ -1,150 +0,0 @@ -using NahidaProject4CSharp.UnitTest.NahidaBenchmarkTest; -using NahidaProject4CSharp.UnitTest.NahidaMockTest; -using NahidaProject4CSharp.UnitTest.NahidaUnitTest; -using System; -using System.Reflection; -using System.Text; - -namespace NahidaProject4CSharp.UnitTest.FunctionalTest { - public class UnitTestTests{ - - [Test] public void TestPoint1() { - Assert.Equals(1 + 1, 2); - } - - [Test] public void TestPoint2() { - Assert.Equals(2 + 2, 22); - } - } - - [BenchmarkClass(Name = "TestClass1", Description = "Testing various string operations performance")] - public class TestClass1 { - [Benchmark(Iterations = 1000, Warmup = 10, Description = "String concatenation using + operator")] - public void TestPoint1(){ - string result = ""; - for (int i = 0; i < 100; i++) - { - result += "test"; - } - } - - [Benchmark(Iterations = 1000, Warmup = 10, Description = "String concatenation using StringBuilder")] - public void TestPoint2(){ - var sb = new StringBuilder(); - for (int i = 0; i < 100; i++){ - sb.Append("test"); - } - sb.ToString(); - } - - [Benchmark(Iterations = 1000, Warmup = 10, Description = "String.Join operation")] - public void TestPoint3(){ - var array = new string[100]; - for (int i = 0; i < 100; i++){ - array[i] = "test"; - } - string.Join("", array); - } - - [Benchmark(Iterations = 100, Warmup = 5, Description = "Parameterized string format test")] - public void TestPoint4([BenchmarkParam("Hello", "World", "Test")] string input){ - string.Format("Formatted: {0}", input); - } - } - - public interface IUserService - { - string GetUserName(int userId); - int GetUserCount(); - void SaveUser(string name); - bool DeleteUser(int userId); - } - - public class UserServiceConsumer - { - private readonly IUserService _userService; - - public UserServiceConsumer(IUserService userService) - { - _userService = userService; - } - - public string GetWelcomeMessage(int userId) - { - var userName = _userService.GetUserName(userId); - return $"Welcome, {userName}!"; - } - - public void CreateUser(string name) - { - _userService.SaveUser(name); - } - - public bool RemoveUser(int userId) - { - return _userService.DeleteUser(userId); - } - } - - internal class Program { - static void Main() { - var assemblyRunner = new TestRunner(); - assemblyRunner.RunTests(Assembly.GetExecutingAssembly()); - assemblyRunner.PrintResults(); - - var runner = new BenchmarkRunner(); - - runner.OnTestCompleted += (result) =>{ - if (result.Success){ - Console.WriteLine($"Completed: {result.TestName} - {result.AverageMs:F3}ms avg"); - } - else{ - Console.WriteLine($"Failed: {result.TestName} - {result.Exception?.Message}"); - } - }; - - runner.OnSuiteCompleted += (suiteResult) =>{ - Console.WriteLine($"\nSuite '{suiteResult.SuiteName}' completed in {suiteResult.TotalDuration.TotalMilliseconds:F2}ms"); - }; - - var stringResults = runner.Run(); - BenchmarkReporter.GenerateDetailedConsoleReport(stringResults); - - var mockUserService = MockFactory.CreateMock(); - mockUserService.Setup(x => x.GetUserName(1), "John Doe"); - mockUserService.Setup(x => x.GetUserCount(), 5); - mockUserService.Setup(x => x.DeleteUser(1), true); - - var consumer = new UserServiceConsumer(mockUserService.Object); - - var welcomeMessage = consumer.GetWelcomeMessage(1); - Console.WriteLine($"Welcome Message: {welcomeMessage}"); - - consumer.CreateUser("Jane Doe"); - - var deleteResult = consumer.RemoveUser(1); - Console.WriteLine($"Delete Result: {deleteResult}"); - - try - { - mockUserService.Verify(x => x.GetUserName(1), Times.Once()); - mockUserService.Verify(x => x.SaveUser("Jane Doe"), Times.Once()); - mockUserService.Verify(x => x.DeleteUser(1), Times.Once()); - Console.WriteLine("All verifications passed!"); - } - catch (MockException ex) - { - Console.WriteLine($"Verification failed: {ex.Message}"); - } - - try - { - mockUserService.Verify(x => x.GetUserCount(), Times.Once()); - } - catch (MockException ex) - { - Console.WriteLine($"Expected verification failure: {ex.Message}"); - } - } - } -} diff --git a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/Properties/AssemblyInfo.cs b/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/Properties/AssemblyInfo.cs deleted file mode 100644 index 0074137..0000000 --- a/NahidaProject4CSharp/FunctionalTest/NahidaProject4CSharp.UnitTest.FunctionalTest/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// 有关程序集的一般信息由以下 -// 控制。更改这些特性值可修改 -// 与程序集关联的信息。 -[assembly: AssemblyTitle("NahidaProject4CSharp.UnitTest.FunctionalTest")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("NahidaProject4CSharp.UnitTest.FunctionalTest")] -[assembly: AssemblyCopyright("Copyright © 2025")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 将 ComVisible 设置为 false 会使此程序集中的类型 -//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 -//请将此类型的 ComVisible 特性设置为 true。 -[assembly: ComVisible(false)] - -// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID -[assembly: Guid("2da61d72-1c90-4e5a-9fb3-69e1b5200f33")] - -// 程序集的版本信息由下列四个值组成: -// -// 主版本 -// 次版本 -// 生成号 -// 修订号 -// -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/NahidaProject4CSharp/NahidaPrjoect4CSharp.Database/NahidaPrjoect4CSharp.Database.csproj b/NahidaProject4CSharp/NahidaPrjoect4CSharp.Database/NahidaPrjoect4CSharp.Database.csproj deleted file mode 100644 index 0015ecf..0000000 --- a/NahidaProject4CSharp/NahidaPrjoect4CSharp.Database/NahidaPrjoect4CSharp.Database.csproj +++ /dev/null @@ -1,48 +0,0 @@ - - - - - Debug - AnyCPU - {7F4FC760-8EFB-463E-9013-997296DDC298} - Library - Properties - NahidaPrjoect4CSharp.Database - NahidaPrjoect4CSharp.Database - v4.8 - 512 - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/NahidaProject4CSharp/NahidaPrjoect4CSharp.Database/ODBC.cs b/NahidaProject4CSharp/NahidaPrjoect4CSharp.Database/ODBC.cs deleted file mode 100644 index 43b63b0..0000000 --- a/NahidaProject4CSharp/NahidaPrjoect4CSharp.Database/ODBC.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System; -using System.Data; -using System.Data.Odbc; - -namespace NahidaPrjoect4CSharp.Database -{ - public class ODBC : IDisposable - { - private readonly OdbcConnection _connection; - private OdbcTransaction _transaction; - private bool _isTransactionActive; - - public ODBC(string connectionString) - { - _connection = new OdbcConnection(connectionString); - } - - public void OpenConnection() - { - if (_connection.State == ConnectionState.Closed) - { - _connection.Open(); - } - } - - public void CloseConnection() - { - if (_connection.State == ConnectionState.Open) - { - _connection.Close(); - } - } - - public void BeginTransaction() - { - if (_connection.State == ConnectionState.Closed) - { - OpenConnection(); - } - - _transaction = _connection.BeginTransaction(); - _isTransactionActive = true; - } - - public void CommitTransaction() - { - if (_isTransactionActive) - { - _transaction.Commit(); - _isTransactionActive = false; - } - } - - public void RollbackTransaction() - { - if (_isTransactionActive) - { - _transaction.Rollback(); - _isTransactionActive = false; - } - } - - public DataTable ExecuteQuery(string query, params OdbcParameter[] parameters) - { - using (OdbcCommand command = new OdbcCommand(query, _connection, _transaction)) - { - if (parameters != null) - { - command.Parameters.AddRange(parameters); - } - - using (OdbcDataAdapter adapter = new OdbcDataAdapter(command)) - { - DataTable resultTable = new DataTable(); - adapter.Fill(resultTable); - return resultTable; - } - } - } - - public int ExecuteNonQuery(string commandText, params OdbcParameter[] parameters) - { - using (OdbcCommand command = new OdbcCommand(commandText, _connection, _transaction)) - { - if (parameters != null) - { - command.Parameters.AddRange(parameters); - } - - return command.ExecuteNonQuery(); - } - } - - public object ExecuteScalar(string commandText, params OdbcParameter[] parameters) - { - using (OdbcCommand command = new OdbcCommand(commandText, _connection, _transaction)) - { - if (parameters != null) - { - command.Parameters.AddRange(parameters); - } - - return command.ExecuteScalar(); - } - } - - public void Dispose() - { - if (_isTransactionActive) - { - RollbackTransaction(); - } - - if (_connection != null) - { - CloseConnection(); - _connection.Dispose(); - } - } - } -} diff --git a/NahidaProject4CSharp/NahidaPrjoect4CSharp.Database/Properties/AssemblyInfo.cs b/NahidaProject4CSharp/NahidaPrjoect4CSharp.Database/Properties/AssemblyInfo.cs deleted file mode 100644 index 5dfd759..0000000 --- a/NahidaProject4CSharp/NahidaPrjoect4CSharp.Database/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// 有关程序集的一般信息由以下 -// 控制。更改这些特性值可修改 -// 与程序集关联的信息。 -[assembly: AssemblyTitle("NahidaPrjoect4CSharp.Database")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("NahidaPrjoect4CSharp.Database")] -[assembly: AssemblyCopyright("Copyright © 2025")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 将 ComVisible 设置为 false 会使此程序集中的类型 -//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 -//请将此类型的 ComVisible 特性设置为 true。 -[assembly: ComVisible(false)] - -// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID -[assembly: Guid("7f4fc760-8efb-463e-9013-997296ddc298")] - -// 程序集的版本信息由下列四个值组成: -// -// 主版本 -// 次版本 -// 生成号 -// 修订号 -// -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/BloomFilter.cs b/NahidaProject4CSharp/NahidaProject4CSharp.Generic/BloomFilter.cs deleted file mode 100644 index c80dfe7..0000000 --- a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/BloomFilter.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Security.Cryptography; - -namespace NahidaProject4CSharp.Generic -{ - public class BloomFilter - { - private readonly int _size; - private readonly int _hashCount; - private readonly BitArray _bits; - private readonly HashAlgorithm _hashAlgorithm; - - public BloomFilter(int size, int hashCount) - { - _size = size; - _hashCount = hashCount; - _bits = new BitArray(size); - _hashAlgorithm = SHA256.Create(); - } - - public void Add(string item) - { - var hashes = GetHashes(item); - foreach (var hash in hashes) - { - _bits[hash % _size] = true; - } - } - - public bool Contains(string item) - { - var hashes = GetHashes(item); - foreach (var hash in hashes) - { - if (!_bits[hash % _size]) - { - return false; - } - } - return true; - } - - private IEnumerable GetHashes(string item) - { - var bytes = _hashAlgorithm.ComputeHash(System.Text.Encoding.UTF8.GetBytes(item)); - for (int i = 0; i < _hashCount; i++) - { - yield return BitConverter.ToInt32(bytes, (i * 4) % bytes.Length); - } - } - } -} diff --git a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/HTTPRequest.cs b/NahidaProject4CSharp/NahidaProject4CSharp.Generic/HTTPRequest.cs deleted file mode 100644 index 9dca754..0000000 --- a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/HTTPRequest.cs +++ /dev/null @@ -1,540 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Net; -using System.Net.Http; -using System.Text; -using System.Threading.Tasks; -using System.Web; - -namespace NahidaProject4CSharp.Generic -{ - ///

- /// HTTP 请求方法枚举 - /// - public enum HttpMethodType - { - GET, - POST, - PUT, - DELETE, - PATCH, - HEAD, - OPTIONS - } - - /// - /// HTTP 响应结果类 - /// - public class HTTPResponse - { - public int StatusCode { get; set; } - public string Content { get; set; } - public Dictionary Headers { get; set; } - public bool IsSuccess { get; set; } - public string ErrorMessage { get; set; } - - public HTTPResponse() - { - Headers = new Dictionary(); - } - } - - /// - /// 功能完善的 HTTP 请求类 - /// - public class HTTPRequestClient : IDisposable - { - private HttpClient _httpClient; - private HttpClientHandler _httpClientHandler; - private bool _disposed = false; - - /// - /// 构造函数 - /// - public HTTPRequestClient() - { - _httpClientHandler = new HttpClientHandler(); - _httpClient = new HttpClient(_httpClientHandler); - SetDefaultHeaders(); - } - - /// - /// 构造函数(带基础URL) - /// - /// 基础URL - public HTTPRequestClient(string baseUrl) : this() - { - if (!string.IsNullOrEmpty(baseUrl)) - { - _httpClient.BaseAddress = new Uri(baseUrl); - } - } - - /// - /// 设置默认请求头 - /// - private void SetDefaultHeaders() - { - _httpClient.DefaultRequestHeaders.Add("User-Agent", "HttpRequestClient/1.0"); - } - - #region 配置方法 - - /// - /// 设置超时时间 - /// - /// 超时时间(毫秒) - public void SetTimeout(int timeout) - { - _httpClient.Timeout = TimeSpan.FromMilliseconds(timeout); - } - - /// - /// 设置超时时间 - /// - /// 超时时间 - public void SetTimeout(TimeSpan timeout) - { - _httpClient.Timeout = timeout; - } - - /// - /// 设置是否使用默认凭据 - /// - /// 是否使用默认凭据 - public void SetUseDefaultCredentials(bool useDefaultCredentials) - { - _httpClientHandler.UseDefaultCredentials = useDefaultCredentials; - } - - /// - /// 设置是否允许自动重定向 - /// - /// 是否允许自动重定向 - public void SetAllowAutoRedirect(bool allowAutoRedirect) - { - _httpClientHandler.AllowAutoRedirect = allowAutoRedirect; - } - - /// - /// 设置最大自动重定向次数 - /// - /// 最大重定向次数 - public void SetMaxAutomaticRedirections(int maxRedirects) - { - _httpClientHandler.MaxAutomaticRedirections = maxRedirects; - } - - /// - /// 设置代理 - /// - /// 代理服务器 - public void SetProxy(IWebProxy proxy) - { - _httpClientHandler.Proxy = proxy; - } - - /// - /// 设置Cookie容器 - /// - /// Cookie容器 - public void SetCookieContainer(CookieContainer cookieContainer) - { - _httpClientHandler.CookieContainer = cookieContainer; - } - - /// - /// 添加默认请求头 - /// - /// 头名称 - /// 头值 - public void AddDefaultHeader(string name, string value) - { - _httpClient.DefaultRequestHeaders.Add(name, value); - } - - /// - /// 清除默认请求头 - /// - /// 头名称 - public void RemoveDefaultHeader(string name) - { - _httpClient.DefaultRequestHeaders.Remove(name); - } - - /// - /// 清除所有默认请求头 - /// - public void ClearDefaultHeaders() - { - _httpClient.DefaultRequestHeaders.Clear(); - } - - #endregion - - #region GET 请求 - - /// - /// 发送 GET 请求 - /// - /// 请求URL - /// HTTP响应 - public async Task GetAsync(string url) - { - return await SendAsync(HttpMethodType.GET, url, null, null); - } - - /// - /// 发送 GET 请求(带查询参数) - /// - /// 请求URL - /// 查询参数 - /// HTTP响应 - public async Task GetAsync(string url, Dictionary parameters) - { - string fullUrl = BuildUrlWithParameters(url, parameters); - return await SendAsync(HttpMethodType.GET, fullUrl, null, null); - } - - /// - /// 发送 GET 请求(带请求头) - /// - /// 请求URL - /// 请求头 - /// HTTP响应 - public async Task GetAsyncWithRequestHeader(string url, Dictionary headers) - { - return await SendAsync(HttpMethodType.GET, url, null, headers); - } - - /// - /// 发送 GET 请求(带查询参数和请求头) - /// - /// 请求URL - /// 查询参数 - /// 请求头 - /// HTTP响应 - public async Task GetAsync(string url, Dictionary parameters, Dictionary headers) - { - string fullUrl = BuildUrlWithParameters(url, parameters); - return await SendAsync(HttpMethodType.GET, fullUrl, null, headers); - } - - #endregion - - #region POST 请求 - - /// - /// 发送 POST 请求(JSON数据) - /// - /// 请求URL - /// JSON数据 - /// HTTP响应 - public async Task PostJsonAsync(string url, string jsonData) - { - return await SendAsync(HttpMethodType.POST, url, jsonData, null, "application/json"); - } - - /// - /// 发送 POST 请求(JSON数据和请求头) - /// - /// 请求URL - /// JSON数据 - /// 请求头 - /// HTTP响应 - public async Task PostJsonAsync(string url, string jsonData, Dictionary headers) - { - return await SendAsync(HttpMethodType.POST, url, jsonData, headers, "application/json"); - } - - /// - /// 发送 POST 请求(表单数据) - /// - /// 请求URL - /// 表单数据 - /// HTTP响应 - public async Task PostFormAsync(string url, Dictionary formData) - { - return await SendAsync(HttpMethodType.POST, url, formData, null); - } - - /// - /// 发送 POST 请求(表单数据和请求头) - /// - /// 请求URL - /// 表单数据 - /// 请求头 - /// HTTP响应 - public async Task PostFormAsync(string url, Dictionary formData, Dictionary headers) - { - return await SendAsync(HttpMethodType.POST, url, formData, headers); - } - - /// - /// 发送 POST 请求(原始数据) - /// - /// 请求URL - /// 原始数据 - /// 内容类型 - /// HTTP响应 - public async Task PostAsync(string url, string data, string contentType = "text/plain") - { - return await SendAsync(HttpMethodType.POST, url, data, null, contentType); - } - - /// - /// 发送 POST 请求(原始数据和请求头) - /// - /// 请求URL - /// 原始数据 - /// 请求头 - /// 内容类型 - /// HTTP响应 - public async Task PostAsync(string url, string data, Dictionary headers, string contentType = "text/plain") - { - return await SendAsync(HttpMethodType.POST, url, data, headers, contentType); - } - - #endregion - - #region PUT 请求 - - /// - /// 发送 PUT 请求(JSON数据) - /// - /// 请求URL - /// JSON数据 - /// HTTP响应 - public async Task PutJsonAsync(string url, string jsonData) - { - return await SendAsync(HttpMethodType.PUT, url, jsonData, null, "application/json"); - } - - /// - /// 发送 PUT 请求(表单数据) - /// - /// 请求URL - /// 表单数据 - /// HTTP响应 - public async Task PutFormAsync(string url, Dictionary formData) - { - return await SendAsync(HttpMethodType.PUT, url, formData, null); - } - - /// - /// 发送 PUT 请求(原始数据) - /// - /// 请求URL - /// 原始数据 - /// 内容类型 - /// HTTP响应 - public async Task PutAsync(string url, string data, string contentType = "text/plain") - { - return await SendAsync(HttpMethodType.PUT, url, data, null, contentType); - } - - #endregion - - #region DELETE 请求 - - /// - /// 发送 DELETE 请求 - /// - /// 请求URL - /// HTTP响应 - public async Task DeleteAsync(string url) - { - return await SendAsync(HttpMethodType.DELETE, url, null, null); - } - - /// - /// 发送 DELETE 请求(带请求头) - /// - /// 请求URL - /// 请求头 - /// HTTP响应 - public async Task DeleteAsync(string url, Dictionary headers) - { - return await SendAsync(HttpMethodType.DELETE, url, null, headers); - } - - #endregion - - #region PATCH 请求 - - /// - /// 发送 PATCH 请求(JSON数据) - /// - /// 请求URL - /// JSON数据 - /// HTTP响应 - public async Task PatchJsonAsync(string url, string jsonData) - { - return await SendAsync(HttpMethodType.PATCH, url, jsonData, null, "application/json"); - } - - /// - /// 发送 PATCH 请求(原始数据) - /// - /// 请求URL - /// 原始数据 - /// 内容类型 - /// HTTP响应 - public async Task PatchAsync(string url, string data, string contentType = "text/plain") - { - return await SendAsync(HttpMethodType.PATCH, url, data, null, contentType); - } - - #endregion - - #region 通用请求方法 - - /// - /// 发送 HTTP 请求 - /// - /// HTTP方法 - /// 请求URL - /// 请求数据 - /// 请求头 - /// 内容类型 - /// HTTP响应 - public async Task SendAsync(HttpMethodType method, string url, object data, Dictionary headers, string contentType = null) - { - if (_disposed) - throw new ObjectDisposedException(nameof(HTTPRequestClient)); - - try - { - using (var request = CreateHttpRequest(method, url, data, headers, contentType)) - { - using (var response = await _httpClient.SendAsync(request)) - { - return await ProcessResponseAsync(response); - } - } - } - catch (Exception ex) - { - return new HTTPResponse - { - IsSuccess = false, - ErrorMessage = ex.Message - }; - } - } - - /// - /// 创建 HTTP 请求消息 - /// - private HttpRequestMessage CreateHttpRequest(HttpMethodType method, string url, object data, Dictionary headers, string contentType) - { - var request = new HttpRequestMessage(new HttpMethod(method.ToString()), url); - - // 添加请求头 - if (headers != null) - { - foreach (var header in headers) - { - request.Headers.Add(header.Key, header.Value); - } - } - - // 添加请求内容 - if (data != null) - { - if (data is string stringData) - { - request.Content = new StringContent(stringData, Encoding.UTF8, contentType ?? "text/plain"); - } - else if (data is Dictionary formData) - { - request.Content = new FormUrlEncodedContent(formData); - } - } - - return request; - } - - /// - /// 处理 HTTP 响应 - /// - private async Task ProcessResponseAsync(HttpResponseMessage response) - { - var result = new HTTPResponse - { - StatusCode = (int)response.StatusCode, - IsSuccess = response.IsSuccessStatusCode, - Headers = new Dictionary() - }; - - // 读取响应头 - foreach (var header in response.Headers) - { - result.Headers[header.Key] = string.Join(",", header.Value); - } - - // 读取响应内容 - if (response.Content != null) - { - result.Content = await response.Content.ReadAsStringAsync(); - } - - return result; - } - - #endregion - - #region 辅助方法 - - /// - /// 构建带查询参数的URL - /// - private string BuildUrlWithParameters(string url, Dictionary parameters) - { - if (parameters == null || parameters.Count == 0) - return url; - - var uriBuilder = new UriBuilder(url); - var query = System.Web.HttpUtility.ParseQueryString(uriBuilder.Query); - - foreach (var param in parameters) - { - query[param.Key] = param.Value; - } - - uriBuilder.Query = query.ToString(); - return uriBuilder.ToString(); - } - - #endregion - - #region IDisposable 实现 - - /// - /// 释放资源 - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// 释放资源 - /// - protected virtual void Dispose(bool disposing) - { - if (!_disposed) - { - if (disposing) - { - _httpClient?.Dispose(); - _httpClientHandler?.Dispose(); - } - _disposed = true; - } - } - - #endregion - } -} diff --git a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/Logger.cs b/NahidaProject4CSharp/NahidaProject4CSharp.Generic/Logger.cs deleted file mode 100644 index 07f4652..0000000 --- a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/Logger.cs +++ /dev/null @@ -1,427 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.IO; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -namespace NahidaProject4CSharp.Generic -{ - /// - /// 日志级别枚举 - /// - public enum LogLevel { Debug = 0, Info = 1, Warn = 2, Error = 3, Fatal = 4 } - - /// - /// 功能全面的日志类 - /// - public class Logger : IDisposable - { - #region 字段和属性 - - private static readonly Lazy _instance = new(() => new Logger()); - public static Logger Instance => _instance.Value; - - private readonly string _logDirectory; - private readonly string _logFileName; - private readonly LogLevel _minLogLevel; - private readonly bool _enableConsoleOutput; - private readonly long _maxFileSize; - private readonly int _maxBackupFiles; - private readonly bool _enableAsync; - - private readonly ConcurrentQueue _logQueue; - private readonly CancellationTokenSource _cancellationTokenSource; - private readonly Task _logTask; - private readonly object _fileLock = new(); - private readonly object _consoleLock = new(); - - private StreamWriter _currentWriter; - private string _currentFilePath; - private long _currentFileSize; - - #endregion - - #region 构造函数和初始化 - - /// - /// 私有构造函数(单例模式) - /// - private Logger() - { - // 默认配置 - _logDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs"); - _logFileName = "Logger.log"; - _minLogLevel = LogLevel.Info; - _enableConsoleOutput = true; - _maxFileSize = 10 * 1024 * 1024; // 10MB - _maxBackupFiles = 5; - _enableAsync = true; - - Initialize(); - } - - /// - /// 带参数的构造函数 - /// - public Logger( - string logDirectory = null, - string logFileName = "Logger.log", - LogLevel minLogLevel = LogLevel.Info, - bool enableConsoleOutput = true, - long maxFileSize = 10485760, // 10MB - int maxBackupFiles = 5, - bool enableAsync = true) - { - _logDirectory = logDirectory ?? Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs"); - _logFileName = logFileName; - _minLogLevel = minLogLevel; - _enableConsoleOutput = enableConsoleOutput; - _maxFileSize = maxFileSize; - _maxBackupFiles = maxBackupFiles; - _enableAsync = enableAsync; - - if (_enableAsync) - { - _logQueue = new ConcurrentQueue(); - _cancellationTokenSource = new CancellationTokenSource(); - _logTask = Task.Run(ProcessLogQueue, _cancellationTokenSource.Token); - } - - Initialize(); - } - - /// - /// 初始化日志系统 - /// - private void Initialize() - { - // 确保日志目录存在 - if (!Directory.Exists(_logDirectory)) - { - Directory.CreateDirectory(_logDirectory); - } - - // 初始化当前日志文件 - CreateNewLogFile(); - } - - #endregion - - #region 公共日志方法 - - /// - /// 记录调试日志 - /// - public void Debug(string message, Exception exception = null) - { - Log(LogLevel.Debug, message, exception); - } - - /// - /// 记录信息日志 - /// - public void Information(string message, Exception exception = null) - { - Log(LogLevel.Info, message, exception); - } - - /// - /// 记录警告日志 - /// - public void Warning(string message, Exception exception = null) - { - Log(LogLevel.Warn, message, exception); - } - - /// - /// 记录错误日志 - /// - public void Error(string message, Exception exception = null) - { - Log(LogLevel.Error, message, exception); - } - - /// - /// 记录致命错误日志 - /// - public void Fatal(string message, Exception exception = null) - { - Log(LogLevel.Fatal, message, exception); - } - - /// - /// 通用日志记录方法 - /// - public void Log(LogLevel level, string message, Exception exception = null) - { - // 检查日志级别 - if (level < _minLogLevel) - return; - - var logEntry = new LogEntry - { - Timestamp = DateTime.Now, - Level = level, - Message = message, - Exception = exception - }; - - if (_enableAsync) - { - _logQueue.Enqueue(logEntry); - } - else - { - WriteLogEntry(logEntry); - } - } - - #endregion - - #region 私有方法 - - /// - /// 异步处理日志队列 - /// - private async Task ProcessLogQueue() - { - while (!_cancellationTokenSource.Token.IsCancellationRequested) - { - if (_logQueue.TryDequeue(out var logEntry)) - { - WriteLogEntry(logEntry); - } - else - { - await Task.Delay(10, _cancellationTokenSource.Token); - } - } - - // 处理剩余的日志条目 - while (_logQueue.TryDequeue(out var logEntry)) - { - WriteLogEntry(logEntry); - } - } - - /// - /// 写入日志条目 - /// - private void WriteLogEntry(LogEntry logEntry) - { - try - { - var logMessage = FormatLogMessage(logEntry); - - // 写入文件 - WriteToFile(logMessage); - - // 写入控制台 - if (_enableConsoleOutput) - { - WriteToConsole(logEntry.Level, logMessage); - } - } - catch (Exception ex) - { - // 如果日志系统本身出错,避免递归调用 - Console.WriteLine($"Logger error: {ex.Message}"); - } - } - - /// - /// 格式化日志消息 - /// - private string FormatLogMessage(LogEntry logEntry) - { - var sb = new StringBuilder(); - sb.Append($"[{logEntry.Timestamp:yyyy-MM-dd HH:mm:ss.fff}]"); - sb.Append($" [{logEntry.Level.ToString().ToUpper()}]"); - sb.Append($" {logEntry.Message}"); - - if (logEntry.Exception != null) - { - sb.AppendLine(); - sb.Append($"Exception: {logEntry.Exception}"); - } - - return sb.ToString(); - } - - /// - /// 写入文件 - /// - private void WriteToFile(string message) - { - lock (_fileLock) - { - try - { - // 检查是否需要轮转日志文件 - if (_currentFileSize >= _maxFileSize) - { - RotateLogFile(); - } - - // 写入日志 - var messageBytes = Encoding.UTF8.GetBytes(message + Environment.NewLine); - _currentWriter.Write(message); - _currentWriter.WriteLine(); - _currentWriter.Flush(); - - _currentFileSize += messageBytes.Length; - } - catch (Exception ex) - { - Console.WriteLine($"Failed to write to log file: {ex.Message}"); - } - } - } - - /// - /// 写入控制台 - /// - private void WriteToConsole(LogLevel level, string message) - { - lock (_consoleLock) - { - var originalColor = Console.ForegroundColor; - - try - { - Console.ForegroundColor = level switch - { - LogLevel.Debug => ConsoleColor.Gray, - LogLevel.Info => ConsoleColor.White, - LogLevel.Warn => ConsoleColor.Yellow, - LogLevel.Error => ConsoleColor.Red, - LogLevel.Fatal => ConsoleColor.Magenta, - _ => ConsoleColor.White - }; - - Console.WriteLine(message); - } - finally - { - Console.ForegroundColor = originalColor; - } - } - } - - /// - /// 创建新的日志文件 - /// - private void CreateNewLogFile() - { - lock (_fileLock) - { - try - { - _currentWriter?.Close(); - _currentFilePath = Path.Combine(_logDirectory, _logFileName); - _currentWriter = new StreamWriter(_currentFilePath, true, Encoding.UTF8); - _currentFileSize = new FileInfo(_currentFilePath).Length; - } - catch (Exception ex) - { - Console.WriteLine($"Failed to create log file: {ex.Message}"); - } - } - } - - /// - /// 轮转日志文件 - /// - private void RotateLogFile() - { - lock (_fileLock) - { - try - { - _currentWriter?.Close(); - - // 删除最旧的备份文件 - var oldestBackup = Path.Combine(_logDirectory, $"{_logFileName}.{_maxBackupFiles}"); - if (File.Exists(oldestBackup)) - { - File.Delete(oldestBackup); - } - - // 重命名备份文件 - for (int i = _maxBackupFiles - 1; i >= 1; i--) - { - var oldFile = Path.Combine(_logDirectory, $"{_logFileName}.{i}"); - var newFile = Path.Combine(_logDirectory, $"{_logFileName}.{i + 1}"); - - if (File.Exists(oldFile)) - { - if (File.Exists(newFile)) - File.Delete(newFile); - File.Move(oldFile, newFile); - } - } - - // 重命名当前日志文件 - var backupFile = Path.Combine(_logDirectory, $"{_logFileName}.1"); - if (File.Exists(backupFile)) - File.Delete(backupFile); - File.Move(_currentFilePath, backupFile); - - // 创建新的日志文件 - CreateNewLogFile(); - } - catch (Exception ex) - { - Console.WriteLine($"Failed to rotate log file: {ex.Message}"); - } - } - } - - #endregion - - #region IDisposable 实现 - - /// - /// 释放资源 - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// 释放资源 - /// - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - _cancellationTokenSource?.Cancel(); - _logTask?.Wait(1000); // 等待最多1秒 - - lock (_fileLock) - { - _currentWriter?.Close(); - _currentWriter?.Dispose(); - } - - _cancellationTokenSource?.Dispose(); - } - } - - #endregion - } - - /// - /// 日志条目类 - /// - internal class LogEntry - { - public DateTime Timestamp { get; set; } - public LogLevel Level { get; set; } - public string Message { get; set; } - public Exception Exception { get; set; } - } -} diff --git a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/NahidaProject.cs b/NahidaProject4CSharp/NahidaProject4CSharp.Generic/NahidaProject.cs deleted file mode 100644 index a427861..0000000 --- a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/NahidaProject.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace NahidaProject4CSharp.Generic -{ - public class NahidaProject - { - string Version() - { - return "1.0-SNAPSHOT"; - } - - void DeveloperThanks() - { - - } - - string EasterEgg() - { - return ""; - } - - void HelloWorld() - { - System.Console.WriteLine("Hello World!"); - } - } -} diff --git a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/NahidaProject4CSharp.Generic.csproj b/NahidaProject4CSharp/NahidaProject4CSharp.Generic/NahidaProject4CSharp.Generic.csproj deleted file mode 100644 index 2fadba3..0000000 --- a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/NahidaProject4CSharp.Generic.csproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - - latest - Debug - AnyCPU - {41576B57-FEA7-407E-9417-7B6B6B8078B1} - Library - Properties - NahidaProject4CSharp.Generic - NahidaProject4CSharp.Generic - v4.8 - 512 - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - ..\packages\System.Web.Http.Common.4.0.20126.16343\lib\net40\System.Web.Http.Common.dll - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/Properties/AssemblyInfo.cs b/NahidaProject4CSharp/NahidaProject4CSharp.Generic/Properties/AssemblyInfo.cs deleted file mode 100644 index 1f8b1a8..0000000 --- a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// 有关程序集的一般信息由以下 -// 控制。更改这些特性值可修改 -// 与程序集关联的信息。 -[assembly: AssemblyTitle("NahidaProject4CSharp.Generic")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("NahidaProject4CSharp.Generic")] -[assembly: AssemblyCopyright("Copyright © 2025")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 将 ComVisible 设置为 false 会使此程序集中的类型 -//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 -//请将此类型的 ComVisible 特性设置为 true。 -[assembly: ComVisible(false)] - -// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID -[assembly: Guid("41576b57-fea7-407e-9417-7b6b6b8078b1")] - -// 程序集的版本信息由下列四个值组成: -// -// 主版本 -// 次版本 -// 生成号 -// 修订号 -// -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/SortModule.cs b/NahidaProject4CSharp/NahidaProject4CSharp.Generic/SortModule.cs deleted file mode 100644 index 6fe21d9..0000000 --- a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/SortModule.cs +++ /dev/null @@ -1,232 +0,0 @@ -using System.Linq; - -namespace NahidaProject4CSharp.Generic -{ - public class SortModule - { - public static void BubbleSort(int[] arr) - { - int n = arr.Length; - for (int i = 0; i < n - 1; i++) - { - bool swapped = false; - for (int j = 0; j < n - 1 - i; j++) - { - if (arr[j] > arr[j + 1]) - { - Swap(arr, j, j + 1); - swapped = true; - } - } - // 如果没有发生交换,说明已经有序 - if (!swapped) break; - } - } - - public static void SelectionSort(int[] arr) - { - int n = arr.Length; - for (int i = 0; i < n - 1; i++) - { - int minIndex = i; - // 找到最小元素的索引 - for (int j = i + 1; j < n; j++) - { - if (arr[j] < arr[minIndex]) - minIndex = j; - } - // 交换最小元素到当前位置 - if (minIndex != i) - Swap(arr, i, minIndex); - } - } - - public static void InsertionSort(int[] arr) - { - int n = arr.Length; - for (int i = 1; i < n; i++) - { - int key = arr[i]; - int j = i - 1; - // 将大于key的元素向后移动 - while (j >= 0 && arr[j] > key) - { - arr[j + 1] = arr[j]; - j--; - } - arr[j + 1] = key; - } - } - public static void QuickSort(int[] arr, int low, int high) - { - if (low < high) - { - int pivotIndex = Partition(arr, low, high); - QuickSort(arr, low, pivotIndex - 1); - QuickSort(arr, pivotIndex + 1, high); - } - } - - private static int Partition(int[] arr, int low, int high) - { - int pivot = arr[high]; // 选择最后一个元素作为基准 - int i = low - 1; - - for (int j = low; j < high; j++) - { - if (arr[j] <= pivot) - { - i++; - Swap(arr, i, j); - } - } - Swap(arr, i + 1, high); - return i + 1; - } - public static void MergeSort(int[] arr, int left, int right) - { - if (left < right) - { - int mid = left + (right - left) / 2; - MergeSort(arr, left, mid); - MergeSort(arr, mid + 1, right); - Merge(arr, left, mid, right); - } - } - - private static void Merge(int[] arr, int left, int mid, int right) - { - int n1 = mid - left + 1; - int n2 = right - mid; - - // 创建临时数组 - int[] leftArr = new int[n1]; - int[] rightArr = new int[n2]; - - // 复制数据到临时数组 - for (int i = 0; i < n1; i++) - leftArr[i] = arr[left + i]; - for (int i = 0; i < n2; i++) - rightArr[i] = arr[mid + 1 + i]; - - // 合并临时数组 - int i1 = 0, i2 = 0, k = left; - while (i1 < n1 && i2 < n2) - { - if (leftArr[i1] <= rightArr[i2]) - { - arr[k] = leftArr[i1]; - i1++; - } - else - { - arr[k] = rightArr[i2]; - i2++; - } - k++; - } - - // 复制剩余元素 - while (i1 < n1) - { - arr[k] = leftArr[i1]; - i1++; - k++; - } - while (i2 < n2) - { - arr[k] = rightArr[i2]; - i2++; - k++; - } - } - public static void HeapSort(int[] arr) - { - int n = arr.Length; - - // 构建最大堆 - for (int i = n / 2 - 1; i >= 0; i--) - Heapify(arr, n, i); - - // 逐个提取元素 - for (int i = n - 1; i > 0; i--) - { - Swap(arr, 0, i); // 将当前最大元素移到末尾 - Heapify(arr, i, 0); // 重新调整堆 - } - } - - private static void Heapify(int[] arr, int n, int i) - { - int largest = i; - int left = 2 * i + 1; - int right = 2 * i + 2; - - if (left < n && arr[left] > arr[largest]) - largest = left; - - if (right < n && arr[right] > arr[largest]) - largest = right; - - if (largest != i) - { - Swap(arr, i, largest); - Heapify(arr, n, largest); - } - } - public static void ShellSort(int[] arr) - { - int n = arr.Length; - for (int gap = n / 2; gap > 0; gap /= 2) - { - for (int i = gap; i < n; i++) - { - int temp = arr[i]; - int j; - for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) - { - arr[j] = arr[j - gap]; - } - arr[j] = temp; - } - } - } - public static void CountingSort(int[] arr) - { - if (arr.Length == 0) return; - - int max = arr.Max(); - int min = arr.Min(); - int range = max - min + 1; - - int[] count = new int[range]; - int[] output = new int[arr.Length]; - - // 计算每个元素出现的次数 - for (int i = 0; i < arr.Length; i++) - count[arr[i] - min]++; - - // 计算累积计数 - for (int i = 1; i < count.Length; i++) - count[i] += count[i - 1]; - - // 构建输出数组 - for (int i = arr.Length - 1; i >= 0; i--) - { - output[count[arr[i] - min] - 1] = arr[i]; - count[arr[i] - min]--; - } - - // 复制回原数组 - for (int i = 0; i < arr.Length; i++) - arr[i] = output[i]; - } - - private static void Swap(int[] arr, int i, int j) - { - int temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; - } - } -} diff --git a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/app.config b/NahidaProject4CSharp/NahidaProject4CSharp.Generic/app.config deleted file mode 100644 index 1696df6..0000000 --- a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/packages.config b/NahidaProject4CSharp/NahidaProject4CSharp.Generic/packages.config deleted file mode 100644 index 2f3e199..0000000 --- a/NahidaProject4CSharp/NahidaProject4CSharp.Generic/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaBenchmarkTest.cs b/NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaBenchmarkTest.cs deleted file mode 100644 index 23ab6c2..0000000 --- a/NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaBenchmarkTest.cs +++ /dev/null @@ -1,370 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reflection; -using System.Text; - -namespace NahidaProject4CSharp.UnitTest.NahidaBenchmarkTest -{ - - [AttributeUsage(AttributeTargets.Method)] - public class BenchmarkAttribute : Attribute - { - public int Iterations { get; set; } = 1; - public int Warmup { get; set; } = 0; - public string Description { get; set; } = ""; - } - - [AttributeUsage(AttributeTargets.Class)] - public class BenchmarkClassAttribute : Attribute - { - public string Name { get; set; } = ""; - public string Description { get; set; } = ""; - } - - [AttributeUsage(AttributeTargets.Parameter)] - public class BenchmarkParamAttribute : Attribute - { - public object[] Values { get; set; } - - public BenchmarkParamAttribute(params object[] values) - { - Values = values; - } - } - public class BenchmarkResult - { - public string TestName { get; set; } - public string Description { get; set; } - public TimeSpan Duration { get; set; } - public long Ticks { get; set; } - public double Milliseconds { get; set; } - public Dictionary Parameters { get; set; } = new Dictionary(); - public Exception Exception { get; set; } - public bool Success { get; set; } - public long MemoryBefore { get; set; } - public long MemoryAfter { get; set; } - public long MemoryUsed { get; set; } - public int Iterations { get; set; } - public double AverageMs { get; set; } - - public override string ToString() - { - if (!Success) - { - return $"{TestName}: FAILED - {Exception?.Message}"; - } - - return $"{TestName}: {AverageMs:F3}ms avg ({Iterations} iterations)"; - } - } - public class BenchmarkSuiteResult - { - public string SuiteName { get; set; } - public string Description { get; set; } - public List Results { get; set; } = new List(); - public DateTime StartTime { get; set; } - public DateTime EndTime { get; set; } - public TimeSpan TotalDuration => EndTime - StartTime; - - public void AddResult(BenchmarkResult result) - { - Results.Add(result); - } - - public IEnumerable SuccessfulResults => Results.Where(r => r.Success); - public IEnumerable FailedResults => Results.Where(r => !r.Success); - } - - public class BenchmarkRunner - { - private readonly List _suiteResults = new List(); - - public event Action OnTestCompleted; - public event Action OnSuiteCompleted; - - public BenchmarkSuiteResult Run() where T : new() - { - return Run(typeof(T)); - } - - public BenchmarkSuiteResult Run(Type benchmarkType) - { - var suiteResult = new BenchmarkSuiteResult - { - StartTime = DateTime.Now - }; - - var classAttr = benchmarkType.GetCustomAttribute(); - suiteResult.SuiteName = !string.IsNullOrEmpty(classAttr?.Name) ? classAttr.Name : benchmarkType.Name; - suiteResult.Description = classAttr?.Description ?? ""; - - Console.WriteLine($"Starting benchmark suite: {suiteResult.SuiteName}"); - if (!string.IsNullOrEmpty(suiteResult.Description)) - { - Console.WriteLine($"Description: {suiteResult.Description}"); - } - Console.WriteLine(new string('=', 60)); - - var instance = Activator.CreateInstance(benchmarkType); - - var methods = benchmarkType.GetMethods(BindingFlags.Public | BindingFlags.Instance).Where(m => m.GetCustomAttribute() != null); - - foreach (var method in methods) - { - var attr = method.GetCustomAttribute(); - var testName = method.Name; - var description = attr.Description; - - var parameters = method.GetParameters(); - if (parameters.Length == 0) - { - var result = RunTestMethod(instance, method, attr, testName, description); - suiteResult.AddResult(result); - OnTestCompleted?.Invoke(result); - } - else - { - RunParameterizedTest(instance, method, attr, suiteResult); - } - } - - suiteResult.EndTime = DateTime.Now; - _suiteResults.Add(suiteResult); - OnSuiteCompleted?.Invoke(suiteResult); - - return suiteResult; - } - - private void RunParameterizedTest(object instance, MethodInfo method, BenchmarkAttribute attr, BenchmarkSuiteResult suiteResult) - { - var parameters = method.GetParameters(); - var parameterValues = new List(); - - GenerateParameterCombinations(parameters, 0, new object[parameters.Length], parameterValues); - - foreach (var paramValues in parameterValues) - { - var testName = $"{method.Name}({string.Join(", ", paramValues.Select(v => v?.ToString() ?? "null"))})"; - var result = RunTestMethod(instance, method, attr, testName, attr.Description, paramValues); - suiteResult.AddResult(result); - OnTestCompleted?.Invoke(result); - } - } - - private void GenerateParameterCombinations(ParameterInfo[] parameters, int index, object[] currentValues, List combinations) - { - if (index >= parameters.Length) - { - combinations.Add((object[])currentValues.Clone()); - return; - } - - var param = parameters[index]; - var paramAttr = param.GetCustomAttribute(); - - if (paramAttr != null && paramAttr.Values.Length > 0) - { - foreach (var value in paramAttr.Values) - { - var convertedValue = ConvertValue(value, param.ParameterType); - currentValues[index] = convertedValue; - GenerateParameterCombinations(parameters, index + 1, currentValues, combinations); - } - } - else - { - currentValues[index] = GetDefaultValue(param.ParameterType); - GenerateParameterCombinations(parameters, index + 1, currentValues, combinations); - } - } - - private object ConvertValue(object value, Type targetType) - { - if (value == null) return null; - if (targetType.IsAssignableFrom(value.GetType())) return value; - - try - { - return Convert.ChangeType(value, targetType); - } - catch - { - return value; - } - } - - private object GetDefaultValue(Type type) - { - if (type.IsValueType) - { - return Activator.CreateInstance(type); - } - return null; - } - - private BenchmarkResult RunTestMethod(object instance, MethodInfo method, BenchmarkAttribute attr, string testName, string description, object[] parameters = null) - { - var result = new BenchmarkResult - { - TestName = testName, - Description = description, - Iterations = attr.Iterations - }; - - try - { - for (int i = 0; i < attr.Warmup; i++) - { - method.Invoke(instance, parameters); - } - - GC.Collect(); - GC.WaitForPendingFinalizers(); - GC.Collect(); - - var memoryBefore = GC.GetTotalMemory(false); - var stopwatch = Stopwatch.StartNew(); - - for (int i = 0; i < attr.Iterations; i++) - { - method.Invoke(instance, parameters); - } - - stopwatch.Stop(); - - var memoryAfter = GC.GetTotalMemory(false); - - result.Duration = stopwatch.Elapsed; - result.Ticks = stopwatch.ElapsedTicks; - result.Milliseconds = stopwatch.Elapsed.TotalMilliseconds; - result.MemoryBefore = memoryBefore; - result.MemoryAfter = memoryAfter; - result.MemoryUsed = Math.Max(0, memoryAfter - memoryBefore); - result.AverageMs = result.Milliseconds / attr.Iterations; - result.Success = true; - - if (parameters != null) - { - var methodParams = method.GetParameters(); - for (int i = 0; i < parameters.Length; i++) - { - result.Parameters[methodParams[i].Name] = parameters[i]; - } - } - } - catch (Exception ex) - { - result.Exception = ex.InnerException ?? ex; - result.Success = false; - } - - return result; - } - - public List RunAllTest() - { - var results = new List(); - - // 查找所有基准测试类 - var assemblies = AppDomain.CurrentDomain.GetAssemblies(); - foreach (var assembly in assemblies) - { - try - { - var benchmarkTypes = assembly.GetTypes().Where(t => t.GetCustomAttribute() != null); - - foreach (var type in benchmarkTypes) - { - var result = Run(type); - results.Add(result); - } - } - catch (ReflectionTypeLoadException reflectionTypeLoadException) - { - Console.WriteLine(reflectionTypeLoadException.Message); - } - } - - return results; - } - } - - public class BenchmarkReporter - { - public static void GenerateConsoleReport(BenchmarkSuiteResult suiteResult) - { - Console.WriteLine($"\nBenchmark Suite: {suiteResult.SuiteName}"); - if (!string.IsNullOrEmpty(suiteResult.Description)) - { - Console.WriteLine($"Description: {suiteResult.Description}"); - } - Console.WriteLine($"Total Duration: {suiteResult.TotalDuration.TotalMilliseconds:F2}ms"); - Console.WriteLine(new string('-', 60)); - - foreach (var result in suiteResult.SuccessfulResults.OrderBy(r => r.AverageMs)) - { - Console.WriteLine($"[SUCCESS] {result}"); - if (!string.IsNullOrEmpty(result.Description)) - { - Console.WriteLine($" Description: {result.Description}"); - } - Console.WriteLine($" Memory: {result.MemoryUsed / 1024.0:F2} KB"); - if (result.Parameters.Count > 0) - { - Console.WriteLine($" Parameters: {string.Join(", ", result.Parameters.Select(p => $"{p.Key}={p.Value}"))}"); - } - Console.WriteLine(); - } - - if (suiteResult.FailedResults.Any()) - { - Console.WriteLine("Failed Tests:"); - Console.WriteLine(new string('-', 30)); - foreach (var result in suiteResult.FailedResults) - { - Console.WriteLine($"[FAILURE] {result.TestName}: {result.Exception?.Message}"); - } - } - - Console.WriteLine(new string('=', 60)); - } - - public static void GenerateDetailedConsoleReport(BenchmarkSuiteResult suiteResult) - { - GenerateConsoleReport(suiteResult); - - if (suiteResult.SuccessfulResults.Any()) - { - Console.WriteLine("\nPerformance Summary:"); - Console.WriteLine(new string('-', 40)); - - var results = suiteResult.SuccessfulResults.OrderBy(r => r.AverageMs).ToList(); - var fastest = results.First(); - var slowest = results.Last(); - - Console.WriteLine($"Fastest: {fastest.TestName} ({fastest.AverageMs:F3}ms)"); - Console.WriteLine($"Slowest: {slowest.TestName} ({slowest.AverageMs:F3}ms)"); - Console.WriteLine($"Performance Range: {slowest.AverageMs - fastest.AverageMs:F3}ms"); - - if (results.Count > 1) - { - var average = results.Average(r => r.AverageMs); - Console.WriteLine($"Average: {average:F3}ms"); - } - } - } - - public static string GenerateCSVReport(BenchmarkSuiteResult suiteResult) { - var sb = new StringBuilder(); - sb.AppendLine("TestName,Description,DurationMs,AverageMs,Iterations,MemoryUsedKB,Success"); - - foreach (var result in suiteResult.Results){ - sb.AppendLine($"{result.TestName}," + $"{result.Description}," + $"{result.Milliseconds:F6}," + $"{result.AverageMs:F6}," + $"{result.Iterations}," + $"{result.MemoryUsed / 1024.0:F2}," + $"{result.Success}"); - } - - return sb.ToString(); - } - } -} diff --git a/NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaMockTest.cs b/NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaMockTest.cs deleted file mode 100644 index b755af3..0000000 --- a/NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaMockTest.cs +++ /dev/null @@ -1,174 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; - -namespace NahidaProject4CSharp.UnitTest.NahidaMockTest { - public interface IMock where T : class - { - T Object { get; } - void Setup(Expression> expression, TResult returnValue); - void Setup(Expression> expression); - void Verify(Expression> expression, Times times); - void Verify(Expression> expression, Times times); - } - - public class MockException : Exception - { - public MockException(string message) : base(message) - { - } - - public MockException(string message, Exception innerException) : base(message, innerException) - { - } - } - - public class Times - { - public int Count { get; private set; } - public string Description { get; private set; } - - private Times(int count, string description) - { - Count = count; - Description = description; - } - - public static Times Once() => new Times(1, "Once"); - public static Times Never() => new Times(0, "Never"); - public static Times AtLeastOnce() => new Times(-1, "AtLeastOnce"); - public static Times Exactly(int count) => new Times(count, $"Exactly {count}"); - } - - public class Invocation - { - public string MethodName { get; set; } - public object[] Arguments { get; set; } - public Type ReturnType { get; set; } - } - - public class Mock : IMock where T : class - { - private readonly T _mockObject; - private readonly Dictionary _setups; - private readonly List _invocations; - - public T Object => _mockObject; - - public Mock() - { - _setups = new Dictionary(); - _invocations = new List(); - _mockObject = CreateProxy(); - } - - private T CreateProxy() - { - var type = typeof(T); - var proxyType = CreateProxyType(type); - return (T)Activator.CreateInstance(proxyType, this); - } - - private Type CreateProxyType(Type interfaceType) - { - var typeName = $"Mock_{interfaceType.Name}_{Guid.NewGuid():N}"; - return interfaceType; - } - - public void Setup(Expression> expression, TResult returnValue) - { - var methodName = GetMethodName(expression); - var key = GetMethodKey(methodName, expression.Parameters.ToArray()); - _setups[key] = returnValue; - } - - public void Setup(Expression> expression) - { - var methodName = GetMethodName(expression); - var key = GetMethodKey(methodName, expression.Parameters.ToArray()); - _setups[key] = null; - } - - public void Verify(Expression> expression, Times times) - { - var methodName = GetMethodName(expression); - var key = GetMethodKey(methodName, expression.Parameters.ToArray()); - var count = _invocations.Count(i => i.MethodName == key); - - if (!IsCountValid(count, times)) - { - throw new MockException($"Expected invocation on the mock {times.Description}, but was {count} times."); - } - } - - public void Verify(Expression> expression, Times times) - { - var methodName = GetMethodName(expression); - var key = GetMethodKey(methodName, expression.Parameters.ToArray()); - var count = _invocations.Count(i => i.MethodName == key); - - if (!IsCountValid(count, times)) - { - throw new MockException($"Expected invocation on the mock {times.Description}, but was {count} times."); - } - } - - private string GetMethodName(LambdaExpression expression) - { - if (expression.Body is MethodCallExpression methodCall) - { - return methodCall.Method.Name; - } - throw new ArgumentException("Expression must be a method call"); - } - - private string GetMethodKey(string methodName, ParameterExpression[] parameters) - { - return $"{methodName}_{parameters.Length}"; - } - - private bool IsCountValid(int actualCount, Times expectedTimes) - { - return expectedTimes.Count switch - { - 0 => actualCount == 0, - 1 => actualCount == 1, - -1 => actualCount >= 1, - _ => actualCount == expectedTimes.Count - }; - } - - internal object HandleInvocation(string methodName, Type returnType, params object[] args) - { - var key = $"{methodName}_{args.Length}"; - _invocations.Add(new Invocation - { - MethodName = key, - Arguments = args, - ReturnType = returnType - }); - - if (_setups.ContainsKey(key)) - { - return _setups[key]; - } - - if (returnType == typeof(void)) - { - return null; - } - - return returnType.IsValueType ? Activator.CreateInstance(returnType) : null; - } - } - - public static class MockFactory - { - public static Mock CreateMock() where T : class - { - return new Mock(); - } - } - -} diff --git a/NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaProject4CSharp.UnitTest.csproj b/NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaProject4CSharp.UnitTest.csproj deleted file mode 100644 index cfd12b4..0000000 --- a/NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaProject4CSharp.UnitTest.csproj +++ /dev/null @@ -1,54 +0,0 @@ - - - - - latest - Debug - AnyCPU - {AC8F58AE-96FA-49A3-8B24-0674DDFEF2F7} - Library - Properties - NahidaProject4CSharp.UnitTest - NahidaProject4CSharp.UnitTest - v4.8 - 512 - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - false - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaUnitTest.cs b/NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaUnitTest.cs deleted file mode 100644 index 3d7c9fc..0000000 --- a/NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/NahidaUnitTest.cs +++ /dev/null @@ -1,176 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Reflection; - -namespace NahidaProject4CSharp.UnitTest.NahidaUnitTest { - [AttributeUsage(AttributeTargets.Method)] - public class TestAttribute : Attribute{ - - } - - public class AssertionException : Exception{ - public AssertionException(string message) : base(message){ - - } - } - - public static class Assert { - public static void AreEqual(object expected, object actual, string message = "") { - if (!Equals(expected, actual)) { - throw new AssertionException($"Expected: {expected}, Actual: {actual}. {message}"); - } - } - - public static void AreNotEqual(object expected, object actual, string message = "") { - if (Equals(expected, actual)) { - throw new AssertionException($"Expected not equal to: {expected}, Actual: {actual}. {message}"); - } - } - - public static void IsTrue(bool condition, string message = ""){ - if (!condition){ - throw new AssertionException($"Expected true, but was false. {message}"); - } - } - - public static void IsFalse(bool condition, string message = ""){ - if (condition){ - throw new AssertionException($"Expected false, but was true. {message}"); - } - } - - public static void IsNull(object value, string message = ""){ - if (value != null){ - throw new AssertionException($"Expected null, but was {value}. {message}"); - } - } - - public static void IsNotNull(object value, string message = ""){ - if (value == null){ - throw new AssertionException($"Expected not null. {message}"); - } - } - - public static void Fail(string message = ""){ - throw new AssertionException($"Test failed. {message}"); - } - } - - public class TestResult{ - public string TestName { get; set; } - public bool Passed { get; set; } - public string Message { get; set; } - public double Duration { get; set; } - - public TestResult(string testName, bool passed, string message = "", double duration = 0) { - TestName = testName; - Passed = passed; - Message = message; - Duration = duration; - } - } - - public class TestRunner { - private readonly List _results = new List(); - - public List RunTests(Assembly assembly){ - _results.Clear(); - var testClasses = GetTestClasses(assembly); - - foreach (var testClass in testClasses){ - RunTestClass(testClass); - } - return _results; - } - - public List RunTests() where T : class, new(){ - _results.Clear(); - RunTestClass(typeof(T)); - return _results; - } - - private List GetTestClasses(Assembly assembly){ - var testClasses = new List(); - - foreach (var type in assembly.GetTypes()){ - if (HasTestMethods(type)){ - testClasses.Add(type); - } - } - - return testClasses; - } - - private bool HasTestMethods(Type type){ - var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); - foreach (var method in methods){ - if (method.GetCustomAttribute() != null){ - return true; - } - } - return false; - } - - private void RunTestClass(Type testClassType){ - var methods = testClassType.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); - - foreach (var method in methods){ - var testAttribute = method.GetCustomAttribute(); - if (testAttribute != null){ - RunTestMethod(testClassType, method); - } - } - } - - private void RunTestMethod(Type testClassType, MethodInfo method){ - var testName = $"{testClassType.Name}.{method.Name}"; - var stopwatch = Stopwatch.StartNew(); - - try{ - var instance = Activator.CreateInstance(testClassType); - method.Invoke(instance, null); - - stopwatch.Stop(); - _results.Add(new TestResult(testName, true, "", stopwatch.Elapsed.TotalMilliseconds)); - } - catch (TargetInvocationException ex){ - stopwatch.Stop(); - var innerException = ex.InnerException; - if (innerException is AssertionException assertionEx) - { - _results.Add(new TestResult(testName, false, assertionEx.Message, stopwatch.Elapsed.TotalMilliseconds)); - } - else - { - _results.Add(new TestResult(testName, false, $"Exception: {innerException?.Message}", stopwatch.Elapsed.TotalMilliseconds)); - } - } - catch (Exception ex){ - stopwatch.Stop(); - _results.Add(new TestResult(testName, false, $"Unexpected error: {ex.Message}", stopwatch.Elapsed.TotalMilliseconds)); - } - } - - public void PrintResults(){ - Console.WriteLine("Test Results:"); - Console.WriteLine("============="); - - int passed = 0, failed = 0; - - foreach (var result in _results){ - if (result.Passed){ - Console.WriteLine($"[SUCCESS] {result.TestName} (Passed) - {result.Duration:F2}ms"); - passed++; - } - else{ - Console.WriteLine($"[FAILURE] {result.TestName} (Failed) - {result.Duration:F2}ms"); - Console.WriteLine($" Message: {result.Message}"); - failed++; - } - } - - Console.WriteLine($"\nSummary: {passed} passed, {failed} failed, {_results.Count} total"); - } - } -} diff --git a/NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/Properties/AssemblyInfo.cs b/NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/Properties/AssemblyInfo.cs deleted file mode 100644 index 8276195..0000000 --- a/NahidaProject4CSharp/NahidaProject4CSharp.UnitTest/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// 有关程序集的一般信息由以下 -// 控制。更改这些特性值可修改 -// 与程序集关联的信息。 -[assembly: AssemblyTitle("NahidaProject4CSharp.UnitTest")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 将 ComVisible 设置为 false 会使此程序集中的类型 -//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 -//请将此类型的 ComVisible 特性设置为 true。 -[assembly: ComVisible(true)] - -// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID -[assembly: Guid("ac8f58ae-96fa-49a3-8b24-0674ddfef2f7")] - -// 程序集的版本信息由下列四个值组成: -// -// 主版本 -// 次版本 -// 生成号 -// 修订号 -// -[assembly: AssemblyVersion("0.0.0.0")] -[assembly: AssemblyFileVersion("0.0.0.0")] diff --git a/NahidaProject4CSharp/NahidaProject4CSharp.sln b/NahidaProject4CSharp/NahidaProject4CSharp.sln deleted file mode 100644 index a9f4601..0000000 --- a/NahidaProject4CSharp/NahidaProject4CSharp.sln +++ /dev/null @@ -1,62 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.14.36414.22 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NahidaProject4CSharp.UnitTest", "NahidaProject4CSharp.UnitTest\NahidaProject4CSharp.UnitTest.csproj", "{AC8F58AE-96FA-49A3-8B24-0674DDFEF2F7}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FunctionalTest", "FunctionalTest", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NahidaProject4CSharp.UnitTest.FunctionalTest", "FunctionalTest\NahidaProject4CSharp.UnitTest.FunctionalTest\NahidaProject4CSharp.UnitTest.FunctionalTest.csproj", "{2DA61D72-1C90-4E5A-9FB3-69E1B5200F33}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NahidaPrjoect4CSharp.Database", "NahidaPrjoect4CSharp.Database\NahidaPrjoect4CSharp.Database.csproj", "{7F4FC760-8EFB-463E-9013-997296DDC298}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NahidaProject4CSharp.Generic", "NahidaProject4CSharp.Generic\NahidaProject4CSharp.Generic.csproj", "{41576B57-FEA7-407E-9417-7B6B6B8078B1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NahidaProject4CSharp.Database.FunctionalTest", "FunctionalTest\NahidaProject4CSharp.Database.FunctionalTest\NahidaProject4CSharp.Database.FunctionalTest.csproj", "{B4085054-7471-4BD3-936C-03A77D5A6526}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NahidaProject4CSharp.Generic.FunctionalTest", "FunctionalTest\NahidaProject4CSharp.Generic.FunctionalTest\NahidaProject4CSharp.Generic.FunctionalTest.csproj", "{CEAF0071-F049-4618-B7F4-762EA18EB0CC}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {AC8F58AE-96FA-49A3-8B24-0674DDFEF2F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AC8F58AE-96FA-49A3-8B24-0674DDFEF2F7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AC8F58AE-96FA-49A3-8B24-0674DDFEF2F7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AC8F58AE-96FA-49A3-8B24-0674DDFEF2F7}.Release|Any CPU.Build.0 = Release|Any CPU - {2DA61D72-1C90-4E5A-9FB3-69E1B5200F33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2DA61D72-1C90-4E5A-9FB3-69E1B5200F33}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2DA61D72-1C90-4E5A-9FB3-69E1B5200F33}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2DA61D72-1C90-4E5A-9FB3-69E1B5200F33}.Release|Any CPU.Build.0 = Release|Any CPU - {7F4FC760-8EFB-463E-9013-997296DDC298}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7F4FC760-8EFB-463E-9013-997296DDC298}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7F4FC760-8EFB-463E-9013-997296DDC298}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7F4FC760-8EFB-463E-9013-997296DDC298}.Release|Any CPU.Build.0 = Release|Any CPU - {41576B57-FEA7-407E-9417-7B6B6B8078B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {41576B57-FEA7-407E-9417-7B6B6B8078B1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {41576B57-FEA7-407E-9417-7B6B6B8078B1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {41576B57-FEA7-407E-9417-7B6B6B8078B1}.Release|Any CPU.Build.0 = Release|Any CPU - {B4085054-7471-4BD3-936C-03A77D5A6526}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B4085054-7471-4BD3-936C-03A77D5A6526}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B4085054-7471-4BD3-936C-03A77D5A6526}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B4085054-7471-4BD3-936C-03A77D5A6526}.Release|Any CPU.Build.0 = Release|Any CPU - {CEAF0071-F049-4618-B7F4-762EA18EB0CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CEAF0071-F049-4618-B7F4-762EA18EB0CC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CEAF0071-F049-4618-B7F4-762EA18EB0CC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CEAF0071-F049-4618-B7F4-762EA18EB0CC}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {2DA61D72-1C90-4E5A-9FB3-69E1B5200F33} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} - {B4085054-7471-4BD3-936C-03A77D5A6526} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} - {CEAF0071-F049-4618-B7F4-762EA18EB0CC} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {3C6716E8-851E-4719-A112-8F33471CFFA2} - EndGlobalSection -EndGlobal diff --git a/README.md b/README.md index 464c9d2..accfb87 100644 --- a/README.md +++ b/README.md @@ -11,15 +11,17 @@ NahidaProject 十分小巧,却包含了常用的模块: |模块名称 | 模块用途 | |---------------------------|-----------------------------| -|NahidaProject-Console |控制台模块 | -|NahidaProject-Database |数据库模块 | -|NahidaProject-Generic |通用模块 | -|NahidaProject-Mathmatics |数学与算法模块 | -|NahidaProject-Other |其他模块 | -|NahidaProject-Serialization|序列化模块 | -|NahidaProject-System |Windows 系统独有的模块 | -|NahidaProject-Thread |与线程,流程控制有关的模块 | -|NahidaProject-UnitTest |微型单元、基准、模拟测试模块 | +|NahidaProject.Console |控制台模块 | +|NahidaProject.Database |数据库模块 | +|NahidaProject.Generic |通用模块 | +|NahidaProject.Mathmatics |数学与算法模块 | +|NahidaProject.Other |其他模块 | +|NahidaProject.Serialization|序列化模块 | +|NahidaProject.System |Windows 系统独有的模块 | +|NahidaProject.Thread |与线程,流程控制有关的模块 | +|NahidaProject.UnitTest |微型单元、基准、模拟测试模块 | + +另外,我们还提供了 NahidaProject 的 C# 实现。 ## 参考文档 -- Gitee