mod common;
use basic::mach::Runtime;
use common::*;
#[test]
fn test_built_in_reserved() {
let mut r = Runtime::default();
r.enter(r#"len$(0)="foo":?len$(0)"#);
assert_eq!(exec(&mut r), "foo\n");
r.enter(r#"rnd=42:?rnd"#);
assert_eq!(exec(&mut r), " 42 \n");
r.enter(r#"val(0)=42"#);
assert_eq!(exec(&mut r), "?SYNTAX ERROR; RESERVED FOR BUILT-IN\n");
r.enter(r#"time$="42""#);
assert_eq!(exec(&mut r), "?SYNTAX ERROR; RESERVED FOR BUILT-IN\n");
r.enter(r#"rnd()=42"#);
assert_eq!(exec(&mut r), "?SYNTAX ERROR; EXPECTED EXPRESSION\n");
}
#[test]
fn test_fn_abs() {
let mut r = Runtime::default();
r.enter(r#"?abs(9)abs(-9)"#);
assert_eq!(exec(&mut r), " 9 9 \n");
}
#[test]
fn test_fn_asc() {
let mut r = Runtime::default();
r.enter(r#"?asc("A")"#);
assert_eq!(exec(&mut r), " 65 \n");
}
#[test]
fn test_fn_atn() {
let mut r = Runtime::default();
r.enter(r#"?atn(3)"#);
assert_eq!(exec(&mut r), " 1.2490457 \n");
}
#[test]
fn test_fn_cdbl() {
let mut r = Runtime::default();
r.enter(r#"?cdbl(3.1)"#);
assert_eq!(exec(&mut r), " 3.0999999046325684 \n");
}
#[test]
fn test_fn_chr() {
let mut r = Runtime::default();
r.enter(r#"?chr$(65.9)"#);
assert_eq!(exec(&mut r), "A\n");
}
#[test]
fn test_fn_cint() {
let mut r = Runtime::default();
r.enter(r#"?cint(-3.7)"#);
assert_eq!(exec(&mut r), "-4 \n");
}
#[test]
fn test_fn_cos() {
let mut r = Runtime::default();
r.enter(r#"?cos(3.14159265)"#);
assert_eq!(exec(&mut r), "-1 \n");
}
#[test]
fn test_fn_csng() {
let mut r = Runtime::default();
r.enter(r#"?csng(-3.123456789)"#);
assert_eq!(exec(&mut r), "-3.1234567 \n");
}
#[test]
fn test_fn_date() {
let mut r = Runtime::default();
r.enter(r#"?len(date$)"#);
assert_eq!(exec(&mut r), " 10 \n");
}
#[test]
fn test_fn_exp() {
let mut r = Runtime::default();
r.enter(r#"?exp(-9.9)"#);
assert_eq!(exec(&mut r), " 5.01747E-5 \n");
}
#[test]
fn test_fn_fix() {
let mut r = Runtime::default();
r.enter(r#"?fix(-9.9)"#);
assert_eq!(exec(&mut r), "-9 \n");
}
#[test]
fn test_fn_hex() {
let mut r = Runtime::default();
r.enter(r#"?hex$(13)"#);
assert_eq!(exec(&mut r), "D\n");
}
#[test]
fn test_fn_instr() {
let mut r = Runtime::default();
r.enter(r#"?instr("abcdeb","b")"#);
assert_eq!(exec(&mut r), " 2 \n");
r.enter(r#"?instr(6, "abcdeb","b")"#);
assert_eq!(exec(&mut r), " 6 \n");
r.enter(r#"?instr(0, "abcdeb","b")"#);
assert_eq!(exec(&mut r), "?ILLEGAL FUNCTION CALL; START IS 0\n");
r.enter(r#"?instr(4, "abcdeb","")"#);
assert_eq!(exec(&mut r), " 4 \n");
r.enter(r#"?instr(9, "abcdeb","a")"#);
assert_eq!(exec(&mut r), " 0 \n");
r.enter(r#"?instr(2,"","a")"#);
assert_eq!(exec(&mut r), " 0 \n");
r.enter(r#"?instr("","a")"#);
assert_eq!(exec(&mut r), " 0 \n");
}
#[test]
fn test_fn_int() {
let mut r = Runtime::default();
r.enter(r#"?int(9.9)int(-9.9)"#);
assert_eq!(exec(&mut r), " 9 -10 \n");
}
#[test]
fn test_fn_left() {
let mut r = Runtime::default();
r.enter(r#"?left$("TASTY",2)"#);
assert_eq!(exec(&mut r), "TA\n");
}
#[test]
fn test_fn_len() {
let mut r = Runtime::default();
r.enter(r#"?len("TASTY")"#);
assert_eq!(exec(&mut r), " 5 \n");
}
#[test]
fn test_fn_log() {
let mut r = Runtime::default();
r.enter(r#"?log(8/37)"#);
assert_eq!(exec(&mut r), "-1.5314764 \n");
}
#[test]
fn test_fn_mid() {
let mut r = Runtime::default();
r.enter(r#"?mid$("TASTY",4)"#);
assert_eq!(exec(&mut r), "TY\n");
r.enter(r#"?mid$("TASTY",4,1)"#);
assert_eq!(exec(&mut r), "T\n");
}
#[test]
fn test_fn_oct() {
let mut r = Runtime::default();
r.enter(r#"?oct$(13)"#);
assert_eq!(exec(&mut r), "15\n");
}
#[test]
fn test_fn_pos() {
let mut r = Runtime::default();
r.enter(r#"?" ";pos()"#);
assert_eq!(exec(&mut r), " 5 \n");
r.enter(r#"?" ";pos(-10)"#);
assert_eq!(exec(&mut r), " 6 \n");
}
#[test]
fn test_fn_right() {
let mut r = Runtime::default();
r.enter(r#"?right$("TASTY",3)"#);
assert_eq!(exec(&mut r), "STY\n");
}
#[test]
fn test_fn_rnd() {
let mut r = Runtime::default();
r.enter(r#"?rnd(-1)rnd()rnd()rnd(0)rnd(1)"#);
assert_eq!(
exec(&mut r),
" 2.5737405E-2 0.6736604 0.6325681 0.6325681 0.8636829 \n"
);
r.enter(r#"?rnd(-1.61803)rnd(0)rnd()"#);
assert_eq!(exec(&mut r), " 0.2008394 0.2008394 1.7587423E-2 \n");
}
#[test]
fn test_fn_sgn() {
let mut r = Runtime::default();
r.enter(r#"?sgn(0.0);sgn(-1.0/0.0);sgn(10000000000)"#);
assert_eq!(exec(&mut r), " 0 -1 1 \n");
}
#[test]
fn test_fn_sin() {
let mut r = Runtime::default();
r.enter(r#"?sin(0.707)"#);
assert_eq!(exec(&mut r), " 0.64955574 \n");
}
#[test]
fn test_fn_spc() {
let mut r = Runtime::default();
r.enter(r#"?spc(-1)"#);
assert_eq!(exec(&mut r), "?OVERFLOW\n");
r.enter(r#"?spc(0)"#);
assert_eq!(exec(&mut r), "\n");
r.enter(r#"?spc(1)"#);
assert_eq!(exec(&mut r), " \n");
r.enter(r#"?spc(256)"#);
assert_eq!(exec(&mut r), "?OVERFLOW\n");
}
#[test]
fn test_fn_sqr() {
let mut r = Runtime::default();
r.enter(r#"?sqr(5)"#);
assert_eq!(exec(&mut r), " 2.236068 \n");
}
#[test]
fn test_fn_str() {
let mut r = Runtime::default();
r.enter(r#"?str$(5)"#);
assert_eq!(exec(&mut r), " 5\n");
}
#[test]
fn test_fn_string() {
let mut r = Runtime::default();
r.enter(r#"?string$(5,45)"#);
assert_eq!(exec(&mut r), "-----\n");
r.enter(r#"?string$(3,"^*")"#);
assert_eq!(exec(&mut r), "^^^\n");
r.enter(r#"?string$(3,"")"#);
assert_eq!(exec(&mut r), "?ILLEGAL FUNCTION CALL\n");
r.enter(r#"?string$(256,"=")"#);
assert_eq!(exec(&mut r), "?OVERFLOW\n");
r.enter(r#"?string$(-1,"=")"#);
assert_eq!(exec(&mut r), "?OVERFLOW\n");
r.enter(r#"?string$(0,"=")"#);
assert_eq!(exec(&mut r), "\n");
}
#[test]
fn test_fn_tab() {
let mut r = Runtime::default();
r.enter(r#"?tab(5)"!""#);
assert_eq!(exec(&mut r), " !\n");
}
#[test]
fn test_fn_tan() {
let mut r = Runtime::default();
r.enter(r#"?tan(5/13)"#);
assert_eq!(exec(&mut r), " 0.40477434 \n");
}
#[test]
fn test_fn_val() {
let mut r = Runtime::default();
r.enter(r#"?val(123)"#);
assert_eq!(exec(&mut r), "?TYPE MISMATCH\n");
r.enter(r#"?val("123")"#);
assert_eq!(exec(&mut r), " 123 \n");
r.enter(r#"?val("one")"#);
assert_eq!(exec(&mut r), " 0 \n");
r.enter(r#"?val(" 42 ")"#);
assert_eq!(exec(&mut r), " 42 \n");
r.enter(r#"?val("4two")"#);
assert_eq!(exec(&mut r), " 4 \n");
r.enter(r#"?val("")"#);
assert_eq!(exec(&mut r), " 0 \n");
r.enter(r#"?val("1")/3"#);
assert_eq!(exec(&mut r), " 0.3333333333333333 \n");
}