use typescript::vm::{Builtins, CallFrame, ModuleInstance, PerformanceMonitor, VM};
use typescript_types::TsValue;
#[test]
fn test_vm_basic() {
let vm = VM::new(vec![]);
assert_eq!(vm.call_stack_depth(), 0);
}
#[test]
fn test_builtins() {
let builtins = Builtins::new();
if let TsValue::Function(log) = builtins.console.get("log").unwrap() {
let result = log(&[TsValue::String("test".to_string())]);
assert!(result.is_undefined());
}
if let TsValue::Function(abs) = builtins.math.get("abs").unwrap() {
let result = abs(&[TsValue::Number(-42.0)]);
assert!(result.is_number());
assert_eq!(result.to_number(), 42.0);
}
if let TsValue::Number(pi) = builtins.math.get("PI").unwrap() {
assert!((*pi - std::f64::consts::PI).abs() < f64::EPSILON);
}
}
#[test]
fn test_call_frame() {
let mut frame = CallFrame::new("test".to_string(), 0, 0);
frame.set_local("x", TsValue::Number(42.0));
if let Some(value) = frame.get_local("x") {
assert!(value.is_number());
assert_eq!(value.to_number(), 42.0);
}
else {
panic!("Expected local variable 'x' to exist");
}
}
#[test]
fn test_module_instance() {
let mut module = ModuleInstance::new("test".to_string());
module.export("value", TsValue::Number(42.0));
if let Some(value) = module.get_export("value") {
assert!(value.is_number());
assert_eq!(value.to_number(), 42.0);
}
else {
panic!("Expected export 'value' to exist");
}
}
#[test]
fn test_performance_monitor() {
let mut monitor = PerformanceMonitor::new();
monitor.start();
monitor.record_instruction();
monitor.record_instruction();
monitor.record_call(1);
assert_eq!(monitor.instruction_count, 2);
assert_eq!(monitor.call_count, 1);
assert_eq!(monitor.max_stack_depth, 1);
assert!(monitor.elapsed_us() > 0);
}
#[test]
fn test_binary_operations() {
let vm = VM::new(vec![]);
let result = vm.binary_add(TsValue::Number(1.0), TsValue::Number(2.0)).unwrap();
assert!(result.is_number());
assert_eq!(result.to_number(), 3.0);
let result = vm.binary_sub(TsValue::Number(5.0), TsValue::Number(3.0)).unwrap();
assert!(result.is_number());
assert_eq!(result.to_number(), 2.0);
let result = vm.binary_strict_eq(TsValue::Number(1.0), TsValue::Number(1.0));
assert!(result.is_boolean());
assert_eq!(result.to_boolean(), true);
let result = vm.binary_strict_eq(TsValue::Number(1.0), TsValue::String("1".to_string()));
assert!(result.is_boolean());
assert_eq!(result.to_boolean(), false);
}