]> granicus.if.org Git - icu/commitdiff
Add skeleton for testing units router
authorYounies Mahmoud <younies.mahmoud@gmail.com>
Thu, 19 Mar 2020 01:59:26 +0000 (02:59 +0100)
committerYounies Mahmoud <younies.mahmoud@gmail.com>
Thu, 19 Mar 2020 01:59:26 +0000 (02:59 +0100)
icu4c/source/i18n/Makefile.in
icu4c/source/i18n/complexunitsconverter.cpp
icu4c/source/i18n/i18n.vcxproj
icu4c/source/i18n/i18n.vcxproj.filters
icu4c/source/i18n/i18n_uwp.vcxproj
icu4c/source/i18n/unitsrouter.cpp
icu4c/source/i18n/unitsrouter.h
icu4c/source/test/intltest/Makefile.in
icu4c/source/test/intltest/intltest.vcxproj
icu4c/source/test/intltest/intltest.vcxproj.filters
icu4c/source/test/intltest/itformat.cpp

index 827f2c207badf43e5cd36b2acbac6340f4d4d710..3b8e99ac895c767efbe0c1f25505e80ef96a9326 100644 (file)
@@ -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
index 5c4f4a564f590fee1829533799c288dd6068aa55..6470eb9bd06cf1b7fb4a8b1d335e84ff07fd8a78 100644 (file)
@@ -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);
index f5cad11f5228967f799b4729aa74f306c0fedd38..685946ab9439b12badbc1095e0494fa0de1470c9 100644 (file)
     <ClCompile Include="ulocdata.cpp" />
     <ClCompile Include="umsg.cpp" />
     <ClCompile Include="unitconverter.cpp" />
+    <ClCompile Include="complexunitsconverter.cpp" />
+    <ClCompile Include="unitsrouter.cpp" />
     <ClCompile Include="unum.cpp" />
     <ClCompile Include="unumsys.cpp" />
     <ClCompile Include="upluralrules.cpp" />
     <ClInclude Include="numrange_impl.h" />
     <ClInclude Include="formattedval_impl.h" />
     <ClInclude Include="unitconverter.h" />
+    <ClInclude Include="complexunitsconverter.h" />
+    <ClInclude Include="unitsrouter.h" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="i18n.rc" />
index 5feb9f252fbf277d6886c8392516493faf4606e1..9ed1d9bb6c53526de19998ae9b75013a4c4bb28a 100644 (file)
     <ClCompile Include="unitconverter.cpp">
       <Filter>formatting</Filter>
     </ClCompile>
+    <ClCompile Include="complexunitsconverter.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="unitsrouter.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="bocsu.cpp">
     <ClInclude Include="unitconveter.h">
       <Filter>formatting</Filter>
     </ClInclude>
+    <ClInclude Include="complexunitsconverter.h">
+      <Filter>formatting</Filter>
+    </ClInclude>
+    <ClInclude Include="unitsrouter.h">
+      <Filter>formatting</Filter>
+    </ClInclude>
     <ClInclude Include="vzone.h">
       <Filter>formatting</Filter>
     </ClInclude>
index 39b80d454d4226e96f540dad8b9c463ee2560cea..a350f4090f4d6127590be9bb67cd9c80bf91fa90 100644 (file)
     <ClCompile Include="ulocdata.cpp" />
     <ClCompile Include="umsg.cpp" />
     <ClCompile Include="unitconverter.cpp" />
+    <ClCompile Include="complexunitsconverter.cpp" />
+    <ClCompile Include="unitsrouter.cpp" />
     <ClCompile Include="unum.cpp" />
     <ClCompile Include="unumsys.cpp" />
     <ClCompile Include="upluralrules.cpp" />
     <ClInclude Include="numrange_impl.h" />
     <ClInclude Include="formattedval_impl.h" />
     <ClInclude Include="unitconverter.h" />
+    <ClInclude Include="complexunitsconverter.h" />
+    <ClInclude Include="unitsrouter.h" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="i18n.rc" />
index 9da50ef06474c43b8583e0ec52627a3c7d1b0aad..826f75aba4a6513273be9ee4086dd0ba59dd5e64 100644 (file)
@@ -5,6 +5,8 @@
 
 #if !UCONFIG_NO_FORMATTING
 
+#include <utility>
+
 #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<Measure> 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
index 4fb9e9cdb8993703fcd05535bed0233d412f80d7..f7ffd21f1a423744fe177c8ea27cadea0f02b97f 100644 (file)
@@ -26,7 +26,7 @@ struct ConverterPreference {
 
 class U_I18N_API UnitsRouter {
   public:
-    UnitsRouter(MeasureUnit inputUnit, StringPiece locale, StringPiece usage, UErrorCodestatus);
+    UnitsRouter(MeasureUnit inputUnit, StringPiece locale, StringPiece usage, UErrorCode &status);
 
     MaybeStackVector<Measure> route(double quantity, UErrorCode &status);
 
index 594d491f6f73efe65eb534e3ae019c0857556b24..5878d6b19ca43b596e5bd34927917dbc8436c919 100644 (file)
@@ -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)
 
index 8d0dc75689e053855db58cf9bb75785424dbb692..78084b976c87028e25583039dc5bd2cf569e5cc8 100644 (file)
     <ClCompile Include="localebuildertest.cpp" />
     <ClCompile Include="localematchertest.cpp" />
     <ClCompile Include="unitstest.cpp" />
+    <ClCompile Include="unitsroutertest.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="colldata.h" />
index f068ff80e7fd920377c182f4bfed09e307232aa5..adf9068a83805be625d63f57afb9e3a91ba2040a 100644 (file)
     <ClCompile Include="unitstest.cpp">
       <Filter>formatting</Filter>
     </ClCompile>
+    <ClCompile Include="unitsroutertest.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="itrbbi.h">
index 9126d528fa25ff60bd47beb2f5ffcb17630f2a6a..7ee86dbd9ab9b5fb0b2d87467f079ca700e01f84 100644 (file)
@@ -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<IntlTest> test(createUnitsRouterTest());
+            callTest(*test, par);
+          }
+          break;
         default: name = ""; break; //needed to end loop
     }
     if (exec) {