Skip to main content

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