// Copyright 2009 the Sputnik authors.  All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-date-year-month-date-hours-minutes-seconds-ms
info: |
    All of the arguments are optional, any arguments supplied are
    accepted but are completely ignored. A string is created and returned as
    if by the expression (new Date()).toString()
es5id: 15.9.2.1_A2
description: Use various number arguments and various types of ones
---*/

function isEqual(d1, d2) {
  if (d1 === d2) {
    return true;
  } else if (Math.abs(Date.parse(d1) - Date.parse(d2)) <= 1000) {
    return true;
  } else {
    return false;
  }
}

//CHECK#1
if( !isEqual(Date(), (new Date()).toString()) ) {
  $ERROR('#1: Date() is equal to (new Date()).toString()');
}

//CHECK#2
if( !isEqual(Date(1), (new Date()).toString()) ) {
  $ERROR('#2: Date(1) is equal to (new Date()).toString()');
}

//CHECK#3
if( !isEqual(Date(1970, 1), (new Date()).toString()) ) {
  $ERROR('#3: Date(1970, 1) is equal to (new Date()).toString()');
}

//CHECK#4
if( !isEqual(Date(1970, 1, 1), (new Date()).toString()) ) {
  $ERROR('#4: Date(1970, 1, 1) is equal to (new Date()).toString()');
}

//CHECK#5
if( !isEqual(Date(1970, 1, 1, 1), (new Date()).toString()) ) {
  $ERROR('#5: Date(1970, 1, 1, 1) is equal to (new Date()).toString()');
}

//CHECK#6
if( !isEqual(Date(1970, 1, 1, 1), (new Date()).toString()) ) {
  $ERROR('#7: Date(1970, 1, 1, 1) is equal to (new Date()).toString()');
}

//CHECK#8
if( !isEqual(Date(1970, 1, 1, 1, 0), (new Date()).toString()) ) {
  $ERROR('#8: Date(1970, 1, 1, 1, 0) is equal to (new Date()).toString()');
}

//CHECK#9
if( !isEqual(Date(1970, 1, 1, 1, 0, 0), (new Date()).toString()) ) {
  $ERROR('#9: Date(1970, 1, 1, 1, 0, 0) is equal to (new Date()).toString()');
}

//CHECK#10
if( !isEqual(Date(1970, 1, 1, 1, 0, 0, 0), (new Date()).toString()) ) {
  $ERROR('#10: Date(1970, 1, 1, 1, 0, 0, 0) is equal to (new Date()).toString()');
}

//CHECK#11
if( !isEqual(Date(Number.NaN), (new Date()).toString()) ) {
  $ERROR('#11: Date(Number.NaN) is equal to (new Date()).toString()');
}

//CHECK#12
if( !isEqual(Date(Number.POSITIVE_INFINITY), (new Date()).toString()) ) {
  $ERROR('#12: Date(Number.POSITIVE_INFINITY) is equal to (new Date()).toString()');
}

//CHECK#13
if( !isEqual(Date(Number.NEGATIVE_INFINITY), (new Date()).toString()) ) {
  $ERROR('#13: Date(Number.NEGATIVE_INFINITY) is equal to (new Date()).toString()');
}

//CHECK#14
if( !isEqual(Date(undefined), (new Date()).toString()) ) {
  $ERROR('#14: Date(undefined) is equal to (new Date()).toString()');
}

//CHECK#15
if( !isEqual(Date(null), (new Date()).toString()) ) {
  $ERROR('#15: Date(null) is equal to (new Date()).toString()');
}
