use super::eval;
use tsrun::JsValue;
#[test]
fn test_date_now() {
let result = eval("Date.now()");
assert!(matches!(*result, JsValue::Number(_)));
}
#[test]
fn test_date_with_timestamp() {
assert_eq!(eval("new Date(0).getTime()"), JsValue::Number(0.0));
assert_eq!(eval("new Date(1000).getTime()"), JsValue::Number(1000.0));
}
#[test]
fn test_date_getfullyear() {
assert_eq!(eval("new Date(0).getFullYear()"), JsValue::Number(1970.0));
}
#[test]
fn test_date_getmonth() {
assert_eq!(eval("new Date(0).getMonth()"), JsValue::Number(0.0)); }
#[test]
fn test_date_getdate() {
assert_eq!(eval("new Date(0).getDate()"), JsValue::Number(1.0));
}
#[test]
fn test_date_utc() {
assert_eq!(eval("Date.UTC(1970, 0, 1)"), JsValue::Number(0.0));
}
#[test]
fn test_date_toisostring() {
assert_eq!(
eval("new Date(0).toISOString()"),
JsValue::from("1970-01-01T00:00:00.000Z")
);
}
#[test]
fn test_date_settime() {
assert_eq!(
eval(
r#"
const d = new Date(0);
d.setTime(1000);
d.getTime()
"#
),
JsValue::Number(1000.0)
);
}
#[test]
fn test_date_setfullyear() {
assert_eq!(
eval(
r#"
const d = new Date(0);
d.setFullYear(2000);
d.getFullYear()
"#
),
JsValue::Number(2000.0)
);
}
#[test]
fn test_date_setmonth() {
assert_eq!(
eval(
r#"
const d = new Date(0);
d.setMonth(5);
d.getMonth()
"#
),
JsValue::Number(5.0)
);
}
#[test]
fn test_date_setdate() {
assert_eq!(
eval(
r#"
const d = new Date(0);
d.setDate(15);
d.getDate()
"#
),
JsValue::Number(15.0)
);
}
#[test]
fn test_date_sethours() {
assert_eq!(
eval(
r#"
const d = new Date(0);
d.setHours(12);
d.getHours()
"#
),
JsValue::Number(12.0)
);
}
#[test]
fn test_date_setminutes() {
assert_eq!(
eval(
r#"
const d = new Date(0);
d.setMinutes(30);
d.getMinutes()
"#
),
JsValue::Number(30.0)
);
}
#[test]
fn test_date_setseconds() {
assert_eq!(
eval(
r#"
const d = new Date(0);
d.setSeconds(45);
d.getSeconds()
"#
),
JsValue::Number(45.0)
);
}
#[test]
fn test_date_setmilliseconds() {
assert_eq!(
eval(
r#"
const d = new Date(0);
d.setMilliseconds(500);
d.getMilliseconds()
"#
),
JsValue::Number(500.0)
);
}
#[test]
fn test_date_setfullyear_returns_timestamp() {
assert!(matches!(
*eval(
r#"
const d = new Date(0);
d.setFullYear(2000)
"#
),
JsValue::Number(_)
));
}
#[test]
fn test_date_tostring() {
let result = eval("new Date(0).toString()");
assert!(matches!(*result, JsValue::String(_)));
if let JsValue::String(s) = &*result {
assert!(s.to_string().contains("1970"));
}
}
#[test]
fn test_date_todatestring() {
let result = eval("new Date(0).toDateString()");
assert!(matches!(*result, JsValue::String(_)));
if let JsValue::String(s) = &*result {
let s_str = s.to_string();
assert!(s_str.contains("1970"));
assert!(s_str.contains("Jan"));
}
}
#[test]
fn test_date_totimestring() {
let result = eval("new Date(0).toTimeString()");
assert!(matches!(*result, JsValue::String(_)));
if let JsValue::String(s) = &*result {
assert!(s.to_string().contains("00:00:00"));
}
}
#[test]
fn test_date_from_iso_string() {
assert_eq!(
eval(r#"new Date("2024-12-25T10:30:00Z").toISOString()"#),
JsValue::from("2024-12-25T10:30:00.000Z")
);
}
#[test]
fn test_date_from_iso_string_no_timezone() {
assert_eq!(
eval(r#"new Date("2024-12-25T10:30:00").toISOString()"#),
JsValue::from("2024-12-25T10:30:00.000Z")
);
}
#[test]
fn test_date_from_date_string() {
assert_eq!(
eval(r#"new Date("2024-12-25").getFullYear()"#),
JsValue::Number(2024.0)
);
}
#[test]
fn test_date_from_components() {
assert_eq!(
eval("new Date(2024, 11, 25, 10, 30, 0).getFullYear()"),
JsValue::Number(2024.0)
);
assert_eq!(
eval("new Date(2024, 11, 25, 10, 30, 0).getMonth()"),
JsValue::Number(11.0)
);
assert_eq!(
eval("new Date(2024, 11, 25, 10, 30, 0).getDate()"),
JsValue::Number(25.0)
);
}
#[test]
fn test_date_getutchours() {
assert_eq!(
eval(r#"new Date("2024-07-15T14:30:45.123Z").getUTCHours()"#),
JsValue::Number(14.0)
);
}
#[test]
fn test_date_getutcminutes() {
assert_eq!(
eval(r#"new Date("2024-07-15T14:30:45.123Z").getUTCMinutes()"#),
JsValue::Number(30.0)
);
}
#[test]
fn test_date_getutcseconds() {
assert_eq!(
eval(r#"new Date("2024-07-15T14:30:45.123Z").getUTCSeconds()"#),
JsValue::Number(45.0)
);
}
#[test]
fn test_date_getutcmilliseconds() {
assert_eq!(
eval(r#"new Date("2024-07-15T14:30:45.123Z").getUTCMilliseconds()"#),
JsValue::Number(123.0)
);
}
#[test]
fn test_date_day_zero() {
assert_eq!(
eval("new Date(2024, 3, 0).getDate()"),
JsValue::Number(31.0)
);
assert_eq!(
eval("new Date(2024, 2, 0).getDate()"),
JsValue::Number(29.0)
);
assert_eq!(
eval("new Date(2023, 2, 0).getDate()"),
JsValue::Number(28.0)
);
}
#[test]
fn test_date_called_as_function() {
let result = eval("typeof Date()");
assert_eq!(result, JsValue::String("string".into()));
let result = eval("typeof Date(2024, 0, 1)");
assert_eq!(result, JsValue::String("string".into()));
let result = eval("Date()");
if let JsValue::String(s) = &*result {
assert!(
s.as_str().contains("GMT"),
"Date() should contain 'GMT': {}",
s
);
} else {
panic!("Date() should return a string");
}
}
#[test]
fn test_new_date_creates_object() {
assert_eq!(eval("typeof new Date()"), JsValue::String("object".into()));
assert_eq!(eval("typeof new Date(0)"), JsValue::String("object".into()));
}
#[test]
fn test_date_addition_uses_tostring() {
let result = eval(
r#"
var date = new Date(0);
date + date === date.toString() + date.toString()
"#,
);
assert_eq!(result, JsValue::Boolean(true));
}
#[test]
fn test_date_plus_number() {
let result = eval(
r#"
var date = new Date(0);
date + 0 === date.toString() + "0"
"#,
);
assert_eq!(result, JsValue::Boolean(true));
}
#[test]
fn test_date_plus_boolean() {
let result = eval(
r#"
var date = new Date(0);
date + true === date.toString() + "true"
"#,
);
assert_eq!(result, JsValue::Boolean(true));
}
#[test]
fn test_date_plus_object() {
let result = eval(
r#"
var date = new Date(0);
date + {} === date.toString() + "[object Object]"
"#,
);
assert_eq!(result, JsValue::Boolean(true));
}