From: Lymia Aluysia Date: Sat, 4 Apr 2020 20:54:51 +0000 (-0700) Subject: Add better tests and basic benchmarks. X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=b7947f33724a090928cdfddbad1530a422e3027b;p=enumset.git Add better tests and basic benchmarks. --- diff --git a/.gitignore b/.gitignore index b720ece..c1cf1ca 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /target +/*/target /.idea /Cargo.lock -/*.iml +/*.iml \ No newline at end of file diff --git a/enumset/Cargo.toml b/enumset/Cargo.toml index 476bdc8..b7c1b79 100644 --- a/enumset/Cargo.toml +++ b/enumset/Cargo.toml @@ -14,6 +14,10 @@ readme = "../README.md" license = "MIT/Apache-2.0" +[[bench]] +name = "bench" +harness = false + [features] serde = ["serde2", "enumset_derive/serde"] @@ -24,6 +28,7 @@ serde2 = { package = "serde", version = "1.0.91", default-features = false, opti [dev-dependencies] bincode = { version = "1.0", features = ["i128"] } +criterion = "0.3" serde_derive = "1.0.91" serde_json = "1.0.39" trybuild = "1.0.24" diff --git a/enumset/benches/bench.rs b/enumset/benches/bench.rs new file mode 100644 index 0000000..34b181c --- /dev/null +++ b/enumset/benches/bench.rs @@ -0,0 +1,49 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use enumset::*; +use enumset::internal::*; +use std::mem::transmute; + +#[derive(EnumSetType)] +#[repr(u8)] +enum Enum8 { + A, B, C, D, E, F, G, H, +} + +#[derive(EnumSetType)] +#[repr(u64)] +enum Enum64 { + A, B, C, D, E, F, G, H, +} + +#[derive(EnumSetType)] +#[repr(C)] +enum EnumC { + A, B, C, D, E, F, G, H, +} + +fn transmute_enum(c: &mut Criterion) { + c.bench_function("transmute u8", |b| b.iter(|| unsafe { + transmute::(black_box(0u32) as u8) + })); + c.bench_function("transmute u64", |b| b.iter(|| unsafe { + transmute::(black_box(0u32) as u64) + })); + c.bench_function("transmute C", |b| b.iter(|| unsafe { + transmute::(black_box(0u32) as u32) + })); +} +fn from_enum(c: &mut Criterion) { + c.bench_function("enum_from_u32 u8", |b| b.iter(|| unsafe { + ::enum_from_u32(black_box(0u32)) + })); + c.bench_function("enum_from_u32 u64", |b| b.iter(|| unsafe { + ::enum_from_u32(black_box(0u32)) + })); + c.bench_function("enum_from_u32 C", |b| b.iter(|| unsafe { + ::enum_from_u32(black_box(0u32)) + })); +} + +criterion_group!(baseline, transmute_enum); +criterion_group!(ops, from_enum); +criterion_main!(baseline, ops); diff --git a/enumset/tests/compile-pass/no_std.rs b/enumset/tests/compile-pass/no_std.rs new file mode 100644 index 0000000..ead0435 --- /dev/null +++ b/enumset/tests/compile-pass/no_std.rs @@ -0,0 +1,48 @@ +#![no_std] +#![allow(dead_code)] + +use enumset::*; + +#[derive(EnumSetType)] +pub enum EmptyEnum { } + +#[derive(EnumSetType)] +pub enum Enum1 { + A, +} + +#[derive(EnumSetType)] +pub enum SmallEnum { + A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, +} +#[derive(EnumSetType)] +pub enum Enum128 { + A, B, C, D, E, F, G, H, _8, _9, _10, _11, _12, _13, _14, _15, + _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, + _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, + _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, + _64, _65, _66, _67, _68, _69, _70, _71, _72, _73, _74, _75, _76, _77, _78, _79, + _80, _81, _82, _83, _84, _85, _86, _87, _88, _89, _90, _91, _92, _93, _94, _95, + _96, _97, _98, _99, _100, _101, _102, _103, _104, _105, _106, _107, _108, _109, + _110, _111, _112, _113, _114, _115, _116, _117, _118, _119, _120, _121, _122, + _123, _124, _125, _126, _127, +} +#[derive(EnumSetType)] +pub enum SparseEnum { + A = 0xA, B = 20, C = 30, D = 40, E = 50, F = 60, G = 70, H = 80, +} + +#[repr(u32)] +#[derive(EnumSetType)] +pub enum ReprEnum { + A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, +} +#[repr(C)] +#[derive(EnumSetType)] +pub enum ReprEnum4 { + A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, +} + +pub fn main() { + +} \ No newline at end of file diff --git a/enumset/tests/ops.rs b/enumset/tests/ops.rs index 4d536b1..5c0ad76 100644 --- a/enumset/tests/ops.rs +++ b/enumset/tests/ops.rs @@ -63,6 +63,11 @@ pub enum ReprEnum2 { pub enum ReprEnum3 { A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, } +#[repr(C)] +#[derive(EnumSetType, Debug)] +pub enum ReprEnum4 { + A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, +} macro_rules! test_variants { ($enum_name:ident $all_empty_test:ident $($variant:ident,)*) => { @@ -331,9 +336,10 @@ tests!(large_enum, test_enum!(LargeEnum, 16)); tests!(enum8, test_enum!(Enum8, 1)); tests!(enum128, test_enum!(Enum128, 16)); tests!(sparse_enum, test_enum!(SparseEnum, 16)); -tests!(repr_enum, test_enum!(ReprEnum, 4)); -tests!(repr_enum2, test_enum!(ReprEnum2, 4)); -tests!(repr_enum3, test_enum!(ReprEnum3, 4)); +tests!(repr_enum_u32, test_enum!(ReprEnum, 4)); +tests!(repr_enum_u64, test_enum!(ReprEnum2, 4)); +tests!(repr_enum_isize, test_enum!(ReprEnum3, 4)); +tests!(repr_enum_c, test_enum!(ReprEnum4, 4)); #[derive(EnumSetType, Debug)] pub enum ThresholdEnum { diff --git a/enumset/tests/trybuild.rs b/enumset/tests/trybuild.rs index 5570467..e3c0692 100644 --- a/enumset/tests/trybuild.rs +++ b/enumset/tests/trybuild.rs @@ -3,4 +3,5 @@ fn ui() { let t = trybuild::TestCases::new(); t.compile_fail("tests/compile-fail/*.rs"); + t.pass("tests/compile-pass/*.rs"); }