// 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 intl_test;

import 'package:intl/intl.dart';
import 'package:unittest/unittest.dart';
import 'package:intl/date_symbol_data_local.dart';

main() {
  test("Locale setting doesn't verify the core locale", () {
    var de = new Intl('de_DE');
    expect(de.locale, equals('de_DE'));
  });

  test('DateFormat creation does verify the locale', () {
    // TODO(alanknight): We need to make the locale verification be on a per
    // usage basis rather than once for the entire Intl object. The set of
    // locales covered for messages may be different from that for date
    // formatting.
    initializeDateFormatting('de_DE', null).then((_) {
      var de = new Intl('de_DE');
      var format = de.date().add_d();
      expect(format.locale, equals('de'));
    });
  });

  test("Canonicalizing locales", () {
    expect(Intl.canonicalizedLocale('en-us'), 'en_US');
    expect(Intl.canonicalizedLocale('en_us'), 'en_US');
    expect(Intl.canonicalizedLocale('en_US'), 'en_US');
    expect(Intl.canonicalizedLocale('xx-yyy'), 'xx_YYY');
    expect(Intl.canonicalizedLocale('xx_YYY'), 'xx_YYY');
    expect(Intl.canonicalizedLocale('C'), 'en_ISO');
  });

  test("Verifying locale fallback for numbers", () {
    expect(Intl.verifiedLocale('en-us', NumberFormat.localeExists), 'en_US');
    expect(Intl.verifiedLocale('en_us', NumberFormat.localeExists), 'en_US');
    expect(Intl.verifiedLocale('es-419', NumberFormat.localeExists), 'es_419');
    expect(Intl.verifiedLocale('en-ZZ', NumberFormat.localeExists), 'en');
    expect(Intl.verifiedLocale('es-999', NumberFormat.localeExists), 'es');

    void checkAsNumberDefault(String locale, String expected) {
      var oldDefault = Intl.defaultLocale;
      Intl.defaultLocale = locale;
      var format = new NumberFormat();
      expect(format.locale, expected);
      Intl.defaultLocale = oldDefault;
    }

    checkAsNumberDefault('en-us', 'en_US');
    checkAsNumberDefault('en_us', 'en_US');
    checkAsNumberDefault('es-419', 'es_419');
    checkAsNumberDefault('en-ZZ', 'en');
    checkAsNumberDefault('es-999', 'es');
  });

  test("Verifying locale fallback for dates", () {
    expect(Intl.verifiedLocale('en-us', DateFormat.localeExists), 'en_US');
    expect(Intl.verifiedLocale('en_us', DateFormat.localeExists), 'en_US');
    expect(Intl.verifiedLocale('es-419', DateFormat.localeExists), 'es_419');
    expect(Intl.verifiedLocale('en-ZZ', DateFormat.localeExists), 'en');
    expect(Intl.verifiedLocale('es-999', DateFormat.localeExists), 'es');

    void checkAsDateDefault(String locale, String expected) {
      var oldDefault = Intl.defaultLocale;
      Intl.defaultLocale = locale;
      var format = new DateFormat();
      expect(format.locale, expected);
      Intl.defaultLocale = oldDefault;
    }

    checkAsDateDefault('en-us', 'en_US');
    checkAsDateDefault('en_us', 'en_US');
    checkAsDateDefault('es-419', 'es_419');
    checkAsDateDefault('en-ZZ', 'en');
    checkAsDateDefault('es-999', 'es');
  });

  test("toBeginningOfSentenceCase", () {
    expect(toBeginningOfSentenceCase(null), null);
    expect(toBeginningOfSentenceCase(""), "");
    expect(toBeginningOfSentenceCase("A"), "A");
    expect(toBeginningOfSentenceCase("a"), "A");
    expect(toBeginningOfSentenceCase("abc"), "Abc");
    expect(toBeginningOfSentenceCase("[a]"), "[a]");
    expect(toBeginningOfSentenceCase("ABc"), "ABc");
    expect(toBeginningOfSentenceCase("ı"), "I");
    expect(toBeginningOfSentenceCase("i"), "I");
    expect(toBeginningOfSentenceCase("i", "tr"), "\u0130");
  });
}
