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