1 #![allow(clippy::unit_arg)]
3 use std
::collections
::HashSet
as NatSet
;
4 use std
::fmt
::{Debug, Error, Formatter, Write}
;
9 use proptest
::proptest
;
10 use proptest_derive
::Arbitrary
;
12 #[derive(Arbitrary, Debug)]
19 struct Actions
<A
>(Vec
<Action
<A
>>)
23 impl<A
> Debug
for Actions
<A
>
25 A
: Hash
+ Eq
+ Debug
+ Clone
,
27 fn fmt(&self, f
: &mut Formatter
<'_
>) -> Result
<(), Error
> {
28 let mut out
= String
::new();
29 let mut expected
= NatSet
::new();
30 writeln
!(out
, "let mut set = HashSet::new();")?
;
31 for action
in &self.0 {
33 Action
::Insert(ref value
) => {
34 expected
.insert(value
.clone());
35 writeln
!(out
, "set.insert({:?});", value
)?
;
37 Action
::Remove(ref value
) => {
38 expected
.remove(value
);
39 writeln
!(out
, "set.remove({:?});", value
)?
;
45 "let expected = vec!{:?};",
46 expected
.into_iter().collect
::<Vec
<_
>>()
48 writeln
!(out
, "assert_eq!(HashSet::from(expected), set);")?
;
49 write
!(f
, "{}", super::code_fmt(&out
))
55 fn comprehensive(actions
: Actions
<u8>) {
56 let mut set
= HashSet
::new();
57 let mut nat
= NatSet
::new();
58 for action
in actions
.0 {
60 Action
::Insert(value
) => {
61 let len
= nat
.len() + if nat
.contains(&value
) {
68 assert_eq
!(len
, set
.len());
70 Action
::Remove(value
) => {
71 let len
= nat
.len() - if nat
.contains(&value
) {
78 assert_eq
!(len
, set
.len());
81 assert_eq
!(nat
.len(), set
.len());
82 assert_eq
!(HashSet
::from(nat
.clone()), set
);