]> git.lizzy.rs Git - enumset.git/commitdiff
Add better tests and basic benchmarks.
authorLymia Aluysia <lymia@lymiahugs.com>
Sat, 4 Apr 2020 20:54:51 +0000 (13:54 -0700)
committerLymia Aluysia <lymia@lymiahugs.com>
Sat, 4 Apr 2020 20:54:51 +0000 (13:54 -0700)
.gitignore
enumset/Cargo.toml
enumset/benches/bench.rs [new file with mode: 0644]
enumset/tests/compile-pass/no_std.rs [new file with mode: 0644]
enumset/tests/ops.rs
enumset/tests/trybuild.rs

index b720ece49edf7b5db523ea8d4dc92c71b910d2c4..c1cf1cad68ffecd2ed4cce978b8e00fc881b1706 100644 (file)
@@ -1,4 +1,5 @@
 /target
+/*/target
 /.idea
 /Cargo.lock
-/*.iml
+/*.iml
\ No newline at end of file
index 476bdc81d36e0ae5f57abee5da6233459bbc3697..b7c1b796f00e9492252f3067ac9f3cc9d7282d6d 100644 (file)
@@ -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 (file)
index 0000000..34b181c
--- /dev/null
@@ -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::<u8, Enum8>(black_box(0u32) as u8)
+    }));
+    c.bench_function("transmute u64", |b| b.iter(|| unsafe {
+        transmute::<u64, Enum64>(black_box(0u32) as u64)
+    }));
+    c.bench_function("transmute C", |b| b.iter(|| unsafe {
+        transmute::<u32, EnumC>(black_box(0u32) as u32)
+    }));
+}
+fn from_enum(c: &mut Criterion) {
+    c.bench_function("enum_from_u32 u8", |b| b.iter(|| unsafe {
+        <Enum8 as EnumSetTypePrivate>::enum_from_u32(black_box(0u32))
+    }));
+    c.bench_function("enum_from_u32 u64", |b| b.iter(|| unsafe {
+        <Enum64 as EnumSetTypePrivate>::enum_from_u32(black_box(0u32))
+    }));
+    c.bench_function("enum_from_u32 C", |b| b.iter(|| unsafe {
+        <EnumC as EnumSetTypePrivate>::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 (file)
index 0000000..ead0435
--- /dev/null
@@ -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
index 4d536b190283c5ae265833d377af402eb9348f31..5c0ad76c3e013cc8d5a04958e1c149193ab360ba 100644 (file)
@@ -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 {
index 5570467d205c8fdfc4e439888686d0e13ba0d968..e3c06924b3c54e8f53084d22e9b96368fefa455a 100644 (file)
@@ -3,4 +3,5 @@
 fn ui() {
     let t = trybuild::TestCases::new();
     t.compile_fail("tests/compile-fail/*.rs");
+    t.pass("tests/compile-pass/*.rs");
 }