|
1 | | -use aggregate::{Aggregate, MultAggregate}; |
| 1 | +use aggregate::Aggregate; |
2 | 2 | use bitcoin::{OutPoint, Txid}; |
3 | | -use rusqlite::Connection; |
4 | 3 |
|
5 | | -const SELECT_STMT: &str = "SELECT txid, vout FROM utxos"; |
| 4 | +const TEST_ITERS: usize = 10_000; |
| 5 | +const TEST_SEED: u64 = 420; |
6 | 6 |
|
7 | | -#[test] |
8 | | -fn test_static_utxo_set() { |
9 | | - let mut acc = Aggregate::new(); |
10 | | - let conn = Connection::open("../contrib/data/signet_outpoints.sqlite").unwrap(); |
11 | | - let mut stmt = conn.prepare(SELECT_STMT).unwrap(); |
12 | | - let mut rows = stmt.query([]).unwrap(); |
13 | | - while let Some(row) = rows.next().unwrap() { |
14 | | - let txid: String = row.get(0).unwrap(); |
15 | | - let vout: u32 = row.get(1).unwrap(); |
16 | | - let txid = txid.parse::<Txid>().unwrap(); |
17 | | - let outpoint = OutPoint { txid, vout }; |
18 | | - acc.spend(outpoint); |
| 7 | +struct Rng { |
| 8 | + state: u64, |
| 9 | +} |
| 10 | + |
| 11 | +impl Rng { |
| 12 | + fn new(seed: u64) -> Self { |
| 13 | + Rng { |
| 14 | + state: if seed == 0 { 1 } else { seed }, |
| 15 | + } |
19 | 16 | } |
20 | | - assert!(!acc.is_zero()); |
21 | | - let mut stmt = conn.prepare(SELECT_STMT).unwrap(); |
22 | | - let mut rows = stmt.query([]).unwrap(); |
23 | | - while let Some(row) = rows.next().unwrap() { |
24 | | - let txid: String = row.get(0).unwrap(); |
25 | | - let vout: u32 = row.get(1).unwrap(); |
26 | | - let txid = txid.parse::<Txid>().unwrap(); |
27 | | - let outpoint = OutPoint { txid, vout }; |
28 | | - acc.add(outpoint); |
| 17 | + |
| 18 | + fn next_u64(&mut self) -> u64 { |
| 19 | + self.state ^= self.state << 13; |
| 20 | + self.state ^= self.state >> 7; |
| 21 | + self.state ^= self.state << 17; |
| 22 | + self.state |
| 23 | + } |
| 24 | + |
| 25 | + fn next_32_bytes(&mut self) -> [u8; 32] { |
| 26 | + let mut out = [0u8; 32]; |
| 27 | + for chunk in out.chunks_exact_mut(8) { |
| 28 | + chunk.copy_from_slice(&self.next_u64().to_le_bytes()); |
| 29 | + } |
| 30 | + out |
29 | 31 | } |
30 | | - assert!(acc.is_zero()); |
31 | 32 | } |
32 | 33 |
|
33 | 34 | #[test] |
34 | | -fn test_mult_agg() { |
35 | | - let mut acc = MultAggregate::new(); |
36 | | - let conn = Connection::open("../contrib/data/signet_outpoints.sqlite").unwrap(); |
37 | | - let mut stmt = conn.prepare(SELECT_STMT).unwrap(); |
38 | | - let mut rows = stmt.query([]).unwrap(); |
39 | | - while let Some(row) = rows.next().unwrap() { |
40 | | - let txid: String = row.get(0).unwrap(); |
41 | | - let vout: u32 = row.get(1).unwrap(); |
42 | | - let txid = txid.parse::<Txid>().unwrap(); |
| 35 | +fn test_static_utxo_set() { |
| 36 | + let mut acc = Aggregate::new(); |
| 37 | + let mut rng = Rng::new(TEST_SEED); |
| 38 | + let mut outpoints = Vec::with_capacity(TEST_ITERS); |
| 39 | + for _ in 0..TEST_ITERS { |
| 40 | + let txid = Txid::from_byte_array(rng.next_32_bytes()); |
| 41 | + let vout = (rng.next_u64() % u32::MAX as u64) as u32; |
43 | 42 | let outpoint = OutPoint { txid, vout }; |
44 | 43 | acc.spend(outpoint); |
| 44 | + outpoints.push(outpoint); |
45 | 45 | } |
46 | 46 | assert!(!acc.is_zero()); |
47 | | - let mut stmt = conn.prepare(SELECT_STMT).unwrap(); |
48 | | - let mut rows = stmt.query([]).unwrap(); |
49 | | - while let Some(row) = rows.next().unwrap() { |
50 | | - let txid: String = row.get(0).unwrap(); |
51 | | - let vout: u32 = row.get(1).unwrap(); |
52 | | - let txid = txid.parse::<Txid>().unwrap(); |
53 | | - let outpoint = OutPoint { txid, vout }; |
| 47 | + for outpoint in outpoints { |
54 | 48 | acc.add(outpoint); |
55 | 49 | } |
56 | 50 | assert!(acc.is_zero()); |
|
0 commit comments