use crate::eval::{bc::opcode::BcOpcode, tests::bc::test_instrs};
#[test]
fn test_x_and_true() {
test_instrs(
&[
BcOpcode::LoadLocal,
BcOpcode::Dup,
BcOpcode::IfNotBr,
BcOpcode::Pop,
BcOpcode::Const,
BcOpcode::Return,
],
"def test(x): return x and True",
)
}
#[test]
fn test_x_and_false() {
test_instrs(
&[
BcOpcode::LoadLocal,
BcOpcode::Dup,
BcOpcode::IfNotBr,
BcOpcode::Pop,
BcOpcode::Const,
BcOpcode::Return,
],
"def test(x): return x and False",
)
}
#[test]
fn test_x_or_true() {
test_instrs(
&[
BcOpcode::LoadLocal,
BcOpcode::Dup,
BcOpcode::IfBr,
BcOpcode::Pop,
BcOpcode::Const,
BcOpcode::Return,
],
"def test(x): return x or True",
)
}
#[test]
fn test_x_or_false() {
test_instrs(
&[
BcOpcode::LoadLocal,
BcOpcode::Dup,
BcOpcode::IfBr,
BcOpcode::Pop,
BcOpcode::Const,
BcOpcode::Return,
],
"def test(x): return x or False",
)
}
#[test]
fn test_true_and_x() {
test_instrs(
&[BcOpcode::LoadLocal, BcOpcode::Return],
"def test(x): return True and x",
)
}
#[test]
fn test_false_and_x() {
test_instrs(&[BcOpcode::ReturnConst], "def test(x): return False and x")
}
#[test]
fn test_true_or_x() {
test_instrs(&[BcOpcode::ReturnConst], "def test(x): return True or x")
}
#[test]
fn test_false_or_x() {
test_instrs(
&[BcOpcode::LoadLocal, BcOpcode::Return],
"def test(x): return False or x",
)
}