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, schema::SchemaId},
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 SchemaId value (includes type discriminator)
152	pub fn extend_schema_id(&mut self, object: impl Into<SchemaId>) -> &mut Self {
153		let primitive = object.into();
154		self.buffer.extend_from_slice(&catalog::serialize_schema_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())
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_type::{
451		util::hex,
452		value::{
453			Value,
454			blob::Blob,
455			date::Date,
456			datetime::DateTime,
457			decimal::Decimal,
458			dictionary::DictionaryEntryId,
459			duration::Duration,
460			identity::IdentityId,
461			int::Int,
462			ordered_f32::OrderedF32,
463			ordered_f64::OrderedF64,
464			row_number::RowNumber,
465			time::Time,
466			r#type::Type,
467			uint::Uint,
468			uuid::{Uuid4, Uuid7},
469		},
470	};
471
472	use crate::{
473		interface::catalog::{
474			id::{IndexId, PrimaryKeyId, TableId},
475			schema::SchemaId,
476		},
477		util::encoding::keycode::{deserializer::KeyDeserializer, serializer::KeySerializer},
478	};
479
480	#[test]
481	fn test_new() {
482		let serializer = KeySerializer::new();
483		assert!(serializer.is_empty());
484		assert_eq!(serializer.len(), 0);
485	}
486
487	#[test]
488	fn test_with_capacity() {
489		let serializer = KeySerializer::with_capacity(100);
490		assert!(serializer.is_empty());
491		assert_eq!(serializer.len(), 0);
492	}
493
494	#[test]
495	fn test_extend_bool() {
496		let mut serializer = KeySerializer::new();
497		serializer.extend_bool(true);
498		let result = serializer.finish();
499		assert_eq!(result, vec![0x00]);
500		assert_eq!(hex::encode(&result), "00");
501
502		let mut serializer = KeySerializer::new();
503		serializer.extend_bool(false);
504		let result = serializer.finish();
505		assert_eq!(result, vec![0x01]);
506		assert_eq!(hex::encode(&result), "01");
507	}
508
509	#[test]
510	fn test_extend_f32() {
511		let mut serializer = KeySerializer::new();
512		serializer.extend_f32(3.14f32);
513		let result = serializer.finish();
514		assert_eq!(result.len(), 4);
515		assert_eq!(hex::encode(&result), "3fb70a3c");
516
517		let mut serializer = KeySerializer::new();
518		serializer.extend_f32(-3.14f32);
519		let result = serializer.finish();
520		assert_eq!(result.len(), 4);
521		assert_eq!(hex::encode(&result), "c048f5c3");
522
523		let mut serializer = KeySerializer::new();
524		serializer.extend_f32(0.0f32);
525		let result = serializer.finish();
526		assert_eq!(hex::encode(&result), "7fffffff");
527
528		let mut serializer = KeySerializer::new();
529		serializer.extend_f32(f32::MAX);
530		let result = serializer.finish();
531		assert_eq!(hex::encode(&result), "00800000");
532
533		let mut serializer = KeySerializer::new();
534		serializer.extend_f32(f32::MIN);
535		let result = serializer.finish();
536		assert_eq!(hex::encode(&result), "ff7fffff");
537	}
538
539	#[test]
540	fn test_extend_f64() {
541		let mut serializer = KeySerializer::new();
542		serializer.extend_f64(f64::consts::PI);
543		let result = serializer.finish();
544		assert_eq!(result.len(), 8);
545		assert_eq!(hex::encode(&result), "3ff6de04abbbd2e7");
546
547		let mut serializer = KeySerializer::new();
548		serializer.extend_f64(-f64::consts::PI);
549		let result = serializer.finish();
550		assert_eq!(result.len(), 8);
551		assert_eq!(hex::encode(&result), "c00921fb54442d18");
552
553		let mut serializer = KeySerializer::new();
554		serializer.extend_f64(0.0f64);
555		let result = serializer.finish();
556		assert_eq!(hex::encode(&result), "7fffffffffffffff");
557	}
558
559	#[test]
560	fn test_extend_i8() {
561		let mut serializer = KeySerializer::new();
562		serializer.extend_i8(0i8);
563		let result = serializer.finish();
564		assert_eq!(hex::encode(&result), "7f");
565
566		let mut serializer = KeySerializer::new();
567		serializer.extend_i8(1i8);
568		let result = serializer.finish();
569		assert_eq!(hex::encode(&result), "7e");
570
571		let mut serializer = KeySerializer::new();
572		serializer.extend_i8(-1i8);
573		let result = serializer.finish();
574		assert_eq!(hex::encode(&result), "80");
575
576		let mut serializer = KeySerializer::new();
577		serializer.extend_i8(i8::MAX);
578		let result = serializer.finish();
579		assert_eq!(hex::encode(&result), "00");
580
581		let mut serializer = KeySerializer::new();
582		serializer.extend_i8(i8::MIN);
583		let result = serializer.finish();
584		assert_eq!(hex::encode(&result), "ff");
585	}
586
587	#[test]
588	fn test_extend_i16() {
589		let mut serializer = KeySerializer::new();
590		serializer.extend_i16(0i16);
591		let result = serializer.finish();
592		assert_eq!(hex::encode(&result), "7fff");
593
594		let mut serializer = KeySerializer::new();
595		serializer.extend_i16(1i16);
596		let result = serializer.finish();
597		assert_eq!(hex::encode(&result), "7ffe");
598
599		let mut serializer = KeySerializer::new();
600		serializer.extend_i16(-1i16);
601		let result = serializer.finish();
602		assert_eq!(hex::encode(&result), "8000");
603
604		let mut serializer = KeySerializer::new();
605		serializer.extend_i16(i16::MAX);
606		let result = serializer.finish();
607		assert_eq!(hex::encode(&result), "0000");
608
609		let mut serializer = KeySerializer::new();
610		serializer.extend_i16(i16::MIN);
611		let result = serializer.finish();
612		assert_eq!(hex::encode(&result), "ffff");
613	}
614
615	#[test]
616	fn test_extend_i32() {
617		let mut serializer = KeySerializer::new();
618		serializer.extend_i32(0i32);
619		let result = serializer.finish();
620		assert_eq!(hex::encode(&result), "7fffffff");
621
622		let mut serializer = KeySerializer::new();
623		serializer.extend_i32(1i32);
624		let result = serializer.finish();
625		assert_eq!(hex::encode(&result), "7ffffffe");
626
627		let mut serializer = KeySerializer::new();
628		serializer.extend_i32(-1i32);
629		let result = serializer.finish();
630		assert_eq!(hex::encode(&result), "80000000");
631
632		let mut serializer = KeySerializer::new();
633		serializer.extend_i32(i32::MAX);
634		let result = serializer.finish();
635		assert_eq!(hex::encode(&result), "00000000");
636
637		let mut serializer = KeySerializer::new();
638		serializer.extend_i32(i32::MIN);
639		let result = serializer.finish();
640		assert_eq!(hex::encode(&result), "ffffffff");
641	}
642
643	#[test]
644	fn test_extend_i64() {
645		let mut serializer = KeySerializer::new();
646		serializer.extend_i64(0i64);
647		let result = serializer.finish();
648		assert_eq!(hex::encode(&result), "7fffffffffffffff");
649
650		let mut serializer = KeySerializer::new();
651		serializer.extend_i64(1i64);
652		let result = serializer.finish();
653		assert_eq!(hex::encode(&result), "7ffffffffffffffe");
654
655		let mut serializer = KeySerializer::new();
656		serializer.extend_i64(-1i64);
657		let result = serializer.finish();
658		assert_eq!(hex::encode(&result), "8000000000000000");
659
660		let mut serializer = KeySerializer::new();
661		serializer.extend_i64(i64::MAX);
662		let result = serializer.finish();
663		assert_eq!(hex::encode(&result), "0000000000000000");
664
665		let mut serializer = KeySerializer::new();
666		serializer.extend_i64(i64::MIN);
667		let result = serializer.finish();
668		assert_eq!(hex::encode(&result), "ffffffffffffffff");
669	}
670
671	#[test]
672	fn test_extend_i128() {
673		let mut serializer = KeySerializer::new();
674		serializer.extend_i128(0i128);
675		let result = serializer.finish();
676		assert_eq!(hex::encode(&result), "7fffffffffffffffffffffffffffffff");
677
678		let mut serializer = KeySerializer::new();
679		serializer.extend_i128(1i128);
680		let result = serializer.finish();
681		assert_eq!(hex::encode(&result), "7ffffffffffffffffffffffffffffffe");
682
683		let mut serializer = KeySerializer::new();
684		serializer.extend_i128(-1i128);
685		let result = serializer.finish();
686		assert_eq!(hex::encode(&result), "80000000000000000000000000000000");
687
688		let mut serializer = KeySerializer::new();
689		serializer.extend_i128(i128::MAX);
690		let result = serializer.finish();
691		assert_eq!(hex::encode(&result), "00000000000000000000000000000000");
692
693		let mut serializer = KeySerializer::new();
694		serializer.extend_i128(i128::MIN);
695		let result = serializer.finish();
696		assert_eq!(hex::encode(&result), "ffffffffffffffffffffffffffffffff");
697	}
698
699	#[test]
700	fn test_extend_u8() {
701		let mut serializer = KeySerializer::new();
702		serializer.extend_u8(0u8);
703		let result = serializer.finish();
704		assert_eq!(hex::encode(&result), "ff");
705
706		let mut serializer = KeySerializer::new();
707		serializer.extend_u8(1u8);
708		let result = serializer.finish();
709		assert_eq!(hex::encode(&result), "fe");
710
711		let mut serializer = KeySerializer::new();
712		serializer.extend_u8(255u8);
713		let result = serializer.finish();
714		assert_eq!(hex::encode(&result), "00");
715	}
716
717	#[test]
718	fn test_extend_u16() {
719		let mut serializer = KeySerializer::new();
720		serializer.extend_u16(0u16);
721		let result = serializer.finish();
722		assert_eq!(hex::encode(&result), "ffff");
723
724		let mut serializer = KeySerializer::new();
725		serializer.extend_u16(1u16);
726		let result = serializer.finish();
727		assert_eq!(hex::encode(&result), "fffe");
728
729		let mut serializer = KeySerializer::new();
730		serializer.extend_u16(255u16);
731		let result = serializer.finish();
732		assert_eq!(hex::encode(&result), "ff00");
733
734		let mut serializer = KeySerializer::new();
735		serializer.extend_u16(u16::MAX);
736		let result = serializer.finish();
737		assert_eq!(hex::encode(&result), "0000");
738	}
739
740	#[test]
741	fn test_extend_u32() {
742		let mut serializer = KeySerializer::new();
743		serializer.extend_u32(0u32);
744		let result = serializer.finish();
745		assert_eq!(hex::encode(&result), "ffffffff");
746
747		let mut serializer = KeySerializer::new();
748		serializer.extend_u32(1u32);
749		let result = serializer.finish();
750		assert_eq!(hex::encode(&result), "fffffffe");
751
752		let mut serializer = KeySerializer::new();
753		serializer.extend_u32(u32::MAX);
754		let result = serializer.finish();
755		assert_eq!(hex::encode(&result), "00000000");
756	}
757
758	#[test]
759	fn test_extend_u64() {
760		let mut serializer = KeySerializer::new();
761		serializer.extend_u64(0u64);
762		let result = serializer.finish();
763		assert_eq!(hex::encode(&result), "ffffffffffffffff");
764
765		let mut serializer = KeySerializer::new();
766		serializer.extend_u64(1u64);
767		let result = serializer.finish();
768		assert_eq!(hex::encode(&result), "fffffffffffffffe");
769
770		let mut serializer = KeySerializer::new();
771		serializer.extend_u64(65535u64);
772		let result = serializer.finish();
773		assert_eq!(hex::encode(&result), "ffffffffffff0000");
774
775		let mut serializer = KeySerializer::new();
776		serializer.extend_u64(u64::MAX);
777		let result = serializer.finish();
778		assert_eq!(hex::encode(&result), "0000000000000000");
779	}
780
781	#[test]
782	fn test_extend_u128() {
783		let mut serializer = KeySerializer::new();
784		serializer.extend_u128(0u128);
785		let result = serializer.finish();
786		assert_eq!(hex::encode(&result), "ffffffffffffffffffffffffffffffff");
787
788		let mut serializer = KeySerializer::new();
789		serializer.extend_u128(1u128);
790		let result = serializer.finish();
791		assert_eq!(hex::encode(&result), "fffffffffffffffffffffffffffffffe");
792
793		let mut serializer = KeySerializer::new();
794		serializer.extend_u128(u128::MAX);
795		let result = serializer.finish();
796		assert_eq!(hex::encode(&result), "00000000000000000000000000000000");
797	}
798
799	#[test]
800	fn test_extend_bytes() {
801		let mut serializer = KeySerializer::new();
802		serializer.extend_bytes(b"hello");
803		let result = serializer.finish();
804		// Should have "hello" plus terminator (0xff, 0xff)
805		assert_eq!(result, vec![b'h', b'e', b'l', b'l', b'o', 0xff, 0xff]);
806
807		// Test with 0xff in the data
808		let mut serializer = KeySerializer::new();
809		serializer.extend_bytes(&[0x01, 0xff, 0x02]);
810		let result = serializer.finish();
811		// 0xff should be escaped as 0xff, 0x00
812		assert_eq!(result, vec![0x01, 0xff, 0x00, 0x02, 0xff, 0xff]);
813	}
814
815	#[test]
816	fn test_extend_str() {
817		let mut serializer = KeySerializer::new();
818		serializer.extend_str("hello world");
819		let result = serializer.finish();
820		// Should encode as UTF-8 bytes plus terminator
821		assert!(result.len() > "hello world".len());
822		assert!(result.ends_with(&[0xff, 0xff]));
823	}
824
825	#[test]
826	fn test_extend_raw() {
827		let mut serializer = KeySerializer::new();
828		serializer.extend_raw(&[0x01, 0x02, 0x03]);
829		let result = serializer.finish();
830		assert_eq!(result, vec![0x01, 0x02, 0x03]);
831	}
832
833	#[test]
834	fn test_chaining() {
835		let mut serializer = KeySerializer::new();
836		serializer.extend_bool(true).extend_i32(42i32).extend_str("test").extend_u64(1000u64);
837		let result = serializer.finish();
838
839		// Should have bool (1 byte) + i32 (4 bytes) + "test" with terminator (6 bytes) + u64 (8 bytes)
840		assert!(result.len() >= 19);
841
842		let mut de = KeyDeserializer::from_bytes(&result);
843		assert_eq!(de.read_bool().unwrap(), true);
844		assert_eq!(de.read_i32().unwrap(), 42);
845		assert_eq!(de.read_str().unwrap(), "test");
846		assert_eq!(de.read_u64().unwrap(), 1000);
847		assert!(de.is_empty());
848	}
849
850	#[test]
851	fn test_ordering_descending_i32() {
852		// Test that descending order is preserved: larger values -> smaller bytes
853		let mut ser1 = KeySerializer::new();
854		ser1.extend_i32(1i32);
855		let bytes1 = ser1.finish();
856
857		let mut ser2 = KeySerializer::new();
858		ser2.extend_i32(100i32);
859		let bytes2 = ser2.finish();
860
861		let mut ser3 = KeySerializer::new();
862		ser3.extend_i32(1000i32);
863		let bytes3 = ser3.finish();
864
865		// In descending order: larger values encode to smaller bytes
866		// So: bytes_1000 < bytes_100 < bytes_1
867		assert!(bytes3 < bytes2, "encode(1000) should be < encode(100)");
868		assert!(bytes2 < bytes1, "encode(100) should be < encode(1)");
869	}
870
871	#[test]
872	fn test_ordering_descending_u64() {
873		let mut ser1 = KeySerializer::new();
874		ser1.extend_u64(1u64);
875		let bytes1 = ser1.finish();
876
877		let mut ser2 = KeySerializer::new();
878		ser2.extend_u64(100u64);
879		let bytes2 = ser2.finish();
880
881		let mut ser3 = KeySerializer::new();
882		ser3.extend_u64(10000u64);
883		let bytes3 = ser3.finish();
884
885		// Descending: larger u64 -> smaller bytes
886		assert!(bytes3 < bytes2, "encode(10000) should be < encode(100)");
887		assert!(bytes2 < bytes1, "encode(100) should be < encode(1)");
888	}
889
890	#[test]
891	fn test_ordering_descending_negative() {
892		// Test negative numbers ordering
893		// In descending order: -1 > -100 > -1000
894		// So encoded bytes: encode(-1) < encode(-100) < encode(-1000)
895		let mut ser1 = KeySerializer::new();
896		ser1.extend_i32(-1i32);
897		let bytes_neg1 = ser1.finish();
898
899		let mut ser2 = KeySerializer::new();
900		ser2.extend_i32(-100i32);
901		let bytes_neg100 = ser2.finish();
902
903		let mut ser3 = KeySerializer::new();
904		ser3.extend_i32(-1000i32);
905		let bytes_neg1000 = ser3.finish();
906
907		// In descending: -1 > -100 > -1000, so encode(-1) < encode(-100) < encode(-1000)
908		assert!(bytes_neg1 < bytes_neg100, "encode(-1) should be < encode(-100)");
909		assert!(bytes_neg100 < bytes_neg1000, "encode(-100) should be < encode(-1000)");
910	}
911
912	#[test]
913	fn test_ordering_mixed_sign() {
914		// Test that positive/negative ordering is correct
915		let mut ser_neg = KeySerializer::new();
916		ser_neg.extend_i32(-1i32);
917		let bytes_neg = ser_neg.finish();
918
919		let mut ser_zero = KeySerializer::new();
920		ser_zero.extend_i32(0i32);
921		let bytes_zero = ser_zero.finish();
922
923		let mut ser_pos = KeySerializer::new();
924		ser_pos.extend_i32(1i32);
925		let bytes_pos = ser_pos.finish();
926
927		// In descending: 1 > 0 > -1, so encode(1) < encode(0) < encode(-1)
928		assert!(bytes_pos < bytes_zero, "encode(1) should be < encode(0)");
929		assert!(bytes_zero < bytes_neg, "encode(0) should be < encode(-1)");
930	}
931
932	#[test]
933	fn test_date() {
934		let mut serializer = KeySerializer::new();
935		let date = Date::from_ymd(2024, 1, 1).unwrap();
936		serializer.extend_date(&date);
937		let result = serializer.finish();
938		assert_eq!(result.len(), 4); // i32 encoding
939	}
940
941	#[test]
942	fn test_datetime() {
943		let mut serializer = KeySerializer::new();
944		let datetime = DateTime::from_ymd_hms(2024, 1, 1, 12, 0, 0).unwrap();
945		serializer.extend_datetime(&datetime);
946		let result = serializer.finish();
947		assert_eq!(result.len(), 8); // i64 encoding
948	}
949
950	#[test]
951	fn test_time() {
952		let mut serializer = KeySerializer::new();
953		let time = Time::from_hms(12, 30, 45).unwrap();
954		serializer.extend_time(&time);
955		let result = serializer.finish();
956		assert_eq!(result.len(), 8); // u64 encoding
957	}
958
959	#[test]
960	fn test_interval() {
961		let mut serializer = KeySerializer::new();
962		let duration = Duration::from_nanoseconds(1000000).unwrap();
963		serializer.extend_duration(&duration);
964		let result = serializer.finish();
965		assert_eq!(result.len(), 16); // i32 + i32 + i64 encoding
966	}
967
968	#[test]
969	fn test_row_number() {
970		let mut serializer = KeySerializer::new();
971		let row_number = RowNumber(42);
972		serializer.extend_row_number(&row_number);
973		let result = serializer.finish();
974		assert_eq!(result.len(), 8); // u64 encoding
975	}
976
977	#[test]
978	fn test_identity_id() {
979		let mut serializer = KeySerializer::new();
980		let id = IdentityId::generate();
981		serializer.extend_identity_id(&id);
982		let result = serializer.finish();
983		assert!(result.len() > 0);
984	}
985
986	#[test]
987	fn test_uuid4() {
988		let mut serializer = KeySerializer::new();
989		let uuid = Uuid4::generate();
990		serializer.extend_uuid4(&uuid);
991		let result = serializer.finish();
992		// UUID is 16 bytes plus encoding overhead
993		assert!(result.len() > 16);
994	}
995
996	#[test]
997	fn test_uuid7() {
998		let mut serializer = KeySerializer::new();
999		let uuid = Uuid7::generate();
1000		serializer.extend_uuid7(&uuid);
1001		let result = serializer.finish();
1002		// UUID is 16 bytes plus encoding overhead
1003		assert!(result.len() > 16);
1004	}
1005
1006	#[test]
1007	fn test_blob() {
1008		let mut serializer = KeySerializer::new();
1009		let blob = Blob::from(vec![0x01, 0x02, 0x03]);
1010		serializer.extend_blob(&blob);
1011		let result = serializer.finish();
1012		// Should have data plus terminator
1013		assert!(result.len() > 3);
1014	}
1015
1016	#[test]
1017	fn test_int() {
1018		let mut serializer = KeySerializer::new();
1019		let int = Int(BigInt::from(42));
1020		serializer.extend_int(&int);
1021		let result = serializer.finish();
1022		// Should have sign byte + length + data
1023		assert!(result.len() > 0);
1024	}
1025
1026	#[test]
1027	fn test_uint() {
1028		let mut serializer = KeySerializer::new();
1029		let uint = Uint(BigInt::from(42));
1030		serializer.extend_uint(&uint);
1031		let result = serializer.finish();
1032		// Should have length + data
1033		assert!(result.len() > 0);
1034	}
1035
1036	#[test]
1037	fn test_decimal() {
1038		let mut serializer = KeySerializer::new();
1039		let decimal = Decimal::from_str("3.14").unwrap();
1040		serializer.extend_decimal(&decimal);
1041		let result = serializer.finish();
1042		// Should encode as string
1043		assert!(result.len() > 0);
1044	}
1045
1046	#[test]
1047	fn test_extend_value() {
1048		// Test None (Any inner type)
1049		let mut serializer = KeySerializer::new();
1050		serializer.extend_value(&Value::none());
1051		let result = serializer.finish();
1052		assert_eq!(result, vec![0x00, 0x00]); // marker + Any inner type marker
1053
1054		// Test None with typed inner
1055		let mut serializer = KeySerializer::new();
1056		serializer.extend_value(&Value::none_of(Type::Int4));
1057		let result = serializer.finish();
1058		assert_eq!(result, vec![0x00, 0x06]); // marker + Int4 inner type marker
1059
1060		// Test boolean
1061		let mut serializer = KeySerializer::new();
1062		serializer.extend_value(&Value::Boolean(true));
1063		let result = serializer.finish();
1064		assert_eq!(result[0], 0x01); // Boolean marker
1065		assert_eq!(result.len(), 2); // marker + encoded bool
1066
1067		// Test integer
1068		let mut serializer = KeySerializer::new();
1069		serializer.extend_value(&Value::Int4(42));
1070		let result = serializer.finish();
1071		assert_eq!(result[0], 0x06); // Int4 marker
1072		assert_eq!(result.len(), 5); // marker + 4 bytes
1073
1074		// Test string
1075		let mut serializer = KeySerializer::new();
1076		serializer.extend_value(&Value::Utf8("test".to_string()));
1077		let result = serializer.finish();
1078		assert_eq!(result[0], 0x09); // Utf8 marker
1079		assert!(result.ends_with(&[0xff, 0xff]));
1080	}
1081
1082	#[test]
1083	fn test_roundtrip_none() {
1084		let value = Value::none();
1085		let mut ser = KeySerializer::new();
1086		ser.extend_value(&value);
1087		let bytes = ser.finish();
1088		let mut de = KeyDeserializer::from_bytes(&bytes);
1089		assert_eq!(de.read_value().unwrap(), value);
1090		assert!(de.is_empty());
1091	}
1092
1093	#[test]
1094	fn test_roundtrip_none_typed() {
1095		let value = Value::none_of(Type::Int4);
1096		let mut ser = KeySerializer::new();
1097		ser.extend_value(&value);
1098		let bytes = ser.finish();
1099		let mut de = KeyDeserializer::from_bytes(&bytes);
1100		assert_eq!(de.read_value().unwrap(), value);
1101		assert!(de.is_empty());
1102	}
1103
1104	#[test]
1105	fn test_roundtrip_boolean_true() {
1106		let value = Value::Boolean(true);
1107		let mut ser = KeySerializer::new();
1108		ser.extend_value(&value);
1109		let bytes = ser.finish();
1110		let mut de = KeyDeserializer::from_bytes(&bytes);
1111		assert_eq!(de.read_value().unwrap(), value);
1112		assert!(de.is_empty());
1113	}
1114
1115	#[test]
1116	fn test_roundtrip_boolean_false() {
1117		let value = Value::Boolean(false);
1118		let mut ser = KeySerializer::new();
1119		ser.extend_value(&value);
1120		let bytes = ser.finish();
1121		let mut de = KeyDeserializer::from_bytes(&bytes);
1122		assert_eq!(de.read_value().unwrap(), value);
1123		assert!(de.is_empty());
1124	}
1125
1126	#[test]
1127	fn test_roundtrip_float4() {
1128		let value = Value::Float4(OrderedF32::try_from(3.14f32).unwrap());
1129		let mut ser = KeySerializer::new();
1130		ser.extend_value(&value);
1131		let bytes = ser.finish();
1132		let mut de = KeyDeserializer::from_bytes(&bytes);
1133		assert_eq!(de.read_value().unwrap(), value);
1134		assert!(de.is_empty());
1135	}
1136
1137	#[test]
1138	fn test_roundtrip_float8() {
1139		let value = Value::Float8(OrderedF64::try_from(3.14).unwrap());
1140		let mut ser = KeySerializer::new();
1141		ser.extend_value(&value);
1142		let bytes = ser.finish();
1143		let mut de = KeyDeserializer::from_bytes(&bytes);
1144		assert_eq!(de.read_value().unwrap(), value);
1145		assert!(de.is_empty());
1146	}
1147
1148	#[test]
1149	fn test_roundtrip_int1() {
1150		let value = Value::Int1(-42);
1151		let mut ser = KeySerializer::new();
1152		ser.extend_value(&value);
1153		let bytes = ser.finish();
1154		let mut de = KeyDeserializer::from_bytes(&bytes);
1155		assert_eq!(de.read_value().unwrap(), value);
1156		assert!(de.is_empty());
1157	}
1158
1159	#[test]
1160	fn test_roundtrip_int2() {
1161		let value = Value::Int2(-1000);
1162		let mut ser = KeySerializer::new();
1163		ser.extend_value(&value);
1164		let bytes = ser.finish();
1165		let mut de = KeyDeserializer::from_bytes(&bytes);
1166		assert_eq!(de.read_value().unwrap(), value);
1167		assert!(de.is_empty());
1168	}
1169
1170	#[test]
1171	fn test_roundtrip_int4() {
1172		let value = Value::Int4(42);
1173		let mut ser = KeySerializer::new();
1174		ser.extend_value(&value);
1175		let bytes = ser.finish();
1176		let mut de = KeyDeserializer::from_bytes(&bytes);
1177		assert_eq!(de.read_value().unwrap(), value);
1178		assert!(de.is_empty());
1179	}
1180
1181	#[test]
1182	fn test_roundtrip_int8() {
1183		let value = Value::Int8(-1_000_000);
1184		let mut ser = KeySerializer::new();
1185		ser.extend_value(&value);
1186		let bytes = ser.finish();
1187		let mut de = KeyDeserializer::from_bytes(&bytes);
1188		assert_eq!(de.read_value().unwrap(), value);
1189		assert!(de.is_empty());
1190	}
1191
1192	#[test]
1193	fn test_roundtrip_int16() {
1194		let value = Value::Int16(123_456_789);
1195		let mut ser = KeySerializer::new();
1196		ser.extend_value(&value);
1197		let bytes = ser.finish();
1198		let mut de = KeyDeserializer::from_bytes(&bytes);
1199		assert_eq!(de.read_value().unwrap(), value);
1200		assert!(de.is_empty());
1201	}
1202
1203	#[test]
1204	fn test_roundtrip_utf8() {
1205		let value = Value::Utf8("hello world".to_string());
1206		let mut ser = KeySerializer::new();
1207		ser.extend_value(&value);
1208		let bytes = ser.finish();
1209		let mut de = KeyDeserializer::from_bytes(&bytes);
1210		assert_eq!(de.read_value().unwrap(), value);
1211		assert!(de.is_empty());
1212	}
1213
1214	#[test]
1215	fn test_roundtrip_uint1() {
1216		let value = Value::Uint1(255);
1217		let mut ser = KeySerializer::new();
1218		ser.extend_value(&value);
1219		let bytes = ser.finish();
1220		let mut de = KeyDeserializer::from_bytes(&bytes);
1221		assert_eq!(de.read_value().unwrap(), value);
1222		assert!(de.is_empty());
1223	}
1224
1225	#[test]
1226	fn test_roundtrip_uint2() {
1227		let value = Value::Uint2(65535);
1228		let mut ser = KeySerializer::new();
1229		ser.extend_value(&value);
1230		let bytes = ser.finish();
1231		let mut de = KeyDeserializer::from_bytes(&bytes);
1232		assert_eq!(de.read_value().unwrap(), value);
1233		assert!(de.is_empty());
1234	}
1235
1236	#[test]
1237	fn test_roundtrip_uint4() {
1238		let value = Value::Uint4(100_000);
1239		let mut ser = KeySerializer::new();
1240		ser.extend_value(&value);
1241		let bytes = ser.finish();
1242		let mut de = KeyDeserializer::from_bytes(&bytes);
1243		assert_eq!(de.read_value().unwrap(), value);
1244		assert!(de.is_empty());
1245	}
1246
1247	#[test]
1248	fn test_roundtrip_uint8() {
1249		let value = Value::Uint8(999);
1250		let mut ser = KeySerializer::new();
1251		ser.extend_value(&value);
1252		let bytes = ser.finish();
1253		let mut de = KeyDeserializer::from_bytes(&bytes);
1254		assert_eq!(de.read_value().unwrap(), value);
1255		assert!(de.is_empty());
1256	}
1257
1258	#[test]
1259	fn test_roundtrip_uint16() {
1260		let value = Value::Uint16(u128::MAX);
1261		let mut ser = KeySerializer::new();
1262		ser.extend_value(&value);
1263		let bytes = ser.finish();
1264		let mut de = KeyDeserializer::from_bytes(&bytes);
1265		assert_eq!(de.read_value().unwrap(), value);
1266		assert!(de.is_empty());
1267	}
1268
1269	#[test]
1270	fn test_roundtrip_date() {
1271		let value = Value::Date(Date::from_ymd(2024, 6, 15).unwrap());
1272		let mut ser = KeySerializer::new();
1273		ser.extend_value(&value);
1274		let bytes = ser.finish();
1275		let mut de = KeyDeserializer::from_bytes(&bytes);
1276		assert_eq!(de.read_value().unwrap(), value);
1277		assert!(de.is_empty());
1278	}
1279
1280	#[test]
1281	fn test_roundtrip_datetime() {
1282		let value = Value::DateTime(DateTime::from_ymd_hms(2024, 6, 15, 12, 30, 45).unwrap());
1283		let mut ser = KeySerializer::new();
1284		ser.extend_value(&value);
1285		let bytes = ser.finish();
1286		let mut de = KeyDeserializer::from_bytes(&bytes);
1287		assert_eq!(de.read_value().unwrap(), value);
1288		assert!(de.is_empty());
1289	}
1290
1291	#[test]
1292	fn test_roundtrip_time() {
1293		let value = Value::Time(Time::from_hms(12, 30, 45).unwrap());
1294		let mut ser = KeySerializer::new();
1295		ser.extend_value(&value);
1296		let bytes = ser.finish();
1297		let mut de = KeyDeserializer::from_bytes(&bytes);
1298		assert_eq!(de.read_value().unwrap(), value);
1299		assert!(de.is_empty());
1300	}
1301
1302	#[test]
1303	fn test_roundtrip_duration() {
1304		let value = Value::Duration(Duration::from_nanoseconds(1_000_000).unwrap());
1305		let mut ser = KeySerializer::new();
1306		ser.extend_value(&value);
1307		let bytes = ser.finish();
1308		let mut de = KeyDeserializer::from_bytes(&bytes);
1309		assert_eq!(de.read_value().unwrap(), value);
1310		assert!(de.is_empty());
1311	}
1312
1313	#[test]
1314	fn test_roundtrip_identity_id() {
1315		let value = Value::IdentityId(IdentityId::generate());
1316		let mut ser = KeySerializer::new();
1317		ser.extend_value(&value);
1318		let bytes = ser.finish();
1319		let mut de = KeyDeserializer::from_bytes(&bytes);
1320		assert_eq!(de.read_value().unwrap(), value);
1321		assert!(de.is_empty());
1322	}
1323
1324	#[test]
1325	fn test_roundtrip_uuid4() {
1326		let value = Value::Uuid4(Uuid4::generate());
1327		let mut ser = KeySerializer::new();
1328		ser.extend_value(&value);
1329		let bytes = ser.finish();
1330		let mut de = KeyDeserializer::from_bytes(&bytes);
1331		assert_eq!(de.read_value().unwrap(), value);
1332		assert!(de.is_empty());
1333	}
1334
1335	#[test]
1336	fn test_roundtrip_uuid7() {
1337		let value = Value::Uuid7(Uuid7::generate());
1338		let mut ser = KeySerializer::new();
1339		ser.extend_value(&value);
1340		let bytes = ser.finish();
1341		let mut de = KeyDeserializer::from_bytes(&bytes);
1342		assert_eq!(de.read_value().unwrap(), value);
1343		assert!(de.is_empty());
1344	}
1345
1346	#[test]
1347	fn test_roundtrip_blob() {
1348		let value = Value::Blob(Blob::from(vec![0x01, 0x02, 0x03]));
1349		let mut ser = KeySerializer::new();
1350		ser.extend_value(&value);
1351		let bytes = ser.finish();
1352		let mut de = KeyDeserializer::from_bytes(&bytes);
1353		assert_eq!(de.read_value().unwrap(), value);
1354		assert!(de.is_empty());
1355	}
1356
1357	#[test]
1358	fn test_roundtrip_int() {
1359		let value = Value::Int(Int(BigInt::from(-42)));
1360		let mut ser = KeySerializer::new();
1361		ser.extend_value(&value);
1362		let bytes = ser.finish();
1363		let mut de = KeyDeserializer::from_bytes(&bytes);
1364		assert_eq!(de.read_value().unwrap(), value);
1365		assert!(de.is_empty());
1366	}
1367
1368	#[test]
1369	fn test_roundtrip_uint() {
1370		let value = Value::Uint(Uint(BigInt::from(42)));
1371		let mut ser = KeySerializer::new();
1372		ser.extend_value(&value);
1373		let bytes = ser.finish();
1374		let mut de = KeyDeserializer::from_bytes(&bytes);
1375		assert_eq!(de.read_value().unwrap(), value);
1376		assert!(de.is_empty());
1377	}
1378
1379	#[test]
1380	fn test_roundtrip_decimal() {
1381		let value = Value::Decimal(Decimal::from_str("3.14").unwrap());
1382		let mut ser = KeySerializer::new();
1383		ser.extend_value(&value);
1384		let bytes = ser.finish();
1385		let mut de = KeyDeserializer::from_bytes(&bytes);
1386		assert_eq!(de.read_value().unwrap(), value);
1387		assert!(de.is_empty());
1388	}
1389
1390	#[test]
1391	fn test_roundtrip_dictionary_id_u1() {
1392		let value = Value::DictionaryId(DictionaryEntryId::U1(42));
1393		let mut ser = KeySerializer::new();
1394		ser.extend_value(&value);
1395		let bytes = ser.finish();
1396		let mut de = KeyDeserializer::from_bytes(&bytes);
1397		assert_eq!(de.read_value().unwrap(), value);
1398		assert!(de.is_empty());
1399	}
1400
1401	#[test]
1402	fn test_roundtrip_dictionary_id_u2() {
1403		let value = Value::DictionaryId(DictionaryEntryId::U2(1000));
1404		let mut ser = KeySerializer::new();
1405		ser.extend_value(&value);
1406		let bytes = ser.finish();
1407		let mut de = KeyDeserializer::from_bytes(&bytes);
1408		assert_eq!(de.read_value().unwrap(), value);
1409		assert!(de.is_empty());
1410	}
1411
1412	#[test]
1413	fn test_roundtrip_dictionary_id_u4() {
1414		let value = Value::DictionaryId(DictionaryEntryId::U4(100_000));
1415		let mut ser = KeySerializer::new();
1416		ser.extend_value(&value);
1417		let bytes = ser.finish();
1418		let mut de = KeyDeserializer::from_bytes(&bytes);
1419		assert_eq!(de.read_value().unwrap(), value);
1420		assert!(de.is_empty());
1421	}
1422
1423	#[test]
1424	fn test_roundtrip_dictionary_id_u8() {
1425		let value = Value::DictionaryId(DictionaryEntryId::U8(10_000_000_000));
1426		let mut ser = KeySerializer::new();
1427		ser.extend_value(&value);
1428		let bytes = ser.finish();
1429		let mut de = KeyDeserializer::from_bytes(&bytes);
1430		assert_eq!(de.read_value().unwrap(), value);
1431		assert!(de.is_empty());
1432	}
1433
1434	#[test]
1435	fn test_roundtrip_dictionary_id_u16() {
1436		let value = Value::DictionaryId(DictionaryEntryId::U16(u128::MAX));
1437		let mut ser = KeySerializer::new();
1438		ser.extend_value(&value);
1439		let bytes = ser.finish();
1440		let mut de = KeyDeserializer::from_bytes(&bytes);
1441		assert_eq!(de.read_value().unwrap(), value);
1442		assert!(de.is_empty());
1443	}
1444
1445	#[test]
1446	fn test_roundtrip_all() {
1447		let values = vec![
1448			Value::none(),
1449			Value::none_of(Type::Int4),
1450			Value::Boolean(true),
1451			Value::Boolean(false),
1452			Value::Float4(OrderedF32::try_from(3.14f32).unwrap()),
1453			Value::Float8(OrderedF64::try_from(3.14).unwrap()),
1454			Value::Int1(-42),
1455			Value::Int2(-1000),
1456			Value::Int4(42),
1457			Value::Int8(-1_000_000),
1458			Value::Int16(123_456_789),
1459			Value::Utf8("hello world".to_string()),
1460			Value::Uint1(255),
1461			Value::Uint2(65535),
1462			Value::Uint4(100_000),
1463			Value::Uint8(999),
1464			Value::Uint16(u128::MAX),
1465			Value::Date(Date::from_ymd(2024, 6, 15).unwrap()),
1466			Value::DateTime(DateTime::from_ymd_hms(2024, 6, 15, 12, 30, 45).unwrap()),
1467			Value::Time(Time::from_hms(12, 30, 45).unwrap()),
1468			Value::Duration(Duration::from_nanoseconds(1_000_000).unwrap()),
1469			Value::IdentityId(IdentityId::generate()),
1470			Value::Uuid4(Uuid4::generate()),
1471			Value::Uuid7(Uuid7::generate()),
1472			Value::Blob(Blob::from(vec![0x01, 0x02, 0x03])),
1473			Value::Int(Int(BigInt::from(-42))),
1474			Value::Uint(Uint(BigInt::from(42))),
1475			Value::Decimal(Decimal::from_str("3.14").unwrap()),
1476			Value::DictionaryId(DictionaryEntryId::U8(42)),
1477		];
1478
1479		let mut ser = KeySerializer::new();
1480		for v in &values {
1481			ser.extend_value(v);
1482		}
1483		let bytes = ser.finish();
1484
1485		let mut de = KeyDeserializer::from_bytes(&bytes);
1486		for expected in &values {
1487			let actual = de.read_value().unwrap();
1488			assert_eq!(&actual, expected);
1489		}
1490		assert!(de.is_empty());
1491	}
1492
1493	/// Compile-time exhaustiveness guard: if a new Value variant is added,
1494	/// this test will fail to compile. Add a corresponding `test_roundtrip_<variant>`
1495	/// test above, then add the new variant arm here.
1496	#[test]
1497	fn test_roundtrip_exhaustiveness_guard() {
1498		let value = Value::none();
1499		match value {
1500			Value::None {
1501				..
1502			} => {}
1503			Value::Boolean(_) => {}
1504			Value::Float4(_) => {}
1505			Value::Float8(_) => {}
1506			Value::Int1(_) => {}
1507			Value::Int2(_) => {}
1508			Value::Int4(_) => {}
1509			Value::Int8(_) => {}
1510			Value::Int16(_) => {}
1511			Value::Utf8(_) => {}
1512			Value::Uint1(_) => {}
1513			Value::Uint2(_) => {}
1514			Value::Uint4(_) => {}
1515			Value::Uint8(_) => {}
1516			Value::Uint16(_) => {}
1517			Value::Date(_) => {}
1518			Value::DateTime(_) => {}
1519			Value::Time(_) => {}
1520			Value::Duration(_) => {}
1521			Value::IdentityId(_) => {}
1522			Value::Uuid4(_) => {}
1523			Value::Uuid7(_) => {}
1524			Value::Blob(_) => {}
1525			Value::Int(_) => {}
1526			Value::Uint(_) => {}
1527			Value::Decimal(_) => {}
1528			Value::DictionaryId(_) => {}
1529			// Not serializable in keys:
1530			Value::Any(_) => {}
1531			Value::Type(_) => {}
1532			Value::List(_) => {}
1533			Value::Record(_) => {}
1534			Value::Tuple(_) => {}
1535		}
1536	}
1537
1538	#[test]
1539	fn test_to_encoded_key() {
1540		let mut serializer = KeySerializer::new();
1541		serializer.extend_i32(42);
1542		let key = serializer.to_encoded_key();
1543		assert_eq!(key.len(), 4);
1544	}
1545
1546	#[test]
1547	fn test_index_id() {
1548		let mut serializer = KeySerializer::new();
1549		serializer.extend_index_id(IndexId::Primary(PrimaryKeyId(123456789)));
1550		let result = serializer.finish();
1551
1552		// IndexId Primary uses 1 byte prefix + 8 bytes u64 with bitwise NOT
1553		assert_eq!(result.len(), 9);
1554		assert_eq!(result[0], 0x01); // Primary variant prefix
1555
1556		// Verify it's using bitwise NOT (smaller values produce larger encoded values)
1557		let mut serializer2 = KeySerializer::new();
1558		serializer2.extend_index_id(IndexId::Primary(PrimaryKeyId(1)));
1559		let result2 = serializer2.finish();
1560
1561		// result2 (for IndexId(1)) should be > result (for IndexId(123456789))
1562		// Compare from byte 1 onwards (after the variant prefix)
1563		assert!(result2[1..] > result[1..]);
1564	}
1565
1566	#[test]
1567	fn test_object_id() {
1568		let mut serializer = KeySerializer::new();
1569		serializer.extend_schema_id(SchemaId::Table(TableId(987654321)));
1570		let result = serializer.finish();
1571
1572		// SchemaId Table uses 1 byte prefix + 8 bytes u64 with bitwise NOT
1573		assert_eq!(result.len(), 9);
1574		assert_eq!(result[0], 0x01); // Table variant prefix
1575
1576		// Verify ordering
1577		let mut serializer2 = KeySerializer::new();
1578		serializer2.extend_schema_id(SchemaId::Table(TableId(987654322)));
1579		let result2 = serializer2.finish();
1580
1581		// result2 (for larger SchemaId) should be < result (inverted ordering)
1582		// Compare from byte 1 onwards (after the variant prefix)
1583		assert!(result2[1..] < result[1..]);
1584	}
1585}