From 3a74fcf052fee4c89ff92107cf3f22f8ae3bea03 Mon Sep 17 00:00:00 2001 From: Frank Tang Date: Fri, 6 Sep 2024 18:34:05 -0700 Subject: [PATCH] ICU-22716 Test more number format --- .../test/fuzzer/number_format_fuzzer.cpp | 60 +++++++++++++++++-- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/icu4c/source/test/fuzzer/number_format_fuzzer.cpp b/icu4c/source/test/fuzzer/number_format_fuzzer.cpp index 4be2f97a7562..5a540695e959 100644 --- a/icu4c/source/test/fuzzer/number_format_fuzzer.cpp +++ b/icu4c/source/test/fuzzer/number_format_fuzzer.cpp @@ -9,7 +9,11 @@ #include #include #include "fuzzer_utils.h" +#include "unicode/choicfmt.h" +#include "unicode/compactdecimalformat.h" +#include "unicode/decimfmt.h" #include "unicode/numfmt.h" +#include "unicode/rbnf.h" IcuEnvironment* env = new IcuEnvironment(); @@ -31,15 +35,61 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { const icu::Locale& locale = GetRandomLocale(rnd); + icu::UnicodeString fuzzstr(false, fuzzbuff.get(), unistr_size); + icu::Formattable result; std::unique_ptr fmt( icu::NumberFormat::createInstance(locale, status)); - if (U_FAILURE(status)) { - return 0; + if (U_SUCCESS(status)) { + fmt->parse(fuzzstr, result, status); } - icu::UnicodeString fuzzstr(false, fuzzbuff.get(), unistr_size); - icu::Formattable result; - fmt->parse(fuzzstr, result, status); + status = U_ZERO_ERROR; + fmt.reset(icu::NumberFormat::createCurrencyInstance(locale, status)); + if (U_SUCCESS(status)) { + fmt->parse(fuzzstr, result, status); + } + + status = U_ZERO_ERROR; + fmt.reset(icu::NumberFormat::createPercentInstance(locale, status)); + if (U_SUCCESS(status)) { + fmt->parse(fuzzstr, result, status); + } + + status = U_ZERO_ERROR; + fmt.reset(icu::NumberFormat::createScientificInstance(locale, status)); + if (U_SUCCESS(status)) { + fmt->parse(fuzzstr, result, status); + } + status = U_ZERO_ERROR; + icu::ChoiceFormat cfmt(fuzzstr, status); + if (U_SUCCESS(status)) { + cfmt.parse(fuzzstr, result, status); + } + + UParseError perror; + status = U_ZERO_ERROR; + icu::RuleBasedNumberFormat rbfmt(fuzzstr, locale, perror, status); + if (U_SUCCESS(status)) { + rbfmt.parse(fuzzstr, result, status); + } + + status = U_ZERO_ERROR; + icu::DecimalFormat dfmt(fuzzstr, status); + if (U_SUCCESS(status)) { + dfmt.parse(fuzzstr, result, status); + } + + status = U_ZERO_ERROR; + fmt.reset(icu::CompactDecimalFormat::createInstance(locale, UNUM_SHORT, status)); + if (U_SUCCESS(status)) { + fmt->parse(fuzzstr, result, status); + } + + status = U_ZERO_ERROR; + fmt.reset(icu::CompactDecimalFormat::createInstance(locale, UNUM_LONG, status)); + if (U_SUCCESS(status)) { + fmt->parse(fuzzstr, result, status); + } return 0; }