// 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.

/// 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:unittest/unittest.dart';
import 'package:intl/intl.dart';
import 'date_time_format_test_core.dart';

typedef List<String> TestListFunc();

typedef Future InitializeDateFormattingFunc(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() {
  int 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() {
  int 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.

  bool 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);
}
