microsoft/qdk

Public

mirrored from https://github.com/microsoft/qdkAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
4faaeecf8600237cb5d0fed3f1c880ed1b77641e

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

source/paulimer/tests/bitvec_test.rs

75lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use paulimer::bits::BitVec;
5use paulimer::bits::Bitwise;
6use paulimer::bits::BitwiseBinaryOps;
7use paulimer::bits::IndexAssignable;
8use paulimer::bits::WORD_COUNT_DEFAULT;
9use proptest::prelude::*;
10
11proptest! {
12 #[test]
13 fn from_iter(bits in prop::collection::vec(any::<bool>(), 0..2000)) {
14 let bitvec = BitVec::<WORD_COUNT_DEFAULT>::from_iter(bits.clone());
15 let actual: Vec<bool> = bitvec.into_iter().collect();
16 assert_eq!(bits.support().collect::<Vec<usize>>(), actual.support().collect::<Vec<usize>>());
17 }
18
19 #[test]
20 fn index(bits in prop::collection::vec(any::<bool>(), 0..2000)) {
21 let bitvec = BitVec::<WORD_COUNT_DEFAULT>::from_iter(bits.clone());
22 for (index, expected) in bits.iter().enumerate() {
23 assert_eq!(bitvec.index(index), *expected);
24 }
25 }
26
27 #[test]
28 fn weight(bits in arbitrary_bitvec(2000)) {
29 let ones = bits.into_iter().filter(|bit| *bit);
30 assert_eq!(ones.count(), bits.weight());
31 }
32
33 #[test]
34 fn support(bits in arbitrary_bitvec(2000)) {
35 let support: Vec<usize> = bits.support().collect();
36 assert_eq!(support.len(), bits.weight());
37 for index in support {
38 assert!(bits.index(index));
39 }
40 }
41
42 #[test]
43 fn assign(bits in prop::collection::vec(any::<bool>(), 0..10)) {
44 let mut bitvec = BitVec::<WORD_COUNT_DEFAULT>::of_length(bits.len());
45 for (index, bit) in bits.iter().enumerate() {
46 bitvec.assign_index(index, *bit);
47 }
48 let actual: Vec<bool> = bitvec.into_iter().take(bits.len()).collect();
49 assert_eq!(bits, actual);
50 }
51
52 #[test]
53 fn bitxor_assign((left, right) in equal_length_bitvecs(2000)) {
54 let mut xored = left.clone();
55 xored.bitxor_assign(&right);
56 for (index, result) in xored.into_iter().enumerate() {
57 assert_eq!(result, left.index(index) ^ right.index(index));
58 }
59 }
60
61}
62
63fn arbitrary_bitvec(max_length: usize) -> impl Strategy<Value = BitVec<WORD_COUNT_DEFAULT>> {
64 prop::collection::vec(any::<bool>(), 0..max_length)
65 .prop_map(BitVec::<WORD_COUNT_DEFAULT>::from_iter)
66}
67
68fn equal_length_bitvecs(max_length: usize) -> impl Strategy<Value = (BitVec, BitVec)> {
69 (0..max_length).prop_flat_map(|length| {
70 (
71 prop::collection::vec(any::<bool>(), length).prop_map(BitVec::from_iter),
72 prop::collection::vec(any::<bool>(), length).prop_map(BitVec::from_iter),
73 )
74 })
75}
76