Skip to main content

reifydb_core/util/encoding/keycode/
serializer.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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		// Should have "hello" plus terminator (0xff, 0xff)
816		assert_eq!(result, vec![b'h', b'e', b'l', b'l', b'o', 0xff, 0xff]);
817
818		// Test with 0xff in the data
819		let mut serializer = KeySerializer::new();
820		serializer.extend_bytes(&[0x01, 0xff, 0x02]);
821		let result = serializer.finish();
822		// 0xff should be escaped as 0xff, 0x00
823		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		// Should encode as UTF-8 bytes plus terminator
832		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		// Should have bool (1 byte) + i32 (4 bytes) + "test" with terminator (6 bytes) + u64 (varies)
851		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		// Test that descending order is preserved: larger values -> smaller bytes
864		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		// In descending order: larger values encode to smaller bytes
877		// So: bytes_1000 < bytes_100 < bytes_1
878		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		// Ascending: a smaller value must encode to smaller bytes so a forward scan returns it first.
885		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		// Descending: a larger value must encode to smaller bytes so a forward scan returns it first.
898		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		// none sorts last under ascending and first under descending.
910		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		// Strings encode ascending in keycode; asc must preserve lexicographic order and desc must reverse it
930		// (this is the regression that the uniform-invert implementation got backwards).
931		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		// Descending: larger u64 -> smaller bytes
960		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		// Test negative numbers ordering
967		// In descending order: -1 > -100 > -1000
968		// So encoded bytes: encode(-1) < encode(-100) < encode(-1000)
969		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		// In descending: -1 > -100 > -1000, so encode(-1) < encode(-100) < encode(-1000)
982		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		// Test that positive/negative ordering is correct
989		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		// In descending: 1 > 0 > -1, so encode(1) < encode(0) < encode(-1)
1002		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); // i32 encoding
1013	}
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); // i64 varint encoding
1022	}
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); // u64 varint encoding
1031	}
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); // i32 + i32 + i64 varint encoding
1040	}
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); // u64 varint encoding
1049	}
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		// UUID is 16 bytes plus encoding overhead
1068		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		// UUID is 16 bytes plus encoding overhead
1079		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		// Should have data plus terminator
1089		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		// Should have sign byte + length + data
1099		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		// Should have length + data
1109		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		// Should encode as string
1119		assert!(result.len() > 0);
1120	}
1121
1122	#[test]
1123	fn test_extend_value() {
1124		// Test None (Any inner type)
1125		let mut serializer = KeySerializer::new();
1126		serializer.extend_value(&Value::none());
1127		let result = serializer.finish();
1128		assert_eq!(result, vec![0x00, 0x00]); // marker + Any inner type marker
1129
1130		// Test None with typed inner
1131		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]); // marker + Int4 inner type marker
1135
1136		// Test boolean
1137		let mut serializer = KeySerializer::new();
1138		serializer.extend_value(&Value::Boolean(true));
1139		let result = serializer.finish();
1140		assert_eq!(result[0], 0x01); // Boolean marker
1141		assert_eq!(result.len(), 2); // marker + encoded bool
1142
1143		// Test integer
1144		let mut serializer = KeySerializer::new();
1145		serializer.extend_value(&Value::Int4(42));
1146		let result = serializer.finish();
1147		assert_eq!(result[0], 0x06); // Int4 marker
1148		assert_eq!(result.len(), 5); // marker + 4 bytes
1149
1150		// Test string
1151		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); // Utf8 marker
1155		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	/// Compile-time exhaustiveness guard: if a new Value variant is added,
1573	/// this test will fail to compile. Add a corresponding `test_roundtrip_<variant>`
1574	/// test above, then add the new variant arm here.
1575	#[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			// Not serializable in keys:
1609			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		// IndexId Primary uses 1 byte prefix + u64 varint
1632		assert_eq!(result.len(), 5);
1633		assert_eq!(result[0], 0x01); // Primary variant prefix
1634
1635		// Verify it's using bitwise NOT (smaller values produce larger encoded values)
1636		let mut serializer2 = KeySerializer::new();
1637		serializer2.extend_index_id(IndexId::Primary(PrimaryKeyId(1)));
1638		let result2 = serializer2.finish();
1639
1640		// result2 (for IndexId(1)) should be > result (for IndexId(123456789))
1641		// Compare from byte 1 onwards (after the variant prefix)
1642		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		// ShapeId Table uses 1 byte prefix + u64 varint
1652		assert_eq!(result.len(), 6);
1653		assert_eq!(result[0], 0x01); // Table variant prefix
1654
1655		// Verify ordering
1656		let mut serializer2 = KeySerializer::new();
1657		serializer2.extend_shape_id(ShapeId::Table(TableId(987654322)));
1658		let result2 = serializer2.finish();
1659
1660		// result2 (for larger ShapeId) should be < result (inverted ordering)
1661		// Compare from byte 1 onwards (after the variant prefix)
1662		assert!(result2[1..] < result[1..]);
1663	}
1664}