Skip to content

Commit 544d979

Browse files
committed
consensus_encoding: update encoder unit tests
1 parent 9b90283 commit 544d979

File tree

1 file changed

+75
-30
lines changed

1 file changed

+75
-30
lines changed

consensus_encoding/src/encode/encoders.rs

Lines changed: 75 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -241,61 +241,106 @@ impl<A: Encoder, B: Encoder, C: Encoder, D: Encoder, E: Encoder, F: Encoder> Enc
241241
}
242242

243243
#[cfg(test)]
244-
#[cfg(feature = "alloc")]
245244
mod tests {
246-
use alloc::vec::Vec;
247-
248245
use super::*;
249246

250-
// Run the encoder i.e., use it to encode into a vector.
251-
fn run_encoder(mut encoder: impl Encoder) -> Vec<u8> {
252-
let mut vec = Vec::new();
253-
while let Some(chunk) = encoder.current_chunk() {
254-
vec.extend_from_slice(chunk);
255-
encoder.advance();
247+
struct TestBytes<'a>(&'a [u8], bool);
248+
249+
impl<'a> Encodable for TestBytes<'a> {
250+
type Encoder<'s>
251+
= BytesEncoder<'s>
252+
where
253+
Self: 's;
254+
255+
fn encoder(&self) -> Self::Encoder<'_> {
256+
if self.1 {
257+
BytesEncoder::with_length_prefix(self.0)
258+
} else {
259+
BytesEncoder::without_length_prefix(self.0)
260+
}
256261
}
257-
vec
262+
}
263+
264+
struct TestArray<const N: usize>([u8; N]);
265+
266+
impl<const N: usize> Encodable for TestArray<N> {
267+
type Encoder<'s>
268+
= ArrayEncoder<N>
269+
where
270+
Self: 's;
271+
272+
fn encoder(&self) -> Self::Encoder<'_> { ArrayEncoder::without_length_prefix(self.0) }
273+
}
274+
275+
#[test]
276+
fn encode_array_with_data() {
277+
// Should have one chunk with the array data, then exhausted.
278+
let test_array = TestArray([1u8, 2, 3, 4]);
279+
let mut encoder = test_array.encoder();
280+
assert_eq!(encoder.current_chunk(), Some(&[1u8, 2, 3, 4][..]));
281+
assert!(!encoder.advance());
282+
assert_eq!(encoder.current_chunk(), None);
283+
}
284+
285+
#[test]
286+
fn encode_empty_array() {
287+
// Empty array should have one empty chunk, then exhausted.
288+
let test_array = TestArray([]);
289+
let mut encoder = test_array.encoder();
290+
assert_eq!(encoder.current_chunk(), Some(&[][..]));
291+
assert!(!encoder.advance());
292+
assert_eq!(encoder.current_chunk(), None);
258293
}
259294

260295
#[test]
261296
fn encode_byte_slice_without_prefix() {
297+
// Should have one chunk with the byte data, then exhausted.
262298
let obj = [1u8, 2, 3];
299+
let test_bytes = TestBytes(&obj, false);
300+
let mut encoder = test_bytes.encoder();
263301

264-
let encoder = BytesEncoder::without_length_prefix(&obj);
265-
let got = run_encoder(encoder);
266-
267-
assert_eq!(got, obj);
302+
assert_eq!(encoder.current_chunk(), Some(&[1u8, 2, 3][..]));
303+
assert!(!encoder.advance());
304+
assert_eq!(encoder.current_chunk(), None);
268305
}
269306

270307
#[test]
271308
fn encode_empty_byte_slice_without_prefix() {
309+
// Should have one empty chunk, then exhausted.
272310
let obj = [];
311+
let test_bytes = TestBytes(&obj, false);
312+
let mut encoder = test_bytes.encoder();
273313

274-
let encoder = BytesEncoder::without_length_prefix(&obj);
275-
let got = run_encoder(encoder);
276-
277-
assert_eq!(got, obj);
314+
assert_eq!(encoder.current_chunk(), Some(&[][..]));
315+
assert!(!encoder.advance());
316+
assert_eq!(encoder.current_chunk(), None);
278317
}
279318

280319
#[test]
281320
fn encode_byte_slice_with_prefix() {
321+
// Should have length prefix chunk, then data chunk, then exhausted.
282322
let obj = [1u8, 2, 3];
283-
284-
let encoder = BytesEncoder::with_length_prefix(&obj);
285-
let got = run_encoder(encoder);
286-
287-
let want = [3u8, 1, 2, 3];
288-
assert_eq!(got, want);
323+
let test_bytes = TestBytes(&obj, true);
324+
let mut encoder = test_bytes.encoder();
325+
326+
assert_eq!(encoder.current_chunk(), Some(&[3u8][..]));
327+
assert!(encoder.advance());
328+
assert_eq!(encoder.current_chunk(), Some(&[1u8, 2, 3][..]));
329+
assert!(!encoder.advance());
330+
assert_eq!(encoder.current_chunk(), None);
289331
}
290332

291333
#[test]
292334
fn encode_empty_byte_slice_with_prefix() {
335+
// Should have length prefix chunk (0), then empty data chunk, then exhausted.
293336
let obj = [];
294-
295-
let encoder = BytesEncoder::with_length_prefix(&obj);
296-
let got = run_encoder(encoder);
297-
298-
let want = [0u8];
299-
assert_eq!(got, want);
337+
let test_bytes = TestBytes(&obj, true);
338+
let mut encoder = test_bytes.encoder();
339+
340+
assert_eq!(encoder.current_chunk(), Some(&[0u8][..]));
341+
assert!(encoder.advance());
342+
assert_eq!(encoder.current_chunk(), Some(&[][..]));
343+
assert!(!encoder.advance());
344+
assert_eq!(encoder.current_chunk(), None);
300345
}
301346
}

0 commit comments

Comments
 (0)