// 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.
// @dart=2.9

/// Test date formatting and parsing using locale data which is available
/// directly in the program as a constant.

library date_time_format_test;

import 'dart:async';
import 'package:test/test.dart';
import 'package:intl/intl.dart';
import 'date_time_format_test_core.dart';

typedef TestListFunc = List<String> Function();

typedef InitializeDateFormattingFunc = Future<void> Function(
    String locale, String filePath);

/// Return only the odd-numbered locales. A simple way to divide the list into
/// two roughly equal parts.
List<String> oddLocales() {
  var i = 1;
  return allLocales().where((x) => (i++).isOdd).toList();
}

/// Return a set of a few locales to run just the tests on a small sample.
List<String> smallSetOfLocales() {
  return allLocales().sublist(0, 10);
}

/// Return only the even-numbered locales. A simple way to divide the list into
/// two roughly equal parts.
List<String> evenLocales() {
  var i = 1;
  return allLocales().where((x) => !(i++).isOdd).toList();
}

void runWith(TestListFunc getSubset, String dir,
    InitializeDateFormattingFunc initFunction) {
  // Initialize one locale just so we know what the list is.
  // Also, note that we take the list of locales as a function so that we don't
  // evaluate it until after we know that all the locales are available.

  var initialized = false;

  setUp(() {
    if (initialized) {
      return null;
    }
    return initFunction('en_US', dir).then((_) {
      return Future.forEach(DateFormat.allLocalesWithSymbols(), (locale) {
        return initFunction(locale, dir);
      });
    }).then((_) {
      initialized = true;
    });
  });

  runDateTests(getSubset);
}
