243 lines
5.0 KiB
Rust
243 lines
5.0 KiB
Rust
#[cfg(test)]
|
|
mod test {
|
|
use indoc::indoc;
|
|
use pretty_assertions::assert_eq;
|
|
|
|
#[test]
|
|
fn test_tuple_literal_declaration() -> anyhow::Result<()> {
|
|
let compiled = compile!(
|
|
debug
|
|
r#"
|
|
let (x, y) = (1, 2);
|
|
"#
|
|
);
|
|
|
|
assert_eq!(
|
|
compiled,
|
|
indoc! {
|
|
"
|
|
j main
|
|
main:
|
|
move r8 1
|
|
move r9 2
|
|
"
|
|
}
|
|
);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_tuple_literal_declaration_with_underscore() -> anyhow::Result<()> {
|
|
let compiled = compile!(
|
|
debug
|
|
r#"
|
|
let (x, _) = (1, 2);
|
|
"#
|
|
);
|
|
|
|
assert_eq!(
|
|
compiled,
|
|
indoc! {
|
|
"
|
|
j main
|
|
main:
|
|
move r8 1
|
|
"
|
|
}
|
|
);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_tuple_literal_assignment() -> anyhow::Result<()> {
|
|
let compiled = compile!(
|
|
debug
|
|
r#"
|
|
let x = 0;
|
|
let y = 0;
|
|
(x, y) = (5, 10);
|
|
"#
|
|
);
|
|
|
|
assert_eq!(
|
|
compiled,
|
|
indoc! {
|
|
"
|
|
j main
|
|
main:
|
|
move r8 0
|
|
move r9 0
|
|
move r8 5
|
|
move r9 10
|
|
"
|
|
}
|
|
);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_tuple_literal_with_variables() -> anyhow::Result<()> {
|
|
let compiled = compile!(
|
|
debug
|
|
r#"
|
|
let a = 42;
|
|
let b = 99;
|
|
let (x, y) = (a, b);
|
|
"#
|
|
);
|
|
|
|
assert_eq!(
|
|
compiled,
|
|
indoc! {
|
|
"
|
|
j main
|
|
main:
|
|
move r8 42
|
|
move r9 99
|
|
move r10 r8
|
|
move r11 r9
|
|
"
|
|
}
|
|
);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_tuple_literal_three_elements() -> anyhow::Result<()> {
|
|
let compiled = compile!(
|
|
debug
|
|
r#"
|
|
let (x, y, z) = (1, 2, 3);
|
|
"#
|
|
);
|
|
|
|
assert_eq!(
|
|
compiled,
|
|
indoc! {
|
|
"
|
|
j main
|
|
main:
|
|
move r8 1
|
|
move r9 2
|
|
move r10 3
|
|
"
|
|
}
|
|
);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_tuple_literal_assignment_with_underscore() -> anyhow::Result<()> {
|
|
let compiled = compile!(
|
|
debug
|
|
r#"
|
|
let i = 0;
|
|
let x = 123;
|
|
(i, _) = (456, 789);
|
|
"#
|
|
);
|
|
|
|
assert_eq!(
|
|
compiled,
|
|
indoc! {
|
|
"
|
|
j main
|
|
main:
|
|
move r8 0
|
|
move r9 123
|
|
move r8 456
|
|
"
|
|
}
|
|
);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_tuple_return_simple() -> anyhow::Result<()> {
|
|
let compiled = compile!(
|
|
debug
|
|
r#"
|
|
fn getPair() {
|
|
return (10, 20);
|
|
};
|
|
let (x, y) = getPair();
|
|
"#
|
|
);
|
|
|
|
// Basic structure check - should have the function label and main
|
|
assert!(compiled.contains("getPair:"));
|
|
assert!(compiled.contains("main:"));
|
|
assert!(compiled.contains("jal getPair"));
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_tuple_return_with_underscore() -> anyhow::Result<()> {
|
|
let compiled = compile!(
|
|
debug
|
|
r#"
|
|
fn getPair() {
|
|
return (5, 15);
|
|
};
|
|
let (x, _) = getPair();
|
|
"#
|
|
);
|
|
|
|
// Basic structure check
|
|
assert!(compiled.contains("getPair:"));
|
|
assert!(compiled.contains("main:"));
|
|
assert!(compiled.contains("jal getPair"));
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_tuple_return_three_elements() -> anyhow::Result<()> {
|
|
let compiled = compile!(
|
|
debug
|
|
r#"
|
|
fn getTriple() {
|
|
return (1, 2, 3);
|
|
};
|
|
let (a, b, c) = getTriple();
|
|
"#
|
|
);
|
|
|
|
// Basic structure check
|
|
assert!(compiled.contains("getTriple:"));
|
|
assert!(compiled.contains("main:"));
|
|
assert!(compiled.contains("jal getTriple"));
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_tuple_return_assignment() -> anyhow::Result<()> {
|
|
let compiled = compile!(
|
|
debug
|
|
r#"
|
|
fn getPair() {
|
|
return (42, 84);
|
|
};
|
|
let i = 0;
|
|
let j = 0;
|
|
(i, j) = getPair();
|
|
"#
|
|
);
|
|
|
|
// Basic structure check
|
|
assert!(compiled.contains("getPair:"));
|
|
assert!(compiled.contains("main:"));
|
|
assert!(compiled.contains("jal getPair"));
|
|
|
|
Ok(())
|
|
}
|
|
}
|