Skip to main content

reifydb_core/util/encoding/keycode/
serializer.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use 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		// Should have "hello" plus terminator (0xff, 0xff)
773		assert_eq!(result, vec![b'h', b'e', b'l', b'l', b'o', 0xff, 0xff]);
774
775		// Test with 0xff in the data
776		let mut serializer = KeySerializer::new();
777		serializer.extend_bytes(&[0x01, 0xff, 0x02]);
778		let result = serializer.finish();
779		// 0xff should be escaped as 0xff, 0x00
780		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		// Should encode as UTF-8 bytes plus terminator
789		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		// Should have bool (1 byte) + i32 (4 bytes) + "test" with terminator (6 bytes) + u64 (varies)
808		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		// Test that descending order is preserved: larger values -> smaller bytes
821		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		// In descending order: larger values encode to smaller bytes
834		// So: bytes_1000 < bytes_100 < bytes_1
835		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		// Descending: larger u64 -> smaller bytes
854		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		// Test negative numbers ordering
861		// In descending order: -1 > -100 > -1000
862		// So encoded bytes: encode(-1) < encode(-100) < encode(-1000)
863		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		// In descending: -1 > -100 > -1000, so encode(-1) < encode(-100) < encode(-1000)
876		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		// Test that positive/negative ordering is correct
883		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		// In descending: 1 > 0 > -1, so encode(1) < encode(0) < encode(-1)
896		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); // i32 encoding
907	}
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); // i64 varint encoding
916	}
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); // u64 varint encoding
925	}
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); // i32 + i32 + i64 varint encoding
934	}
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); // u64 varint encoding
943	}
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		// UUID is 16 bytes plus encoding overhead
962		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		// UUID is 16 bytes plus encoding overhead
973		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		// Should have data plus terminator
983		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		// Should have sign byte + length + data
993		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		// Should have length + data
1003		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		// Should encode as string
1013		assert!(result.len() > 0);
1014	}
1015
1016	#[test]
1017	fn test_extend_value() {
1018		// Test None (Any inner type)
1019		let mut serializer = KeySerializer::new();
1020		serializer.extend_value(&Value::none());
1021		let result = serializer.finish();
1022		assert_eq!(result, vec![0x00, 0x00]); // marker + Any inner type marker
1023
1024		// Test None with typed inner
1025		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]); // marker + Int4 inner type marker
1029
1030		// Test boolean
1031		let mut serializer = KeySerializer::new();
1032		serializer.extend_value(&Value::Boolean(true));
1033		let result = serializer.finish();
1034		assert_eq!(result[0], 0x01); // Boolean marker
1035		assert_eq!(result.len(), 2); // marker + encoded bool
1036
1037		// Test integer
1038		let mut serializer = KeySerializer::new();
1039		serializer.extend_value(&Value::Int4(42));
1040		let result = serializer.finish();
1041		assert_eq!(result[0], 0x06); // Int4 marker
1042		assert_eq!(result.len(), 5); // marker + 4 bytes
1043
1044		// Test string
1045		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); // Utf8 marker
1049		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	/// Compile-time exhaustiveness guard: if a new Value variant is added,
1467	/// this test will fail to compile. Add a corresponding `test_roundtrip_<variant>`
1468	/// test above, then add the new variant arm here.
1469	#[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			// Not serializable in keys:
1503			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		// IndexId Primary uses 1 byte prefix + u64 varint
1526		assert_eq!(result.len(), 5);
1527		assert_eq!(result[0], 0x01); // Primary variant prefix
1528
1529		// Verify it's using bitwise NOT (smaller values produce larger encoded values)
1530		let mut serializer2 = KeySerializer::new();
1531		serializer2.extend_index_id(IndexId::Primary(PrimaryKeyId(1)));
1532		let result2 = serializer2.finish();
1533
1534		// result2 (for IndexId(1)) should be > result (for IndexId(123456789))
1535		// Compare from byte 1 onwards (after the variant prefix)
1536		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		// ShapeId Table uses 1 byte prefix + u64 varint
1546		assert_eq!(result.len(), 6);
1547		assert_eq!(result[0], 0x01); // Table variant prefix
1548
1549		// Verify ordering
1550		let mut serializer2 = KeySerializer::new();
1551		serializer2.extend_shape_id(ShapeId::Table(TableId(987654322)));
1552		let result2 = serializer2.finish();
1553
1554		// result2 (for larger ShapeId) should be < result (inverted ordering)
1555		// Compare from byte 1 onwards (after the variant prefix)
1556		assert!(result2[1..] < result[1..]);
1557	}
1558}