1use num_bigint::Sign;
5use reifydb_type::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 r#type::Type,
18 uint::Uint,
19 uuid::{Uuid4, Uuid7},
20};
21use serde::Serialize;
22
23use super::{
24 catalog, encode_bool, encode_bytes, encode_f32, encode_f64, encode_i8, encode_i16, encode_i32,
25 encode_i64_varint, encode_i128, encode_u8, encode_u16, encode_u32_varint, encode_u64_varint, encode_u128,
26 serialize,
27};
28use crate::{
29 encoded::key::EncodedKey,
30 interface::catalog::{id::IndexId, shape::ShapeId},
31};
32
33pub struct KeySerializer {
34 buffer: EncodedKey,
35}
36
37impl KeySerializer {
38 pub fn new() -> Self {
39 Self {
40 buffer: EncodedKey::with_capacity(0),
41 }
42 }
43
44 pub fn with_capacity(capacity: usize) -> Self {
45 Self {
46 buffer: EncodedKey::with_capacity(capacity),
47 }
48 }
49
50 pub fn extend_bool(&mut self, value: bool) -> &mut Self {
51 self.buffer.push(encode_bool(value));
52 self
53 }
54
55 pub fn extend_f32(&mut self, value: f32) -> &mut Self {
56 self.buffer.extend_from_slice(&encode_f32(value));
57 self
58 }
59
60 pub fn extend_f64(&mut self, value: f64) -> &mut Self {
61 self.buffer.extend_from_slice(&encode_f64(value));
62 self
63 }
64
65 pub fn extend_i8<T: Into<i8>>(&mut self, value: T) -> &mut Self {
66 self.buffer.extend_from_slice(&encode_i8(value.into()));
67 self
68 }
69
70 pub fn extend_i16<T: Into<i16>>(&mut self, value: T) -> &mut Self {
71 self.buffer.extend_from_slice(&encode_i16(value.into()));
72 self
73 }
74
75 pub fn extend_i32<T: Into<i32>>(&mut self, value: T) -> &mut Self {
76 self.buffer.extend_from_slice(&encode_i32(value.into()));
77 self
78 }
79
80 pub fn extend_i64<T: Into<i64>>(&mut self, value: T) -> &mut Self {
81 encode_i64_varint(value.into(), &mut self.buffer);
82 self
83 }
84
85 pub fn extend_i128<T: Into<i128>>(&mut self, value: T) -> &mut Self {
86 self.buffer.extend_from_slice(&encode_i128(value.into()));
87 self
88 }
89
90 pub fn extend_u8<T: Into<u8>>(&mut self, value: T) -> &mut Self {
91 self.buffer.push(encode_u8(value.into()));
92 self
93 }
94
95 pub fn extend_u16<T: Into<u16>>(&mut self, value: T) -> &mut Self {
96 self.buffer.extend_from_slice(&encode_u16(value.into()));
97 self
98 }
99
100 pub fn extend_u32<T: Into<u32>>(&mut self, value: T) -> &mut Self {
101 encode_u32_varint(value.into(), &mut self.buffer);
102 self
103 }
104
105 pub fn extend_u64<T: Into<u64>>(&mut self, value: T) -> &mut Self {
106 encode_u64_varint(value.into(), &mut self.buffer);
107 self
108 }
109
110 pub fn extend_u128<T: Into<u128>>(&mut self, value: T) -> &mut Self {
111 self.buffer.extend_from_slice(&encode_u128(value.into()));
112 self
113 }
114
115 pub fn extend_bytes<T: AsRef<[u8]>>(&mut self, bytes: T) -> &mut Self {
116 encode_bytes(bytes.as_ref(), &mut self.buffer);
117 self
118 }
119
120 pub fn extend_str<T: AsRef<str>>(&mut self, s: T) -> &mut Self {
121 self.extend_bytes(s.as_ref().as_bytes())
122 }
123
124 pub fn finish(self) -> EncodedKey {
125 self.buffer
126 }
127
128 pub fn to_encoded_key(self) -> EncodedKey {
129 self.buffer
130 }
131
132 pub fn extend_shape_id(&mut self, object: impl Into<ShapeId>) -> &mut Self {
133 let primitive = object.into();
134 catalog::serialize_shape_id(&primitive, &mut self.buffer);
135 self
136 }
137
138 pub fn extend_index_id(&mut self, index: impl Into<IndexId>) -> &mut Self {
139 let index = index.into();
140 catalog::serialize_index_id(&index, &mut self.buffer);
141 self
142 }
143
144 pub fn extend_serialize<T: Serialize>(&mut self, value: &T) -> &mut Self {
145 self.buffer.extend_from_slice(&serialize(value));
146 self
147 }
148
149 pub fn extend_raw(&mut self, bytes: &[u8]) -> &mut Self {
150 self.buffer.extend_from_slice(bytes);
151 self
152 }
153
154 pub fn len(&self) -> usize {
155 self.buffer.len()
156 }
157
158 pub fn is_empty(&self) -> bool {
159 self.buffer.is_empty()
160 }
161
162 pub fn extend_date(&mut self, date: &Date) -> &mut Self {
163 self.extend_i32(date.to_days_since_epoch())
164 }
165
166 pub fn extend_datetime(&mut self, datetime: &DateTime) -> &mut Self {
167 self.extend_u64(datetime.to_nanos())
168 }
169
170 pub fn extend_time(&mut self, time: &Time) -> &mut Self {
171 self.extend_u64(time.to_nanos_since_midnight())
172 }
173
174 pub fn extend_duration(&mut self, duration: &Duration) -> &mut Self {
175 self.extend_i32(duration.get_months()).extend_i32(duration.get_days()).extend_i64(duration.get_nanos())
176 }
177
178 pub fn extend_row_number(&mut self, row_number: &RowNumber) -> &mut Self {
179 self.extend_u64(row_number.0)
180 }
181
182 pub fn extend_identity_id(&mut self, id: &IdentityId) -> &mut Self {
183 self.extend_bytes(id.as_bytes())
184 }
185
186 pub fn extend_uuid4(&mut self, uuid: &Uuid4) -> &mut Self {
187 self.extend_bytes(uuid.as_bytes())
188 }
189
190 pub fn extend_uuid7(&mut self, uuid: &Uuid7) -> &mut Self {
191 self.extend_bytes(uuid.as_bytes())
192 }
193
194 pub fn extend_blob(&mut self, blob: &Blob) -> &mut Self {
195 self.extend_bytes(blob.as_ref() as &[u8])
196 }
197
198 pub fn extend_int(&mut self, int: &Int) -> &mut Self {
199 let (sign, bytes) = int.to_bytes_be();
200
201 self.buffer.push(match sign {
202 Sign::Minus => 0,
203 _ => 1,
204 });
205 self.extend_u32(bytes.len() as u32);
206 self.buffer.extend_from_slice(&bytes);
207 self
208 }
209
210 pub fn extend_uint(&mut self, uint: &Uint) -> &mut Self {
211 let (_sign, bytes) = uint.0.to_bytes_be();
212 self.extend_u32(bytes.len() as u32);
213 self.buffer.extend_from_slice(&bytes);
214 self
215 }
216
217 pub fn extend_decimal(&mut self, decimal: &Decimal) -> &mut Self {
218 let s = decimal.to_string();
219 self.extend_str(&s);
220 self
221 }
222
223 pub fn extend_value(&mut self, value: &Value) -> &mut Self {
224 match value {
225 Value::None {
226 inner,
227 ..
228 } => {
229 self.buffer.push(0x00);
230 self.buffer.push(match inner {
231 Type::Any => 0x00,
232 Type::Boolean => 0x01,
233 Type::Float4 => 0x02,
234 Type::Float8 => 0x03,
235 Type::Int1 => 0x04,
236 Type::Int2 => 0x05,
237 Type::Int4 => 0x06,
238 Type::Int8 => 0x07,
239 Type::Int16 => 0x08,
240 Type::Utf8 => 0x09,
241 Type::Uint1 => 0x0a,
242 Type::Uint2 => 0x0b,
243 Type::Uint4 => 0x0c,
244 Type::Uint8 => 0x0d,
245 Type::Uint16 => 0x0e,
246 Type::Date => 0x0f,
247 Type::DateTime => 0x10,
248 Type::Time => 0x11,
249 Type::Duration => 0x12,
250 Type::IdentityId => 0x14,
251 Type::Uuid4 => 0x15,
252 Type::Uuid7 => 0x16,
253 Type::Blob => 0x17,
254 Type::Int => 0x18,
255 Type::Uint => 0x19,
256 Type::Decimal => 0x1a,
257 Type::DictionaryId => 0x1b,
258 _ => unreachable!(
259 "Option/List/Record/Tuple types cannot be encoded as None inner type in keys"
260 ),
261 });
262 }
263 Value::Boolean(b) => {
264 self.buffer.push(0x01);
265 self.extend_bool(*b);
266 }
267 Value::Float4(f) => {
268 self.buffer.push(0x02);
269 self.extend_f32(**f);
270 }
271 Value::Float8(f) => {
272 self.buffer.push(0x03);
273 self.extend_f64(**f);
274 }
275 Value::Int1(i) => {
276 self.buffer.push(0x04);
277 self.extend_i8(*i);
278 }
279 Value::Int2(i) => {
280 self.buffer.push(0x05);
281 self.extend_i16(*i);
282 }
283 Value::Int4(i) => {
284 self.buffer.push(0x06);
285 self.extend_i32(*i);
286 }
287 Value::Int8(i) => {
288 self.buffer.push(0x07);
289 self.extend_i64(*i);
290 }
291 Value::Int16(i) => {
292 self.buffer.push(0x08);
293 self.extend_i128(*i);
294 }
295 Value::Utf8(s) => {
296 self.buffer.push(0x09);
297 self.extend_str(s);
298 }
299 Value::Uint1(u) => {
300 self.buffer.push(0x0a);
301 self.extend_u8(*u);
302 }
303 Value::Uint2(u) => {
304 self.buffer.push(0x0b);
305 self.extend_u16(*u);
306 }
307 Value::Uint4(u) => {
308 self.buffer.push(0x0c);
309 self.extend_u32(*u);
310 }
311 Value::Uint8(u) => {
312 self.buffer.push(0x0d);
313 self.extend_u64(*u);
314 }
315 Value::Uint16(u) => {
316 self.buffer.push(0x0e);
317 self.extend_u128(*u);
318 }
319 Value::Date(d) => {
320 self.buffer.push(0x0f);
321 self.extend_date(d);
322 }
323 Value::DateTime(dt) => {
324 self.buffer.push(0x10);
325 self.extend_datetime(dt);
326 }
327 Value::Time(t) => {
328 self.buffer.push(0x11);
329 self.extend_time(t);
330 }
331 Value::Duration(i) => {
332 self.buffer.push(0x12);
333 self.extend_duration(i);
334 }
335 Value::IdentityId(id) => {
336 self.buffer.push(0x14);
337 self.extend_identity_id(id);
338 }
339 Value::Uuid4(uuid) => {
340 self.buffer.push(0x15);
341 self.extend_uuid4(uuid);
342 }
343 Value::Uuid7(uuid) => {
344 self.buffer.push(0x16);
345 self.extend_uuid7(uuid);
346 }
347 Value::Blob(b) => {
348 self.buffer.push(0x17);
349 self.extend_blob(b);
350 }
351 Value::Int(i) => {
352 self.buffer.push(0x18);
353 self.extend_int(i);
354 }
355 Value::Uint(u) => {
356 self.buffer.push(0x19);
357 self.extend_uint(u);
358 }
359 Value::Decimal(d) => {
360 self.buffer.push(0x1a);
361 self.extend_decimal(d);
362 }
363 Value::Any(_) | Value::Type(_) | Value::List(_) | Value::Record(_) | Value::Tuple(_) => {
364 unreachable!("Any/Type/List/Record/Tuple values cannot be serialized in keys");
365 }
366 Value::DictionaryId(id) => {
367 self.buffer.push(0x1b);
368 match id {
369 DictionaryEntryId::U1(v) => {
370 self.buffer.push(0x00);
371 self.extend_u8(*v);
372 }
373 DictionaryEntryId::U2(v) => {
374 self.buffer.push(0x01);
375 self.extend_u16(*v);
376 }
377 DictionaryEntryId::U4(v) => {
378 self.buffer.push(0x02);
379 self.extend_u32(*v);
380 }
381 DictionaryEntryId::U8(v) => {
382 self.buffer.push(0x03);
383 self.extend_u64(*v);
384 }
385 DictionaryEntryId::U16(v) => {
386 self.buffer.push(0x04);
387 self.extend_u128(*v);
388 }
389 }
390 }
391 }
392 self
393 }
394}
395
396impl Default for KeySerializer {
397 fn default() -> Self {
398 Self::new()
399 }
400}
401
402#[cfg(test)]
403pub mod tests {
404 use std::{f64, str::FromStr};
405
406 use num_bigint::BigInt;
407 use reifydb_runtime::context::{
408 clock::{Clock, MockClock},
409 rng::Rng,
410 };
411 use reifydb_type::{
412 util::hex,
413 value::{
414 Value,
415 blob::Blob,
416 date::Date,
417 datetime::DateTime,
418 decimal::Decimal,
419 dictionary::DictionaryEntryId,
420 duration::Duration,
421 identity::IdentityId,
422 int::Int,
423 ordered_f32::OrderedF32,
424 ordered_f64::OrderedF64,
425 row_number::RowNumber,
426 time::Time,
427 r#type::Type,
428 uint::Uint,
429 uuid::{Uuid4, Uuid7},
430 },
431 };
432
433 use crate::{
434 interface::catalog::{
435 id::{IndexId, PrimaryKeyId, TableId},
436 shape::ShapeId,
437 },
438 util::encoding::keycode::{deserializer::KeyDeserializer, serializer::KeySerializer},
439 };
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_ordering_descending_u64() {
841 let mut ser1 = KeySerializer::new();
842 ser1.extend_u64(1u64);
843 let bytes1 = ser1.finish();
844
845 let mut ser2 = KeySerializer::new();
846 ser2.extend_u64(100u64);
847 let bytes2 = ser2.finish();
848
849 let mut ser3 = KeySerializer::new();
850 ser3.extend_u64(10000u64);
851 let bytes3 = ser3.finish();
852
853 assert!(bytes3 < bytes2, "encode(10000) should be < encode(100)");
855 assert!(bytes2 < bytes1, "encode(100) should be < encode(1)");
856 }
857
858 #[test]
859 fn test_ordering_descending_negative() {
860 let mut ser1 = KeySerializer::new();
864 ser1.extend_i32(-1i32);
865 let bytes_neg1 = ser1.finish();
866
867 let mut ser2 = KeySerializer::new();
868 ser2.extend_i32(-100i32);
869 let bytes_neg100 = ser2.finish();
870
871 let mut ser3 = KeySerializer::new();
872 ser3.extend_i32(-1000i32);
873 let bytes_neg1000 = ser3.finish();
874
875 assert!(bytes_neg1 < bytes_neg100, "encode(-1) should be < encode(-100)");
877 assert!(bytes_neg100 < bytes_neg1000, "encode(-100) should be < encode(-1000)");
878 }
879
880 #[test]
881 fn test_ordering_mixed_sign() {
882 let mut ser_neg = KeySerializer::new();
884 ser_neg.extend_i32(-1i32);
885 let bytes_neg = ser_neg.finish();
886
887 let mut ser_zero = KeySerializer::new();
888 ser_zero.extend_i32(0i32);
889 let bytes_zero = ser_zero.finish();
890
891 let mut ser_pos = KeySerializer::new();
892 ser_pos.extend_i32(1i32);
893 let bytes_pos = ser_pos.finish();
894
895 assert!(bytes_pos < bytes_zero, "encode(1) should be < encode(0)");
897 assert!(bytes_zero < bytes_neg, "encode(0) should be < encode(-1)");
898 }
899
900 #[test]
901 fn test_date() {
902 let mut serializer = KeySerializer::new();
903 let date = Date::from_ymd(2024, 1, 1).unwrap();
904 serializer.extend_date(&date);
905 let result = serializer.finish();
906 assert_eq!(result.len(), 4); }
908
909 #[test]
910 fn test_datetime() {
911 let mut serializer = KeySerializer::new();
912 let datetime = DateTime::from_ymd_hms(2024, 1, 1, 12, 0, 0).unwrap();
913 serializer.extend_datetime(&datetime);
914 let result = serializer.finish();
915 assert_eq!(result.len(), 9); }
917
918 #[test]
919 fn test_time() {
920 let mut serializer = KeySerializer::new();
921 let time = Time::from_hms(12, 30, 45).unwrap();
922 serializer.extend_time(&time);
923 let result = serializer.finish();
924 assert_eq!(result.len(), 7); }
926
927 #[test]
928 fn test_interval() {
929 let mut serializer = KeySerializer::new();
930 let duration = Duration::from_nanoseconds(1000000).unwrap();
931 serializer.extend_duration(&duration);
932 let result = serializer.finish();
933 assert_eq!(result.len(), 17); }
935
936 #[test]
937 fn test_row_number() {
938 let mut serializer = KeySerializer::new();
939 let row_number = RowNumber(42);
940 serializer.extend_row_number(&row_number);
941 let result = serializer.finish();
942 assert_eq!(result.len(), 1); }
944
945 #[test]
946 fn test_identity_id() {
947 let (_, clock, rng) = test_clock_and_rng();
948 let mut serializer = KeySerializer::new();
949 let id = IdentityId::generate(&clock, &rng);
950 serializer.extend_identity_id(&id);
951 let result = serializer.finish();
952 assert!(result.len() > 0);
953 }
954
955 #[test]
956 fn test_uuid4() {
957 let mut serializer = KeySerializer::new();
958 let uuid = Uuid4::generate();
959 serializer.extend_uuid4(&uuid);
960 let result = serializer.finish();
961 assert!(result.len() > 16);
963 }
964
965 #[test]
966 fn test_uuid7() {
967 let (_, clock, rng) = test_clock_and_rng();
968 let mut serializer = KeySerializer::new();
969 let uuid = Uuid7::generate(&clock, &rng);
970 serializer.extend_uuid7(&uuid);
971 let result = serializer.finish();
972 assert!(result.len() > 16);
974 }
975
976 #[test]
977 fn test_blob() {
978 let mut serializer = KeySerializer::new();
979 let blob = Blob::from(vec![0x01, 0x02, 0x03]);
980 serializer.extend_blob(&blob);
981 let result = serializer.finish();
982 assert!(result.len() > 3);
984 }
985
986 #[test]
987 fn test_int() {
988 let mut serializer = KeySerializer::new();
989 let int = Int(BigInt::from(42));
990 serializer.extend_int(&int);
991 let result = serializer.finish();
992 assert!(result.len() > 0);
994 }
995
996 #[test]
997 fn test_uint() {
998 let mut serializer = KeySerializer::new();
999 let uint = Uint(BigInt::from(42));
1000 serializer.extend_uint(&uint);
1001 let result = serializer.finish();
1002 assert!(result.len() > 0);
1004 }
1005
1006 #[test]
1007 fn test_decimal() {
1008 let mut serializer = KeySerializer::new();
1009 let decimal = Decimal::from_str("3.14").unwrap();
1010 serializer.extend_decimal(&decimal);
1011 let result = serializer.finish();
1012 assert!(result.len() > 0);
1014 }
1015
1016 #[test]
1017 fn test_extend_value() {
1018 let mut serializer = KeySerializer::new();
1020 serializer.extend_value(&Value::none());
1021 let result = serializer.finish();
1022 assert_eq!(result, vec![0x00, 0x00]); let mut serializer = KeySerializer::new();
1026 serializer.extend_value(&Value::none_of(Type::Int4));
1027 let result = serializer.finish();
1028 assert_eq!(result, vec![0x00, 0x06]); let mut serializer = KeySerializer::new();
1032 serializer.extend_value(&Value::Boolean(true));
1033 let result = serializer.finish();
1034 assert_eq!(result[0], 0x01); assert_eq!(result.len(), 2); let mut serializer = KeySerializer::new();
1039 serializer.extend_value(&Value::Int4(42));
1040 let result = serializer.finish();
1041 assert_eq!(result[0], 0x06); assert_eq!(result.len(), 5); let mut serializer = KeySerializer::new();
1046 serializer.extend_value(&Value::Utf8("test".to_string()));
1047 let result = serializer.finish();
1048 assert_eq!(result[0], 0x09); assert!(result.ends_with(&[0xff, 0xff]));
1050 }
1051
1052 #[test]
1053 fn test_roundtrip_none() {
1054 let value = Value::none();
1055 let mut ser = KeySerializer::new();
1056 ser.extend_value(&value);
1057 let bytes = ser.finish();
1058 let mut de = KeyDeserializer::from_bytes(&bytes);
1059 assert_eq!(de.read_value().unwrap(), value);
1060 assert!(de.is_empty());
1061 }
1062
1063 #[test]
1064 fn test_roundtrip_none_typed() {
1065 let value = Value::none_of(Type::Int4);
1066 let mut ser = KeySerializer::new();
1067 ser.extend_value(&value);
1068 let bytes = ser.finish();
1069 let mut de = KeyDeserializer::from_bytes(&bytes);
1070 assert_eq!(de.read_value().unwrap(), value);
1071 assert!(de.is_empty());
1072 }
1073
1074 #[test]
1075 fn test_roundtrip_boolean_true() {
1076 let value = Value::Boolean(true);
1077 let mut ser = KeySerializer::new();
1078 ser.extend_value(&value);
1079 let bytes = ser.finish();
1080 let mut de = KeyDeserializer::from_bytes(&bytes);
1081 assert_eq!(de.read_value().unwrap(), value);
1082 assert!(de.is_empty());
1083 }
1084
1085 #[test]
1086 fn test_roundtrip_boolean_false() {
1087 let value = Value::Boolean(false);
1088 let mut ser = KeySerializer::new();
1089 ser.extend_value(&value);
1090 let bytes = ser.finish();
1091 let mut de = KeyDeserializer::from_bytes(&bytes);
1092 assert_eq!(de.read_value().unwrap(), value);
1093 assert!(de.is_empty());
1094 }
1095
1096 #[test]
1097 fn test_roundtrip_float4() {
1098 let value = Value::Float4(OrderedF32::try_from(3.14f32).unwrap());
1099 let mut ser = KeySerializer::new();
1100 ser.extend_value(&value);
1101 let bytes = ser.finish();
1102 let mut de = KeyDeserializer::from_bytes(&bytes);
1103 assert_eq!(de.read_value().unwrap(), value);
1104 assert!(de.is_empty());
1105 }
1106
1107 #[test]
1108 fn test_roundtrip_float8() {
1109 let value = Value::Float8(OrderedF64::try_from(3.14).unwrap());
1110 let mut ser = KeySerializer::new();
1111 ser.extend_value(&value);
1112 let bytes = ser.finish();
1113 let mut de = KeyDeserializer::from_bytes(&bytes);
1114 assert_eq!(de.read_value().unwrap(), value);
1115 assert!(de.is_empty());
1116 }
1117
1118 #[test]
1119 fn test_roundtrip_int1() {
1120 let value = Value::Int1(-42);
1121 let mut ser = KeySerializer::new();
1122 ser.extend_value(&value);
1123 let bytes = ser.finish();
1124 let mut de = KeyDeserializer::from_bytes(&bytes);
1125 assert_eq!(de.read_value().unwrap(), value);
1126 assert!(de.is_empty());
1127 }
1128
1129 #[test]
1130 fn test_roundtrip_int2() {
1131 let value = Value::Int2(-1000);
1132 let mut ser = KeySerializer::new();
1133 ser.extend_value(&value);
1134 let bytes = ser.finish();
1135 let mut de = KeyDeserializer::from_bytes(&bytes);
1136 assert_eq!(de.read_value().unwrap(), value);
1137 assert!(de.is_empty());
1138 }
1139
1140 #[test]
1141 fn test_roundtrip_int4() {
1142 let value = Value::Int4(42);
1143 let mut ser = KeySerializer::new();
1144 ser.extend_value(&value);
1145 let bytes = ser.finish();
1146 let mut de = KeyDeserializer::from_bytes(&bytes);
1147 assert_eq!(de.read_value().unwrap(), value);
1148 assert!(de.is_empty());
1149 }
1150
1151 #[test]
1152 fn test_roundtrip_int8() {
1153 let value = Value::Int8(-1_000_000);
1154 let mut ser = KeySerializer::new();
1155 ser.extend_value(&value);
1156 let bytes = ser.finish();
1157 let mut de = KeyDeserializer::from_bytes(&bytes);
1158 assert_eq!(de.read_value().unwrap(), value);
1159 assert!(de.is_empty());
1160 }
1161
1162 #[test]
1163 fn test_roundtrip_int16() {
1164 let value = Value::Int16(123_456_789);
1165 let mut ser = KeySerializer::new();
1166 ser.extend_value(&value);
1167 let bytes = ser.finish();
1168 let mut de = KeyDeserializer::from_bytes(&bytes);
1169 assert_eq!(de.read_value().unwrap(), value);
1170 assert!(de.is_empty());
1171 }
1172
1173 #[test]
1174 fn test_roundtrip_utf8() {
1175 let value = Value::Utf8("hello world".to_string());
1176 let mut ser = KeySerializer::new();
1177 ser.extend_value(&value);
1178 let bytes = ser.finish();
1179 let mut de = KeyDeserializer::from_bytes(&bytes);
1180 assert_eq!(de.read_value().unwrap(), value);
1181 assert!(de.is_empty());
1182 }
1183
1184 #[test]
1185 fn test_roundtrip_uint1() {
1186 let value = Value::Uint1(255);
1187 let mut ser = KeySerializer::new();
1188 ser.extend_value(&value);
1189 let bytes = ser.finish();
1190 let mut de = KeyDeserializer::from_bytes(&bytes);
1191 assert_eq!(de.read_value().unwrap(), value);
1192 assert!(de.is_empty());
1193 }
1194
1195 #[test]
1196 fn test_roundtrip_uint2() {
1197 let value = Value::Uint2(65535);
1198 let mut ser = KeySerializer::new();
1199 ser.extend_value(&value);
1200 let bytes = ser.finish();
1201 let mut de = KeyDeserializer::from_bytes(&bytes);
1202 assert_eq!(de.read_value().unwrap(), value);
1203 assert!(de.is_empty());
1204 }
1205
1206 #[test]
1207 fn test_roundtrip_uint4() {
1208 let value = Value::Uint4(100_000);
1209 let mut ser = KeySerializer::new();
1210 ser.extend_value(&value);
1211 let bytes = ser.finish();
1212 let mut de = KeyDeserializer::from_bytes(&bytes);
1213 assert_eq!(de.read_value().unwrap(), value);
1214 assert!(de.is_empty());
1215 }
1216
1217 #[test]
1218 fn test_roundtrip_uint8() {
1219 let value = Value::Uint8(999);
1220 let mut ser = KeySerializer::new();
1221 ser.extend_value(&value);
1222 let bytes = ser.finish();
1223 let mut de = KeyDeserializer::from_bytes(&bytes);
1224 assert_eq!(de.read_value().unwrap(), value);
1225 assert!(de.is_empty());
1226 }
1227
1228 #[test]
1229 fn test_roundtrip_uint16() {
1230 let value = Value::Uint16(u128::MAX);
1231 let mut ser = KeySerializer::new();
1232 ser.extend_value(&value);
1233 let bytes = ser.finish();
1234 let mut de = KeyDeserializer::from_bytes(&bytes);
1235 assert_eq!(de.read_value().unwrap(), value);
1236 assert!(de.is_empty());
1237 }
1238
1239 #[test]
1240 fn test_roundtrip_date() {
1241 let value = Value::Date(Date::from_ymd(2024, 6, 15).unwrap());
1242 let mut ser = KeySerializer::new();
1243 ser.extend_value(&value);
1244 let bytes = ser.finish();
1245 let mut de = KeyDeserializer::from_bytes(&bytes);
1246 assert_eq!(de.read_value().unwrap(), value);
1247 assert!(de.is_empty());
1248 }
1249
1250 #[test]
1251 fn test_roundtrip_datetime() {
1252 let value = Value::DateTime(DateTime::from_ymd_hms(2024, 6, 15, 12, 30, 45).unwrap());
1253 let mut ser = KeySerializer::new();
1254 ser.extend_value(&value);
1255 let bytes = ser.finish();
1256 let mut de = KeyDeserializer::from_bytes(&bytes);
1257 assert_eq!(de.read_value().unwrap(), value);
1258 assert!(de.is_empty());
1259 }
1260
1261 #[test]
1262 fn test_roundtrip_time() {
1263 let value = Value::Time(Time::from_hms(12, 30, 45).unwrap());
1264 let mut ser = KeySerializer::new();
1265 ser.extend_value(&value);
1266 let bytes = ser.finish();
1267 let mut de = KeyDeserializer::from_bytes(&bytes);
1268 assert_eq!(de.read_value().unwrap(), value);
1269 assert!(de.is_empty());
1270 }
1271
1272 #[test]
1273 fn test_roundtrip_duration() {
1274 let value = Value::Duration(Duration::from_nanoseconds(1_000_000).unwrap());
1275 let mut ser = KeySerializer::new();
1276 ser.extend_value(&value);
1277 let bytes = ser.finish();
1278 let mut de = KeyDeserializer::from_bytes(&bytes);
1279 assert_eq!(de.read_value().unwrap(), value);
1280 assert!(de.is_empty());
1281 }
1282
1283 #[test]
1284 fn test_roundtrip_identity_id() {
1285 let (_, clock, rng) = test_clock_and_rng();
1286 let value = Value::IdentityId(IdentityId::generate(&clock, &rng));
1287 let mut ser = KeySerializer::new();
1288 ser.extend_value(&value);
1289 let bytes = ser.finish();
1290 let mut de = KeyDeserializer::from_bytes(&bytes);
1291 assert_eq!(de.read_value().unwrap(), value);
1292 assert!(de.is_empty());
1293 }
1294
1295 #[test]
1296 fn test_roundtrip_uuid4() {
1297 let value = Value::Uuid4(Uuid4::generate());
1298 let mut ser = KeySerializer::new();
1299 ser.extend_value(&value);
1300 let bytes = ser.finish();
1301 let mut de = KeyDeserializer::from_bytes(&bytes);
1302 assert_eq!(de.read_value().unwrap(), value);
1303 assert!(de.is_empty());
1304 }
1305
1306 #[test]
1307 fn test_roundtrip_uuid7() {
1308 let (_, clock, rng) = test_clock_and_rng();
1309 let value = Value::Uuid7(Uuid7::generate(&clock, &rng));
1310 let mut ser = KeySerializer::new();
1311 ser.extend_value(&value);
1312 let bytes = ser.finish();
1313 let mut de = KeyDeserializer::from_bytes(&bytes);
1314 assert_eq!(de.read_value().unwrap(), value);
1315 assert!(de.is_empty());
1316 }
1317
1318 #[test]
1319 fn test_roundtrip_blob() {
1320 let value = Value::Blob(Blob::from(vec![0x01, 0x02, 0x03]));
1321 let mut ser = KeySerializer::new();
1322 ser.extend_value(&value);
1323 let bytes = ser.finish();
1324 let mut de = KeyDeserializer::from_bytes(&bytes);
1325 assert_eq!(de.read_value().unwrap(), value);
1326 assert!(de.is_empty());
1327 }
1328
1329 #[test]
1330 fn test_roundtrip_int() {
1331 let value = Value::Int(Int(BigInt::from(-42)));
1332 let mut ser = KeySerializer::new();
1333 ser.extend_value(&value);
1334 let bytes = ser.finish();
1335 let mut de = KeyDeserializer::from_bytes(&bytes);
1336 assert_eq!(de.read_value().unwrap(), value);
1337 assert!(de.is_empty());
1338 }
1339
1340 #[test]
1341 fn test_roundtrip_uint() {
1342 let value = Value::Uint(Uint(BigInt::from(42)));
1343 let mut ser = KeySerializer::new();
1344 ser.extend_value(&value);
1345 let bytes = ser.finish();
1346 let mut de = KeyDeserializer::from_bytes(&bytes);
1347 assert_eq!(de.read_value().unwrap(), value);
1348 assert!(de.is_empty());
1349 }
1350
1351 #[test]
1352 fn test_roundtrip_decimal() {
1353 let value = Value::Decimal(Decimal::from_str("3.14").unwrap());
1354 let mut ser = KeySerializer::new();
1355 ser.extend_value(&value);
1356 let bytes = ser.finish();
1357 let mut de = KeyDeserializer::from_bytes(&bytes);
1358 assert_eq!(de.read_value().unwrap(), value);
1359 assert!(de.is_empty());
1360 }
1361
1362 #[test]
1363 fn test_roundtrip_dictionary_id_u1() {
1364 let value = Value::DictionaryId(DictionaryEntryId::U1(42));
1365 let mut ser = KeySerializer::new();
1366 ser.extend_value(&value);
1367 let bytes = ser.finish();
1368 let mut de = KeyDeserializer::from_bytes(&bytes);
1369 assert_eq!(de.read_value().unwrap(), value);
1370 assert!(de.is_empty());
1371 }
1372
1373 #[test]
1374 fn test_roundtrip_dictionary_id_u2() {
1375 let value = Value::DictionaryId(DictionaryEntryId::U2(1000));
1376 let mut ser = KeySerializer::new();
1377 ser.extend_value(&value);
1378 let bytes = ser.finish();
1379 let mut de = KeyDeserializer::from_bytes(&bytes);
1380 assert_eq!(de.read_value().unwrap(), value);
1381 assert!(de.is_empty());
1382 }
1383
1384 #[test]
1385 fn test_roundtrip_dictionary_id_u4() {
1386 let value = Value::DictionaryId(DictionaryEntryId::U4(100_000));
1387 let mut ser = KeySerializer::new();
1388 ser.extend_value(&value);
1389 let bytes = ser.finish();
1390 let mut de = KeyDeserializer::from_bytes(&bytes);
1391 assert_eq!(de.read_value().unwrap(), value);
1392 assert!(de.is_empty());
1393 }
1394
1395 #[test]
1396 fn test_roundtrip_dictionary_id_u8() {
1397 let value = Value::DictionaryId(DictionaryEntryId::U8(10_000_000_000));
1398 let mut ser = KeySerializer::new();
1399 ser.extend_value(&value);
1400 let bytes = ser.finish();
1401 let mut de = KeyDeserializer::from_bytes(&bytes);
1402 assert_eq!(de.read_value().unwrap(), value);
1403 assert!(de.is_empty());
1404 }
1405
1406 #[test]
1407 fn test_roundtrip_dictionary_id_u16() {
1408 let value = Value::DictionaryId(DictionaryEntryId::U16(u128::MAX));
1409 let mut ser = KeySerializer::new();
1410 ser.extend_value(&value);
1411 let bytes = ser.finish();
1412 let mut de = KeyDeserializer::from_bytes(&bytes);
1413 assert_eq!(de.read_value().unwrap(), value);
1414 assert!(de.is_empty());
1415 }
1416
1417 #[test]
1418 fn test_roundtrip_all() {
1419 let (_, clock, rng) = test_clock_and_rng();
1420 let values = vec![
1421 Value::none(),
1422 Value::none_of(Type::Int4),
1423 Value::Boolean(true),
1424 Value::Boolean(false),
1425 Value::Float4(OrderedF32::try_from(3.14f32).unwrap()),
1426 Value::Float8(OrderedF64::try_from(3.14).unwrap()),
1427 Value::Int1(-42),
1428 Value::Int2(-1000),
1429 Value::Int4(42),
1430 Value::Int8(-1_000_000),
1431 Value::Int16(123_456_789),
1432 Value::Utf8("hello world".to_string()),
1433 Value::Uint1(255),
1434 Value::Uint2(65535),
1435 Value::Uint4(100_000),
1436 Value::Uint8(999),
1437 Value::Uint16(u128::MAX),
1438 Value::Date(Date::from_ymd(2024, 6, 15).unwrap()),
1439 Value::DateTime(DateTime::from_ymd_hms(2024, 6, 15, 12, 30, 45).unwrap()),
1440 Value::Time(Time::from_hms(12, 30, 45).unwrap()),
1441 Value::Duration(Duration::from_nanoseconds(1_000_000).unwrap()),
1442 Value::IdentityId(IdentityId::generate(&clock, &rng)),
1443 Value::Uuid4(Uuid4::generate()),
1444 Value::Uuid7(Uuid7::generate(&clock, &rng)),
1445 Value::Blob(Blob::from(vec![0x01, 0x02, 0x03])),
1446 Value::Int(Int(BigInt::from(-42))),
1447 Value::Uint(Uint(BigInt::from(42))),
1448 Value::Decimal(Decimal::from_str("3.14").unwrap()),
1449 Value::DictionaryId(DictionaryEntryId::U8(42)),
1450 ];
1451
1452 let mut ser = KeySerializer::new();
1453 for v in &values {
1454 ser.extend_value(v);
1455 }
1456 let bytes = ser.finish();
1457
1458 let mut de = KeyDeserializer::from_bytes(&bytes);
1459 for expected in &values {
1460 let actual = de.read_value().unwrap();
1461 assert_eq!(&actual, expected);
1462 }
1463 assert!(de.is_empty());
1464 }
1465
1466 #[test]
1470 fn test_roundtrip_exhaustiveness_guard() {
1471 let value = Value::none();
1472 match value {
1473 Value::None {
1474 ..
1475 } => {}
1476 Value::Boolean(_) => {}
1477 Value::Float4(_) => {}
1478 Value::Float8(_) => {}
1479 Value::Int1(_) => {}
1480 Value::Int2(_) => {}
1481 Value::Int4(_) => {}
1482 Value::Int8(_) => {}
1483 Value::Int16(_) => {}
1484 Value::Utf8(_) => {}
1485 Value::Uint1(_) => {}
1486 Value::Uint2(_) => {}
1487 Value::Uint4(_) => {}
1488 Value::Uint8(_) => {}
1489 Value::Uint16(_) => {}
1490 Value::Date(_) => {}
1491 Value::DateTime(_) => {}
1492 Value::Time(_) => {}
1493 Value::Duration(_) => {}
1494 Value::IdentityId(_) => {}
1495 Value::Uuid4(_) => {}
1496 Value::Uuid7(_) => {}
1497 Value::Blob(_) => {}
1498 Value::Int(_) => {}
1499 Value::Uint(_) => {}
1500 Value::Decimal(_) => {}
1501 Value::DictionaryId(_) => {}
1502 Value::Any(_) => {}
1504 Value::Type(_) => {}
1505 Value::List(_) => {}
1506 Value::Record(_) => {}
1507 Value::Tuple(_) => {}
1508 }
1509 }
1510
1511 #[test]
1512 fn test_to_encoded_key() {
1513 let mut serializer = KeySerializer::new();
1514 serializer.extend_i32(42);
1515 let key = serializer.to_encoded_key();
1516 assert_eq!(key.len(), 4);
1517 }
1518
1519 #[test]
1520 fn test_index_id() {
1521 let mut serializer = KeySerializer::new();
1522 serializer.extend_index_id(IndexId::Primary(PrimaryKeyId(123456789)));
1523 let result = serializer.finish();
1524
1525 assert_eq!(result.len(), 5);
1527 assert_eq!(result[0], 0x01); let mut serializer2 = KeySerializer::new();
1531 serializer2.extend_index_id(IndexId::Primary(PrimaryKeyId(1)));
1532 let result2 = serializer2.finish();
1533
1534 assert!(result2[1..] > result[1..]);
1537 }
1538
1539 #[test]
1540 fn test_object_id() {
1541 let mut serializer = KeySerializer::new();
1542 serializer.extend_shape_id(ShapeId::Table(TableId(987654321)));
1543 let result = serializer.finish();
1544
1545 assert_eq!(result.len(), 6);
1547 assert_eq!(result[0], 0x01); let mut serializer2 = KeySerializer::new();
1551 serializer2.extend_shape_id(ShapeId::Table(TableId(987654322)));
1552 let result2 = serializer2.finish();
1553
1554 assert!(result2[1..] < result[1..]);
1557 }
1558}