cargo/tests/testsuite/proc_macro.rs
Dale Wijnand f8c9928cc1
Rework some test projects to use the "foo" default
Generally that means either switching "foo" and "bar" around (reversing
the arrow), or it means push "foo" to "bar" (and sometimes "bar" to
"baz", etc..) to free up "foo".

For trivia that leaves 80/1222 outliers, therefore 93.4% of test
project use the default. :)
2018-07-21 19:40:45 +01:00

302 lines
6.5 KiB
Rust

use cargotest::is_nightly;
use cargotest::support::{execs, project};
use hamcrest::assert_that;
#[test]
fn probe_cfg_before_crate_type_discovery() {
let p = project()
.file(
"Cargo.toml",
r#"
[package]
name = "foo"
version = "0.0.1"
authors = []
[target.'cfg(not(stage300))'.dependencies.noop]
path = "../noop"
"#,
)
.file(
"src/main.rs",
r#"
#[macro_use]
extern crate noop;
#[derive(Noop)]
struct X;
fn main() {}
"#,
)
.build();
let _noop = project().at("noop")
.file(
"Cargo.toml",
r#"
[package]
name = "noop"
version = "0.0.1"
authors = []
[lib]
proc-macro = true
"#,
)
.file(
"src/lib.rs",
r#"
extern crate proc_macro;
use proc_macro::TokenStream;
#[proc_macro_derive(Noop)]
pub fn noop(_input: TokenStream) -> TokenStream {
"".parse().unwrap()
}
"#,
)
.build();
assert_that(p.cargo("build"), execs().with_status(0));
}
#[test]
fn noop() {
let p = project()
.file(
"Cargo.toml",
r#"
[package]
name = "foo"
version = "0.0.1"
authors = []
[dependencies.noop]
path = "../noop"
"#,
)
.file(
"src/main.rs",
r#"
#[macro_use]
extern crate noop;
#[derive(Noop)]
struct X;
fn main() {}
"#,
)
.build();
let _noop = project().at("noop")
.file(
"Cargo.toml",
r#"
[package]
name = "noop"
version = "0.0.1"
authors = []
[lib]
proc-macro = true
"#,
)
.file(
"src/lib.rs",
r#"
extern crate proc_macro;
use proc_macro::TokenStream;
#[proc_macro_derive(Noop)]
pub fn noop(_input: TokenStream) -> TokenStream {
"".parse().unwrap()
}
"#,
)
.build();
assert_that(p.cargo("build"), execs().with_status(0));
assert_that(p.cargo("build"), execs().with_status(0));
}
#[test]
fn impl_and_derive() {
let p = project()
.file(
"Cargo.toml",
r#"
[package]
name = "foo"
version = "0.0.1"
authors = []
[dependencies.transmogrify]
path = "../transmogrify"
"#,
)
.file(
"src/main.rs",
r#"
#[macro_use]
extern crate transmogrify;
trait ImplByTransmogrify {
fn impl_by_transmogrify(&self) -> bool;
}
#[derive(Transmogrify, Debug)]
struct X { success: bool }
fn main() {
let x = X::new();
assert!(x.impl_by_transmogrify());
println!("{:?}", x);
}
"#,
)
.build();
let _transmogrify = project().at("transmogrify")
.file(
"Cargo.toml",
r#"
[package]
name = "transmogrify"
version = "0.0.1"
authors = []
[lib]
proc-macro = true
"#,
)
.file(
"src/lib.rs",
r#"
extern crate proc_macro;
use proc_macro::TokenStream;
#[proc_macro_derive(Transmogrify)]
#[doc(hidden)]
pub fn transmogrify(input: TokenStream) -> TokenStream {
"
impl X {
fn new() -> Self {
X { success: true }
}
}
impl ImplByTransmogrify for X {
fn impl_by_transmogrify(&self) -> bool {
true
}
}
".parse().unwrap()
}
"#,
)
.build();
assert_that(p.cargo("build"), execs().with_status(0));
assert_that(
p.cargo("run"),
execs().with_status(0).with_stdout("X { success: true }"),
);
}
#[test]
fn plugin_and_proc_macro() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
r#"
[package]
name = "foo"
version = "0.0.1"
authors = []
[lib]
plugin = true
proc-macro = true
"#,
)
.file(
"src/lib.rs",
r#"
#![feature(plugin_registrar, rustc_private)]
#![feature(proc_macro, proc_macro_lib)]
extern crate rustc_plugin;
use rustc_plugin::Registry;
extern crate proc_macro;
use proc_macro::TokenStream;
#[plugin_registrar]
pub fn plugin_registrar(reg: &mut Registry) {}
#[proc_macro_derive(Questionable)]
pub fn questionable(input: TokenStream) -> TokenStream {
input
}
"#,
)
.build();
let msg = " lib.plugin and lib.proc-macro cannot both be true";
assert_that(
p.cargo("build"),
execs().with_status(101).with_stderr_contains(msg),
);
}
#[test]
fn proc_macro_doctest() {
let foo = project()
.file(
"Cargo.toml",
r#"
[package]
name = "foo"
version = "0.1.0"
authors = []
[lib]
proc-macro = true
"#,
)
.file(
"src/lib.rs",
r#"
#![crate_type = "proc-macro"]
extern crate proc_macro;
use proc_macro::TokenStream;
/// ```
/// assert!(true);
/// ```
#[proc_macro_derive(Bar)]
pub fn derive(_input: TokenStream) -> TokenStream {
"".parse().unwrap()
}
#[test]
fn a() {
assert!(true);
}
"#,
)
.build();
assert_that(
foo.cargo("test"),
execs()
.with_status(0)
.with_stdout_contains("test a ... ok")
.with_stdout_contains_n("test [..] ... ok", 2),
);
}