Add compiletest crate to test against invalid derivations
This commit is contained in:
parent
b038b79900
commit
0c89b893a9
|
@ -14,6 +14,7 @@ quote = "0.1.3"
|
||||||
syn = "0.6.0"
|
syn = "0.6.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
compiletest_rs = "0.2.2"
|
||||||
|
|
||||||
[dev-dependencies.num]
|
[dev-dependencies.num]
|
||||||
path = ".."
|
path = ".."
|
||||||
|
|
|
@ -19,6 +19,7 @@ extern crate rustc_macro;
|
||||||
use rustc_macro::TokenStream;
|
use rustc_macro::TokenStream;
|
||||||
|
|
||||||
use syn::Body::Enum;
|
use syn::Body::Enum;
|
||||||
|
use syn::VariantData::Unit;
|
||||||
|
|
||||||
#[rustc_macro_derive(FromPrimitive)]
|
#[rustc_macro_derive(FromPrimitive)]
|
||||||
pub fn from_primitive(input: TokenStream) -> TokenStream {
|
pub fn from_primitive(input: TokenStream) -> TokenStream {
|
||||||
|
@ -29,13 +30,22 @@ pub fn from_primitive(input: TokenStream) -> TokenStream {
|
||||||
|
|
||||||
let variants = match ast.body {
|
let variants = match ast.body {
|
||||||
Enum(ref variants) => variants,
|
Enum(ref variants) => variants,
|
||||||
_ => panic!("`FromPrimitive` can be applied only to the enums, {} is not an enum", name),
|
_ => {
|
||||||
|
panic!("`FromPrimitive` can be applied only to the enums, {} is not an enum",
|
||||||
|
name)
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut idx = 0;
|
let mut idx = 0;
|
||||||
let variants: Vec<_> = variants.iter()
|
let variants: Vec<_> = variants.iter()
|
||||||
.map(|variant| {
|
.map(|variant| {
|
||||||
let ident = &variant.ident;
|
let ident = &variant.ident;
|
||||||
|
match variant.data {
|
||||||
|
Unit => (),
|
||||||
|
_ => {
|
||||||
|
panic!("`FromPrimitive` can be applied only to unitary enums, {}::{} is either struct or tuple", name, ident)
|
||||||
|
},
|
||||||
|
}
|
||||||
if let Some(val) = variant.discriminant {
|
if let Some(val) = variant.discriminant {
|
||||||
idx = val.value;
|
idx = val.value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
|
||||||
|
// Copyright 2013-2015 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![feature(rustc_macro)]
|
||||||
|
|
||||||
|
extern crate num;
|
||||||
|
#[macro_use]
|
||||||
|
extern crate num_macros;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, FromPrimitive)] //~ ERROR
|
||||||
|
struct Color {
|
||||||
|
r: u8,
|
||||||
|
g: u8,
|
||||||
|
b: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,24 @@
|
||||||
|
|
||||||
|
// Copyright 2013-2015 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![feature(rustc_macro)]
|
||||||
|
|
||||||
|
extern crate num;
|
||||||
|
#[macro_use]
|
||||||
|
extern crate num_macros;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, FromPrimitive)] //~ ERROR
|
||||||
|
enum Color {
|
||||||
|
Rgb(u8, u8, u8),
|
||||||
|
Hsv(u8, u8, u8),
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,25 @@
|
||||||
|
extern crate compiletest_rs as compiletest;
|
||||||
|
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::env::var;
|
||||||
|
|
||||||
|
fn run_mode(mode: &'static str) {
|
||||||
|
let mut config = compiletest::default_config();
|
||||||
|
|
||||||
|
let cfg_mode = mode.parse().ok().expect("Invalid mode");
|
||||||
|
|
||||||
|
config.target_rustcflags = Some("-L target/debug/ -L target/debug/deps/".to_owned());
|
||||||
|
if let Ok(name) = var::<&str>("TESTNAME") {
|
||||||
|
let s : String = name.to_owned();
|
||||||
|
config.filter = Some(s)
|
||||||
|
}
|
||||||
|
config.mode = cfg_mode;
|
||||||
|
config.src_base = PathBuf::from(format!("tests/{}", mode));
|
||||||
|
|
||||||
|
compiletest::run_tests(&config);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn compile_test() {
|
||||||
|
run_mode("compile-fail");
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
|
||||||
|
// Copyright 2013-2015 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![feature(rustc_macro)]
|
||||||
|
|
||||||
|
extern crate num;
|
||||||
|
#[macro_use]
|
||||||
|
extern crate num_macros;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, FromPrimitive)]
|
||||||
|
enum Color {}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_empty_enum() {
|
||||||
|
let v: [Option<Color>; 1] = [num::FromPrimitive::from_u64(0)];
|
||||||
|
|
||||||
|
assert_eq!(v, [None]);
|
||||||
|
}
|
Loading…
Reference in New Issue