use hase::assemble;

#[test]
fn empty() {
    assert_eq!(assemble("").unwrap(), vec![0]);
}

#[test]
fn define_register() {
    assert_eq!(assemble("x:1").unwrap(), vec![1, 0, 1]);
}

#[test]
fn define_list() {
    assert_eq!(
        assemble("x:[1 2 3]").unwrap(),
        vec![1, 0, 3, 1, 96, 0, 1, 1, 0, 0, 1, 1, 96, 0, 2, 1, 0, 0, 1, 1, 96, 0, 3, 1, 0, 0, 1]
    );
}

#[test]
fn add_one() {
    assert_eq!(
        assemble("x:1\nx+2").unwrap(),
        vec![1, 0, 1, 1, 0b01100000, 0, 2]
    );
}

#[test]
fn return_reg() {
    assert_eq!(assemble("x:1\n=x").unwrap(), vec![1, 0, 1, 0, 193, 0, 1]);
}

#[test]
fn register_not_found() {
    assert!(assemble("y+1").is_err());
}

#[test]
fn standalone_add() {
    assert!(assemble("+").is_err());
}

#[test]
fn standalone_left() {
    assert!(assemble("<").is_err());
}

#[test]
fn two_numbers() {
    assert!(assemble("1 1").is_err());
}

#[test]
fn duplicate_register() {
    assert!(assemble("a:1\na:1").is_err());
}

#[test]
fn duplicate_label() {
    assert!(assemble("1=1\n1=1").is_err());
}

#[test]
fn jump() {
    assert_eq!(
        assemble("1=1\nn1").unwrap(),
        vec![0, 0, 192, 0, 1, 0, 160, 0, 0]
    )
}