From d96bfbb942c09e9854b00e5d84863c1cf3a6614c Mon Sep 17 00:00:00 2001 From: WerWolv Date: Sun, 25 May 2025 12:43:15 +0200 Subject: [PATCH] tests: Execute and test format functions --- patterns/cpio.hexpat | 2 +- patterns/java_class.hexpat | 10 ++++++++-- tests/patterns/source/main.cpp | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/patterns/cpio.hexpat b/patterns/cpio.hexpat index 95ddd05..e666178 100644 --- a/patterns/cpio.hexpat +++ b/patterns/cpio.hexpat @@ -19,7 +19,7 @@ namespace old_binary { }; fn format_time(u32 value) { - return std::time::format(std::time::to_utc(swap_32bit(value))); + return std::time::format(std::time::to_utc(old_binary::swap_32bit(value))); }; using SwappedU32 = u32 [[transform("old_binary::swap_32bit"), format("old_binary::swap_32bit")]]; diff --git a/patterns/java_class.hexpat b/patterns/java_class.hexpat index 5aec41d..47cac0d 100644 --- a/patterns/java_class.hexpat +++ b/patterns/java_class.hexpat @@ -117,7 +117,10 @@ namespace fmt { }; fn const_ref(u2 index) { - cp_info info = file.constant_pool[index-1]; + return fmt::format_info_const_ref(index, file.constant_pool[index-1]); + }; + + fn format_info_const_ref(u2 index, ref auto info) { match(info.tag) { (1): return info.bytes; (3): return std::format("{:d} [{:d}]", index, info.bytes); @@ -140,7 +143,10 @@ namespace fmt { }; fn const_ref_top(u2 index) { - cp_info info = file.constant_pool[index-1]; + return fmt::format_info_const_ref_top(index, file.constant_pool[index-1]); + }; + + fn format_info_const_ref_top(u2 index, ref auto info) { match(info.tag) { (1): return std::format("{:d} [{:s}]", index, info.bytes); (_): return fmt::const_ref(index); diff --git a/tests/patterns/source/main.cpp b/tests/patterns/source/main.cpp index 217d822..7d12f03 100644 --- a/tests/patterns/source/main.cpp +++ b/tests/patterns/source/main.cpp @@ -6,8 +6,29 @@ #include #include +#include + #define EXIT_SKIP 77 +bool validatePatternValues(pl::ptrn::Pattern *pattern) { + auto value = pattern->getFormattedValue(); + if (!pattern->hasValidFormattedValue()) { + fmt::print("Invalid formatted value \"{}\" of pattern \"{}\"\n", value, pattern->getDisplayName()); + return false; + } + + for (const auto &[address, child] : pattern->getChildren()) { + if (pattern == child) + continue; + + child->setOffset(address); + if (!validatePatternValues(child)) + return false; + } + + return true; +} + int main(int argc, char **argv) { // Any number of arguments other than 5 are invalid if (argc != 4 && argc != 5) @@ -87,6 +108,17 @@ int main(int argc, char **argv) { return EXIT_FAILURE; } + + for (const auto &pattern : runtime.getPatterns()) { + if (!validatePatternValues(pattern.get())) + return EXIT_FAILURE; + } + for (const auto &[id, section] : runtime.getSections()) { + for (const auto &pattern : runtime.getPatterns(id)) { + if (!validatePatternValues(pattern.get())) + return EXIT_FAILURE; + } + } } else { // Parse the file fmt::println("Parsing pattern {} without executing it", patternName);