mirror of
https://github.com/rust-lang/cargo
synced 2024-10-02 22:13:47 +00:00
Test for rustc-macro
This commit is contained in:
parent
1a50cc02ab
commit
5cfc4fb629
146
tests/rustc-macro.rs
Normal file
146
tests/rustc-macro.rs
Normal file
|
@ -0,0 +1,146 @@
|
|||
extern crate cargotest;
|
||||
extern crate hamcrest;
|
||||
|
||||
use cargotest::is_nightly;
|
||||
use cargotest::support::{project, execs};
|
||||
use hamcrest::assert_that;
|
||||
|
||||
#[test]
|
||||
fn noop() {
|
||||
if !is_nightly() {
|
||||
return;
|
||||
}
|
||||
|
||||
let client = project("client")
|
||||
.file("Cargo.toml", r#"
|
||||
[package]
|
||||
name = "client"
|
||||
version = "0.0.1"
|
||||
authors = []
|
||||
|
||||
[dependencies.noop]
|
||||
path = "../noop"
|
||||
"#)
|
||||
.file("src/main.rs", r#"
|
||||
#![feature(rustc_macro)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate noop;
|
||||
|
||||
#[derive(Noop)]
|
||||
struct X;
|
||||
|
||||
fn main() {}
|
||||
"#);
|
||||
let noop = project("noop")
|
||||
.file("Cargo.toml", r#"
|
||||
[package]
|
||||
name = "noop"
|
||||
version = "0.0.1"
|
||||
authors = []
|
||||
|
||||
[lib]
|
||||
rustc-macro = true
|
||||
"#)
|
||||
.file("src/lib.rs", r#"
|
||||
#![feature(rustc_macro, rustc_macro_lib)]
|
||||
|
||||
extern crate rustc_macro;
|
||||
use rustc_macro::TokenStream;
|
||||
|
||||
#[rustc_macro_derive(Noop)]
|
||||
pub fn noop(input: TokenStream) -> TokenStream {
|
||||
input
|
||||
}
|
||||
"#);
|
||||
noop.build();
|
||||
|
||||
assert_that(client.cargo_process("build"),
|
||||
execs().with_status(0));
|
||||
assert_that(client.cargo("build"),
|
||||
execs().with_status(0));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn impl_and_derive() {
|
||||
if !is_nightly() {
|
||||
return;
|
||||
}
|
||||
|
||||
let client = project("client")
|
||||
.file("Cargo.toml", r#"
|
||||
[package]
|
||||
name = "client"
|
||||
version = "0.0.1"
|
||||
authors = []
|
||||
|
||||
[dependencies.transmogrify]
|
||||
path = "../transmogrify"
|
||||
"#)
|
||||
.file("src/main.rs", r#"
|
||||
#![feature(rustc_macro)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate transmogrify;
|
||||
|
||||
trait ImplByTransmogrify {
|
||||
fn impl_by_transmogrify(&self) -> bool;
|
||||
}
|
||||
|
||||
#[derive(Transmogrify)]
|
||||
struct X;
|
||||
|
||||
fn main() {
|
||||
let x = X::new();
|
||||
assert!(x.impl_by_transmogrify());
|
||||
println!("{:?}", x);
|
||||
}
|
||||
"#);
|
||||
let transmogrify = project("transmogrify")
|
||||
.file("Cargo.toml", r#"
|
||||
[package]
|
||||
name = "transmogrify"
|
||||
version = "0.0.1"
|
||||
authors = []
|
||||
|
||||
[lib]
|
||||
rustc-macro = true
|
||||
"#)
|
||||
.file("src/lib.rs", r#"
|
||||
#![feature(rustc_macro, rustc_macro_lib)]
|
||||
|
||||
extern crate rustc_macro;
|
||||
use rustc_macro::TokenStream;
|
||||
|
||||
#[rustc_macro_derive(Transmogrify)]
|
||||
#[doc(hidden)]
|
||||
pub fn transmogrify(input: TokenStream) -> TokenStream {
|
||||
assert_eq!(input.to_string(), "struct X;\n");
|
||||
|
||||
"
|
||||
impl X {
|
||||
fn new() -> Self {
|
||||
X { success: true }
|
||||
}
|
||||
}
|
||||
|
||||
impl ImplByTransmogrify for X {
|
||||
fn impl_by_transmogrify(&self) -> bool {
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct X {
|
||||
success: bool,
|
||||
}
|
||||
".parse().unwrap()
|
||||
}
|
||||
"#);
|
||||
transmogrify.build();
|
||||
|
||||
assert_that(client.cargo_process("build"),
|
||||
execs().with_status(0));
|
||||
assert_that(client.cargo("run"),
|
||||
execs().with_status(0).with_stdout("X { success: true }"));
|
||||
}
|
Loading…
Reference in a new issue