1 use super::query_context::test::{Def, UltraMinimal};
2 use crate::maybe_transmutable::MaybeTransmutableQuery;
3 use crate::{layout, Answer, Reason, Set};
4 use itertools::Itertools;
10 fn should_permit_identity_transmutation_tree() {
11 println!("{:?}", layout::Tree::<!, !>::bool());
12 let answer = crate::maybe_transmutable::MaybeTransmutableQuery::new(
13 layout::Tree::<Def, !>::bool(),
14 layout::Tree::<Def, !>::bool(),
16 crate::Assume { alignment: false, lifetimes: false, validity: true, visibility: false },
20 assert_eq!(answer, Answer::Yes);
24 fn should_permit_identity_transmutation_dfa() {
25 let answer = crate::maybe_transmutable::MaybeTransmutableQuery::new(
26 layout::Dfa::<!>::bool(),
27 layout::Dfa::<!>::bool(),
29 crate::Assume { alignment: false, lifetimes: false, validity: true, visibility: false },
33 assert_eq!(answer, Answer::Yes);
37 fn should_permit_validity_expansion_and_reject_contraction() {
38 let un = layout::Tree::<Def, !>::uninhabited();
39 let b0 = layout::Tree::<Def, !>::from_bits(0);
40 let b1 = layout::Tree::<Def, !>::from_bits(1);
41 let b2 = layout::Tree::<Def, !>::from_bits(2);
43 let alts = [b0, b1, b2];
45 let into_layout = |alts: Vec<_>| {
46 alts.into_iter().fold(layout::Tree::<Def, !>::uninhabited(), layout::Tree::<Def, !>::or)
49 let into_set = |alts: Vec<_>| {
50 #[cfg(feature = "rustc")]
51 let mut set = Set::default();
52 #[cfg(not(feature = "rustc"))]
53 let mut set = Set::new();
58 for src_alts in alts.clone().into_iter().powerset() {
59 let src_layout = into_layout(src_alts.clone());
60 let src_set = into_set(src_alts.clone());
62 for dst_alts in alts.clone().into_iter().powerset().filter(|alts| !alts.is_empty()) {
63 let dst_layout = into_layout(dst_alts.clone());
64 let dst_set = into_set(dst_alts.clone());
66 if src_set.is_subset(&dst_set) {
69 MaybeTransmutableQuery::new(
73 crate::Assume { validity: false, ..crate::Assume::default() },
77 "{:?} SHOULD be transmutable into {:?}",
81 } else if !src_set.is_disjoint(&dst_set) {
84 MaybeTransmutableQuery::new(
88 crate::Assume { validity: true, ..crate::Assume::default() },
92 "{:?} SHOULD be transmutable (assuming validity) into {:?}",
98 Answer::No(Reason::DstIsBitIncompatible),
99 MaybeTransmutableQuery::new(
103 crate::Assume { validity: false, ..crate::Assume::default() },
107 "{:?} should NOT be transmutable into {:?}",