const MAC_ADDRESS_SIZE: usize = 6;
addr_ty!(
#[doc(alias = "Eui48Addr")]
#[derive(Eq, PartialEq, Ord, PartialOrd, Hash)]
MacAddr[MAC_ADDRESS_SIZE]
);
#[cfg(test)]
mod tests {
use super::*;
use crate::{ParseError, TestCase};
use std::{string::ToString, vec, vec::Vec};
fn test_cases() -> Vec<TestCase<MAC_ADDRESS_SIZE>> {
vec![
TestCase {
input: "00:00:5e:00:53:01",
output: Some(vec![0x00, 0x00, 0x5e, 0x00, 0x53, 0x01]),
err: None,
},
TestCase {
input: "00-00-5e-00-53-01",
output: Some(vec![0x00, 0x00, 0x5e, 0x00, 0x53, 0x01]),
err: None,
},
TestCase {
input: "0000.5e00.5301",
output: Some(vec![0x00, 0x00, 0x5e, 0x00, 0x53, 0x01]),
err: None,
},
TestCase {
input: "ab:cd:ef:AB:CD:EF",
output: Some(vec![0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef]),
err: None,
},
TestCase {
input: "01.02.03.04.05.06",
output: None,
err: Some(ParseError::InvalidSeparator(b'.')),
},
TestCase {
input: "01:02:03:04:05:06:",
output: None,
err: Some(ParseError::InvalidLength(18)),
},
TestCase {
input: "x1:02:03:04:05:06",
output: None,
err: Some(ParseError::InvalidHexDigit([b'x', b'1'])),
},
TestCase {
input: "01-02:03:04:05:06",
output: None,
err: Some(ParseError::UnexpectedSeparator {
expected: b'-',
actual: b':',
}),
},
]
}
#[test]
fn parse() {
let cases = test_cases();
for (i, test) in cases.iter().enumerate() {
let result = MacAddr::try_from(test.input);
match (result, &test.output) {
(Ok(out), Some(expected)) => {
assert_eq!(
out.as_bytes(),
expected.as_slice(),
"Test case {}: MacAddr::parse({}) output mismatch",
i,
test.input
);
if test.err.is_none() {
let formatted = out.to_string();
let round_trip = MacAddr::try_from(formatted.as_str());
assert!(
round_trip.is_ok(),
"Test case {}: Round-trip parse failed for {}",
i,
formatted
);
assert_eq!(
round_trip.unwrap(),
out,
"Test case {}: Round-trip value mismatch",
i
);
}
}
(Err(err), None) => {
assert_eq!(
Some(&err),
test.err.as_ref(),
"Test case {}: Expected error containing '{:?}', got '{:?}'",
i,
test.err,
err
);
}
(Ok(out), None) => {
panic!(
"Test case {}: Expected error '{:?}', got success: {:?}",
i, test.err, out
);
}
(Err(err), Some(expected)) => {
panic!(
"Test case {}: Expected {:?}, got error: {:?}",
i, expected, err
);
}
}
}
}
#[test]
fn formatted() {
let addr = MacAddr::try_from("00:00:5e:00:53:01").unwrap();
assert_eq!(addr.to_string(), "00:00:5e:00:53:01");
let dot = addr.to_dot_seperated_array();
let dot_str = core::str::from_utf8(&dot).unwrap();
assert_eq!(dot_str, "0000.5e00.5301");
let dashed = addr.to_hyphen_seperated_array();
let dashed_str = core::str::from_utf8(&dashed).unwrap();
assert_eq!(dashed_str, "00-00-5e-00-53-01");
}
#[cfg(feature = "serde")]
#[test]
fn serde_human_readable() {
let addr = MacAddr::try_from("00:00:5e:00:53:01").unwrap();
let json = serde_json::to_string(&addr).unwrap();
assert_eq!(json, "\"00:00:5e:00:53:01\"");
let addr2: MacAddr = serde_json::from_str(&json).unwrap();
assert_eq!(addr, addr2);
}
#[cfg(feature = "serde")]
#[test]
fn serde_human_unreadable() {
let addr = MacAddr::try_from("00:00:5e:00:53:01").unwrap();
let json = bincode::serialize(&addr).unwrap();
assert_eq!(json, [0, 0, 94, 0, 83, 1]);
assert_eq!(addr.octets(), [0, 0, 94, 0, 83, 1]);
let addr2: MacAddr = bincode::deserialize(&json).unwrap();
assert_eq!(addr, addr2);
let addr3 = MacAddr::new([0, 0, 94, 0, 83, 1]);
assert_eq!(addr, addr3);
println!("{:?}", addr);
}
}