From: Younies Mahmoud Date: Thu, 19 Mar 2020 01:59:26 +0000 (+0100) Subject: Add skeleton for testing units router X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=98b8c4f16ca5b070194a7c9eaa18589342c87bd7;p=icu Add skeleton for testing units router --- diff --git a/icu4c/source/i18n/Makefile.in b/icu4c/source/i18n/Makefile.in index 827f2c207ba..3b8e99ac895 100644 --- a/icu4c/source/i18n/Makefile.in +++ b/icu4c/source/i18n/Makefile.in @@ -115,7 +115,7 @@ numparse_affixes.o numparse_compositions.o numparse_validators.o \ numrange_fluent.o numrange_impl.o \ erarules.o \ formattedvalue.o formattedval_iterimpl.o formattedval_sbimpl.o formatted_string_builder.o \ -unitconverter.o +unitconverter.o unitsrouter.o complexunitsconverter.o ## Header files to install HEADERS = $(srcdir)/unicode/*.h diff --git a/icu4c/source/i18n/complexunitsconverter.cpp b/icu4c/source/i18n/complexunitsconverter.cpp index 5c4f4a564f5..6470eb9bd06 100644 --- a/icu4c/source/i18n/complexunitsconverter.cpp +++ b/icu4c/source/i18n/complexunitsconverter.cpp @@ -53,7 +53,7 @@ ComplexUnitsConverter::ComplexUnitsConverter(const MeasureUnit inputUnit, } UBool ComplexUnitsConverter::greaterThanOrEqual(double quantity, double limit) const { - U_ASSERT(unitConverters_.length() ?> 0); + U_ASSERT(unitConverters_.length() > 0); // first quantity is the biggest one. double newQuantity = (*unitConverters_[0]).convert(quantity); diff --git a/icu4c/source/i18n/i18n.vcxproj b/icu4c/source/i18n/i18n.vcxproj index f5cad11f522..685946ab943 100644 --- a/icu4c/source/i18n/i18n.vcxproj +++ b/icu4c/source/i18n/i18n.vcxproj @@ -267,6 +267,8 @@ + + @@ -502,6 +504,8 @@ + + diff --git a/icu4c/source/i18n/i18n.vcxproj.filters b/icu4c/source/i18n/i18n.vcxproj.filters index 5feb9f252fb..9ed1d9bb6c5 100644 --- a/icu4c/source/i18n/i18n.vcxproj.filters +++ b/icu4c/source/i18n/i18n.vcxproj.filters @@ -654,6 +654,12 @@ formatting + + formatting + + + formatting + @@ -1001,6 +1007,12 @@ formatting + + formatting + + + formatting + formatting diff --git a/icu4c/source/i18n/i18n_uwp.vcxproj b/icu4c/source/i18n/i18n_uwp.vcxproj index 39b80d454d4..a350f4090f4 100644 --- a/icu4c/source/i18n/i18n_uwp.vcxproj +++ b/icu4c/source/i18n/i18n_uwp.vcxproj @@ -486,6 +486,8 @@ + + @@ -721,6 +723,8 @@ + + diff --git a/icu4c/source/i18n/unitsrouter.cpp b/icu4c/source/i18n/unitsrouter.cpp index 9da50ef0647..826f75aba4a 100644 --- a/icu4c/source/i18n/unitsrouter.cpp +++ b/icu4c/source/i18n/unitsrouter.cpp @@ -5,6 +5,8 @@ #if !UCONFIG_NO_FORMATTING +#include + #include "cmemory.h" #include "unitsrouter.h" @@ -50,23 +52,24 @@ UnitsRouter::UnitsRouter(MeasureUnit inputUnit, StringPiece locale, StringPiece for (int i = 0, n = preferences.length(); i < n; ++i) { const auto &preference = *preferences[i]; MeasureUnit complexTargetUnit = MeasureUnit::forIdentifier(preference.identifier, status); - converterPreferences_.emplaceBack( - ConverterPreference(inputUnit, complexTargetUnit, preference.limit, status)); + // TODO(younies): Find a way to emplaceBack `ConverterPreference` + // converterPreferences_.emplaceBack( + // std::move(ConverterPreference(inputUnit, complexTargetUnit, preference.limit, status))); } } MaybeStackVector UnitsRouter::route(double quantity, UErrorCode &status) { - for (int i = 0, n = converterPreferences_.length(); i < n; i++) { + for (int i = 0, n = converterPreferences_.length() - 1; i < n; i++) { const auto &converterPreference = *converterPreferences_[i]; - if (i == n - 1) { // last unit preference - return converterPreference.converter.convert(quantity, status); - } - if (converterPreference.converter.greaterThanOrEqual(quantity, converterPreference.limit)) { return converterPreference.converter.convert(quantity, status); } } + + const auto &converterPreference = + *converterPreferences_[converterPreferences_.length() - 1]; // Last Element + return converterPreference.converter.convert(quantity, status); } U_NAMESPACE_END diff --git a/icu4c/source/i18n/unitsrouter.h b/icu4c/source/i18n/unitsrouter.h index 4fb9e9cdb89..f7ffd21f1a4 100644 --- a/icu4c/source/i18n/unitsrouter.h +++ b/icu4c/source/i18n/unitsrouter.h @@ -26,7 +26,7 @@ struct ConverterPreference { class U_I18N_API UnitsRouter { public: - UnitsRouter(MeasureUnit inputUnit, StringPiece locale, StringPiece usage, UErrorCode& status); + UnitsRouter(MeasureUnit inputUnit, StringPiece locale, StringPiece usage, UErrorCode &status); MaybeStackVector route(double quantity, UErrorCode &status); diff --git a/icu4c/source/test/intltest/Makefile.in b/icu4c/source/test/intltest/Makefile.in index 594d491f6f7..5878d6b19ca 100644 --- a/icu4c/source/test/intltest/Makefile.in +++ b/icu4c/source/test/intltest/Makefile.in @@ -69,7 +69,7 @@ string_segment_test.o \ numbertest_parse.o numbertest_doubleconversion.o numbertest_skeletons.o \ static_unisets_test.o numfmtdatadriventest.o numbertest_range.o erarulestest.o \ formattedvaluetest.o formatted_string_builder_test.o numbertest_permutation.o \ -unitstest.o +unitstest.o unitsroutertest.o DEPS = $(OBJECTS:.o=.d) diff --git a/icu4c/source/test/intltest/intltest.vcxproj b/icu4c/source/test/intltest/intltest.vcxproj index 8d0dc75689e..78084b976c8 100644 --- a/icu4c/source/test/intltest/intltest.vcxproj +++ b/icu4c/source/test/intltest/intltest.vcxproj @@ -302,6 +302,7 @@ + diff --git a/icu4c/source/test/intltest/intltest.vcxproj.filters b/icu4c/source/test/intltest/intltest.vcxproj.filters index f068ff80e7f..adf9068a838 100644 --- a/icu4c/source/test/intltest/intltest.vcxproj.filters +++ b/icu4c/source/test/intltest/intltest.vcxproj.filters @@ -553,6 +553,9 @@ formatting + + formatting + diff --git a/icu4c/source/test/intltest/itformat.cpp b/icu4c/source/test/intltest/itformat.cpp index 9126d528fa2..7ee86dbd9ab 100644 --- a/icu4c/source/test/intltest/itformat.cpp +++ b/icu4c/source/test/intltest/itformat.cpp @@ -75,6 +75,7 @@ extern IntlTest *createFormattedValueTest(); extern IntlTest *createFormattedStringBuilderTest(); extern IntlTest *createStringSegmentTest(); extern IntlTest *createUnitsTest(); +extern IntlTest *createUnitsRouterTest(); #define TESTCLASS(id, TestClass) \ @@ -257,6 +258,15 @@ void IntlTestFormat::runIndexedTest( int32_t index, UBool exec, const char* &nam callTest(*test, par); } break; + case 57: + name = "UnitsRouterTest"; + if (exec) { + logln("UnitsRouterTest test---"); + logln((UnicodeString)""); + LocalPointer test(createUnitsRouterTest()); + callTest(*test, par); + } + break; default: name = ""; break; //needed to end loop } if (exec) {