Garrit Franke
2 years ago
2 changed files with 0 additions and 148 deletions
@ -1,147 +0,0 @@
|
||||
/**
|
||||
* Copyright 2021 Alexey Yerin |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
#[test] |
||||
fn qbe_value() { |
||||
let val = qbe::Value::Temporary("temp42".into()); |
||||
assert_eq!(format!("{}", val), "%temp42"); |
||||
|
||||
let val = qbe::Value::Global("main".into()); |
||||
assert_eq!(format!("{}", val), "$main"); |
||||
|
||||
let val = qbe::Value::Const(1337); |
||||
assert_eq!(format!("{}", val), "1337"); |
||||
} |
||||
|
||||
#[test] |
||||
fn block() { |
||||
let blk = qbe::Block { |
||||
label: "start".into(), |
||||
statements: vec![qbe::Statement::Volatile(qbe::Instr::Ret(None))], |
||||
}; |
||||
|
||||
let formatted = format!("{}", blk); |
||||
let mut lines = formatted.lines(); |
||||
assert_eq!(lines.next().unwrap(), "@start"); |
||||
assert_eq!(lines.next().unwrap(), "\tret"); |
||||
|
||||
let blk = qbe::Block { |
||||
label: "start".into(), |
||||
statements: vec![ |
||||
qbe::Statement::Assign( |
||||
qbe::Value::Temporary("foo".into()), |
||||
qbe::Type::Word, |
||||
qbe::Instr::Add(qbe::Value::Const(2), qbe::Value::Const(2)), |
||||
), |
||||
qbe::Statement::Volatile(qbe::Instr::Ret(Some(qbe::Value::Temporary("foo".into())))), |
||||
], |
||||
}; |
||||
|
||||
let formatted = format!("{}", blk); |
||||
let mut lines = formatted.lines(); |
||||
assert_eq!(lines.next().unwrap(), "@start"); |
||||
assert_eq!(lines.next().unwrap(), "\t%foo =w add 2, 2"); |
||||
assert_eq!(lines.next().unwrap(), "\tret %foo"); |
||||
} |
||||
|
||||
#[test] |
||||
fn function() { |
||||
let func = qbe::Function { |
||||
linkage: qbe::Linkage::public(), |
||||
return_ty: None, |
||||
name: "main".into(), |
||||
arguments: Vec::new(), |
||||
blocks: vec![qbe::Block { |
||||
label: "start".into(), |
||||
statements: vec![qbe::Statement::Volatile(qbe::Instr::Ret(None))], |
||||
}], |
||||
}; |
||||
|
||||
let formatted = format!("{}", func); |
||||
let mut lines = formatted.lines(); |
||||
assert_eq!(lines.next().unwrap(), "export function $main() {"); |
||||
assert_eq!(lines.next().unwrap(), "@start"); |
||||
assert_eq!(lines.next().unwrap(), "\tret"); |
||||
assert_eq!(lines.next().unwrap(), "}"); |
||||
} |
||||
|
||||
#[test] |
||||
fn datadef() { |
||||
let datadef = qbe::DataDef { |
||||
linkage: qbe::Linkage::public(), |
||||
name: "hello".into(), |
||||
align: None, |
||||
items: vec![ |
||||
(qbe::Type::Byte, qbe::DataItem::Str("Hello, World!".into())), |
||||
(qbe::Type::Byte, qbe::DataItem::Const(0)), |
||||
], |
||||
}; |
||||
|
||||
let formatted = format!("{}", datadef); |
||||
assert_eq!( |
||||
formatted, |
||||
"export data $hello = { b \"Hello, World!\", b 0 }" |
||||
); |
||||
} |
||||
|
||||
#[test] |
||||
fn typedef() { |
||||
let typedef = qbe::TypeDef { |
||||
name: "person".into(), |
||||
align: None, |
||||
items: vec![ |
||||
(qbe::Type::Long, 1), |
||||
(qbe::Type::Word, 2), |
||||
(qbe::Type::Byte, 1), |
||||
], |
||||
}; |
||||
|
||||
let formatted = format!("{}", typedef); |
||||
assert_eq!(formatted, "type :person = { l, w 2, b }"); |
||||
} |
||||
|
||||
#[test] |
||||
fn type_into_abi() { |
||||
// Base types and aggregates should stay unchanged
|
||||
let unchanged = |ty: qbe::Type| assert_eq!(ty.clone().into_abi(), ty); |
||||
unchanged(qbe::Type::Word); |
||||
unchanged(qbe::Type::Long); |
||||
unchanged(qbe::Type::Single); |
||||
unchanged(qbe::Type::Double); |
||||
unchanged(qbe::Type::Aggregate("foo".into())); |
||||
|
||||
// Extended types are transformed into closest base types
|
||||
assert_eq!(qbe::Type::Byte.into_abi(), qbe::Type::Word); |
||||
assert_eq!(qbe::Type::Halfword.into_abi(), qbe::Type::Word); |
||||
} |
||||
|
||||
#[test] |
||||
fn type_into_base() { |
||||
// Base types should stay unchanged
|
||||
let unchanged = |ty: qbe::Type| assert_eq!(ty.clone().into_base(), ty); |
||||
unchanged(qbe::Type::Word); |
||||
unchanged(qbe::Type::Long); |
||||
unchanged(qbe::Type::Single); |
||||
unchanged(qbe::Type::Double); |
||||
|
||||
// Extended and aggregate types are transformed into closest base types
|
||||
assert_eq!(qbe::Type::Byte.into_base(), qbe::Type::Word); |
||||
assert_eq!(qbe::Type::Halfword.into_base(), qbe::Type::Word); |
||||
assert_eq!( |
||||
qbe::Type::Aggregate("foo".into()).into_base(), |
||||
qbe::Type::Long |
||||
); |
||||
} |
Loading…
Reference in new issue