Skip to content

Commit fc06965

Browse files
daxpeddaModProg
authored andcommitted
More tests
1 parent 0c08281 commit fc06965

File tree

3 files changed

+230
-117
lines changed

3 files changed

+230
-117
lines changed

.github/workflows/validate.yml

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,8 @@
11
name: Validate
22

3-
on:
4-
push:
5-
pull_request:
6-
schedule:
7-
# Give nightly release some time to complete.
8-
# See <https://github.com/rust-lang/rustup-components-history/blob/dc6890bde289ac72d9d16959e4432f72f30c051b/.github/workflows/rust.yml#L9-L10>
9-
- cron: 0 2 * * *
3+
on: [push, pull_request]
104

115
jobs:
12-
test:
13-
name: Test
14-
15-
if: github.event_name == 'schedule'
16-
17-
strategy:
18-
fail-fast: false
19-
matrix:
20-
rust:
21-
- stable
22-
- beta
23-
24-
runs-on: ubuntu-latest
25-
26-
steps:
27-
- name: Update Rust
28-
run: |
29-
rustup toolchain install ${{ matrix.rust }} --profile minimal --allow-downgrade
30-
rustup default ${{ matrix.rust }}
31-
- name: Checkout
32-
uses: actions/checkout@v3
33-
- name: Test
34-
run:
35-
cargo test --workspace --all-targets --no-fail-fast
36-
376
miri:
387
name: Miri
398

tests/discriminant.rs

Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
#![cfg_attr(feature = "nightly", feature(core_intrinsics))]
2+
3+
#[cfg(feature = "nightly")]
4+
use std::intrinsics::discriminant_value;
5+
6+
#[test]
7+
fn default() {
8+
enum Test {
9+
A,
10+
B,
11+
C,
12+
}
13+
14+
#[cfg(feature = "nightly")]
15+
{
16+
assert_eq!(0_isize, discriminant_value(&Test::A));
17+
assert_eq!(1_isize, discriminant_value(&Test::B));
18+
assert_eq!(2_isize, discriminant_value(&Test::C));
19+
}
20+
assert_eq!(0, Test::A as isize);
21+
assert_eq!(1, Test::B as isize);
22+
assert_eq!(2, Test::C as isize);
23+
}
24+
25+
#[test]
26+
fn default_with_discriminants() {
27+
enum Test {
28+
A = 3,
29+
B,
30+
C,
31+
}
32+
assert_eq!(3, Test::A as isize);
33+
assert_eq!(4, Test::B as isize);
34+
assert_eq!(5, Test::C as isize);
35+
}
36+
37+
#[test]
38+
#[cfg(feature = "nightly")]
39+
fn default_with_values() {
40+
enum Test {
41+
A(u8),
42+
B,
43+
C,
44+
}
45+
46+
assert_eq!(0_isize, discriminant_value(&Test::A(0)));
47+
assert_eq!(1_isize, discriminant_value(&Test::B));
48+
assert_eq!(2_isize, discriminant_value(&Test::C));
49+
}
50+
51+
#[test]
52+
fn repr() {
53+
#[repr(u8)]
54+
enum Test {
55+
A,
56+
B,
57+
C,
58+
}
59+
60+
#[cfg(feature = "nightly")]
61+
{
62+
assert_eq!(0_u8, discriminant_value(&Test::A));
63+
assert_eq!(1_u8, discriminant_value(&Test::B));
64+
assert_eq!(2_u8, discriminant_value(&Test::C));
65+
}
66+
assert_eq!(0, Test::A as u8);
67+
assert_eq!(1, Test::B as u8);
68+
assert_eq!(2, Test::C as u8);
69+
}
70+
71+
#[test]
72+
fn repr_with_discriminants() {
73+
#[repr(u8)]
74+
enum Test {
75+
A = 3,
76+
B,
77+
C,
78+
}
79+
80+
#[cfg(feature = "nightly")]
81+
{
82+
assert_eq!(3_u8, discriminant_value(&Test::A));
83+
assert_eq!(4_u8, discriminant_value(&Test::B));
84+
assert_eq!(5_u8, discriminant_value(&Test::C));
85+
}
86+
assert_eq!(3, Test::A as isize);
87+
assert_eq!(4, Test::B as isize);
88+
assert_eq!(5, Test::C as isize);
89+
}
90+
91+
#[test]
92+
fn repr_with_values() {
93+
#[repr(u8)]
94+
enum Test {
95+
A(u8),
96+
B,
97+
C,
98+
}
99+
100+
#[cfg(feature = "nightly")]
101+
{
102+
assert_eq!(0_u8, discriminant_value(&Test::A(0)));
103+
assert_eq!(1_u8, discriminant_value(&Test::B));
104+
assert_eq!(2_u8, discriminant_value(&Test::C));
105+
}
106+
assert_eq!(0, unsafe { *<*const _>::from(&Test::A(0)).cast::<u8>() });
107+
assert_eq!(1, unsafe { *<*const _>::from(&Test::B).cast::<u8>() });
108+
assert_eq!(2, unsafe { *<*const _>::from(&Test::C).cast::<u8>() });
109+
}
110+
111+
#[test]
112+
fn repr_with_discriminants_values() {
113+
#[repr(u8)]
114+
enum Test {
115+
A(u8) = 3,
116+
B,
117+
C,
118+
}
119+
120+
#[cfg(feature = "nightly")]
121+
{
122+
assert_eq!(3_u8, discriminant_value(&Test::A(0)));
123+
assert_eq!(4_u8, discriminant_value(&Test::B));
124+
assert_eq!(5_u8, discriminant_value(&Test::C));
125+
}
126+
assert_eq!(3, unsafe { *<*const _>::from(&Test::A(0)).cast::<u8>() });
127+
assert_eq!(4, unsafe { *<*const _>::from(&Test::B).cast::<u8>() });
128+
assert_eq!(5, unsafe { *<*const _>::from(&Test::C).cast::<u8>() });
129+
}
130+
131+
#[test]
132+
fn repr_c() {
133+
#[repr(C)]
134+
enum Test {
135+
A,
136+
B,
137+
C,
138+
}
139+
140+
#[cfg(feature = "nightly")]
141+
{
142+
assert_eq!(0_isize, discriminant_value(&Test::A));
143+
assert_eq!(1_isize, discriminant_value(&Test::B));
144+
assert_eq!(2_isize, discriminant_value(&Test::C));
145+
}
146+
assert_eq!(0, Test::A as isize);
147+
assert_eq!(1, Test::B as isize);
148+
assert_eq!(2, Test::C as isize);
149+
}
150+
151+
#[test]
152+
fn repr_c_with_discriminants() {
153+
#[repr(C)]
154+
enum Test {
155+
A = 3,
156+
B,
157+
C,
158+
}
159+
160+
#[cfg(feature = "nightly")]
161+
{
162+
assert_eq!(3_isize, discriminant_value(&Test::A));
163+
assert_eq!(4_isize, discriminant_value(&Test::B));
164+
assert_eq!(5_isize, discriminant_value(&Test::C));
165+
}
166+
assert_eq!(3, Test::A as isize);
167+
assert_eq!(4, Test::B as isize);
168+
assert_eq!(5, Test::C as isize);
169+
}
170+
171+
#[test]
172+
fn repr_c_with_values() {
173+
#[repr(C)]
174+
enum Test {
175+
A(u8),
176+
B,
177+
C,
178+
}
179+
180+
#[cfg(feature = "nightly")]
181+
{
182+
assert_eq!(0_isize, discriminant_value(&Test::A(0)));
183+
assert_eq!(1_isize, discriminant_value(&Test::B));
184+
assert_eq!(2_isize, discriminant_value(&Test::C));
185+
}
186+
assert_eq!(0, unsafe { *<*const _>::from(&Test::A(0)).cast::<isize>() });
187+
assert_eq!(1, unsafe { *<*const _>::from(&Test::B).cast::<isize>() });
188+
assert_eq!(2, unsafe { *<*const _>::from(&Test::C).cast::<isize>() });
189+
}
190+
191+
#[test]
192+
fn repr_with_repr_c_with_values() {
193+
#[repr(C, u8)]
194+
enum Test {
195+
A(u8),
196+
B,
197+
C,
198+
}
199+
200+
#[cfg(feature = "nightly")]
201+
{
202+
assert_eq!(0_u8, discriminant_value(&Test::A(0)));
203+
assert_eq!(1_u8, discriminant_value(&Test::B));
204+
assert_eq!(2_u8, discriminant_value(&Test::C));
205+
}
206+
assert_eq!(0, unsafe { *<*const _>::from(&Test::A(0)).cast::<u8>() });
207+
assert_eq!(1, unsafe { *<*const _>::from(&Test::B).cast::<u8>() });
208+
assert_eq!(2, unsafe { *<*const _>::from(&Test::C).cast::<u8>() });
209+
}
210+
211+
#[test]
212+
fn repr_with_repr_c_with_values_discriminants() {
213+
#[repr(C, u8)]
214+
enum Test {
215+
A(u8) = 3,
216+
B,
217+
C,
218+
}
219+
220+
#[cfg(feature = "nightly")]
221+
{
222+
assert_eq!(3_u8, discriminant_value(&Test::A(0)));
223+
assert_eq!(4_u8, discriminant_value(&Test::B));
224+
assert_eq!(5_u8, discriminant_value(&Test::C));
225+
}
226+
assert_eq!(3, unsafe { *<*const _>::from(&Test::A(0)).cast::<u8>() });
227+
assert_eq!(4, unsafe { *<*const _>::from(&Test::B).cast::<u8>() });
228+
assert_eq!(5, unsafe { *<*const _>::from(&Test::C).cast::<u8>() });
229+
}

tests/nightly.rs

Lines changed: 0 additions & 85 deletions
This file was deleted.

0 commit comments

Comments
 (0)