// Copyright 2012 Mozilla Corporation. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
es5id: 12.1.1_TDTO
description: >
    Tests that the set of options for the date and time components is
    processed correctly.
author: Norbert Lindenberg
includes: [testIntl.js]
---*/

var locales = [[], ["zh-Hans-CN"], ["hi-IN"], ["en-US"], ["id-ID"]];
var dates = [new Date(), new Date(0), new Date(Date.parse("1989-11-09T17:57:00Z"))];

function testWithDateTimeFormat(options, expected) {
    locales.forEach(function (locales) {
        var format = new Intl.DateTimeFormat(locales, options);
        var resolvedOptions = format.resolvedOptions();
        getDateTimeComponents().forEach(function (component) {
            if (resolvedOptions.hasOwnProperty(component)) {
                assert(expected.hasOwnProperty(component),
                        "Unrequested component " + component +
                        " added to expected subset " + JSON.stringify(expected) +
                        "; locales " + locales + ", options " +
                        (options ? JSON.stringify(options) : options) + ".");
            } else {
                assert.sameValue(expected.hasOwnProperty(component), false,
                        "Missing component " + component +
                        " from expected subset " + JSON.stringify(expected) +
                        "; locales " + locales + ", options " +
                        (options ? JSON.stringify(options) : options) + ".");
            }
        });
    });
}

function testWithToLocale(f, options, expected) {
    // expected can be either one subset or an array of possible subsets
    if (expected.length === undefined) {
        expected = [expected];
    }
    locales.forEach(function (locales) {
        dates.forEach(function (date) {
            var formatted = Date.prototype[f].call(date, locales, options);
            var expectedStrings = [];
            expected.forEach(function (expected) {
                var referenceFormat = new Intl.DateTimeFormat(locales, expected);
                expectedStrings.push(referenceFormat.format(date));
            });
            assert.notSameValue(expectedStrings.indexOf(formatted), -1,
                    "Function " + f + " did not return expected string for locales " +
                    locales + ", options " + (options? JSON.stringify(options) : options) +
                    "; expected " +
                    (expectedStrings.length === 1 ? expectedStrings[0] : "one of " + expectedStrings) +
                    ", got " + formatted + ".");
        });
    });
}   

// any/date: steps 5a, 6a, 7a
testWithDateTimeFormat(undefined, {year: "numeric", month: "numeric", day: "numeric"});

// any/date: steps 5a, 6a
testWithDateTimeFormat({year: "numeric", month: "numeric"}, {year: "numeric", month: "numeric"});

// any/date: steps 5a, 6a
testWithDateTimeFormat({hour: "numeric", minute: "numeric"}, {hour: "numeric", minute: "numeric"});

// any/all: steps 5a, 6a, 7a, 8a
testWithToLocale("toLocaleString", undefined, [
        // the first one is not guaranteed to be supported; the second one is
        {year: "numeric", month: "numeric", day: "numeric", hour: "numeric", minute: "numeric", second: "numeric"},
        {weekday: "short", year: "numeric", month: "numeric", day: "numeric", hour: "numeric", minute: "numeric", second: "numeric"}
]);

// any/all: steps 5a, 6a
testWithToLocale("toLocaleString", {year: "numeric", month: "numeric"}, {year: "numeric", month: "numeric"});

// any/all: steps 5a, 6a
testWithToLocale("toLocaleString", {hour: "numeric", minute: "numeric"}, {hour: "numeric", minute: "numeric"});

// date/date: steps 5a, 7a
testWithToLocale("toLocaleDateString", undefined, {year: "numeric", month: "numeric", day: "numeric"});

// date/date: steps 5a
testWithToLocale("toLocaleDateString", {year: "numeric", month: "numeric"}, {year: "numeric", month: "numeric"});

// date/date: steps 5a, 7a
testWithToLocale("toLocaleDateString", {hour: "numeric", minute: "numeric", second: "numeric"}, [
        // the first one is not guaranteed to be supported; the second one is
        {year: "numeric", month: "numeric", day: "numeric", hour: "numeric", minute: "numeric", second: "numeric"},
        {weekday: "short", year: "numeric", month: "numeric", day: "numeric", hour: "numeric", minute: "numeric", second: "numeric"}
]);

// time/time: steps 6a, 8a
testWithToLocale("toLocaleTimeString", undefined, {hour: "numeric", minute: "numeric", second: "numeric"});

// time/time: steps 6a, 8a
testWithToLocale("toLocaleTimeString", {weekday: "short", year: "numeric", month: "numeric", day: "numeric"},
    {weekday: "short", year: "numeric", month: "numeric", day: "numeric", hour: "numeric", minute: "numeric", second: "numeric"});

// time/time: steps 6a
testWithToLocale("toLocaleTimeString", {hour: "numeric", minute: "numeric"}, {hour: "numeric", minute: "numeric"});
