1use num_bigint::Sign;
5use reifydb_value::value::{
6 Value,
7 blob::Blob,
8 date::Date,
9 datetime::DateTime,
10 decimal::Decimal,
11 dictionary::DictionaryEntryId,
12 duration::Duration,
13 identity::IdentityId,
14 int::Int,
15 row_number::RowNumber,
16 time::Time,
17 uint::Uint,
18 uuid::{Uuid4, Uuid7},
19 value_type::ValueType,
20};
21use serde::Serialize;
22
23use super::{
24 encode_bool, encode_bytes, encode_f32, encode_f64, encode_i8, encode_i16, encode_i32, encode_i64_varint,
25 encode_i128, encode_u8, encode_u16, encode_u32_varint, encode_u64_varint, encode_u128, encode_u128_varint,
26 serialize,
27};
28use crate::{
29 key::{encoded::EncodedKey, sort::SortOrder},
30 tag::{TypeTag, ValueKind},
31};
32
33fn keycode_type_descending(ty: &ValueType) -> bool {
34 matches!(
35 ty,
36 ValueType::Boolean
37 | ValueType::Float4 | ValueType::Float8
38 | ValueType::Int1 | ValueType::Int2
39 | ValueType::Int4 | ValueType::Int8
40 | ValueType::Int16 | ValueType::Uint1
41 | ValueType::Uint2 | ValueType::Uint4
42 | ValueType::Uint8 | ValueType::Uint16
43 | ValueType::Date | ValueType::DateTime
44 | ValueType::Time | ValueType::Duration
45 )
46}
47
48pub struct KeySerializer {
49 buffer: EncodedKey,
50}
51
52impl KeySerializer {
53 pub fn new() -> Self {
54 Self {
55 buffer: EncodedKey::with_capacity(0),
56 }
57 }
58
59 pub fn with_capacity(capacity: usize) -> Self {
60 Self {
61 buffer: EncodedKey::with_capacity(capacity),
62 }
63 }
64
65 pub fn extend_bool(&mut self, value: bool) -> &mut Self {
66 self.buffer.push(encode_bool(value));
67 self
68 }
69
70 pub fn extend_f32(&mut self, value: f32) -> &mut Self {
71 self.buffer.extend_from_slice(&encode_f32(value));
72 self
73 }
74
75 pub fn extend_f64(&mut self, value: f64) -> &mut Self {
76 self.buffer.extend_from_slice(&encode_f64(value));
77 self
78 }
79
80 pub fn extend_i8<T: Into<i8>>(&mut self, value: T) -> &mut Self {
81 self.buffer.extend_from_slice(&encode_i8(value.into()));
82 self
83 }
84
85 pub fn extend_i16<T: Into<i16>>(&mut self, value: T) -> &mut Self {
86 self.buffer.extend_from_slice(&encode_i16(value.into()));
87 self
88 }
89
90 pub fn extend_i32<T: Into<i32>>(&mut self, value: T) -> &mut Self {
91 self.buffer.extend_from_slice(&encode_i32(value.into()));
92 self
93 }
94
95 pub fn extend_i64<T: Into<i64>>(&mut self, value: T) -> &mut Self {
96 encode_i64_varint(value.into(), &mut self.buffer);
97 self
98 }
99
100 pub fn extend_i128<T: Into<i128>>(&mut self, value: T) -> &mut Self {
101 self.buffer.extend_from_slice(&encode_i128(value.into()));
102 self
103 }
104
105 pub fn extend_u8<T: Into<u8>>(&mut self, value: T) -> &mut Self {
106 self.buffer.push(encode_u8(value.into()));
107 self
108 }
109
110 pub fn extend_u16<T: Into<u16>>(&mut self, value: T) -> &mut Self {
111 self.buffer.extend_from_slice(&encode_u16(value.into()));
112 self
113 }
114
115 pub fn extend_u32<T: Into<u32>>(&mut self, value: T) -> &mut Self {
116 encode_u32_varint(value.into(), &mut self.buffer);
117 self
118 }
119
120 pub fn extend_u64<T: Into<u64>>(&mut self, value: T) -> &mut Self {
121 encode_u64_varint(value.into(), &mut self.buffer);
122 self
123 }
124
125 pub fn extend_u128<T: Into<u128>>(&mut self, value: T) -> &mut Self {
126 self.buffer.extend_from_slice(&encode_u128(value.into()));
127 self
128 }
129
130 pub fn extend_u128_varint<T: Into<u128>>(&mut self, value: T) -> &mut Self {
131 encode_u128_varint(value.into(), &mut self.buffer);
132 self
133 }
134
135 pub fn extend_bytes<T: AsRef<[u8]>>(&mut self, bytes: T) -> &mut Self {
136 encode_bytes(bytes.as_ref(), &mut self.buffer);
137 self
138 }
139
140 pub fn extend_str<T: AsRef<str>>(&mut self, s: T) -> &mut Self {
141 self.extend_bytes(s.as_ref().as_bytes())
142 }
143
144 pub fn finish(self) -> EncodedKey {
145 self.buffer
146 }
147
148 pub fn to_encoded_key(self) -> EncodedKey {
149 self.buffer
150 }
151
152 pub fn extend_serialize<T: Serialize>(&mut self, value: &T) -> &mut Self {
153 self.buffer.extend_from_slice(&serialize(value));
154 self
155 }
156
157 pub fn extend_raw(&mut self, bytes: &[u8]) -> &mut Self {
158 self.buffer.extend_from_slice(bytes);
159 self
160 }
161
162 pub fn extend_value_with_direction(&mut self, value: &Value, direction: SortOrder) -> &mut Self {
163 let ty = match value {
164 Value::None {
165 inner,
166 } => inner.clone(),
167 present => present.get_type(),
168 };
169 let ascending = matches!(direction, SortOrder::Asc);
170 if ascending == keycode_type_descending(&ty) {
171 let mut tmp = KeySerializer::new();
172 tmp.extend_value(value);
173 let mut bytes = tmp.to_encoded_key().to_vec();
174 for b in bytes.iter_mut() {
175 *b = !*b;
176 }
177 self.extend_raw(&bytes)
178 } else {
179 self.extend_value(value)
180 }
181 }
182
183 pub fn len(&self) -> usize {
184 self.buffer.len()
185 }
186
187 pub fn is_empty(&self) -> bool {
188 self.buffer.is_empty()
189 }
190
191 pub fn extend_date(&mut self, date: &Date) -> &mut Self {
192 self.extend_i32(date.to_days_since_epoch())
193 }
194
195 pub fn extend_datetime(&mut self, datetime: &DateTime) -> &mut Self {
196 self.extend_u64(datetime.to_nanos())
197 }
198
199 pub fn extend_time(&mut self, time: &Time) -> &mut Self {
200 self.extend_u64(time.to_nanos_since_midnight())
201 }
202
203 pub fn extend_duration(&mut self, duration: &Duration) -> &mut Self {
204 self.extend_i32(duration.get_months()).extend_i32(duration.get_days()).extend_i64(duration.get_nanos())
205 }
206
207 pub fn extend_row_number(&mut self, row_number: &RowNumber) -> &mut Self {
208 self.extend_u64(row_number.0)
209 }
210
211 pub fn extend_identity_id(&mut self, id: &IdentityId) -> &mut Self {
212 self.extend_bytes(id.as_bytes())
213 }
214
215 pub fn extend_uuid4(&mut self, uuid: &Uuid4) -> &mut Self {
216 self.extend_bytes(uuid.as_bytes())
217 }
218
219 pub fn extend_uuid7(&mut self, uuid: &Uuid7) -> &mut Self {
220 self.extend_bytes(uuid.as_bytes())
221 }
222
223 pub fn extend_blob(&mut self, blob: &Blob) -> &mut Self {
224 self.extend_bytes(blob.as_ref() as &[u8])
225 }
226
227 pub fn extend_int(&mut self, int: &Int) -> &mut Self {
228 let (sign, bytes) = int.to_bytes_be();
229
230 self.buffer.push(match sign {
231 Sign::Minus => 0,
232 _ => 1,
233 });
234 self.extend_u32(bytes.len() as u32);
235 self.buffer.extend_from_slice(&bytes);
236 self
237 }
238
239 pub fn extend_uint(&mut self, uint: &Uint) -> &mut Self {
240 let (_sign, bytes) = uint.0.to_bytes_be();
241 self.extend_u32(bytes.len() as u32);
242 self.buffer.extend_from_slice(&bytes);
243 self
244 }
245
246 pub fn extend_decimal(&mut self, decimal: &Decimal) -> &mut Self {
247 let s = decimal.to_string();
248 self.extend_str(&s);
249 self
250 }
251
252 pub fn extend_value(&mut self, value: &Value) -> &mut Self {
253 match value {
254 Value::None {
255 inner,
256 ..
257 } => {
258 self.buffer.push(ValueKind::None.byte());
259 match ValueKind::of_type(inner) {
260 ValueKind::List | ValueKind::Record | ValueKind::Tuple => unreachable!(
261 "List/Record/Tuple types cannot be encoded as none inner type in keys"
262 ),
263 _ => {}
264 }
265 let tag = TypeTag::of_type(inner)
266 .expect("option nesting in a key none inner exceeds the supported depth");
267 self.buffer.push(tag.byte());
268 }
269 Value::Boolean(b) => {
270 self.buffer.push(ValueKind::Boolean.byte());
271 self.extend_bool(*b);
272 }
273 Value::Float4(f) => {
274 self.buffer.push(ValueKind::Float4.byte());
275 self.extend_f32(**f);
276 }
277 Value::Float8(f) => {
278 self.buffer.push(ValueKind::Float8.byte());
279 self.extend_f64(**f);
280 }
281 Value::Int1(i) => {
282 self.buffer.push(ValueKind::Int1.byte());
283 self.extend_i8(*i);
284 }
285 Value::Int2(i) => {
286 self.buffer.push(ValueKind::Int2.byte());
287 self.extend_i16(*i);
288 }
289 Value::Int4(i) => {
290 self.buffer.push(ValueKind::Int4.byte());
291 self.extend_i32(*i);
292 }
293 Value::Int8(i) => {
294 self.buffer.push(ValueKind::Int8.byte());
295 self.extend_i64(*i);
296 }
297 Value::Int16(i) => {
298 self.buffer.push(ValueKind::Int16.byte());
299 self.extend_i128(*i);
300 }
301 Value::Utf8(s) => {
302 self.buffer.push(ValueKind::Utf8.byte());
303 self.extend_str(s);
304 }
305 Value::Uint1(u) => {
306 self.buffer.push(ValueKind::Uint1.byte());
307 self.extend_u8(*u);
308 }
309 Value::Uint2(u) => {
310 self.buffer.push(ValueKind::Uint2.byte());
311 self.extend_u16(*u);
312 }
313 Value::Uint4(u) => {
314 self.buffer.push(ValueKind::Uint4.byte());
315 self.extend_u32(*u);
316 }
317 Value::Uint8(u) => {
318 self.buffer.push(ValueKind::Uint8.byte());
319 self.extend_u64(*u);
320 }
321 Value::Uint16(u) => {
322 self.buffer.push(ValueKind::Uint16.byte());
323 self.extend_u128(*u);
324 }
325 Value::Date(d) => {
326 self.buffer.push(ValueKind::Date.byte());
327 self.extend_date(d);
328 }
329 Value::DateTime(dt) => {
330 self.buffer.push(ValueKind::DateTime.byte());
331 self.extend_datetime(dt);
332 }
333 Value::Time(t) => {
334 self.buffer.push(ValueKind::Time.byte());
335 self.extend_time(t);
336 }
337 Value::Duration(i) => {
338 self.buffer.push(ValueKind::Duration.byte());
339 self.extend_duration(i);
340 }
341 Value::IdentityId(id) => {
342 self.buffer.push(ValueKind::IdentityId.byte());
343 self.extend_identity_id(id);
344 }
345 Value::Uuid4(uuid) => {
346 self.buffer.push(ValueKind::Uuid4.byte());
347 self.extend_uuid4(uuid);
348 }
349 Value::Uuid7(uuid) => {
350 self.buffer.push(ValueKind::Uuid7.byte());
351 self.extend_uuid7(uuid);
352 }
353 Value::Blob(b) => {
354 self.buffer.push(ValueKind::Blob.byte());
355 self.extend_blob(b);
356 }
357 Value::Int(i) => {
358 self.buffer.push(ValueKind::Int.byte());
359 self.extend_int(i);
360 }
361 Value::Uint(u) => {
362 self.buffer.push(ValueKind::Uint.byte());
363 self.extend_uint(u);
364 }
365 Value::Decimal(d) => {
366 self.buffer.push(ValueKind::Decimal.byte());
367 self.extend_decimal(d);
368 }
369 Value::Any(_) | Value::Type(_) | Value::List(_) | Value::Record(_) | Value::Tuple(_) => {
370 unreachable!("Any/ValueType/List/Record/Tuple values cannot be serialized in keys");
371 }
372 Value::DictionaryId(id) => {
373 self.buffer.push(ValueKind::DictionaryId.byte());
374 match id {
375 DictionaryEntryId::U1(v) => {
376 self.buffer.push(0x00);
377 self.extend_u8(*v);
378 }
379 DictionaryEntryId::U2(v) => {
380 self.buffer.push(0x01);
381 self.extend_u16(*v);
382 }
383 DictionaryEntryId::U4(v) => {
384 self.buffer.push(0x02);
385 self.extend_u32(*v);
386 }
387 DictionaryEntryId::U8(v) => {
388 self.buffer.push(0x03);
389 self.extend_u64(*v);
390 }
391 DictionaryEntryId::U16(v) => {
392 self.buffer.push(0x04);
393 self.extend_u128(*v);
394 }
395 }
396 }
397 }
398 self
399 }
400}
401
402impl Default for KeySerializer {
403 fn default() -> Self {
404 Self::new()
405 }
406}
407
408#[cfg(test)]
409pub mod tests {
410 use std::{f64, str::FromStr};
411
412 use num_bigint::BigInt;
413 use reifydb_runtime::context::{
414 clock::{Clock, MockClock},
415 rng::Rng,
416 };
417 use reifydb_value::{
418 util::hex,
419 value::{
420 Value,
421 blob::Blob,
422 date::Date,
423 datetime::DateTime,
424 decimal::Decimal,
425 dictionary::DictionaryEntryId,
426 duration::Duration,
427 identity::IdentityId,
428 int::Int,
429 ordered_f32::OrderedF32,
430 ordered_f64::OrderedF64,
431 row_number::RowNumber,
432 time::Time,
433 uint::Uint,
434 uuid::{Uuid4, Uuid7},
435 value_type::ValueType,
436 },
437 };
438
439 use crate::key::{deserializer::KeyDeserializer, serializer::KeySerializer, sort::SortOrder};
440
441 fn test_clock_and_rng() -> (MockClock, Clock, Rng) {
442 let mock = MockClock::from_millis(1000);
443 let clock = Clock::Mock(mock.clone());
444 let rng = Rng::seeded(42);
445 (mock, clock, rng)
446 }
447
448 #[test]
449 fn test_new() {
450 let serializer = KeySerializer::new();
451 assert!(serializer.is_empty());
452 assert_eq!(serializer.len(), 0);
453 }
454
455 #[test]
456 fn test_with_capacity() {
457 let serializer = KeySerializer::with_capacity(100);
458 assert!(serializer.is_empty());
459 assert_eq!(serializer.len(), 0);
460 }
461
462 #[test]
463 fn test_extend_bool() {
464 let mut serializer = KeySerializer::new();
465 serializer.extend_bool(true);
466 let result = serializer.finish();
467 assert_eq!(result, vec![0x00]);
468 assert_eq!(hex::encode(&result), "00");
469
470 let mut serializer = KeySerializer::new();
471 serializer.extend_bool(false);
472 let result = serializer.finish();
473 assert_eq!(result, vec![0x01]);
474 assert_eq!(hex::encode(&result), "01");
475 }
476
477 #[test]
478 fn test_extend_f32() {
479 let mut serializer = KeySerializer::new();
480 serializer.extend_f32(3.14f32);
481 let result = serializer.finish();
482 assert_eq!(result.len(), 4);
483 assert_eq!(hex::encode(&result), "3fb70a3c");
484
485 let mut serializer = KeySerializer::new();
486 serializer.extend_f32(-3.14f32);
487 let result = serializer.finish();
488 assert_eq!(result.len(), 4);
489 assert_eq!(hex::encode(&result), "c048f5c3");
490
491 let mut serializer = KeySerializer::new();
492 serializer.extend_f32(0.0f32);
493 let result = serializer.finish();
494 assert_eq!(hex::encode(&result), "7fffffff");
495
496 let mut serializer = KeySerializer::new();
497 serializer.extend_f32(f32::MAX);
498 let result = serializer.finish();
499 assert_eq!(hex::encode(&result), "00800000");
500
501 let mut serializer = KeySerializer::new();
502 serializer.extend_f32(f32::MIN);
503 let result = serializer.finish();
504 assert_eq!(hex::encode(&result), "ff7fffff");
505 }
506
507 #[test]
508 fn test_extend_f64() {
509 let mut serializer = KeySerializer::new();
510 serializer.extend_f64(f64::consts::PI);
511 let result = serializer.finish();
512 assert_eq!(result.len(), 8);
513 assert_eq!(hex::encode(&result), "3ff6de04abbbd2e7");
514
515 let mut serializer = KeySerializer::new();
516 serializer.extend_f64(-f64::consts::PI);
517 let result = serializer.finish();
518 assert_eq!(result.len(), 8);
519 assert_eq!(hex::encode(&result), "c00921fb54442d18");
520
521 let mut serializer = KeySerializer::new();
522 serializer.extend_f64(0.0f64);
523 let result = serializer.finish();
524 assert_eq!(hex::encode(&result), "7fffffffffffffff");
525 }
526
527 #[test]
528 fn test_extend_i8() {
529 let mut serializer = KeySerializer::new();
530 serializer.extend_i8(0i8);
531 let result = serializer.finish();
532 assert_eq!(hex::encode(&result), "7f");
533
534 let mut serializer = KeySerializer::new();
535 serializer.extend_i8(1i8);
536 let result = serializer.finish();
537 assert_eq!(hex::encode(&result), "7e");
538
539 let mut serializer = KeySerializer::new();
540 serializer.extend_i8(-1i8);
541 let result = serializer.finish();
542 assert_eq!(hex::encode(&result), "80");
543
544 let mut serializer = KeySerializer::new();
545 serializer.extend_i8(i8::MAX);
546 let result = serializer.finish();
547 assert_eq!(hex::encode(&result), "00");
548
549 let mut serializer = KeySerializer::new();
550 serializer.extend_i8(i8::MIN);
551 let result = serializer.finish();
552 assert_eq!(hex::encode(&result), "ff");
553 }
554
555 #[test]
556 fn test_extend_i16() {
557 let mut serializer = KeySerializer::new();
558 serializer.extend_i16(0i16);
559 let result = serializer.finish();
560 assert_eq!(hex::encode(&result), "7fff");
561
562 let mut serializer = KeySerializer::new();
563 serializer.extend_i16(1i16);
564 let result = serializer.finish();
565 assert_eq!(hex::encode(&result), "7ffe");
566
567 let mut serializer = KeySerializer::new();
568 serializer.extend_i16(-1i16);
569 let result = serializer.finish();
570 assert_eq!(hex::encode(&result), "8000");
571
572 let mut serializer = KeySerializer::new();
573 serializer.extend_i16(i16::MAX);
574 let result = serializer.finish();
575 assert_eq!(hex::encode(&result), "0000");
576
577 let mut serializer = KeySerializer::new();
578 serializer.extend_i16(i16::MIN);
579 let result = serializer.finish();
580 assert_eq!(hex::encode(&result), "ffff");
581 }
582
583 #[test]
584 fn test_extend_i32() {
585 let mut serializer = KeySerializer::new();
586 serializer.extend_i32(0i32);
587 let result = serializer.finish();
588 assert_eq!(hex::encode(&result), "7fffffff");
589
590 let mut serializer = KeySerializer::new();
591 serializer.extend_i32(1i32);
592 let result = serializer.finish();
593 assert_eq!(hex::encode(&result), "7ffffffe");
594
595 let mut serializer = KeySerializer::new();
596 serializer.extend_i32(-1i32);
597 let result = serializer.finish();
598 assert_eq!(hex::encode(&result), "80000000");
599
600 let mut serializer = KeySerializer::new();
601 serializer.extend_i32(i32::MAX);
602 let result = serializer.finish();
603 assert_eq!(hex::encode(&result), "00000000");
604
605 let mut serializer = KeySerializer::new();
606 serializer.extend_i32(i32::MIN);
607 let result = serializer.finish();
608 assert_eq!(hex::encode(&result), "ffffffff");
609 }
610
611 #[test]
612 fn test_extend_i64() {
613 let mut serializer = KeySerializer::new();
614 serializer.extend_i64(0i64);
615 let result = serializer.finish();
616 assert_eq!(hex::encode(&result), "7f");
617
618 let mut serializer = KeySerializer::new();
619 serializer.extend_i64(1i64);
620 let result = serializer.finish();
621 assert_eq!(hex::encode(&result), "7e");
622
623 let mut serializer = KeySerializer::new();
624 serializer.extend_i64(-1i64);
625 let result = serializer.finish();
626 assert_eq!(hex::encode(&result), "80");
627
628 let mut serializer = KeySerializer::new();
629 serializer.extend_i64(i64::MAX);
630 let result = serializer.finish();
631 assert_eq!(hex::encode(&result), "018000000000000000");
632
633 let mut serializer = KeySerializer::new();
634 serializer.extend_i64(i64::MIN);
635 let result = serializer.finish();
636 assert_eq!(hex::encode(&result), "fe7fffffffffffffff");
637 }
638
639 #[test]
640 fn test_extend_i128() {
641 let mut serializer = KeySerializer::new();
642 serializer.extend_i128(0i128);
643 let result = serializer.finish();
644 assert_eq!(hex::encode(&result), "7fffffffffffffffffffffffffffffff");
645
646 let mut serializer = KeySerializer::new();
647 serializer.extend_i128(1i128);
648 let result = serializer.finish();
649 assert_eq!(hex::encode(&result), "7ffffffffffffffffffffffffffffffe");
650
651 let mut serializer = KeySerializer::new();
652 serializer.extend_i128(-1i128);
653 let result = serializer.finish();
654 assert_eq!(hex::encode(&result), "80000000000000000000000000000000");
655
656 let mut serializer = KeySerializer::new();
657 serializer.extend_i128(i128::MAX);
658 let result = serializer.finish();
659 assert_eq!(hex::encode(&result), "00000000000000000000000000000000");
660
661 let mut serializer = KeySerializer::new();
662 serializer.extend_i128(i128::MIN);
663 let result = serializer.finish();
664 assert_eq!(hex::encode(&result), "ffffffffffffffffffffffffffffffff");
665 }
666
667 #[test]
668 fn test_extend_u8() {
669 let mut serializer = KeySerializer::new();
670 serializer.extend_u8(0u8);
671 let result = serializer.finish();
672 assert_eq!(hex::encode(&result), "ff");
673
674 let mut serializer = KeySerializer::new();
675 serializer.extend_u8(1u8);
676 let result = serializer.finish();
677 assert_eq!(hex::encode(&result), "fe");
678
679 let mut serializer = KeySerializer::new();
680 serializer.extend_u8(255u8);
681 let result = serializer.finish();
682 assert_eq!(hex::encode(&result), "00");
683 }
684
685 #[test]
686 fn test_extend_u16() {
687 let mut serializer = KeySerializer::new();
688 serializer.extend_u16(0u16);
689 let result = serializer.finish();
690 assert_eq!(hex::encode(&result), "ffff");
691
692 let mut serializer = KeySerializer::new();
693 serializer.extend_u16(1u16);
694 let result = serializer.finish();
695 assert_eq!(hex::encode(&result), "fffe");
696
697 let mut serializer = KeySerializer::new();
698 serializer.extend_u16(255u16);
699 let result = serializer.finish();
700 assert_eq!(hex::encode(&result), "ff00");
701
702 let mut serializer = KeySerializer::new();
703 serializer.extend_u16(u16::MAX);
704 let result = serializer.finish();
705 assert_eq!(hex::encode(&result), "0000");
706 }
707
708 #[test]
709 fn test_extend_u32() {
710 let mut serializer = KeySerializer::new();
711 serializer.extend_u32(0u32);
712 let result = serializer.finish();
713 assert_eq!(hex::encode(&result), "ff");
714
715 let mut serializer = KeySerializer::new();
716 serializer.extend_u32(1u32);
717 let result = serializer.finish();
718 assert_eq!(hex::encode(&result), "fe");
719
720 let mut serializer = KeySerializer::new();
721 serializer.extend_u32(u32::MAX);
722 let result = serializer.finish();
723 assert_eq!(hex::encode(&result), "0f00000000");
724 }
725
726 #[test]
727 fn test_extend_u64() {
728 let mut serializer = KeySerializer::new();
729 serializer.extend_u64(0u64);
730 let result = serializer.finish();
731 assert_eq!(hex::encode(&result), "ff");
732
733 let mut serializer = KeySerializer::new();
734 serializer.extend_u64(1u64);
735 let result = serializer.finish();
736 assert_eq!(hex::encode(&result), "fe");
737
738 let mut serializer = KeySerializer::new();
739 serializer.extend_u64(65535u64);
740 let result = serializer.finish();
741 assert_eq!(hex::encode(&result), "3f0000");
742
743 let mut serializer = KeySerializer::new();
744 serializer.extend_u64(u64::MAX);
745 let result = serializer.finish();
746 assert_eq!(hex::encode(&result), "000000000000000000");
747 }
748
749 #[test]
750 fn test_extend_u128() {
751 let mut serializer = KeySerializer::new();
752 serializer.extend_u128(0u128);
753 let result = serializer.finish();
754 assert_eq!(hex::encode(&result), "ffffffffffffffffffffffffffffffff");
755
756 let mut serializer = KeySerializer::new();
757 serializer.extend_u128(1u128);
758 let result = serializer.finish();
759 assert_eq!(hex::encode(&result), "fffffffffffffffffffffffffffffffe");
760
761 let mut serializer = KeySerializer::new();
762 serializer.extend_u128(u128::MAX);
763 let result = serializer.finish();
764 assert_eq!(hex::encode(&result), "00000000000000000000000000000000");
765 }
766
767 #[test]
768 fn test_extend_bytes() {
769 let mut serializer = KeySerializer::new();
770 serializer.extend_bytes(b"hello");
771 let result = serializer.finish();
772 assert_eq!(result, vec![b'h', b'e', b'l', b'l', b'o', 0xff, 0xff]);
774
775 let mut serializer = KeySerializer::new();
777 serializer.extend_bytes(&[0x01, 0xff, 0x02]);
778 let result = serializer.finish();
779 assert_eq!(result, vec![0x01, 0xff, 0x00, 0x02, 0xff, 0xff]);
781 }
782
783 #[test]
784 fn test_extend_str() {
785 let mut serializer = KeySerializer::new();
786 serializer.extend_str("hello world");
787 let result = serializer.finish();
788 assert!(result.len() > "hello world".len());
790 assert!(result.ends_with(&[0xff, 0xff]));
791 }
792
793 #[test]
794 fn test_extend_raw() {
795 let mut serializer = KeySerializer::new();
796 serializer.extend_raw(&[0x01, 0x02, 0x03]);
797 let result = serializer.finish();
798 assert_eq!(result, vec![0x01, 0x02, 0x03]);
799 }
800
801 #[test]
802 fn test_chaining() {
803 let mut serializer = KeySerializer::new();
804 serializer.extend_bool(true).extend_i32(42i32).extend_str("test").extend_u64(1000u64);
805 let result = serializer.finish();
806
807 assert!(result.len() >= 13);
809
810 let mut de = KeyDeserializer::from_bytes(&result);
811 assert_eq!(de.read_bool().unwrap(), true);
812 assert_eq!(de.read_i32().unwrap(), 42);
813 assert_eq!(de.read_str().unwrap(), "test");
814 assert_eq!(de.read_u64().unwrap(), 1000);
815 assert!(de.is_empty());
816 }
817
818 #[test]
819 fn test_ordering_descending_i32() {
820 let mut ser1 = KeySerializer::new();
822 ser1.extend_i32(1i32);
823 let bytes1 = ser1.finish();
824
825 let mut ser2 = KeySerializer::new();
826 ser2.extend_i32(100i32);
827 let bytes2 = ser2.finish();
828
829 let mut ser3 = KeySerializer::new();
830 ser3.extend_i32(1000i32);
831 let bytes3 = ser3.finish();
832
833 assert!(bytes3 < bytes2, "encode(1000) should be < encode(100)");
836 assert!(bytes2 < bytes1, "encode(100) should be < encode(1)");
837 }
838
839 #[test]
840 fn test_extend_value_with_direction_ascending() {
841 let enc = |v: i32| {
843 let mut s = KeySerializer::new();
844 s.extend_value_with_direction(&Value::Int4(v), SortOrder::Asc);
845 s.finish()
846 };
847 assert!(enc(1) < enc(100), "asc: encode(1) should sort before encode(100)");
848 assert!(enc(100) < enc(1000), "asc: encode(100) should sort before encode(1000)");
849 assert!(enc(-5) < enc(0), "asc: encode(-5) should sort before encode(0)");
850 }
851
852 #[test]
853 fn test_extend_value_with_direction_descending() {
854 let enc = |v: i32| {
856 let mut s = KeySerializer::new();
857 s.extend_value_with_direction(&Value::Int4(v), SortOrder::Desc);
858 s.finish()
859 };
860 assert!(enc(1000) < enc(100), "desc: encode(1000) should sort before encode(100)");
861 assert!(enc(100) < enc(1), "desc: encode(100) should sort before encode(1)");
862 }
863
864 #[test]
865 fn test_extend_value_with_direction_none_policy() {
866 let enc = |v: &Value, d: SortOrder| {
868 let mut s = KeySerializer::new();
869 s.extend_value_with_direction(v, d);
870 s.finish()
871 };
872 let none = Value::none_of(ValueType::Int4);
873 let present = Value::Int4(0);
874 assert!(
875 enc(&present, SortOrder::Asc) < enc(&none, SortOrder::Asc),
876 "asc: present should sort before none"
877 );
878 assert!(
879 enc(&none, SortOrder::Desc) < enc(&present, SortOrder::Desc),
880 "desc: none should sort before present"
881 );
882 }
883
884 #[test]
885 fn test_extend_value_with_direction_utf8() {
886 let enc = |s: &str, d: SortOrder| {
889 let mut ser = KeySerializer::new();
890 ser.extend_value_with_direction(&Value::Utf8(s.to_string()), d);
891 ser.finish()
892 };
893 assert!(enc("apple", SortOrder::Asc) < enc("banana", SortOrder::Asc), "asc: apple < banana");
894 assert!(enc("banana", SortOrder::Asc) < enc("cherry", SortOrder::Asc), "asc: banana < cherry");
895 assert!(enc("cherry", SortOrder::Desc) < enc("banana", SortOrder::Desc), "desc: cherry first");
896 assert!(enc("banana", SortOrder::Desc) < enc("apple", SortOrder::Desc), "desc: banana before apple");
897 }
898
899 #[test]
900 fn test_ordering_descending_u64() {
901 let mut ser1 = KeySerializer::new();
902 ser1.extend_u64(1u64);
903 let bytes1 = ser1.finish();
904
905 let mut ser2 = KeySerializer::new();
906 ser2.extend_u64(100u64);
907 let bytes2 = ser2.finish();
908
909 let mut ser3 = KeySerializer::new();
910 ser3.extend_u64(10000u64);
911 let bytes3 = ser3.finish();
912
913 assert!(bytes3 < bytes2, "encode(10000) should be < encode(100)");
915 assert!(bytes2 < bytes1, "encode(100) should be < encode(1)");
916 }
917
918 #[test]
919 fn test_ordering_descending_negative() {
920 let mut ser1 = KeySerializer::new();
924 ser1.extend_i32(-1i32);
925 let bytes_neg1 = ser1.finish();
926
927 let mut ser2 = KeySerializer::new();
928 ser2.extend_i32(-100i32);
929 let bytes_neg100 = ser2.finish();
930
931 let mut ser3 = KeySerializer::new();
932 ser3.extend_i32(-1000i32);
933 let bytes_neg1000 = ser3.finish();
934
935 assert!(bytes_neg1 < bytes_neg100, "encode(-1) should be < encode(-100)");
937 assert!(bytes_neg100 < bytes_neg1000, "encode(-100) should be < encode(-1000)");
938 }
939
940 #[test]
941 fn test_ordering_mixed_sign() {
942 let mut ser_neg = KeySerializer::new();
944 ser_neg.extend_i32(-1i32);
945 let bytes_neg = ser_neg.finish();
946
947 let mut ser_zero = KeySerializer::new();
948 ser_zero.extend_i32(0i32);
949 let bytes_zero = ser_zero.finish();
950
951 let mut ser_pos = KeySerializer::new();
952 ser_pos.extend_i32(1i32);
953 let bytes_pos = ser_pos.finish();
954
955 assert!(bytes_pos < bytes_zero, "encode(1) should be < encode(0)");
957 assert!(bytes_zero < bytes_neg, "encode(0) should be < encode(-1)");
958 }
959
960 #[test]
961 fn test_date() {
962 let mut serializer = KeySerializer::new();
963 let date = Date::from_ymd(2024, 1, 1).unwrap();
964 serializer.extend_date(&date);
965 let result = serializer.finish();
966 assert_eq!(result.len(), 4); }
968
969 #[test]
970 fn test_datetime() {
971 let mut serializer = KeySerializer::new();
972 let datetime = DateTime::from_ymd_hms(2024, 1, 1, 12, 0, 0).unwrap();
973 serializer.extend_datetime(&datetime);
974 let result = serializer.finish();
975 assert_eq!(result.len(), 9); }
977
978 #[test]
979 fn test_time() {
980 let mut serializer = KeySerializer::new();
981 let time = Time::from_hms(12, 30, 45).unwrap();
982 serializer.extend_time(&time);
983 let result = serializer.finish();
984 assert_eq!(result.len(), 7); }
986
987 #[test]
988 fn test_interval() {
989 let mut serializer = KeySerializer::new();
990 let duration = Duration::from_nanoseconds(1000000).unwrap();
991 serializer.extend_duration(&duration);
992 let result = serializer.finish();
993 assert_eq!(result.len(), 17); }
995
996 #[test]
997 fn test_row_number() {
998 let mut serializer = KeySerializer::new();
999 let row_number = RowNumber(42);
1000 serializer.extend_row_number(&row_number);
1001 let result = serializer.finish();
1002 assert_eq!(result.len(), 1); }
1004
1005 #[test]
1006 fn test_identity_id() {
1007 let (_, clock, rng) = test_clock_and_rng();
1008 let mut serializer = KeySerializer::new();
1009 let id = IdentityId::generate(&clock, &rng);
1010 serializer.extend_identity_id(&id);
1011 let result = serializer.finish();
1012 assert!(result.len() > 0);
1013 }
1014
1015 #[test]
1016 fn test_uuid4() {
1017 let mut serializer = KeySerializer::new();
1018 let uuid = Uuid4::generate();
1019 serializer.extend_uuid4(&uuid);
1020 let result = serializer.finish();
1021 assert!(result.len() > 16);
1023 }
1024
1025 #[test]
1026 fn test_uuid7() {
1027 let (_, clock, rng) = test_clock_and_rng();
1028 let mut serializer = KeySerializer::new();
1029 let uuid = Uuid7::generate(&clock, &rng);
1030 serializer.extend_uuid7(&uuid);
1031 let result = serializer.finish();
1032 assert!(result.len() > 16);
1034 }
1035
1036 #[test]
1037 fn test_blob() {
1038 let mut serializer = KeySerializer::new();
1039 let blob = Blob::from(vec![0x01, 0x02, 0x03]);
1040 serializer.extend_blob(&blob);
1041 let result = serializer.finish();
1042 assert!(result.len() > 3);
1044 }
1045
1046 #[test]
1047 fn test_int() {
1048 let mut serializer = KeySerializer::new();
1049 let int = Int(BigInt::from(42));
1050 serializer.extend_int(&int);
1051 let result = serializer.finish();
1052 assert!(result.len() > 0);
1054 }
1055
1056 #[test]
1057 fn test_uint() {
1058 let mut serializer = KeySerializer::new();
1059 let uint = Uint(BigInt::from(42));
1060 serializer.extend_uint(&uint);
1061 let result = serializer.finish();
1062 assert!(result.len() > 0);
1064 }
1065
1066 #[test]
1067 fn test_decimal() {
1068 let mut serializer = KeySerializer::new();
1069 let decimal = Decimal::from_str("3.14").unwrap();
1070 serializer.extend_decimal(&decimal);
1071 let result = serializer.finish();
1072 assert!(result.len() > 0);
1074 }
1075
1076 #[test]
1077 fn test_extend_value() {
1078 let mut serializer = KeySerializer::new();
1080 serializer.extend_value(&Value::none());
1081 let result = serializer.finish();
1082 assert_eq!(result, vec![0x00, 0x1a]); let mut serializer = KeySerializer::new();
1086 serializer.extend_value(&Value::none_of(ValueType::Int4));
1087 let result = serializer.finish();
1088 assert_eq!(result, vec![0x00, 0x06]); let mut serializer = KeySerializer::new();
1092 serializer.extend_value(&Value::Boolean(true));
1093 let result = serializer.finish();
1094 assert_eq!(result[0], 0x01); assert_eq!(result.len(), 2); let mut serializer = KeySerializer::new();
1099 serializer.extend_value(&Value::Int4(42));
1100 let result = serializer.finish();
1101 assert_eq!(result[0], 0x06); assert_eq!(result.len(), 5); let mut serializer = KeySerializer::new();
1106 serializer.extend_value(&Value::Utf8("test".to_string()));
1107 let result = serializer.finish();
1108 assert_eq!(result[0], 0x09); assert!(result.ends_with(&[0xff, 0xff]));
1110 }
1111
1112 #[test]
1113 fn test_roundtrip_none() {
1114 let value = Value::none();
1115 let mut ser = KeySerializer::new();
1116 ser.extend_value(&value);
1117 let bytes = ser.finish();
1118 let mut de = KeyDeserializer::from_bytes(&bytes);
1119 assert_eq!(de.read_value().unwrap(), value);
1120 assert!(de.is_empty());
1121 }
1122
1123 #[test]
1124 fn test_roundtrip_none_typed() {
1125 let value = Value::none_of(ValueType::Int4);
1126 let mut ser = KeySerializer::new();
1127 ser.extend_value(&value);
1128 let bytes = ser.finish();
1129 let mut de = KeyDeserializer::from_bytes(&bytes);
1130 assert_eq!(de.read_value().unwrap(), value);
1131 assert!(de.is_empty());
1132 }
1133
1134 #[test]
1135 fn test_roundtrip_boolean_true() {
1136 let value = Value::Boolean(true);
1137 let mut ser = KeySerializer::new();
1138 ser.extend_value(&value);
1139 let bytes = ser.finish();
1140 let mut de = KeyDeserializer::from_bytes(&bytes);
1141 assert_eq!(de.read_value().unwrap(), value);
1142 assert!(de.is_empty());
1143 }
1144
1145 #[test]
1146 fn test_roundtrip_boolean_false() {
1147 let value = Value::Boolean(false);
1148 let mut ser = KeySerializer::new();
1149 ser.extend_value(&value);
1150 let bytes = ser.finish();
1151 let mut de = KeyDeserializer::from_bytes(&bytes);
1152 assert_eq!(de.read_value().unwrap(), value);
1153 assert!(de.is_empty());
1154 }
1155
1156 #[test]
1157 fn test_roundtrip_float4() {
1158 let value = Value::Float4(OrderedF32::try_from(3.14f32).unwrap());
1159 let mut ser = KeySerializer::new();
1160 ser.extend_value(&value);
1161 let bytes = ser.finish();
1162 let mut de = KeyDeserializer::from_bytes(&bytes);
1163 assert_eq!(de.read_value().unwrap(), value);
1164 assert!(de.is_empty());
1165 }
1166
1167 #[test]
1168 fn test_roundtrip_float8() {
1169 let value = Value::Float8(OrderedF64::try_from(3.14).unwrap());
1170 let mut ser = KeySerializer::new();
1171 ser.extend_value(&value);
1172 let bytes = ser.finish();
1173 let mut de = KeyDeserializer::from_bytes(&bytes);
1174 assert_eq!(de.read_value().unwrap(), value);
1175 assert!(de.is_empty());
1176 }
1177
1178 #[test]
1179 fn test_roundtrip_int1() {
1180 let value = Value::Int1(-42);
1181 let mut ser = KeySerializer::new();
1182 ser.extend_value(&value);
1183 let bytes = ser.finish();
1184 let mut de = KeyDeserializer::from_bytes(&bytes);
1185 assert_eq!(de.read_value().unwrap(), value);
1186 assert!(de.is_empty());
1187 }
1188
1189 #[test]
1190 fn test_roundtrip_int2() {
1191 let value = Value::Int2(-1000);
1192 let mut ser = KeySerializer::new();
1193 ser.extend_value(&value);
1194 let bytes = ser.finish();
1195 let mut de = KeyDeserializer::from_bytes(&bytes);
1196 assert_eq!(de.read_value().unwrap(), value);
1197 assert!(de.is_empty());
1198 }
1199
1200 #[test]
1201 fn test_roundtrip_int4() {
1202 let value = Value::Int4(42);
1203 let mut ser = KeySerializer::new();
1204 ser.extend_value(&value);
1205 let bytes = ser.finish();
1206 let mut de = KeyDeserializer::from_bytes(&bytes);
1207 assert_eq!(de.read_value().unwrap(), value);
1208 assert!(de.is_empty());
1209 }
1210
1211 #[test]
1212 fn test_roundtrip_int8() {
1213 let value = Value::Int8(-1_000_000);
1214 let mut ser = KeySerializer::new();
1215 ser.extend_value(&value);
1216 let bytes = ser.finish();
1217 let mut de = KeyDeserializer::from_bytes(&bytes);
1218 assert_eq!(de.read_value().unwrap(), value);
1219 assert!(de.is_empty());
1220 }
1221
1222 #[test]
1223 fn test_roundtrip_int16() {
1224 let value = Value::Int16(123_456_789);
1225 let mut ser = KeySerializer::new();
1226 ser.extend_value(&value);
1227 let bytes = ser.finish();
1228 let mut de = KeyDeserializer::from_bytes(&bytes);
1229 assert_eq!(de.read_value().unwrap(), value);
1230 assert!(de.is_empty());
1231 }
1232
1233 #[test]
1234 fn test_roundtrip_utf8() {
1235 let value = Value::Utf8("hello world".to_string());
1236 let mut ser = KeySerializer::new();
1237 ser.extend_value(&value);
1238 let bytes = ser.finish();
1239 let mut de = KeyDeserializer::from_bytes(&bytes);
1240 assert_eq!(de.read_value().unwrap(), value);
1241 assert!(de.is_empty());
1242 }
1243
1244 #[test]
1245 fn test_roundtrip_uint1() {
1246 let value = Value::Uint1(255);
1247 let mut ser = KeySerializer::new();
1248 ser.extend_value(&value);
1249 let bytes = ser.finish();
1250 let mut de = KeyDeserializer::from_bytes(&bytes);
1251 assert_eq!(de.read_value().unwrap(), value);
1252 assert!(de.is_empty());
1253 }
1254
1255 #[test]
1256 fn test_roundtrip_uint2() {
1257 let value = Value::Uint2(65535);
1258 let mut ser = KeySerializer::new();
1259 ser.extend_value(&value);
1260 let bytes = ser.finish();
1261 let mut de = KeyDeserializer::from_bytes(&bytes);
1262 assert_eq!(de.read_value().unwrap(), value);
1263 assert!(de.is_empty());
1264 }
1265
1266 #[test]
1267 fn test_roundtrip_uint4() {
1268 let value = Value::Uint4(100_000);
1269 let mut ser = KeySerializer::new();
1270 ser.extend_value(&value);
1271 let bytes = ser.finish();
1272 let mut de = KeyDeserializer::from_bytes(&bytes);
1273 assert_eq!(de.read_value().unwrap(), value);
1274 assert!(de.is_empty());
1275 }
1276
1277 #[test]
1278 fn test_roundtrip_uint8() {
1279 let value = Value::Uint8(999);
1280 let mut ser = KeySerializer::new();
1281 ser.extend_value(&value);
1282 let bytes = ser.finish();
1283 let mut de = KeyDeserializer::from_bytes(&bytes);
1284 assert_eq!(de.read_value().unwrap(), value);
1285 assert!(de.is_empty());
1286 }
1287
1288 #[test]
1289 fn test_roundtrip_uint16() {
1290 let value = Value::Uint16(u128::MAX);
1291 let mut ser = KeySerializer::new();
1292 ser.extend_value(&value);
1293 let bytes = ser.finish();
1294 let mut de = KeyDeserializer::from_bytes(&bytes);
1295 assert_eq!(de.read_value().unwrap(), value);
1296 assert!(de.is_empty());
1297 }
1298
1299 #[test]
1300 fn test_roundtrip_date() {
1301 let value = Value::Date(Date::from_ymd(2024, 6, 15).unwrap());
1302 let mut ser = KeySerializer::new();
1303 ser.extend_value(&value);
1304 let bytes = ser.finish();
1305 let mut de = KeyDeserializer::from_bytes(&bytes);
1306 assert_eq!(de.read_value().unwrap(), value);
1307 assert!(de.is_empty());
1308 }
1309
1310 #[test]
1311 fn test_roundtrip_datetime() {
1312 let value = Value::DateTime(DateTime::from_ymd_hms(2024, 6, 15, 12, 30, 45).unwrap());
1313 let mut ser = KeySerializer::new();
1314 ser.extend_value(&value);
1315 let bytes = ser.finish();
1316 let mut de = KeyDeserializer::from_bytes(&bytes);
1317 assert_eq!(de.read_value().unwrap(), value);
1318 assert!(de.is_empty());
1319 }
1320
1321 #[test]
1322 fn test_roundtrip_time() {
1323 let value = Value::Time(Time::from_hms(12, 30, 45).unwrap());
1324 let mut ser = KeySerializer::new();
1325 ser.extend_value(&value);
1326 let bytes = ser.finish();
1327 let mut de = KeyDeserializer::from_bytes(&bytes);
1328 assert_eq!(de.read_value().unwrap(), value);
1329 assert!(de.is_empty());
1330 }
1331
1332 #[test]
1333 fn test_roundtrip_duration() {
1334 let value = Value::duration_nanoseconds(1_000_000);
1335 let mut ser = KeySerializer::new();
1336 ser.extend_value(&value);
1337 let bytes = ser.finish();
1338 let mut de = KeyDeserializer::from_bytes(&bytes);
1339 assert_eq!(de.read_value().unwrap(), value);
1340 assert!(de.is_empty());
1341 }
1342
1343 #[test]
1344 fn test_roundtrip_identity_id() {
1345 let (_, clock, rng) = test_clock_and_rng();
1346 let value = Value::IdentityId(IdentityId::generate(&clock, &rng));
1347 let mut ser = KeySerializer::new();
1348 ser.extend_value(&value);
1349 let bytes = ser.finish();
1350 let mut de = KeyDeserializer::from_bytes(&bytes);
1351 assert_eq!(de.read_value().unwrap(), value);
1352 assert!(de.is_empty());
1353 }
1354
1355 #[test]
1356 fn test_roundtrip_uuid4() {
1357 let value = Value::Uuid4(Uuid4::generate());
1358 let mut ser = KeySerializer::new();
1359 ser.extend_value(&value);
1360 let bytes = ser.finish();
1361 let mut de = KeyDeserializer::from_bytes(&bytes);
1362 assert_eq!(de.read_value().unwrap(), value);
1363 assert!(de.is_empty());
1364 }
1365
1366 #[test]
1367 fn test_roundtrip_uuid7() {
1368 let (_, clock, rng) = test_clock_and_rng();
1369 let value = Value::Uuid7(Uuid7::generate(&clock, &rng));
1370 let mut ser = KeySerializer::new();
1371 ser.extend_value(&value);
1372 let bytes = ser.finish();
1373 let mut de = KeyDeserializer::from_bytes(&bytes);
1374 assert_eq!(de.read_value().unwrap(), value);
1375 assert!(de.is_empty());
1376 }
1377
1378 #[test]
1379 fn test_roundtrip_blob() {
1380 let value = Value::Blob(Blob::from(vec![0x01, 0x02, 0x03]));
1381 let mut ser = KeySerializer::new();
1382 ser.extend_value(&value);
1383 let bytes = ser.finish();
1384 let mut de = KeyDeserializer::from_bytes(&bytes);
1385 assert_eq!(de.read_value().unwrap(), value);
1386 assert!(de.is_empty());
1387 }
1388
1389 #[test]
1390 fn test_roundtrip_int() {
1391 let value = Value::Int(Int(BigInt::from(-42)));
1392 let mut ser = KeySerializer::new();
1393 ser.extend_value(&value);
1394 let bytes = ser.finish();
1395 let mut de = KeyDeserializer::from_bytes(&bytes);
1396 assert_eq!(de.read_value().unwrap(), value);
1397 assert!(de.is_empty());
1398 }
1399
1400 #[test]
1401 fn test_roundtrip_uint() {
1402 let value = Value::Uint(Uint(BigInt::from(42)));
1403 let mut ser = KeySerializer::new();
1404 ser.extend_value(&value);
1405 let bytes = ser.finish();
1406 let mut de = KeyDeserializer::from_bytes(&bytes);
1407 assert_eq!(de.read_value().unwrap(), value);
1408 assert!(de.is_empty());
1409 }
1410
1411 #[test]
1412 fn test_roundtrip_decimal() {
1413 let value = Value::Decimal(Decimal::from_str("3.14").unwrap());
1414 let mut ser = KeySerializer::new();
1415 ser.extend_value(&value);
1416 let bytes = ser.finish();
1417 let mut de = KeyDeserializer::from_bytes(&bytes);
1418 assert_eq!(de.read_value().unwrap(), value);
1419 assert!(de.is_empty());
1420 }
1421
1422 #[test]
1423 fn test_roundtrip_dictionary_id_u1() {
1424 let value = Value::DictionaryId(DictionaryEntryId::U1(42));
1425 let mut ser = KeySerializer::new();
1426 ser.extend_value(&value);
1427 let bytes = ser.finish();
1428 let mut de = KeyDeserializer::from_bytes(&bytes);
1429 assert_eq!(de.read_value().unwrap(), value);
1430 assert!(de.is_empty());
1431 }
1432
1433 #[test]
1434 fn test_roundtrip_dictionary_id_u2() {
1435 let value = Value::DictionaryId(DictionaryEntryId::U2(1000));
1436 let mut ser = KeySerializer::new();
1437 ser.extend_value(&value);
1438 let bytes = ser.finish();
1439 let mut de = KeyDeserializer::from_bytes(&bytes);
1440 assert_eq!(de.read_value().unwrap(), value);
1441 assert!(de.is_empty());
1442 }
1443
1444 #[test]
1445 fn test_roundtrip_dictionary_id_u4() {
1446 let value = Value::DictionaryId(DictionaryEntryId::U4(100_000));
1447 let mut ser = KeySerializer::new();
1448 ser.extend_value(&value);
1449 let bytes = ser.finish();
1450 let mut de = KeyDeserializer::from_bytes(&bytes);
1451 assert_eq!(de.read_value().unwrap(), value);
1452 assert!(de.is_empty());
1453 }
1454
1455 #[test]
1456 fn test_roundtrip_dictionary_id_u8() {
1457 let value = Value::DictionaryId(DictionaryEntryId::U8(10_000_000_000));
1458 let mut ser = KeySerializer::new();
1459 ser.extend_value(&value);
1460 let bytes = ser.finish();
1461 let mut de = KeyDeserializer::from_bytes(&bytes);
1462 assert_eq!(de.read_value().unwrap(), value);
1463 assert!(de.is_empty());
1464 }
1465
1466 #[test]
1467 fn test_roundtrip_dictionary_id_u16() {
1468 let value = Value::DictionaryId(DictionaryEntryId::U16(u128::MAX));
1469 let mut ser = KeySerializer::new();
1470 ser.extend_value(&value);
1471 let bytes = ser.finish();
1472 let mut de = KeyDeserializer::from_bytes(&bytes);
1473 assert_eq!(de.read_value().unwrap(), value);
1474 assert!(de.is_empty());
1475 }
1476
1477 #[test]
1478 fn test_roundtrip_all() {
1479 let (_, clock, rng) = test_clock_and_rng();
1480 let values = vec![
1481 Value::none(),
1482 Value::none_of(ValueType::Int4),
1483 Value::Boolean(true),
1484 Value::Boolean(false),
1485 Value::Float4(OrderedF32::try_from(3.14f32).unwrap()),
1486 Value::Float8(OrderedF64::try_from(3.14).unwrap()),
1487 Value::Int1(-42),
1488 Value::Int2(-1000),
1489 Value::Int4(42),
1490 Value::Int8(-1_000_000),
1491 Value::Int16(123_456_789),
1492 Value::Utf8("hello world".to_string()),
1493 Value::Uint1(255),
1494 Value::Uint2(65535),
1495 Value::Uint4(100_000),
1496 Value::Uint8(999),
1497 Value::Uint16(u128::MAX),
1498 Value::Date(Date::from_ymd(2024, 6, 15).unwrap()),
1499 Value::DateTime(DateTime::from_ymd_hms(2024, 6, 15, 12, 30, 45).unwrap()),
1500 Value::Time(Time::from_hms(12, 30, 45).unwrap()),
1501 Value::duration_nanoseconds(1_000_000),
1502 Value::IdentityId(IdentityId::generate(&clock, &rng)),
1503 Value::Uuid4(Uuid4::generate()),
1504 Value::Uuid7(Uuid7::generate(&clock, &rng)),
1505 Value::Blob(Blob::from(vec![0x01, 0x02, 0x03])),
1506 Value::Int(Int(BigInt::from(-42))),
1507 Value::Uint(Uint(BigInt::from(42))),
1508 Value::Decimal(Decimal::from_str("3.14").unwrap()),
1509 Value::DictionaryId(DictionaryEntryId::U8(42)),
1510 ];
1511
1512 let mut ser = KeySerializer::new();
1513 for v in &values {
1514 ser.extend_value(v);
1515 }
1516 let bytes = ser.finish();
1517
1518 let mut de = KeyDeserializer::from_bytes(&bytes);
1519 for expected in &values {
1520 let actual = de.read_value().unwrap();
1521 assert_eq!(&actual, expected);
1522 }
1523 assert!(de.is_empty());
1524 }
1525
1526 #[test]
1530 fn test_roundtrip_exhaustiveness_guard() {
1531 let value = Value::none();
1532 match value {
1533 Value::None {
1534 ..
1535 } => {}
1536 Value::Boolean(_) => {}
1537 Value::Float4(_) => {}
1538 Value::Float8(_) => {}
1539 Value::Int1(_) => {}
1540 Value::Int2(_) => {}
1541 Value::Int4(_) => {}
1542 Value::Int8(_) => {}
1543 Value::Int16(_) => {}
1544 Value::Utf8(_) => {}
1545 Value::Uint1(_) => {}
1546 Value::Uint2(_) => {}
1547 Value::Uint4(_) => {}
1548 Value::Uint8(_) => {}
1549 Value::Uint16(_) => {}
1550 Value::Date(_) => {}
1551 Value::DateTime(_) => {}
1552 Value::Time(_) => {}
1553 Value::Duration(_) => {}
1554 Value::IdentityId(_) => {}
1555 Value::Uuid4(_) => {}
1556 Value::Uuid7(_) => {}
1557 Value::Blob(_) => {}
1558 Value::Int(_) => {}
1559 Value::Uint(_) => {}
1560 Value::Decimal(_) => {}
1561 Value::DictionaryId(_) => {}
1562 Value::Any(_) => {}
1564 Value::Type(_) => {}
1565 Value::List(_) => {}
1566 Value::Record(_) => {}
1567 Value::Tuple(_) => {}
1568 }
1569 }
1570
1571 #[test]
1572 fn test_to_encoded_key() {
1573 let mut serializer = KeySerializer::new();
1574 serializer.extend_i32(42);
1575 let key = serializer.to_encoded_key();
1576 assert_eq!(key.len(), 4);
1577 }
1578}