/* The contents of this file are subject to the Netscape Public
 * License Version 1.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/NPL/
 *
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * The Original Code is Mozilla Communicator client code, released March
 * 31, 1998.
 *
 * The Initial Developer of the Original Code is Netscape Communications
 * Corporation. Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation. All
 * Rights Reserved.
 *
 * Contributor(s): 
 * 
 */
/**
    File Name:          15.9.5.36-1.js
    ECMA Section:       15.9.5.36 Date.prototype.setFullYear(year [, mon [, date ]] )
    Description:

    If mon is not specified, this behaves as if mon were specified with the
    value getMonth( ). If date is not specified, this behaves as if date were
    specified with the value getDate( ).

   1.   Let t be the result of LocalTime(this time value); but if this time
        value is NaN, let t be +0.
   2.   Call ToNumber(year).
   3.   If mon is not specified, compute MonthFromTime(t); otherwise, call
        ToNumber(mon).
   4.   If date is not specified, compute DateFromTime(t); otherwise, call
        ToNumber(date).
   5.   Compute MakeDay(Result(2), Result(3), Result(4)).
   6.   Compute UTC(MakeDate(Result(5), TimeWithinDay(t))).
   7.   Set the [[Value]] property of the this value to TimeClip(Result(6)).
   8.   Return the value of the [[Value]] property of the this value.

    Author:             christine@netscape.com
    Date:               12 november 1997

    Added test cases for Year 2000 Compatilibity Testing.

*/
    var SECTION = "15.9.5.36-2";
    var VERSION = "ECMA_1";
    startTest();

    writeHeaderToLog( SECTION + " Date.prototype.setFullYear(year [, mon [, date ]] )");

    getTestCases();
    test();

function test() {
    for ( tc=0; tc < testcases.length; tc++ ) {
        testcases[tc].passed = writeTestCaseResult(
                            testcases[tc].expect,
                            testcases[tc].actual,
                            testcases[tc].description +" = "+
                            testcases[tc].actual );

        testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value ";
    }
    stopTest();
    return ( testcases );
}
function getTestCases() {
    // 1970

    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(1970);TDATE",
                    UTCDateFromTime(SetFullYear(0,1970)),
                    LocalDateFromTime(SetFullYear(0,1970)) );

    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(1970,0);TDATE",
                    UTCDateFromTime(SetFullYear(0,1970,0)),
                    LocalDateFromTime(SetFullYear(0,1970,0)) );

    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(1970,0,1);TDATE",
                    UTCDateFromTime(SetFullYear(0,1970,0,1)),
                    LocalDateFromTime(SetFullYear(0,1970,0,1)) );
/*
    // 1971
    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(1971);TDATE",
                    UTCDateFromTime(SetFullYear(0,1971)),
                    LocalDateFromTime(SetFullYear(0,1971)) );

    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(1971,0);TDATE",
                    UTCDateFromTime(SetFullYear(0,1971,0)),
                    LocalDateFromTime(SetFullYear(0,1971,0)) );

    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(1971,0,1);TDATE",
                    UTCDateFromTime(SetFullYear(0,1971,0,1)),
                    LocalDateFromTime(SetFullYear(0,1971,0,1)) );

    // 1999
    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(1999);TDATE",
                    UTCDateFromTime(SetFullYear(0,1999)),
                    LocalDateFromTime(SetFullYear(0,1999)) );

    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(1999,11);TDATE",
                    UTCDateFromTime(SetFullYear(0,1999,11)),
                    LocalDateFromTime(SetFullYear(0,1999,11)) );

    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(1999,11,31);TDATE",
                    UTCDateFromTime(SetFullYear(0,1999,11,31)),
                    LocalDateFromTime(SetFullYear(0,1999,11,31)) );

    // 2000
    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(2000);TDATE",
                    UTCDateFromTime(SetFullYear(0,2000)),
                    LocalDateFromTime(SetFullYear(0,2000)) );

    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(2000,0);TDATE",
                    UTCDateFromTime(SetFullYear(0,2000,0)),
                    LocalDateFromTime(SetFullYear(0,2000,0)) );

    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(2000,0,1);TDATE",
                    UTCDateFromTime(SetFullYear(0,2000,0,1)),
                    LocalDateFromTime(SetFullYear(0,2000,0,1)) );

    // feb 29, 2000
    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(2000);TDATE",
                    UTCDateFromTime(SetFullYear(0,2000)),
                    LocalDateFromTime(SetFullYear(0,2000)) );

    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(2000,1);TDATE",
                    UTCDateFromTime(SetFullYear(0,2000,1)),
                    LocalDateFromTime(SetFullYear(0,2000,1)) );

    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(2000,1,29);TDATE",
                    UTCDateFromTime(SetFullYear(0,2000,1,29)),
                    LocalDateFromTime(SetFullYear(0,2000,1,29)) );

    // Jan 1, 2005
    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(2005);TDATE",
                    UTCDateFromTime(SetFullYear(0,2005)),
                    LocalDateFromTime(SetFullYear(0,2005)) );

    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(2005,0);TDATE",
                    UTCDateFromTime(SetFullYear(0,2005,0)),
                    LocalDateFromTime(SetFullYear(0,2005,0)) );

    addNewTestCase( "TDATE = new Date(0);(TDATE).setFullYear(2005,0,1);TDATE",
                    UTCDateFromTime(SetFullYear(0,2005,0,1)),
                    LocalDateFromTime(SetFullYear(0,2005,0,1)) );

*/
}
function addNewTestCase( DateString, UTCDate, LocalDate) {
    DateCase = eval( DateString );

    var item = testcases.length;

//    fixed_year = ( ExpectDate.year >=1900 || ExpectDate.year < 2000 ) ? ExpectDate.year - 1900 : ExpectDate.year;

    testcases[item++] = new TestCase( SECTION, DateString+".getTime()",             UTCDate.value,       DateCase.getTime() );
    testcases[item++] = new TestCase( SECTION, DateString+".valueOf()",             UTCDate.value,       DateCase.valueOf() );

    testcases[item++] = new TestCase( SECTION, DateString+".getUTCFullYear()",      UTCDate.year,    DateCase.getUTCFullYear() );
    testcases[item++] = new TestCase( SECTION, DateString+".getUTCMonth()",         UTCDate.month,  DateCase.getUTCMonth() );
    testcases[item++] = new TestCase( SECTION, DateString+".getUTCDate()",          UTCDate.date,   DateCase.getUTCDate() );
    testcases[item++] = new TestCase( SECTION, DateString+".getUTCDay()",           UTCDate.day,    DateCase.getUTCDay() );
    testcases[item++] = new TestCase( SECTION, DateString+".getUTCHours()",         UTCDate.hours,  DateCase.getUTCHours() );
    testcases[item++] = new TestCase( SECTION, DateString+".getUTCMinutes()",       UTCDate.minutes,DateCase.getUTCMinutes() );
    testcases[item++] = new TestCase( SECTION, DateString+".getUTCSeconds()",       UTCDate.seconds,DateCase.getUTCSeconds() );
    testcases[item++] = new TestCase( SECTION, DateString+".getUTCMilliseconds()",  UTCDate.ms,     DateCase.getUTCMilliseconds() );

    testcases[item++] = new TestCase( SECTION, DateString+".getFullYear()",         LocalDate.year,       DateCase.getFullYear() );
    testcases[item++] = new TestCase( SECTION, DateString+".getMonth()",            LocalDate.month,      DateCase.getMonth() );
    testcases[item++] = new TestCase( SECTION, DateString+".getDate()",             LocalDate.date,       DateCase.getDate() );
    testcases[item++] = new TestCase( SECTION, DateString+".getDay()",              LocalDate.day,        DateCase.getDay() );
    testcases[item++] = new TestCase( SECTION, DateString+".getHours()",            LocalDate.hours,      DateCase.getHours() );
    testcases[item++] = new TestCase( SECTION, DateString+".getMinutes()",          LocalDate.minutes,    DateCase.getMinutes() );
    testcases[item++] = new TestCase( SECTION, DateString+".getSeconds()",          LocalDate.seconds,    DateCase.getSeconds() );
    testcases[item++] = new TestCase( SECTION, DateString+".getMilliseconds()",     LocalDate.ms,         DateCase.getMilliseconds() );

    DateCase.toString = Object.prototype.toString;

    testcases[item++] = new TestCase( SECTION,
                                      DateString+".toString=Object.prototype.toString;"+DateString+".toString()",
                                      "[object Date]",
                                      DateCase.toString() );
}

function MyDate() {
    this.year = 0;
    this.month = 0;
    this.date = 0;
    this.hours = 0;
    this.minutes = 0;
    this.seconds = 0;
    this.ms = 0;
}
function LocalDateFromTime(t) {
    t = LocalTime(t);
    return ( MyDateFromTime(t) );
}
function UTCDateFromTime(t) {
 return ( MyDateFromTime(t) );
}
function MyDateFromTime( t ) {
    var d = new MyDate();
    d.year = YearFromTime(t);
    d.month = MonthFromTime(t);
    d.date = DateFromTime(t);
    d.hours = HourFromTime(t);
    d.minutes = MinFromTime(t);
    d.seconds = SecFromTime(t);
    d.ms = msFromTime(t);

    d.time = MakeTime( d.hours, d.minutes, d.seconds, d.ms );
    d.value = TimeClip( MakeDate( MakeDay( d.year, d.month, d.date ), d.time ) );
    d.day = WeekDay( d.value );

    return (d);
}
function SetFullYear( t, year, mon, date ) {
    var T = ( isNaN(t) ) ? 0 : LocalTime(t) ;
    var YEAR = Number( year );
    var MONTH = ( mon == void 0 ) ? MonthFromTime(T) : Number( mon );
    var DATE = ( date == void 0 ) ? DateFromTime(T)  : Number( date );

    var DAY = MakeDay( YEAR, MONTH, DATE );
    var UTC_DATE = UTC(MakeDate( DAY, TimeWithinDay(T)));

    return ( TimeClip(UTC_DATE) );
}