use super::*;
impl<E: Environment> FromBytes for IdentifierLiteral<E> {
#[inline]
fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
let num_bytes = u8::read_le(&mut reader)? as usize;
if num_bytes == 0 || num_bytes > SIZE_IN_BYTES {
return Err(error("Invalid identifier literal length"));
}
let mut bytes = [0u8; SIZE_IN_BYTES];
reader.read_exact(&mut bytes[..num_bytes])?;
Self::from_bytes_array(bytes).map_err(|e| error(e.to_string()))
}
}
impl<E: Environment> ToBytes for IdentifierLiteral<E> {
#[inline]
fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
let length = self.length();
length.write_le(&mut writer)?;
writer.write_all(&self.bytes[..length as usize])
}
}
#[cfg(test)]
mod tests {
use super::*;
use snarkvm_console_network_environment::Console;
type CurrentEnvironment = Console;
const ITERATIONS: u64 = 1000;
#[test]
fn test_bytes_roundtrip() -> Result<()> {
let mut rng = TestRng::default();
for _ in 0..ITERATIONS {
let expected = IdentifierLiteral::<CurrentEnvironment>::rand(&mut rng);
let expected_bytes = expected.to_bytes_le()?;
let recovered = IdentifierLiteral::read_le(&expected_bytes[..])?;
assert_eq!(expected, recovered);
}
Ok(())
}
#[test]
fn test_bytes_single_char() -> Result<()> {
let expected = IdentifierLiteral::<CurrentEnvironment>::new("a")?;
let expected_bytes = expected.to_bytes_le()?;
let recovered = IdentifierLiteral::read_le(&expected_bytes[..])?;
assert_eq!(expected, recovered);
Ok(())
}
#[test]
fn test_bytes_length_zero() {
let bytes = [0u8];
let result = IdentifierLiteral::<CurrentEnvironment>::read_le(&bytes[..]);
assert!(result.is_err());
}
#[test]
fn test_bytes_length_exceeds_max() {
let length = u8::try_from(SIZE_IN_BYTES).expect("SIZE_IN_BYTES fits in u8") + 1;
let mut bytes = vec![length];
bytes.resize(length as usize + 1, b'a');
let result = IdentifierLiteral::<CurrentEnvironment>::read_le(&bytes[..]);
assert!(result.is_err());
}
}