225 lines
4.0 KiB
Rust
225 lines
4.0 KiB
Rust
use indoc::indoc;
|
|
use pretty_assertions::assert_eq;
|
|
|
|
#[test]
|
|
fn device_declaration() -> anyhow::Result<()> {
|
|
let compiled = compile! {
|
|
debug "
|
|
device d0 = \"d0\";
|
|
"
|
|
};
|
|
|
|
// Declaration only emits the jump label header
|
|
assert_eq!(compiled, "j main\n");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn device_property_read() -> anyhow::Result<()> {
|
|
let compiled = compile! {
|
|
debug "
|
|
device ac = \"d0\";
|
|
let temp = ac.Temperature;
|
|
"
|
|
};
|
|
|
|
assert_eq!(
|
|
compiled,
|
|
indoc! {
|
|
"
|
|
j main
|
|
main:
|
|
l r1 d0 Temperature
|
|
move r8 r1
|
|
"
|
|
}
|
|
);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn device_property_write() -> anyhow::Result<()> {
|
|
let compiled = compile! {
|
|
debug "
|
|
device ac = \"d0\";
|
|
ac.On = 1;
|
|
"
|
|
};
|
|
|
|
assert_eq!(
|
|
compiled,
|
|
indoc! {
|
|
"
|
|
j main
|
|
main:
|
|
s d0 On 1
|
|
"
|
|
}
|
|
);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn multiple_device_declarations() -> anyhow::Result<()> {
|
|
let compiled = compile! {
|
|
debug "
|
|
device d0 = \"d0\";
|
|
device d1 = \"d1\";
|
|
device d2 = \"d2\";
|
|
"
|
|
};
|
|
|
|
// Declarations only emit the header when unused
|
|
assert_eq!(compiled, "j main\n");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn device_with_variable_interaction() -> anyhow::Result<()> {
|
|
let compiled = compile! {
|
|
debug "
|
|
device sensor = \"d0\";
|
|
let reading = sensor.Temperature;
|
|
let threshold = 373.15;
|
|
let alert = reading > threshold;
|
|
"
|
|
};
|
|
|
|
assert_eq!(
|
|
compiled,
|
|
indoc! {
|
|
"
|
|
j main
|
|
main:
|
|
l r1 d0 Temperature
|
|
move r8 r1
|
|
move r9 373.15
|
|
sgt r2 r8 r9
|
|
move r10 r2
|
|
"
|
|
}
|
|
);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn device_property_in_arithmetic() -> anyhow::Result<()> {
|
|
let compiled = compile! {
|
|
debug "
|
|
device d0 = \"d0\";
|
|
let result = d0.Temperature + 100;
|
|
"
|
|
};
|
|
|
|
// Verify that we load property, add 100, and move to result
|
|
assert_eq!(
|
|
compiled,
|
|
indoc! {
|
|
"
|
|
j main
|
|
main:
|
|
l r1 d0 Temperature
|
|
add r2 r1 100
|
|
move r8 r2
|
|
"
|
|
}
|
|
);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn device_used_in_function() -> anyhow::Result<()> {
|
|
let compiled = compile! {
|
|
debug "
|
|
device d0 = \"d0\";
|
|
|
|
fn check_power() {
|
|
return d0.On;
|
|
};
|
|
|
|
let powered = check_power();
|
|
"
|
|
};
|
|
|
|
assert_eq!(
|
|
compiled,
|
|
indoc! {
|
|
"
|
|
j main
|
|
check_power:
|
|
push ra
|
|
l r1 d0 On
|
|
move r15 r1
|
|
j __internal_L1
|
|
__internal_L1:
|
|
pop ra
|
|
j ra
|
|
main:
|
|
jal check_power
|
|
move r8 r15
|
|
"
|
|
}
|
|
);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn device_in_conditional() -> anyhow::Result<()> {
|
|
let compiled = compile! {
|
|
debug "
|
|
device d0 = \"d0\";
|
|
|
|
if (d0.On) {
|
|
let x = 1;
|
|
}
|
|
"
|
|
};
|
|
|
|
assert_eq!(
|
|
compiled,
|
|
indoc! {
|
|
"
|
|
j main
|
|
main:
|
|
l r1 d0 On
|
|
beqz r1 __internal_L1
|
|
move r8 1
|
|
__internal_L1:
|
|
"
|
|
}
|
|
);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn device_property_with_underscore_name() -> anyhow::Result<()> {
|
|
let compiled = compile! {
|
|
debug "
|
|
device cool_device = \"d0\";
|
|
let value = cool_device.SomeProperty;
|
|
"
|
|
};
|
|
|
|
assert_eq!(
|
|
compiled,
|
|
indoc! {
|
|
"
|
|
j main
|
|
main:
|
|
l r1 d0 SomeProperty
|
|
move r8 r1
|
|
"
|
|
}
|
|
);
|
|
|
|
Ok(())
|
|
}
|