Skip to main content

reifydb_core/util/encoding/keycode/
serializer.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use num_bigint::Sign;
5use reifydb_type::value::{
6	Value,
7	blob::Blob,
8	date::Date,
9	datetime::DateTime,
10	decimal::Decimal,
11	dictionary::DictionaryEntryId,
12	duration::Duration,
13	identity::IdentityId,
14	int::Int,
15	row_number::RowNumber,
16	time::Time,
17	r#type::Type,
18	uint::Uint,
19	uuid::{Uuid4, Uuid7},
20};
21use serde::Serialize;
22
23use super::{
24	catalog, encode_bool, encode_bytes, encode_f32, encode_f64, encode_i8, encode_i16, encode_i32, encode_i64,
25	encode_i128, encode_u8, encode_u16, encode_u32, encode_u64, encode_u128, serialize,
26};
27use crate::{
28	encoded::key::EncodedKey,
29	interface::catalog::{id::IndexId, shape::ShapeId},
30};
31
32/// A builder for constructing binary keys using keycode encoding
33pub struct KeySerializer {
34	buffer: Vec<u8>,
35}
36
37impl KeySerializer {
38	/// Create new serializer with default capacity
39	pub fn new() -> Self {
40		Self {
41			buffer: Vec::new(),
42		}
43	}
44
45	/// Create with pre-allocated capacity
46	pub fn with_capacity(capacity: usize) -> Self {
47		Self {
48			buffer: Vec::with_capacity(capacity),
49		}
50	}
51
52	/// Extend with bool value
53	pub fn extend_bool(&mut self, value: bool) -> &mut Self {
54		self.buffer.push(encode_bool(value));
55		self
56	}
57
58	/// Extend with f32 value
59	pub fn extend_f32(&mut self, value: f32) -> &mut Self {
60		self.buffer.extend_from_slice(&encode_f32(value));
61		self
62	}
63
64	/// Extend with f64 value
65	pub fn extend_f64(&mut self, value: f64) -> &mut Self {
66		self.buffer.extend_from_slice(&encode_f64(value));
67		self
68	}
69
70	/// Extend with i8 value
71	pub fn extend_i8<T: Into<i8>>(&mut self, value: T) -> &mut Self {
72		self.buffer.extend_from_slice(&encode_i8(value.into()));
73		self
74	}
75
76	/// Extend with i16 value
77	pub fn extend_i16<T: Into<i16>>(&mut self, value: T) -> &mut Self {
78		self.buffer.extend_from_slice(&encode_i16(value.into()));
79		self
80	}
81
82	/// Extend with i32 value
83	pub fn extend_i32<T: Into<i32>>(&mut self, value: T) -> &mut Self {
84		self.buffer.extend_from_slice(&encode_i32(value.into()));
85		self
86	}
87
88	/// Extend with i64 value
89	pub fn extend_i64<T: Into<i64>>(&mut self, value: T) -> &mut Self {
90		self.buffer.extend_from_slice(&encode_i64(value.into()));
91		self
92	}
93
94	/// Extend with i128 value
95	pub fn extend_i128<T: Into<i128>>(&mut self, value: T) -> &mut Self {
96		self.buffer.extend_from_slice(&encode_i128(value.into()));
97		self
98	}
99
100	/// Extend with u8 value
101	pub fn extend_u8<T: Into<u8>>(&mut self, value: T) -> &mut Self {
102		self.buffer.push(encode_u8(value.into()));
103		self
104	}
105
106	/// Extend with u16 value
107	pub fn extend_u16<T: Into<u16>>(&mut self, value: T) -> &mut Self {
108		self.buffer.extend_from_slice(&encode_u16(value.into()));
109		self
110	}
111
112	/// Extend with u32 value
113	pub fn extend_u32<T: Into<u32>>(&mut self, value: T) -> &mut Self {
114		self.buffer.extend_from_slice(&encode_u32(value.into()));
115		self
116	}
117
118	/// Extend with u64 value
119	pub fn extend_u64<T: Into<u64>>(&mut self, value: T) -> &mut Self {
120		self.buffer.extend_from_slice(&encode_u64(value.into()));
121		self
122	}
123
124	/// Extend with u128 value
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	/// Extend with raw bytes
131	pub fn extend_bytes<T: AsRef<[u8]>>(&mut self, bytes: T) -> &mut Self {
132		encode_bytes(bytes.as_ref(), &mut self.buffer);
133		self
134	}
135
136	/// Extend with string (UTF-8 bytes)
137	pub fn extend_str<T: AsRef<str>>(&mut self, s: T) -> &mut Self {
138		self.extend_bytes(s.as_ref().as_bytes())
139	}
140
141	/// Consume serializer and return final buffer
142	pub fn finish(self) -> Vec<u8> {
143		self.buffer
144	}
145
146	/// Consume serializer and return an EncodedKey directly
147	pub fn to_encoded_key(self) -> EncodedKey {
148		EncodedKey::new(self.buffer)
149	}
150
151	/// Extend with a ShapeId value (includes type discriminator)
152	pub fn extend_shape_id(&mut self, object: impl Into<ShapeId>) -> &mut Self {
153		let primitive = object.into();
154		self.buffer.extend_from_slice(&catalog::serialize_shape_id(&primitive));
155		self
156	}
157
158	/// Extend with an IndexId value (includes type discriminator)  
159	pub fn extend_index_id(&mut self, index: impl Into<IndexId>) -> &mut Self {
160		let index = index.into();
161		self.buffer.extend_from_slice(&catalog::serialize_index_id(&index));
162		self
163	}
164
165	/// Extend with a serializable value using keycode encoding
166	pub fn extend_serialize<T: Serialize>(&mut self, value: &T) -> &mut Self {
167		self.buffer.extend_from_slice(&serialize(value));
168		self
169	}
170
171	/// Extend with raw bytes (no encoding)
172	pub fn extend_raw(&mut self, bytes: &[u8]) -> &mut Self {
173		self.buffer.extend_from_slice(bytes);
174		self
175	}
176
177	/// Get current buffer length
178	pub fn len(&self) -> usize {
179		self.buffer.len()
180	}
181
182	/// Check if buffer is empty
183	pub fn is_empty(&self) -> bool {
184		self.buffer.is_empty()
185	}
186
187	/// Extend with Date value
188	pub fn extend_date(&mut self, date: &Date) -> &mut Self {
189		self.extend_i32(date.to_days_since_epoch())
190	}
191
192	/// Extend with DateTime value
193	pub fn extend_datetime(&mut self, datetime: &DateTime) -> &mut Self {
194		self.extend_u64(datetime.to_nanos())
195	}
196
197	/// Extend with Time value
198	pub fn extend_time(&mut self, time: &Time) -> &mut Self {
199		self.extend_u64(time.to_nanos_since_midnight())
200	}
201
202	/// Extend with Duration value
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	/// Extend with RowNumber value
208	pub fn extend_row_number(&mut self, row_number: &RowNumber) -> &mut Self {
209		self.extend_u64(row_number.0)
210	}
211
212	/// Extend with IdentityId value
213	pub fn extend_identity_id(&mut self, id: &IdentityId) -> &mut Self {
214		self.extend_bytes(id.as_bytes())
215	}
216
217	/// Extend with Uuid4 value
218	pub fn extend_uuid4(&mut self, uuid: &Uuid4) -> &mut Self {
219		self.extend_bytes(uuid.as_bytes())
220	}
221
222	/// Extend with Uuid7 value
223	pub fn extend_uuid7(&mut self, uuid: &Uuid7) -> &mut Self {
224		self.extend_bytes(uuid.as_bytes())
225	}
226
227	/// Extend with Blob value
228	pub fn extend_blob(&mut self, blob: &Blob) -> &mut Self {
229		self.extend_bytes(blob.as_ref() as &[u8])
230	}
231
232	/// Extend with arbitrary precision Int value
233	pub fn extend_int(&mut self, int: &Int) -> &mut Self {
234		// For arbitrary precision, encode as bytes with sign prefix
235		let (sign, bytes) = int.to_bytes_be();
236		// Encode sign as a byte (0 for negative, 1 for positive)
237		self.buffer.push(match sign {
238			Sign::Minus => 0,
239			_ => 1,
240		});
241		self.extend_u32(bytes.len() as u32);
242		self.buffer.extend_from_slice(&bytes);
243		self
244	}
245
246	/// Extend with arbitrary precision Uint value
247	pub fn extend_uint(&mut self, uint: &Uint) -> &mut Self {
248		// For arbitrary precision unsigned, encode as bytes with length prefix
249		let (_sign, bytes) = uint.0.to_bytes_be();
250		self.extend_u32(bytes.len() as u32);
251		self.buffer.extend_from_slice(&bytes);
252		self
253	}
254
255	/// Extend with Decimal value
256	pub fn extend_decimal(&mut self, decimal: &Decimal) -> &mut Self {
257		// Encode decimal as string representation for now
258		// This ensures ordering is preserved for decimal values
259		let s = decimal.to_string();
260		self.extend_str(&s);
261		self
262	}
263
264	/// Extend with a Value based on its type, including a type marker byte for self-describing encoding.
265	/// The marker is written as a raw byte (not complement-encoded) so that `read_value()` can decode it.
266	pub fn extend_value(&mut self, value: &Value) -> &mut Self {
267		match value {
268			Value::None {
269				inner,
270				..
271			} => {
272				self.buffer.push(0x00);
273				self.buffer.push(match inner {
274					Type::Any => 0x00,
275					Type::Boolean => 0x01,
276					Type::Float4 => 0x02,
277					Type::Float8 => 0x03,
278					Type::Int1 => 0x04,
279					Type::Int2 => 0x05,
280					Type::Int4 => 0x06,
281					Type::Int8 => 0x07,
282					Type::Int16 => 0x08,
283					Type::Utf8 => 0x09,
284					Type::Uint1 => 0x0a,
285					Type::Uint2 => 0x0b,
286					Type::Uint4 => 0x0c,
287					Type::Uint8 => 0x0d,
288					Type::Uint16 => 0x0e,
289					Type::Date => 0x0f,
290					Type::DateTime => 0x10,
291					Type::Time => 0x11,
292					Type::Duration => 0x12,
293					Type::IdentityId => 0x14,
294					Type::Uuid4 => 0x15,
295					Type::Uuid7 => 0x16,
296					Type::Blob => 0x17,
297					Type::Int => 0x18,
298					Type::Uint => 0x19,
299					Type::Decimal => 0x1a,
300					Type::DictionaryId => 0x1b,
301					_ => unreachable!(
302						"Option/List/Record/Tuple types cannot be encoded as None inner type in keys"
303					),
304				});
305			}
306			Value::Boolean(b) => {
307				self.buffer.push(0x01);
308				self.extend_bool(*b);
309			}
310			Value::Float4(f) => {
311				self.buffer.push(0x02);
312				self.extend_f32(**f);
313			}
314			Value::Float8(f) => {
315				self.buffer.push(0x03);
316				self.extend_f64(**f);
317			}
318			Value::Int1(i) => {
319				self.buffer.push(0x04);
320				self.extend_i8(*i);
321			}
322			Value::Int2(i) => {
323				self.buffer.push(0x05);
324				self.extend_i16(*i);
325			}
326			Value::Int4(i) => {
327				self.buffer.push(0x06);
328				self.extend_i32(*i);
329			}
330			Value::Int8(i) => {
331				self.buffer.push(0x07);
332				self.extend_i64(*i);
333			}
334			Value::Int16(i) => {
335				self.buffer.push(0x08);
336				self.extend_i128(*i);
337			}
338			Value::Utf8(s) => {
339				self.buffer.push(0x09);
340				self.extend_str(s);
341			}
342			Value::Uint1(u) => {
343				self.buffer.push(0x0a);
344				self.extend_u8(*u);
345			}
346			Value::Uint2(u) => {
347				self.buffer.push(0x0b);
348				self.extend_u16(*u);
349			}
350			Value::Uint4(u) => {
351				self.buffer.push(0x0c);
352				self.extend_u32(*u);
353			}
354			Value::Uint8(u) => {
355				self.buffer.push(0x0d);
356				self.extend_u64(*u);
357			}
358			Value::Uint16(u) => {
359				self.buffer.push(0x0e);
360				self.extend_u128(*u);
361			}
362			Value::Date(d) => {
363				self.buffer.push(0x0f);
364				self.extend_date(d);
365			}
366			Value::DateTime(dt) => {
367				self.buffer.push(0x10);
368				self.extend_datetime(dt);
369			}
370			Value::Time(t) => {
371				self.buffer.push(0x11);
372				self.extend_time(t);
373			}
374			Value::Duration(i) => {
375				self.buffer.push(0x12);
376				self.extend_duration(i);
377			}
378			Value::IdentityId(id) => {
379				self.buffer.push(0x14);
380				self.extend_identity_id(id);
381			}
382			Value::Uuid4(uuid) => {
383				self.buffer.push(0x15);
384				self.extend_uuid4(uuid);
385			}
386			Value::Uuid7(uuid) => {
387				self.buffer.push(0x16);
388				self.extend_uuid7(uuid);
389			}
390			Value::Blob(b) => {
391				self.buffer.push(0x17);
392				self.extend_blob(b);
393			}
394			Value::Int(i) => {
395				self.buffer.push(0x18);
396				self.extend_int(i);
397			}
398			Value::Uint(u) => {
399				self.buffer.push(0x19);
400				self.extend_uint(u);
401			}
402			Value::Decimal(d) => {
403				self.buffer.push(0x1a);
404				self.extend_decimal(d);
405			}
406			Value::Any(_) | Value::Type(_) | Value::List(_) | Value::Record(_) | Value::Tuple(_) => {
407				unreachable!("Any/Type/List/Record/Tuple values cannot be serialized in keys");
408			}
409			Value::DictionaryId(id) => {
410				self.buffer.push(0x1b);
411				match id {
412					DictionaryEntryId::U1(v) => {
413						self.buffer.push(0x00);
414						self.extend_u8(*v);
415					}
416					DictionaryEntryId::U2(v) => {
417						self.buffer.push(0x01);
418						self.extend_u16(*v);
419					}
420					DictionaryEntryId::U4(v) => {
421						self.buffer.push(0x02);
422						self.extend_u32(*v);
423					}
424					DictionaryEntryId::U8(v) => {
425						self.buffer.push(0x03);
426						self.extend_u64(*v);
427					}
428					DictionaryEntryId::U16(v) => {
429						self.buffer.push(0x04);
430						self.extend_u128(*v);
431					}
432				}
433			}
434		}
435		self
436	}
437}
438
439impl Default for KeySerializer {
440	fn default() -> Self {
441		Self::new()
442	}
443}
444
445#[cfg(test)]
446pub mod tests {
447	use std::{f64, str::FromStr};
448
449	use num_bigint::BigInt;
450	use reifydb_runtime::context::{
451		clock::{Clock, MockClock},
452		rng::Rng,
453	};
454	use reifydb_type::{
455		util::hex,
456		value::{
457			Value,
458			blob::Blob,
459			date::Date,
460			datetime::DateTime,
461			decimal::Decimal,
462			dictionary::DictionaryEntryId,
463			duration::Duration,
464			identity::IdentityId,
465			int::Int,
466			ordered_f32::OrderedF32,
467			ordered_f64::OrderedF64,
468			row_number::RowNumber,
469			time::Time,
470			r#type::Type,
471			uint::Uint,
472			uuid::{Uuid4, Uuid7},
473		},
474	};
475
476	use crate::{
477		interface::catalog::{
478			id::{IndexId, PrimaryKeyId, TableId},
479			shape::ShapeId,
480		},
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), "7fffffffffffffff");
660
661		let mut serializer = KeySerializer::new();
662		serializer.extend_i64(1i64);
663		let result = serializer.finish();
664		assert_eq!(hex::encode(&result), "7ffffffffffffffe");
665
666		let mut serializer = KeySerializer::new();
667		serializer.extend_i64(-1i64);
668		let result = serializer.finish();
669		assert_eq!(hex::encode(&result), "8000000000000000");
670
671		let mut serializer = KeySerializer::new();
672		serializer.extend_i64(i64::MAX);
673		let result = serializer.finish();
674		assert_eq!(hex::encode(&result), "0000000000000000");
675
676		let mut serializer = KeySerializer::new();
677		serializer.extend_i64(i64::MIN);
678		let result = serializer.finish();
679		assert_eq!(hex::encode(&result), "ffffffffffffffff");
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), "ffffffff");
757
758		let mut serializer = KeySerializer::new();
759		serializer.extend_u32(1u32);
760		let result = serializer.finish();
761		assert_eq!(hex::encode(&result), "fffffffe");
762
763		let mut serializer = KeySerializer::new();
764		serializer.extend_u32(u32::MAX);
765		let result = serializer.finish();
766		assert_eq!(hex::encode(&result), "00000000");
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), "ffffffffffffffff");
775
776		let mut serializer = KeySerializer::new();
777		serializer.extend_u64(1u64);
778		let result = serializer.finish();
779		assert_eq!(hex::encode(&result), "fffffffffffffffe");
780
781		let mut serializer = KeySerializer::new();
782		serializer.extend_u64(65535u64);
783		let result = serializer.finish();
784		assert_eq!(hex::encode(&result), "ffffffffffff0000");
785
786		let mut serializer = KeySerializer::new();
787		serializer.extend_u64(u64::MAX);
788		let result = serializer.finish();
789		assert_eq!(hex::encode(&result), "0000000000000000");
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 (8 bytes)
851		assert!(result.len() >= 19);
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_ordering_descending_u64() {
884		let mut ser1 = KeySerializer::new();
885		ser1.extend_u64(1u64);
886		let bytes1 = ser1.finish();
887
888		let mut ser2 = KeySerializer::new();
889		ser2.extend_u64(100u64);
890		let bytes2 = ser2.finish();
891
892		let mut ser3 = KeySerializer::new();
893		ser3.extend_u64(10000u64);
894		let bytes3 = ser3.finish();
895
896		// Descending: larger u64 -> smaller bytes
897		assert!(bytes3 < bytes2, "encode(10000) should be < encode(100)");
898		assert!(bytes2 < bytes1, "encode(100) should be < encode(1)");
899	}
900
901	#[test]
902	fn test_ordering_descending_negative() {
903		// Test negative numbers ordering
904		// In descending order: -1 > -100 > -1000
905		// So encoded bytes: encode(-1) < encode(-100) < encode(-1000)
906		let mut ser1 = KeySerializer::new();
907		ser1.extend_i32(-1i32);
908		let bytes_neg1 = ser1.finish();
909
910		let mut ser2 = KeySerializer::new();
911		ser2.extend_i32(-100i32);
912		let bytes_neg100 = ser2.finish();
913
914		let mut ser3 = KeySerializer::new();
915		ser3.extend_i32(-1000i32);
916		let bytes_neg1000 = ser3.finish();
917
918		// In descending: -1 > -100 > -1000, so encode(-1) < encode(-100) < encode(-1000)
919		assert!(bytes_neg1 < bytes_neg100, "encode(-1) should be < encode(-100)");
920		assert!(bytes_neg100 < bytes_neg1000, "encode(-100) should be < encode(-1000)");
921	}
922
923	#[test]
924	fn test_ordering_mixed_sign() {
925		// Test that positive/negative ordering is correct
926		let mut ser_neg = KeySerializer::new();
927		ser_neg.extend_i32(-1i32);
928		let bytes_neg = ser_neg.finish();
929
930		let mut ser_zero = KeySerializer::new();
931		ser_zero.extend_i32(0i32);
932		let bytes_zero = ser_zero.finish();
933
934		let mut ser_pos = KeySerializer::new();
935		ser_pos.extend_i32(1i32);
936		let bytes_pos = ser_pos.finish();
937
938		// In descending: 1 > 0 > -1, so encode(1) < encode(0) < encode(-1)
939		assert!(bytes_pos < bytes_zero, "encode(1) should be < encode(0)");
940		assert!(bytes_zero < bytes_neg, "encode(0) should be < encode(-1)");
941	}
942
943	#[test]
944	fn test_date() {
945		let mut serializer = KeySerializer::new();
946		let date = Date::from_ymd(2024, 1, 1).unwrap();
947		serializer.extend_date(&date);
948		let result = serializer.finish();
949		assert_eq!(result.len(), 4); // i32 encoding
950	}
951
952	#[test]
953	fn test_datetime() {
954		let mut serializer = KeySerializer::new();
955		let datetime = DateTime::from_ymd_hms(2024, 1, 1, 12, 0, 0).unwrap();
956		serializer.extend_datetime(&datetime);
957		let result = serializer.finish();
958		assert_eq!(result.len(), 8); // i64 encoding
959	}
960
961	#[test]
962	fn test_time() {
963		let mut serializer = KeySerializer::new();
964		let time = Time::from_hms(12, 30, 45).unwrap();
965		serializer.extend_time(&time);
966		let result = serializer.finish();
967		assert_eq!(result.len(), 8); // u64 encoding
968	}
969
970	#[test]
971	fn test_interval() {
972		let mut serializer = KeySerializer::new();
973		let duration = Duration::from_nanoseconds(1000000).unwrap();
974		serializer.extend_duration(&duration);
975		let result = serializer.finish();
976		assert_eq!(result.len(), 16); // i32 + i32 + i64 encoding
977	}
978
979	#[test]
980	fn test_row_number() {
981		let mut serializer = KeySerializer::new();
982		let row_number = RowNumber(42);
983		serializer.extend_row_number(&row_number);
984		let result = serializer.finish();
985		assert_eq!(result.len(), 8); // u64 encoding
986	}
987
988	#[test]
989	fn test_identity_id() {
990		let (_, clock, rng) = test_clock_and_rng();
991		let mut serializer = KeySerializer::new();
992		let id = IdentityId::generate(&clock, &rng);
993		serializer.extend_identity_id(&id);
994		let result = serializer.finish();
995		assert!(result.len() > 0);
996	}
997
998	#[test]
999	fn test_uuid4() {
1000		let mut serializer = KeySerializer::new();
1001		let uuid = Uuid4::generate();
1002		serializer.extend_uuid4(&uuid);
1003		let result = serializer.finish();
1004		// UUID is 16 bytes plus encoding overhead
1005		assert!(result.len() > 16);
1006	}
1007
1008	#[test]
1009	fn test_uuid7() {
1010		let (_, clock, rng) = test_clock_and_rng();
1011		let mut serializer = KeySerializer::new();
1012		let uuid = Uuid7::generate(&clock, &rng);
1013		serializer.extend_uuid7(&uuid);
1014		let result = serializer.finish();
1015		// UUID is 16 bytes plus encoding overhead
1016		assert!(result.len() > 16);
1017	}
1018
1019	#[test]
1020	fn test_blob() {
1021		let mut serializer = KeySerializer::new();
1022		let blob = Blob::from(vec![0x01, 0x02, 0x03]);
1023		serializer.extend_blob(&blob);
1024		let result = serializer.finish();
1025		// Should have data plus terminator
1026		assert!(result.len() > 3);
1027	}
1028
1029	#[test]
1030	fn test_int() {
1031		let mut serializer = KeySerializer::new();
1032		let int = Int(BigInt::from(42));
1033		serializer.extend_int(&int);
1034		let result = serializer.finish();
1035		// Should have sign byte + length + data
1036		assert!(result.len() > 0);
1037	}
1038
1039	#[test]
1040	fn test_uint() {
1041		let mut serializer = KeySerializer::new();
1042		let uint = Uint(BigInt::from(42));
1043		serializer.extend_uint(&uint);
1044		let result = serializer.finish();
1045		// Should have length + data
1046		assert!(result.len() > 0);
1047	}
1048
1049	#[test]
1050	fn test_decimal() {
1051		let mut serializer = KeySerializer::new();
1052		let decimal = Decimal::from_str("3.14").unwrap();
1053		serializer.extend_decimal(&decimal);
1054		let result = serializer.finish();
1055		// Should encode as string
1056		assert!(result.len() > 0);
1057	}
1058
1059	#[test]
1060	fn test_extend_value() {
1061		// Test None (Any inner type)
1062		let mut serializer = KeySerializer::new();
1063		serializer.extend_value(&Value::none());
1064		let result = serializer.finish();
1065		assert_eq!(result, vec![0x00, 0x00]); // marker + Any inner type marker
1066
1067		// Test None with typed inner
1068		let mut serializer = KeySerializer::new();
1069		serializer.extend_value(&Value::none_of(Type::Int4));
1070		let result = serializer.finish();
1071		assert_eq!(result, vec![0x00, 0x06]); // marker + Int4 inner type marker
1072
1073		// Test boolean
1074		let mut serializer = KeySerializer::new();
1075		serializer.extend_value(&Value::Boolean(true));
1076		let result = serializer.finish();
1077		assert_eq!(result[0], 0x01); // Boolean marker
1078		assert_eq!(result.len(), 2); // marker + encoded bool
1079
1080		// Test integer
1081		let mut serializer = KeySerializer::new();
1082		serializer.extend_value(&Value::Int4(42));
1083		let result = serializer.finish();
1084		assert_eq!(result[0], 0x06); // Int4 marker
1085		assert_eq!(result.len(), 5); // marker + 4 bytes
1086
1087		// Test string
1088		let mut serializer = KeySerializer::new();
1089		serializer.extend_value(&Value::Utf8("test".to_string()));
1090		let result = serializer.finish();
1091		assert_eq!(result[0], 0x09); // Utf8 marker
1092		assert!(result.ends_with(&[0xff, 0xff]));
1093	}
1094
1095	#[test]
1096	fn test_roundtrip_none() {
1097		let value = Value::none();
1098		let mut ser = KeySerializer::new();
1099		ser.extend_value(&value);
1100		let bytes = ser.finish();
1101		let mut de = KeyDeserializer::from_bytes(&bytes);
1102		assert_eq!(de.read_value().unwrap(), value);
1103		assert!(de.is_empty());
1104	}
1105
1106	#[test]
1107	fn test_roundtrip_none_typed() {
1108		let value = Value::none_of(Type::Int4);
1109		let mut ser = KeySerializer::new();
1110		ser.extend_value(&value);
1111		let bytes = ser.finish();
1112		let mut de = KeyDeserializer::from_bytes(&bytes);
1113		assert_eq!(de.read_value().unwrap(), value);
1114		assert!(de.is_empty());
1115	}
1116
1117	#[test]
1118	fn test_roundtrip_boolean_true() {
1119		let value = Value::Boolean(true);
1120		let mut ser = KeySerializer::new();
1121		ser.extend_value(&value);
1122		let bytes = ser.finish();
1123		let mut de = KeyDeserializer::from_bytes(&bytes);
1124		assert_eq!(de.read_value().unwrap(), value);
1125		assert!(de.is_empty());
1126	}
1127
1128	#[test]
1129	fn test_roundtrip_boolean_false() {
1130		let value = Value::Boolean(false);
1131		let mut ser = KeySerializer::new();
1132		ser.extend_value(&value);
1133		let bytes = ser.finish();
1134		let mut de = KeyDeserializer::from_bytes(&bytes);
1135		assert_eq!(de.read_value().unwrap(), value);
1136		assert!(de.is_empty());
1137	}
1138
1139	#[test]
1140	fn test_roundtrip_float4() {
1141		let value = Value::Float4(OrderedF32::try_from(3.14f32).unwrap());
1142		let mut ser = KeySerializer::new();
1143		ser.extend_value(&value);
1144		let bytes = ser.finish();
1145		let mut de = KeyDeserializer::from_bytes(&bytes);
1146		assert_eq!(de.read_value().unwrap(), value);
1147		assert!(de.is_empty());
1148	}
1149
1150	#[test]
1151	fn test_roundtrip_float8() {
1152		let value = Value::Float8(OrderedF64::try_from(3.14).unwrap());
1153		let mut ser = KeySerializer::new();
1154		ser.extend_value(&value);
1155		let bytes = ser.finish();
1156		let mut de = KeyDeserializer::from_bytes(&bytes);
1157		assert_eq!(de.read_value().unwrap(), value);
1158		assert!(de.is_empty());
1159	}
1160
1161	#[test]
1162	fn test_roundtrip_int1() {
1163		let value = Value::Int1(-42);
1164		let mut ser = KeySerializer::new();
1165		ser.extend_value(&value);
1166		let bytes = ser.finish();
1167		let mut de = KeyDeserializer::from_bytes(&bytes);
1168		assert_eq!(de.read_value().unwrap(), value);
1169		assert!(de.is_empty());
1170	}
1171
1172	#[test]
1173	fn test_roundtrip_int2() {
1174		let value = Value::Int2(-1000);
1175		let mut ser = KeySerializer::new();
1176		ser.extend_value(&value);
1177		let bytes = ser.finish();
1178		let mut de = KeyDeserializer::from_bytes(&bytes);
1179		assert_eq!(de.read_value().unwrap(), value);
1180		assert!(de.is_empty());
1181	}
1182
1183	#[test]
1184	fn test_roundtrip_int4() {
1185		let value = Value::Int4(42);
1186		let mut ser = KeySerializer::new();
1187		ser.extend_value(&value);
1188		let bytes = ser.finish();
1189		let mut de = KeyDeserializer::from_bytes(&bytes);
1190		assert_eq!(de.read_value().unwrap(), value);
1191		assert!(de.is_empty());
1192	}
1193
1194	#[test]
1195	fn test_roundtrip_int8() {
1196		let value = Value::Int8(-1_000_000);
1197		let mut ser = KeySerializer::new();
1198		ser.extend_value(&value);
1199		let bytes = ser.finish();
1200		let mut de = KeyDeserializer::from_bytes(&bytes);
1201		assert_eq!(de.read_value().unwrap(), value);
1202		assert!(de.is_empty());
1203	}
1204
1205	#[test]
1206	fn test_roundtrip_int16() {
1207		let value = Value::Int16(123_456_789);
1208		let mut ser = KeySerializer::new();
1209		ser.extend_value(&value);
1210		let bytes = ser.finish();
1211		let mut de = KeyDeserializer::from_bytes(&bytes);
1212		assert_eq!(de.read_value().unwrap(), value);
1213		assert!(de.is_empty());
1214	}
1215
1216	#[test]
1217	fn test_roundtrip_utf8() {
1218		let value = Value::Utf8("hello world".to_string());
1219		let mut ser = KeySerializer::new();
1220		ser.extend_value(&value);
1221		let bytes = ser.finish();
1222		let mut de = KeyDeserializer::from_bytes(&bytes);
1223		assert_eq!(de.read_value().unwrap(), value);
1224		assert!(de.is_empty());
1225	}
1226
1227	#[test]
1228	fn test_roundtrip_uint1() {
1229		let value = Value::Uint1(255);
1230		let mut ser = KeySerializer::new();
1231		ser.extend_value(&value);
1232		let bytes = ser.finish();
1233		let mut de = KeyDeserializer::from_bytes(&bytes);
1234		assert_eq!(de.read_value().unwrap(), value);
1235		assert!(de.is_empty());
1236	}
1237
1238	#[test]
1239	fn test_roundtrip_uint2() {
1240		let value = Value::Uint2(65535);
1241		let mut ser = KeySerializer::new();
1242		ser.extend_value(&value);
1243		let bytes = ser.finish();
1244		let mut de = KeyDeserializer::from_bytes(&bytes);
1245		assert_eq!(de.read_value().unwrap(), value);
1246		assert!(de.is_empty());
1247	}
1248
1249	#[test]
1250	fn test_roundtrip_uint4() {
1251		let value = Value::Uint4(100_000);
1252		let mut ser = KeySerializer::new();
1253		ser.extend_value(&value);
1254		let bytes = ser.finish();
1255		let mut de = KeyDeserializer::from_bytes(&bytes);
1256		assert_eq!(de.read_value().unwrap(), value);
1257		assert!(de.is_empty());
1258	}
1259
1260	#[test]
1261	fn test_roundtrip_uint8() {
1262		let value = Value::Uint8(999);
1263		let mut ser = KeySerializer::new();
1264		ser.extend_value(&value);
1265		let bytes = ser.finish();
1266		let mut de = KeyDeserializer::from_bytes(&bytes);
1267		assert_eq!(de.read_value().unwrap(), value);
1268		assert!(de.is_empty());
1269	}
1270
1271	#[test]
1272	fn test_roundtrip_uint16() {
1273		let value = Value::Uint16(u128::MAX);
1274		let mut ser = KeySerializer::new();
1275		ser.extend_value(&value);
1276		let bytes = ser.finish();
1277		let mut de = KeyDeserializer::from_bytes(&bytes);
1278		assert_eq!(de.read_value().unwrap(), value);
1279		assert!(de.is_empty());
1280	}
1281
1282	#[test]
1283	fn test_roundtrip_date() {
1284		let value = Value::Date(Date::from_ymd(2024, 6, 15).unwrap());
1285		let mut ser = KeySerializer::new();
1286		ser.extend_value(&value);
1287		let bytes = ser.finish();
1288		let mut de = KeyDeserializer::from_bytes(&bytes);
1289		assert_eq!(de.read_value().unwrap(), value);
1290		assert!(de.is_empty());
1291	}
1292
1293	#[test]
1294	fn test_roundtrip_datetime() {
1295		let value = Value::DateTime(DateTime::from_ymd_hms(2024, 6, 15, 12, 30, 45).unwrap());
1296		let mut ser = KeySerializer::new();
1297		ser.extend_value(&value);
1298		let bytes = ser.finish();
1299		let mut de = KeyDeserializer::from_bytes(&bytes);
1300		assert_eq!(de.read_value().unwrap(), value);
1301		assert!(de.is_empty());
1302	}
1303
1304	#[test]
1305	fn test_roundtrip_time() {
1306		let value = Value::Time(Time::from_hms(12, 30, 45).unwrap());
1307		let mut ser = KeySerializer::new();
1308		ser.extend_value(&value);
1309		let bytes = ser.finish();
1310		let mut de = KeyDeserializer::from_bytes(&bytes);
1311		assert_eq!(de.read_value().unwrap(), value);
1312		assert!(de.is_empty());
1313	}
1314
1315	#[test]
1316	fn test_roundtrip_duration() {
1317		let value = Value::Duration(Duration::from_nanoseconds(1_000_000).unwrap());
1318		let mut ser = KeySerializer::new();
1319		ser.extend_value(&value);
1320		let bytes = ser.finish();
1321		let mut de = KeyDeserializer::from_bytes(&bytes);
1322		assert_eq!(de.read_value().unwrap(), value);
1323		assert!(de.is_empty());
1324	}
1325
1326	#[test]
1327	fn test_roundtrip_identity_id() {
1328		let (_, clock, rng) = test_clock_and_rng();
1329		let value = Value::IdentityId(IdentityId::generate(&clock, &rng));
1330		let mut ser = KeySerializer::new();
1331		ser.extend_value(&value);
1332		let bytes = ser.finish();
1333		let mut de = KeyDeserializer::from_bytes(&bytes);
1334		assert_eq!(de.read_value().unwrap(), value);
1335		assert!(de.is_empty());
1336	}
1337
1338	#[test]
1339	fn test_roundtrip_uuid4() {
1340		let value = Value::Uuid4(Uuid4::generate());
1341		let mut ser = KeySerializer::new();
1342		ser.extend_value(&value);
1343		let bytes = ser.finish();
1344		let mut de = KeyDeserializer::from_bytes(&bytes);
1345		assert_eq!(de.read_value().unwrap(), value);
1346		assert!(de.is_empty());
1347	}
1348
1349	#[test]
1350	fn test_roundtrip_uuid7() {
1351		let (_, clock, rng) = test_clock_and_rng();
1352		let value = Value::Uuid7(Uuid7::generate(&clock, &rng));
1353		let mut ser = KeySerializer::new();
1354		ser.extend_value(&value);
1355		let bytes = ser.finish();
1356		let mut de = KeyDeserializer::from_bytes(&bytes);
1357		assert_eq!(de.read_value().unwrap(), value);
1358		assert!(de.is_empty());
1359	}
1360
1361	#[test]
1362	fn test_roundtrip_blob() {
1363		let value = Value::Blob(Blob::from(vec![0x01, 0x02, 0x03]));
1364		let mut ser = KeySerializer::new();
1365		ser.extend_value(&value);
1366		let bytes = ser.finish();
1367		let mut de = KeyDeserializer::from_bytes(&bytes);
1368		assert_eq!(de.read_value().unwrap(), value);
1369		assert!(de.is_empty());
1370	}
1371
1372	#[test]
1373	fn test_roundtrip_int() {
1374		let value = Value::Int(Int(BigInt::from(-42)));
1375		let mut ser = KeySerializer::new();
1376		ser.extend_value(&value);
1377		let bytes = ser.finish();
1378		let mut de = KeyDeserializer::from_bytes(&bytes);
1379		assert_eq!(de.read_value().unwrap(), value);
1380		assert!(de.is_empty());
1381	}
1382
1383	#[test]
1384	fn test_roundtrip_uint() {
1385		let value = Value::Uint(Uint(BigInt::from(42)));
1386		let mut ser = KeySerializer::new();
1387		ser.extend_value(&value);
1388		let bytes = ser.finish();
1389		let mut de = KeyDeserializer::from_bytes(&bytes);
1390		assert_eq!(de.read_value().unwrap(), value);
1391		assert!(de.is_empty());
1392	}
1393
1394	#[test]
1395	fn test_roundtrip_decimal() {
1396		let value = Value::Decimal(Decimal::from_str("3.14").unwrap());
1397		let mut ser = KeySerializer::new();
1398		ser.extend_value(&value);
1399		let bytes = ser.finish();
1400		let mut de = KeyDeserializer::from_bytes(&bytes);
1401		assert_eq!(de.read_value().unwrap(), value);
1402		assert!(de.is_empty());
1403	}
1404
1405	#[test]
1406	fn test_roundtrip_dictionary_id_u1() {
1407		let value = Value::DictionaryId(DictionaryEntryId::U1(42));
1408		let mut ser = KeySerializer::new();
1409		ser.extend_value(&value);
1410		let bytes = ser.finish();
1411		let mut de = KeyDeserializer::from_bytes(&bytes);
1412		assert_eq!(de.read_value().unwrap(), value);
1413		assert!(de.is_empty());
1414	}
1415
1416	#[test]
1417	fn test_roundtrip_dictionary_id_u2() {
1418		let value = Value::DictionaryId(DictionaryEntryId::U2(1000));
1419		let mut ser = KeySerializer::new();
1420		ser.extend_value(&value);
1421		let bytes = ser.finish();
1422		let mut de = KeyDeserializer::from_bytes(&bytes);
1423		assert_eq!(de.read_value().unwrap(), value);
1424		assert!(de.is_empty());
1425	}
1426
1427	#[test]
1428	fn test_roundtrip_dictionary_id_u4() {
1429		let value = Value::DictionaryId(DictionaryEntryId::U4(100_000));
1430		let mut ser = KeySerializer::new();
1431		ser.extend_value(&value);
1432		let bytes = ser.finish();
1433		let mut de = KeyDeserializer::from_bytes(&bytes);
1434		assert_eq!(de.read_value().unwrap(), value);
1435		assert!(de.is_empty());
1436	}
1437
1438	#[test]
1439	fn test_roundtrip_dictionary_id_u8() {
1440		let value = Value::DictionaryId(DictionaryEntryId::U8(10_000_000_000));
1441		let mut ser = KeySerializer::new();
1442		ser.extend_value(&value);
1443		let bytes = ser.finish();
1444		let mut de = KeyDeserializer::from_bytes(&bytes);
1445		assert_eq!(de.read_value().unwrap(), value);
1446		assert!(de.is_empty());
1447	}
1448
1449	#[test]
1450	fn test_roundtrip_dictionary_id_u16() {
1451		let value = Value::DictionaryId(DictionaryEntryId::U16(u128::MAX));
1452		let mut ser = KeySerializer::new();
1453		ser.extend_value(&value);
1454		let bytes = ser.finish();
1455		let mut de = KeyDeserializer::from_bytes(&bytes);
1456		assert_eq!(de.read_value().unwrap(), value);
1457		assert!(de.is_empty());
1458	}
1459
1460	#[test]
1461	fn test_roundtrip_all() {
1462		let (_, clock, rng) = test_clock_and_rng();
1463		let values = vec![
1464			Value::none(),
1465			Value::none_of(Type::Int4),
1466			Value::Boolean(true),
1467			Value::Boolean(false),
1468			Value::Float4(OrderedF32::try_from(3.14f32).unwrap()),
1469			Value::Float8(OrderedF64::try_from(3.14).unwrap()),
1470			Value::Int1(-42),
1471			Value::Int2(-1000),
1472			Value::Int4(42),
1473			Value::Int8(-1_000_000),
1474			Value::Int16(123_456_789),
1475			Value::Utf8("hello world".to_string()),
1476			Value::Uint1(255),
1477			Value::Uint2(65535),
1478			Value::Uint4(100_000),
1479			Value::Uint8(999),
1480			Value::Uint16(u128::MAX),
1481			Value::Date(Date::from_ymd(2024, 6, 15).unwrap()),
1482			Value::DateTime(DateTime::from_ymd_hms(2024, 6, 15, 12, 30, 45).unwrap()),
1483			Value::Time(Time::from_hms(12, 30, 45).unwrap()),
1484			Value::Duration(Duration::from_nanoseconds(1_000_000).unwrap()),
1485			Value::IdentityId(IdentityId::generate(&clock, &rng)),
1486			Value::Uuid4(Uuid4::generate()),
1487			Value::Uuid7(Uuid7::generate(&clock, &rng)),
1488			Value::Blob(Blob::from(vec![0x01, 0x02, 0x03])),
1489			Value::Int(Int(BigInt::from(-42))),
1490			Value::Uint(Uint(BigInt::from(42))),
1491			Value::Decimal(Decimal::from_str("3.14").unwrap()),
1492			Value::DictionaryId(DictionaryEntryId::U8(42)),
1493		];
1494
1495		let mut ser = KeySerializer::new();
1496		for v in &values {
1497			ser.extend_value(v);
1498		}
1499		let bytes = ser.finish();
1500
1501		let mut de = KeyDeserializer::from_bytes(&bytes);
1502		for expected in &values {
1503			let actual = de.read_value().unwrap();
1504			assert_eq!(&actual, expected);
1505		}
1506		assert!(de.is_empty());
1507	}
1508
1509	/// Compile-time exhaustiveness guard: if a new Value variant is added,
1510	/// this test will fail to compile. Add a corresponding `test_roundtrip_<variant>`
1511	/// test above, then add the new variant arm here.
1512	#[test]
1513	fn test_roundtrip_exhaustiveness_guard() {
1514		let value = Value::none();
1515		match value {
1516			Value::None {
1517				..
1518			} => {}
1519			Value::Boolean(_) => {}
1520			Value::Float4(_) => {}
1521			Value::Float8(_) => {}
1522			Value::Int1(_) => {}
1523			Value::Int2(_) => {}
1524			Value::Int4(_) => {}
1525			Value::Int8(_) => {}
1526			Value::Int16(_) => {}
1527			Value::Utf8(_) => {}
1528			Value::Uint1(_) => {}
1529			Value::Uint2(_) => {}
1530			Value::Uint4(_) => {}
1531			Value::Uint8(_) => {}
1532			Value::Uint16(_) => {}
1533			Value::Date(_) => {}
1534			Value::DateTime(_) => {}
1535			Value::Time(_) => {}
1536			Value::Duration(_) => {}
1537			Value::IdentityId(_) => {}
1538			Value::Uuid4(_) => {}
1539			Value::Uuid7(_) => {}
1540			Value::Blob(_) => {}
1541			Value::Int(_) => {}
1542			Value::Uint(_) => {}
1543			Value::Decimal(_) => {}
1544			Value::DictionaryId(_) => {}
1545			// Not serializable in keys:
1546			Value::Any(_) => {}
1547			Value::Type(_) => {}
1548			Value::List(_) => {}
1549			Value::Record(_) => {}
1550			Value::Tuple(_) => {}
1551		}
1552	}
1553
1554	#[test]
1555	fn test_to_encoded_key() {
1556		let mut serializer = KeySerializer::new();
1557		serializer.extend_i32(42);
1558		let key = serializer.to_encoded_key();
1559		assert_eq!(key.len(), 4);
1560	}
1561
1562	#[test]
1563	fn test_index_id() {
1564		let mut serializer = KeySerializer::new();
1565		serializer.extend_index_id(IndexId::Primary(PrimaryKeyId(123456789)));
1566		let result = serializer.finish();
1567
1568		// IndexId Primary uses 1 byte prefix + 8 bytes u64 with bitwise NOT
1569		assert_eq!(result.len(), 9);
1570		assert_eq!(result[0], 0x01); // Primary variant prefix
1571
1572		// Verify it's using bitwise NOT (smaller values produce larger encoded values)
1573		let mut serializer2 = KeySerializer::new();
1574		serializer2.extend_index_id(IndexId::Primary(PrimaryKeyId(1)));
1575		let result2 = serializer2.finish();
1576
1577		// result2 (for IndexId(1)) should be > result (for IndexId(123456789))
1578		// Compare from byte 1 onwards (after the variant prefix)
1579		assert!(result2[1..] > result[1..]);
1580	}
1581
1582	#[test]
1583	fn test_object_id() {
1584		let mut serializer = KeySerializer::new();
1585		serializer.extend_shape_id(ShapeId::Table(TableId(987654321)));
1586		let result = serializer.finish();
1587
1588		// ShapeId Table uses 1 byte prefix + 8 bytes u64 with bitwise NOT
1589		assert_eq!(result.len(), 9);
1590		assert_eq!(result[0], 0x01); // Table variant prefix
1591
1592		// Verify ordering
1593		let mut serializer2 = KeySerializer::new();
1594		serializer2.extend_shape_id(ShapeId::Table(TableId(987654322)));
1595		let result2 = serializer2.finish();
1596
1597		// result2 (for larger ShapeId) should be < result (inverted ordering)
1598		// Compare from byte 1 onwards (after the variant prefix)
1599		assert!(result2[1..] < result[1..]);
1600	}
1601}