diff --git a/include/omath/utility/pattern_scan.hpp b/include/omath/utility/pattern_scan.hpp index f524549..3f5ce6d 100644 --- a/include/omath/utility/pattern_scan.hpp +++ b/include/omath/utility/pattern_scan.hpp @@ -10,6 +10,9 @@ // ReSharper disable once CppInconsistentNaming class unit_test_pattern_scan_read_test_Test; +class unit_test_pattern_scan_corner_case_1_Test; +class unit_test_pattern_scan_corner_case_2_Test; +class unit_test_pattern_scan_corner_case_3_Test; namespace omath { enum class PatternScanError @@ -19,6 +22,9 @@ namespace omath class PatternScanner { friend unit_test_pattern_scan_read_test_Test; + friend unit_test_pattern_scan_corner_case_1_Test; + friend unit_test_pattern_scan_corner_case_2_Test; + friend unit_test_pattern_scan_corner_case_3_Test; public: private: [[nodiscard]] diff --git a/source/utility/pattern_scan.cpp b/source/utility/pattern_scan.cpp index 3efd097..b2ae08e 100644 --- a/source/utility/pattern_scan.cpp +++ b/source/utility/pattern_scan.cpp @@ -28,6 +28,7 @@ namespace omath start = end != pattern_string.end() ? std::next(end) : end; continue; } + if (byte_str == "?" || byte_str == "??") { pattern.emplace_back(std::nullopt); diff --git a/tests/general/unit_test_pattern_scan.cpp b/tests/general/unit_test_pattern_scan.cpp index 0233495..9b03486 100644 --- a/tests/general/unit_test_pattern_scan.cpp +++ b/tests/general/unit_test_pattern_scan.cpp @@ -5,7 +5,43 @@ #include #include + TEST(unit_test_pattern_scan, read_test) { - std::ignore = omath::PatternScanner::parse_pattern("FF ? ?? E9"); + const auto result = omath::PatternScanner::parse_pattern("FF ? ?? E9"); + + EXPECT_EQ(result->at(0), static_cast(0xFF)); + EXPECT_EQ(result->at(1), std::nullopt); + EXPECT_EQ(result->at(2), std::nullopt); + EXPECT_EQ(result->at(3), static_cast(0xE9)); +} + +TEST(unit_test_pattern_scan, corner_case_1) +{ + const auto result = omath::PatternScanner::parse_pattern(" FF ? ?? E9"); + + EXPECT_EQ(result->at(0), static_cast(0xFF)); + EXPECT_EQ(result->at(1), std::nullopt); + EXPECT_EQ(result->at(2), std::nullopt); + EXPECT_EQ(result->at(3), static_cast(0xE9)); +} + +TEST(unit_test_pattern_scan, corner_case_2) +{ + const auto result = omath::PatternScanner::parse_pattern(" FF ? ?? E9 "); + + EXPECT_EQ(result->at(0), static_cast(0xFF)); + EXPECT_EQ(result->at(1), std::nullopt); + EXPECT_EQ(result->at(2), std::nullopt); + EXPECT_EQ(result->at(3), static_cast(0xE9)); +} + +TEST(unit_test_pattern_scan, corner_case_3) +{ + const auto result = omath::PatternScanner::parse_pattern(" FF ? ?? E9 "); + + EXPECT_EQ(result->at(0), static_cast(0xFF)); + EXPECT_EQ(result->at(1), std::nullopt); + EXPECT_EQ(result->at(2), std::nullopt); + EXPECT_EQ(result->at(3), static_cast(0xE9)); } \ No newline at end of file