// Copyright (c) 2019, 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.

/// Tests for the Locale class.
///
/// Currently, the primary intention of these tests is to exercise and
/// demonstrate the API: full test coverage is a non-goal for the prototype.
///
/// For production code, use of ICU would influence what needs and doesn't need
/// to be tested.

import 'package:test/test.dart';
import 'package:intl/src/locale.dart';

import 'locale_test_data.dart';

void main() {
  group('Construction and properties:', () {
    // Simple with normalization:
    testFromSubtags('Zh', null, null, 'zh', null, null, 'zh');
    testFromSubtags('zH', null, 'cn', 'zh', null, 'CN', 'zh-CN');
    testFromSubtags('ZH', null, 'Cn', 'zh', null, 'CN', 'zh-CN');
    testFromSubtags('zh', null, 'cN', 'zh', null, 'CN', 'zh-CN');
    testFromSubtags('zh', 'hans', null, 'zh', 'Hans', null, 'zh-Hans');
    testFromSubtags('ZH', 'HANS', 'CN', 'zh', 'Hans', 'CN', 'zh-Hans-CN');

    // Region codes can be three digits.
    testFromSubtags('es', null, '419', 'es', null, '419', 'es-419');

    // While language is usually 2 characters, it can also be 3.
    testFromSubtags('CKB', 'arab', null, 'ckb', 'Arab', null, 'ckb-Arab');

    // With canonicalization:
    testFromSubtags('Iw', null, null, 'he', null, null, 'he');
    testFromSubtags('iW', null, null, 'he', null, null, 'he');
    testFromSubtags('My', null, 'Bu', 'my', null, 'MM', 'my-MM');
  });

  group('Locale.fromSubtags() FormatExceptions:', () {
    void testExceptionForSubtags(
        String language, String script, String region) {
      test('fromSubtags: "$language / $script / $region"', () {
        expect(
            () => Locale.fromSubtags(
                languageCode: language,
                scriptCode: script,
                countryCode: region),
            throwsFormatException);
      });
    }

    testExceptionForSubtags('a', null, null);
    testExceptionForSubtags('en', 'ZA', null);
    testExceptionForSubtags('en', null, 'Latn');
  });

  group('Locale normalization matching ICU.', () {
    localeParsingTestData.forEach((unnormalized, normalized) {
      test('Locale normalization: $unnormalized -> $normalized', () {
        expect(Locale.parse(unnormalized).toLanguageTag(), normalized);
      });
    });
  });

  group('Unicode LDML Locale Identifier support', () {
    // 'root' is a valid Unicode Locale Identifier, but should be taken as
    // 'und'[1]. ICU's toLanguageTag still returns 'root'.
    // [1]:
    // http://unicode.org/reports/tr35/#Unicode_Locale_Identifier_CLDR_to_BCP_47
    testParse('root', 'und', null, null, [], 'und');
    testParse('Root', 'und', null, null, [], 'und');
    testParse('ROOT', 'und', null, null, [], 'und');

    // We support underscores, whereas ICU's `forLanguageTag` does
    // not.
    testParse('CKB_arab', 'ckb', 'Arab', null, [], 'ckb-Arab');
    testParse('My_Bu', 'my', null, 'MM', [], 'my-MM');

    // Normalises tags, sorts subtags alphabetically, including variants[1]:
    // ICU is currently not sorting variants.
    // [1]: http://unicode.org/reports/tr35/#Unicode_locale_identifier
    testParse('en-scouse-fonipa', 'en', null, null, ['fonipa', 'scouse'],
        'en-fonipa-scouse');

    // Normalises tags, sorts subtags alphabetically and suppresses unneeded
    // "true" in u extension (ICU is currently not dropping -true):
    // http://unicode.org/reports/tr35/#u_Extension
    testParse('en-u-Foo-bar-nu-thai-ca-buddhist-kk-true', 'en', null, null, [],
        'en-u-bar-foo-ca-buddhist-kk-nu-thai');

    // The specification does permit empty extensions for extensions other than
    // u- and t-.
    testParse('en-a', 'en', null, null, [], 'en');
    testParse('en-x', 'en', null, null, [], 'en');
    testParse('en-z', 'en', null, null, [], 'en');

    // Normalization of `tlang` - ICU still returns -t-iw-bu.
    testParse('en-t-iw-Bu', 'en', null, null, [], 'en-t-he-mm');

    test('en-u-ca is equivalent to en-u-ca-true', () {
      expect(Locale.parse('en-u-ca').toLanguageTag(),
          Locale.parse('en-u-ca-true').toLanguageTag());
    });
  });

  // Normalization: sorting of extension subtags:
  testParse('en-z-abc-001-foo-fii-bar-u-cu-usd-co-phonebk', 'en', null, null,
      [], 'en-u-co-phonebk-cu-usd-z-abc-001-foo-fii-bar');

  group('Locale.parse() throws FormatException:', () {
    void testExceptionForId(String x) {
      test('"$x"', () {
        expect(() => Locale.parse(x), throwsFormatException);
      });
    }

    for (var badLocaleIdentifier in invalidLocales) {
      testExceptionForId(badLocaleIdentifier);
    }

    // ICU permits '', taking it as 'und', but it is not a valid Unicode Locale
    // Identifier: We reject it.
    testExceptionForId('');

    // abcd-Latn throws exceptions in our Dart implementation, whereas
    // ECMAScript's Intl.Locale permits it. This is because the BCP47 spec
    // still allows for the possible addition of 4-character languages in
    // the future, whereas the Unicode Locale Identifiers spec bans it
    // outright.
    testExceptionForId('abcd-Latn');

    // ICU permits 'root-Latn' since it conforms to pure BCP47, but it is an
    // invalid Unicode BCP47 Locale Identifier.
    testExceptionForId('root-Latn');

    // ICU permits empty tkeys.
    testExceptionForId('en-t-a0');

    // ICU permits duplicate tkeys, returning the content of -t- verbatim.
    testExceptionForId('en-t-a0-one-a0-two');

    // ICU permits duplicate keys, in this case dropping -ca-buddhist.
    testExceptionForId('en-u-ca-islamic-ca-buddhist');
  });

  group('Locale.tryParse() returns null:', () {
    for (var badLocaleIdentifier in invalidLocales) {
      test('"$badLocaleIdentifier"', () {
        expect(Locale.tryParse(badLocaleIdentifier), isNull);
      });
    }
  });

  // TODO: determine appropriate behaviour for the following examples.

  // // 'mo' is deprecated, and is a tag that ought to be replaced by *two*
  // // subtags (ro-MD), although Chrome Unstable also doesn't presently do
  // // that (replaces it by 'ro' only).
  // // TODO: check up on the Chrome implementation.
  // testParse('mo', 'ro', null, 'MD', [], 'ro-MD');

  // // Script deprecation.
  // testParse('en-Qaai', 'en', 'Zinh', null, [], 'en-Zinh');

  // // Variant deprecation.
  // testParse('sv-aaland', 'sv', null, 'AX', [], 'sv-AX');

  // // Variant deprecation.
  // testParse('en-heploc', 'en', null, null, ['alalc97'], 'en-alalc97');

  // // Variant deprecation.
  // testParse('en-polytoni', 'en', null, null, ['polyton'], 'en-polyton');

  test('Locale cannot be modified via the variants field', () {
    var l = Locale.parse('en-scotland');
    List<String> v = l.variants;
    var good = false;
    try {
      v.add('basiceng');
    } on Error {
      good = true;
    }
    expect(l.toLanguageTag(), 'en-scotland');
    expect(good, isTrue);
  });

  test('operator== and hashCode', () {
    Locale l1, l2;

    l1 = Locale.parse('en-Shaw-ZA');
    l2 = Locale.fromSubtags(
        languageCode: 'en', scriptCode: 'Shaw', countryCode: 'ZA');
    expect(l1, l2);
    expect(l1.hashCode, l2.hashCode);

    l1 = Locale.parse('en');
    l2 = Locale.fromSubtags(
        languageCode: 'en', scriptCode: null, countryCode: null);
    expect(l1, l2);
    expect(l1.hashCode, l2.hashCode);
  });
}

void testFromSubtags(
    String language,
    String script,
    String region,
    String expectedLanguage,
    String expectedScript,
    String expectedRegion,
    String expectedTag) {
  test('Locale.fromSubtags(...) with $language, $script, $region', () {
    var l = Locale.fromSubtags(
        languageCode: language, scriptCode: script, countryCode: region);
    expect(l.languageCode, expectedLanguage);
    expect(l.scriptCode, expectedScript);
    expect(l.countryCode, expectedRegion);
    expect(l.toLanguageTag(), expectedTag);
    expect(l.toString(), expectedTag);
  });
}

void testParse(
    String bcp47Tag,
    String expectedLanguage,
    String expectedScript,
    String expectedRegion,
    Iterable<String> expectedVariants,
    String expectedTag) {
  test('Locale.parse("$bcp47Tag");', () {
    var l = Locale.parse(bcp47Tag);
    expect(l.languageCode, expectedLanguage);
    expect(l.scriptCode, expectedScript);
    expect(l.countryCode, expectedRegion);
    expect(l.toLanguageTag(), expectedTag);
    expect(l.variants, orderedEquals(expectedVariants));
  });
}
