58 lines
1.6 KiB
Rust
58 lines
1.6 KiB
Rust
//! Conditionally compiling tests with std and our executable with no_std.
|
|
//!
|
|
//! Rust's built in unit testing framework requires the standard library,
|
|
//! but we need to build our final executable with no_std.
|
|
//! The testing framework also generates a `main` method, so we need to only use the `#[entry]`
|
|
//! annotation when building our final image.
|
|
//! For more information on why this example works, see this excellent blog post.
|
|
//! https://os.phil-opp.com/unit-testing/
|
|
//!
|
|
//! Running this example:
|
|
//!
|
|
//! Ensure there are no targets specified under `[build]` in `.cargo/config`
|
|
//! In order to make this work, we lose the convenience of having a default target that isn't the
|
|
//! host.
|
|
//!
|
|
//! cargo build --example test_on_host --target thumbv7m-none-eabi
|
|
//! cargo test --example test_on_host
|
|
|
|
#![cfg_attr(test, allow(unused_imports))]
|
|
|
|
#![cfg_attr(not(test), no_std)]
|
|
#![cfg_attr(not(test), no_main)]
|
|
|
|
// pick a panicking behavior
|
|
#[cfg(not(test))]
|
|
extern crate panic_halt; // you can put a breakpoint on `rust_begin_unwind` to catch panics
|
|
// extern crate panic_abort; // requires nightly
|
|
// extern crate panic_itm; // logs messages over ITM; requires ITM support
|
|
// extern crate panic_semihosting; // logs messages to the host stderr; requires a debugger
|
|
|
|
use cortex_m::asm;
|
|
use cortex_m_rt::entry;
|
|
|
|
#[cfg(not(test))]
|
|
#[entry]
|
|
fn main() -> ! {
|
|
asm::nop(); // To not have main optimize to abort in release mode, remove when you add code
|
|
|
|
loop {
|
|
// your code goes here
|
|
}
|
|
}
|
|
|
|
fn add(a: i32, b: i32) -> i32 {
|
|
a + b
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod test {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn foo() {
|
|
println!("tests work!");
|
|
assert!(2 == add(1,1));
|
|
}
|
|
}
|