ICU-20205 RelativeDateTimeFormatter pt data fix, improved error handling and test. (#210)

* ICU-20205 Add locale test for RelativeDateTimeFormatter.

* ICU-20205 Fix error in pt relative date data. Improve error handling in code.

* ICU-20205 Add instantiation test & regen data from ICU4C

* ICU-20205 Added DateFormatSymbols error check per jefgen's comments.

(cherry picked from commit e509105c9b07912562481149aaa1da23c8170548)
diff --git a/icu4c/source/data/locales/pt.txt b/icu4c/source/data/locales/pt.txt
index b3c8e5d..bb63cb7 100644
--- a/icu4c/source/data/locales/pt.txt
+++ b/icu4c/source/data/locales/pt.txt
@@ -2000,7 +2000,7 @@
                 }
                 past{
                     one{"há {0} segunda-feira"}
-                    other{"{{0} segundas-feiras atrás"}
+                    other{"{0} segundas-feiras atrás"}
                 }
             }
         }
diff --git a/icu4c/source/i18n/reldatefmt.cpp b/icu4c/source/i18n/reldatefmt.cpp
index 0af9b47..1a4da0f 100644
--- a/icu4c/source/i18n/reldatefmt.cpp
+++ b/icu4c/source/i18n/reldatefmt.cpp
@@ -605,8 +605,14 @@
                                  [UDAT_ABSOLUTE_UNIT_COUNT][UDAT_DIRECTION_COUNT],
                              const char* localeId,
                              UErrorCode& status) {
+    if (U_FAILURE(status)) {
+        return;
+    }
     Locale locale(localeId);
     DateFormatSymbols dfSym(locale, status);
+    if (U_FAILURE(status)) {
+        return;
+    }
     for (int32_t style = 0; style < UDAT_STYLE_COUNT; ++style) {
         DateFormatSymbols::DtWidthType dtfmtWidth = styleToDateFormatSymbolWidth[style];
         int32_t count;
@@ -630,6 +636,9 @@
     RelDateTimeFmtDataSink sink(cacheData);
 
     ures_getAllItemsWithFallback(resource, "fields", sink, status);
+    if (U_FAILURE(status)) {
+        return false;
+    }
 
     // Get the weekday names from DateFormatSymbols.
     loadWeekdayNames(cacheData.absoluteUnits, localeId, status);
diff --git a/icu4c/source/test/intltest/reldatefmttest.cpp b/icu4c/source/test/intltest/reldatefmttest.cpp
index 65969e4..4481f42 100644
--- a/icu4c/source/test/intltest/reldatefmttest.cpp
+++ b/icu4c/source/test/intltest/reldatefmttest.cpp
@@ -10,8 +10,10 @@
 *
 *******************************************************************************
 */
+#include <memory>
 #include <stdio.h>
 #include <stdlib.h>
+#include <vector>
 
 #include "intltest.h"
 
@@ -765,6 +767,7 @@
     void TestBadDisplayContext();
     void TestFormat();
     void TestFormatNumeric();
+    void TestLocales();
     void RunTest(
             const Locale& locale,
             const WithQuantityExpected* expectedResults,
@@ -854,6 +857,7 @@
     TESTCASE_AUTO(TestSidewaysDataLoading);
     TESTCASE_AUTO(TestFormat);
     TESTCASE_AUTO(TestFormatNumeric);
+    TESTCASE_AUTO(TestLocales);
     TESTCASE_AUTO_END;
 }
 
@@ -1296,6 +1300,19 @@
     RunTest("en", kEnglishFormat, UPRV_LENGTHOF(kEnglishFormat), false);
 }
 
+void RelativeDateTimeFormatterTest::TestLocales() {
+    int32_t numLocales = 0;
+    const Locale *availableLocales = Locale::getAvailableLocales(numLocales);
+    std::vector<std::unique_ptr<RelativeDateTimeFormatter>> allFormatters;
+    for (int localeIdx=0; localeIdx<numLocales; localeIdx++) {
+        const Locale &loc = availableLocales[localeIdx];
+        UErrorCode status = U_ZERO_ERROR;
+        std::unique_ptr<RelativeDateTimeFormatter> rdtf(new RelativeDateTimeFormatter(loc, status));
+        allFormatters.push_back(std::move(rdtf));
+        assertSuccess(loc.getName(), status);
+    }
+}
+
 static const char *kLast2 = "Last_2";
 static const char *kLast = "Last";
 static const char *kThis = "This";
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/RelativeDateTimeFormatter.java b/icu4j/main/classes/core/src/com/ibm/icu/text/RelativeDateTimeFormatter.java
index df61c84..6e90d41 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/RelativeDateTimeFormatter.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/RelativeDateTimeFormatter.java
@@ -970,9 +970,9 @@
         }
 
         EnumMap<Style, EnumMap<AbsoluteUnit, EnumMap<Direction, String>>> qualitativeUnitMap =
-                new EnumMap<Style, EnumMap<AbsoluteUnit, EnumMap<Direction, String>>>(Style.class);
+                new EnumMap<>(Style.class);
         EnumMap<Style, EnumMap<RelativeUnit, String[][]>> styleRelUnitPatterns =
-                new EnumMap<Style, EnumMap<RelativeUnit, String[][]>>(Style.class);
+                new EnumMap<>(Style.class);
 
         StringBuilder sb = new StringBuilder();
 
@@ -1023,7 +1023,7 @@
                             // Handle Zero seconds for "now".
                             EnumMap<Direction, String> unitStrings = absMap.get(AbsoluteUnit.NOW);
                             if (unitStrings == null) {
-                                unitStrings = new EnumMap<Direction, String>(Direction.class);
+                                unitStrings = new EnumMap<>(Direction.class);
                                 absMap.put(AbsoluteUnit.NOW, unitStrings);
                             }
                             if (unitStrings.get(Direction.PLAIN) == null) {
@@ -1042,12 +1042,12 @@
                     }
 
                     if (absMap == null) {
-                        absMap = new EnumMap<AbsoluteUnit, EnumMap<Direction, String>>(AbsoluteUnit.class);
+                        absMap = new EnumMap<>(AbsoluteUnit.class);
                         qualitativeUnitMap.put(style, absMap);
                     }
                     EnumMap<Direction, String> dirMap = absMap.get(absUnit);
                     if (dirMap == null) {
-                        dirMap = new EnumMap<Direction, String>(Direction.class);
+                        dirMap = new EnumMap<>(Direction.class);
                         absMap.put(absUnit, dirMap);
                     }
                     if (dirMap.get(keyDirection) == null) {
@@ -1082,7 +1082,7 @@
 
             EnumMap<RelativeUnit, String[][]> unitPatterns  = styleRelUnitPatterns.get(style);
             if (unitPatterns == null) {
-                unitPatterns = new EnumMap<RelativeUnit, String[][]>(RelativeUnit.class);
+                unitPatterns = new EnumMap<>(RelativeUnit.class);
                 styleRelUnitPatterns.put(style, unitPatterns);
             }
             String[][] patterns = unitPatterns.get(unit.relUnit);
@@ -1112,12 +1112,12 @@
             EnumMap<AbsoluteUnit, EnumMap<Direction, String>> unitMap =
                     qualitativeUnitMap.get(style);
             if (unitMap == null) {
-                unitMap = new EnumMap<AbsoluteUnit, EnumMap<Direction, String>>(AbsoluteUnit.class);
+                unitMap = new EnumMap<>(AbsoluteUnit.class);
                 qualitativeUnitMap.put(style, unitMap);
             }
             EnumMap<Direction,String> dirMap = unitMap.get(absUnit);
             if (dirMap == null) {
-                dirMap = new EnumMap<Direction,String>(Direction.class);
+                dirMap = new EnumMap<>(Direction.class);
                 unitMap.put(absUnit, dirMap);
             }
             if (dirMap.get(Direction.PLAIN) == null) {
diff --git a/icu4j/main/shared/data/icudata.jar b/icu4j/main/shared/data/icudata.jar
index 57a2a86..2d6f0c1 100644
--- a/icu4j/main/shared/data/icudata.jar
+++ b/icu4j/main/shared/data/icudata.jar
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:605d9be70f081c26ec0c632d4a73a121a2c80f8b5cc1d8da265458264c5474e1
-size 12683589
+oid sha256:7000d5c698e9d3ec24a866694d719a51cbfe4929220c1c3043f4405eeb33f288
+size 12683583
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/RelativeDateTimeFormatterTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/RelativeDateTimeFormatterTest.java
index 7abe32a..5e18667 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/RelativeDateTimeFormatterTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/RelativeDateTimeFormatterTest.java
@@ -973,4 +973,13 @@
         String w = fmt.format(6.0, Direction.NEXT, RelativeUnit.QUARTERS);
         assertEquals("narrow: in 6 qtr", "in 6 qtr", w);
     }
+
+@Test
+public void TestLocales() {
+    ULocale[] availableLocales = ULocale.getAvailableLocales();
+    for (ULocale loc: availableLocales) {
+        RelativeDateTimeFormatter.getInstance(loc);
+    }
+}
+
 }