Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(751)

Unified Diff: packages/intl/test/number_format_test.dart

Issue 1400473008: Roll Observatory packages and add a roll script (Closed) Base URL: git@github.com:dart-lang/observatory_pub_packages.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « packages/intl/test/number_closure_test.dart ('k') | packages/intl/test/number_test_data.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: packages/intl/test/number_format_test.dart
diff --git a/packages/intl/test/number_format_test.dart b/packages/intl/test/number_format_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..14c8b3f804e43708240f7bdda5133daf8c743413
--- /dev/null
+++ b/packages/intl/test/number_format_test.dart
@@ -0,0 +1,204 @@
+/**
+ * Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
+ * for details. All rights reserved. Use of this source code is governed by a
+ * BSD-style license that can be found in the LICENSE file.
+ */
+
+library number_format_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:intl/number_symbols_data.dart';
+import 'package:intl/intl.dart';
+import 'number_test_data.dart';
+import 'dart:math';
+
+/**
+ * Tests the Numeric formatting library in dart.
+ */
+var testNumbersWeCanReadBack = {
+ "-1": -1,
+ "-2": -2.0,
+ "-0.01": -0.01,
+ "0.001": 0.001,
+ "0.01": 0.01,
+ "0.1": 0.1,
+ "1": 1,
+ "2": 2.0,
+ "10": 10,
+ "100": 100,
+ "1,000": 1000,
+ "2,000,000,000,000": 2000000000000,
+ "0.123": 0.123,
+ "1,234": 1234.0,
+ "1.234": 1.234,
+ "1.23": 1.230,
+ "NaN": double.NAN,
+ "∞": double.INFINITY,
+ "-∞": double.NEGATIVE_INFINITY,
+};
+
+/** Test numbers that we can't parse because we lose precision in formatting.*/
+var testNumbersWeCannotReadBack = {"3.142": PI,};
+
+/** Test numbers that won't work in Javascript because they're too big. */
+var testNumbersOnlyForTheVM = {
+ "10,000,000,000,000,000,000,000,000,000,000":
+ 10000000000000000000000000000000,
+};
+
+get allTestNumbers => new Map.from(testNumbersWeCanReadBack)
+ ..addAll(testNumbersWeCannotReadBack)
+ ..addAll(inJavaScript() ? {} : testNumbersOnlyForTheVM);
+
+var testExponential = const {"1E-3": 0.001, "1E-2": 0.01, "1.23E0": 1.23};
+
+// TODO(alanknight): Test against currency, which requires generating data
+// for the three different forms that this now supports.
+// TODO(alanknight): Test against scientific, which requires significant
+// digit support.
+List<NumberFormat> standardFormats(String locale) {
+ return [
+ new NumberFormat.decimalPattern(locale),
+ new NumberFormat.percentPattern(locale),
+ ];
+}
+
+// Pay no attention to the hint. This is here deliberately to have different
+// behavior in the Dart VM versus Javascript so we can distinguish the two.
+inJavaScript() => 1 is double;
+
+main() {
+ // For data from a list of locales, run each locale's data as a separate
+ // test so we can see exactly which ones pass or fail. The test data is
+ // hard-coded as printing 123, -12.3, %12,300, -1,230% in each locale.
+ var mainList = numberTestData;
+ var sortedLocales = new List.from(numberFormatSymbols.keys);
+ sortedLocales.sort((a, b) => a.compareTo(b));
+ for (var locale in sortedLocales) {
+ var testFormats = standardFormats(locale);
+ var testLength = (testFormats.length * 3) + 1;
+ var list = mainList.take(testLength).iterator;
+ mainList = mainList.skip(testLength);
+ var nextLocaleFromList = (list..moveNext()).current;
+ test("Test against ICU data for $locale", () {
+ expect(locale, nextLocaleFromList);
+ for (var format in testFormats) {
+ var formatted = format.format(123);
+ var negative = format.format(-12.3);
+ var large = format.format(1234567890);
+ var expected = (list..moveNext()).current;
+ expect(formatted, expected);
+ var expectedNegative = (list..moveNext()).current;
+ // Some of these results from CLDR have a leading LTR/RTL indicator,
+ // which we don't want. We also treat the difference between Unicode
+ // minus sign (2212) and hyphen-minus (45) as not significant.
+ expectedNegative = expectedNegative
+ .replaceAll("\u200e", "")
+ .replaceAll("\u200f", "")
+ .replaceAll("\u2212", "-");
+ expect(negative, expectedNegative);
+ var expectedLarge = (list..moveNext()).current;
+ expect(large, expectedLarge);
+ var readBack = format.parse(formatted);
+ expect(readBack, 123);
+ var readBackNegative = format.parse(negative);
+ expect(readBackNegative, -12.3);
+ var readBackLarge = format.parse(large);
+ expect(readBackLarge, 1234567890);
+ }
+ });
+ }
+
+ test('Simple set of numbers', () {
+ var number = new NumberFormat();
+ for (var x in allTestNumbers.keys) {
+ var formatted = number.format(allTestNumbers[x]);
+ expect(formatted, x);
+ if (!testNumbersWeCannotReadBack.containsKey(x)) {
+ var readBack = number.parse(formatted);
+ // Even among ones we can read back, we can't test NaN for equality.
+ if (allTestNumbers[x].isNaN) {
+ expect(readBack.isNaN, isTrue);
+ } else {
+ expect(readBack, allTestNumbers[x]);
+ }
+ }
+ }
+ });
+
+ test('Exponential form', () {
+ var number = new NumberFormat("#.###E0");
+ for (var x in testExponential.keys) {
+ var formatted = number.format(testExponential[x]);
+ expect(formatted, x);
+ var readBack = number.parse(formatted);
+ expect(testExponential[x], readBack);
+ }
+ });
+
+ test('Percent with no decimals and no integer part', () {
+ var number = new NumberFormat("#%");
+ var formatted = number.format(0.12);
+ expect(formatted, "12%");
+ var readBack = number.parse(formatted);
+ expect(0.12, readBack);
+ });
+
+ // We can't do these in the normal tests because those also format the
+ // numbers and we're reading them in a format where they won't print
+ // back the same way.
+ test('Parsing modifiers,e.g. percent, in the base format', () {
+ var number = new NumberFormat();
+ var modified = {"12%": 0.12, "12\u2030": 0.012};
+ modified.addAll(testExponential);
+ for (var x in modified.keys) {
+ var parsed = number.parse(x);
+ expect(parsed, modified[x]);
+ }
+ });
+
+ test('Explicit currency name', () {
+ var amount = 1000000.32;
+ var usConvention = new NumberFormat.currencyPattern('en_US', '€');
+ var formatted = usConvention.format(amount);
+ expect(formatted, '€1,000,000.32');
+ var readBack = usConvention.parse(formatted);
+ expect(readBack, amount);
+ var swissConvention = new NumberFormat.currencyPattern('de_CH', r'$');
+ formatted = swissConvention.format(amount);
+ var nbsp = new String.fromCharCode(0xa0);
+ expect(formatted, r"$" + nbsp + "1'000'000.32");
+ readBack = swissConvention.parse(formatted);
+ expect(readBack, amount);
+
+ /// Verify we can leave off the currency and it gets filled in.
+ var plainSwiss = new NumberFormat.currencyPattern('de_CH');
+ formatted = plainSwiss.format(amount);
+ expect(formatted, r"CHF" + nbsp + "1'000'000.32");
+ readBack = plainSwiss.parse(formatted);
+ expect(readBack, amount);
+
+ // Verify that we can pass null in order to specify the currency symbol
+ // but use the default locale.
+ var defaultLocale = new NumberFormat.currencyPattern(null, 'Smurfs');
+ formatted = defaultLocale.format(amount);
+ // We don't know what the exact format will be, but it should have Smurfs.
+ expect(formatted.contains('Smurfs'), isTrue);
+ readBack = defaultLocale.parse(formatted);
+ expect(readBack, amount);
+ });
+
+ test("Delta percent format", () {
+ var f = new NumberFormat("+#,##0%;-#,##0%");
+ expect(f.format(-0.07), "-7%");
+ expect(f.format(0.12), "+12%");
+ });
+
+ test('Unparseable', () {
+ var format = new NumberFormat.currencyPattern();
+ expect(() => format.parse("abcdefg"), throwsFormatException);
+ expect(() => format.parse(""), throwsFormatException);
+ expect(() => format.parse("1.0zzz"), throwsFormatException);
+ expect(() => format.parse("-∞+1"), throwsFormatException);
+ });
+}
« no previous file with comments | « packages/intl/test/number_closure_test.dart ('k') | packages/intl/test/number_test_data.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698