Skip to content

Commit 56a198c

Browse files
authored
Fix off-by-one bug in serde impl for Symbol types (#91)
1 parent e92b6b6 commit 56a198c

File tree

1 file changed

+72
-1
lines changed

1 file changed

+72
-1
lines changed

src/serde_impl.rs

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ macro_rules! impl_serde_for_symbol {
9393
&self,
9494
serializer: T,
9595
) -> ::core::result::Result<T::Ok, T::Error> {
96-
self.value.serialize(serializer)
96+
self.to_usize().serialize(serializer)
9797
}
9898
}
9999

@@ -119,3 +119,74 @@ macro_rules! impl_serde_for_symbol {
119119
impl_serde_for_symbol!(SymbolU16, u16);
120120
impl_serde_for_symbol!(SymbolU32, u32);
121121
impl_serde_for_symbol!(SymbolUsize, usize);
122+
123+
#[cfg(test)]
124+
mod tests {
125+
use crate::{
126+
symbol::{SymbolU16, SymbolU32, SymbolUsize},
127+
Symbol,
128+
};
129+
use serde_json;
130+
131+
fn symbol_round_trip_serializes<S>(symbol: S) -> bool
132+
where
133+
S: Symbol + std::fmt::Debug + serde::Serialize + serde::de::DeserializeOwned + PartialEq,
134+
{
135+
let serialized = serde_json::to_string(&symbol).expect("serialization should succeed");
136+
let deserialized: S =
137+
serde_json::from_str(&serialized).expect("deserialization should succeed");
138+
symbol == deserialized
139+
}
140+
141+
#[test]
142+
fn symbol_u16_round_trips() {
143+
assert!(symbol_round_trip_serializes(
144+
SymbolU16::try_from_usize(0).unwrap()
145+
));
146+
assert!(symbol_round_trip_serializes(
147+
SymbolU16::try_from_usize(42).unwrap()
148+
));
149+
assert!(symbol_round_trip_serializes(
150+
SymbolU16::try_from_usize(u16::MAX as usize - 1).unwrap()
151+
));
152+
}
153+
154+
#[test]
155+
fn symbol_u32_round_trips() {
156+
assert!(symbol_round_trip_serializes(
157+
SymbolU32::try_from_usize(0).unwrap()
158+
));
159+
assert!(symbol_round_trip_serializes(
160+
SymbolU32::try_from_usize(42).unwrap()
161+
));
162+
assert!(symbol_round_trip_serializes(
163+
SymbolU32::try_from_usize(u32::MAX as usize - 1).unwrap()
164+
));
165+
}
166+
167+
#[test]
168+
fn symbol_usize_round_trips() {
169+
assert!(symbol_round_trip_serializes(
170+
SymbolUsize::try_from_usize(0).unwrap()
171+
));
172+
assert!(symbol_round_trip_serializes(
173+
SymbolUsize::try_from_usize(42).unwrap()
174+
));
175+
assert!(symbol_round_trip_serializes(
176+
SymbolUsize::try_from_usize(usize::MAX as usize - 1).unwrap()
177+
));
178+
}
179+
180+
#[test]
181+
fn raw_usize_round_trips() {
182+
assert!(symbol_round_trip_serializes(
183+
usize::try_from_usize(0).unwrap()
184+
));
185+
assert!(symbol_round_trip_serializes(
186+
usize::try_from_usize(42).unwrap()
187+
));
188+
assert!(symbol_round_trip_serializes(
189+
usize::try_from_usize(usize::MAX).unwrap()
190+
));
191+
}
192+
}

0 commit comments

Comments
 (0)