// Copyright 2013 The Closure Library Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS-IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** * @fileoverview Assert functions that account for locale data changes. * * The locale data gets updated from CLDR (http://cldr.unicode.org/), * and CLDR gets an update about twice per year. * So the locale data are expected to change. * This can make unit tests quite fragile: * assertEquals("Dec 31, 2013, 1:23pm", format); * Now imagine that the decision is made to add a dot after abbreviations, * and a comma between date and time. * The previous assert will fail, because the string is now * "Dec. 31 2013, 1:23pm" * * One option is to not unit test the results of the formatters client side, * and just trust that CLDR and closure/i18n takes care of that. * The other option is to be a more flexible when testing. * This is the role of assertI18nEquals, to centralize all the small * differences between hard-coded values in unit tests and the current result. * It allows some decupling, so that the closure/i18n can be updated without * breaking all the clients using it. * For the example above, this will succeed: * assertI18nEquals("Dec 31, 2013, 1:23pm", "Dec. 31, 2013 1:23pm"); * It does this by white-listing, no "guessing" involved. * * But I would say that the best practice is the first option: trust the * library, stop unit-testing it. */ goog.provide('goog.testing.i18n.asserts'); goog.setTestOnly('goog.testing.i18n.asserts'); goog.require('goog.testing.jsunit'); /** * A map of known tests where locale data changed, but the old values are * still tested for by various clients. * @const {!Object} * @private */ goog.testing.i18n.asserts.EXPECTED_VALUE_MAP_ = { // Data to test the assert itself, old string as key, new string as value }; /** * Asserts that the two values are "almost equal" from i18n perspective * (based on a manually maintained and validated whitelist). * @param {string} expected The expected value. * @param {string} actual The actual value. */ goog.testing.i18n.asserts.assertI18nEquals = function(expected, actual) { if (expected == actual) { return; } var newExpected = goog.testing.i18n.asserts.EXPECTED_VALUE_MAP_[expected]; if (newExpected == actual) { return; } assertEquals(expected, actual); };