use std::str::FromStr;
use synta::{Decoder, Encoder, Encoding, ObjectIdentifier};
#[test]
fn test_oid_creation() {
let oid = ObjectIdentifier::new(&[1, 2, 840, 113549]).unwrap();
assert_eq!(oid.components(), &[1, 2, 840, 113549]);
}
#[test]
fn test_oid_validation() {
assert!(ObjectIdentifier::new(&[1]).is_err());
assert!(ObjectIdentifier::new(&[3, 0]).is_err());
assert!(ObjectIdentifier::new(&[1, 40]).is_err());
assert!(ObjectIdentifier::new(&[0, 50]).is_err());
assert!(ObjectIdentifier::new(&[2, 100]).is_ok());
}
#[test]
#[cfg(feature = "std")]
fn test_oid_string_conversion() {
let oid = ObjectIdentifier::new(&[1, 2, 840, 113549]).unwrap();
assert_eq!(oid.to_string(), "1.2.840.113549");
let parsed = ObjectIdentifier::from_str("1.2.840.113549").unwrap();
assert_eq!(parsed, oid);
}
#[test]
fn test_oid_roundtrip() {
let test_oids = vec![
vec![0, 0],
vec![0, 39],
vec![1, 0],
vec![1, 39],
vec![2, 0],
vec![2, 100],
vec![2, 999],
vec![1, 2, 840, 113549], vec![2, 5, 4, 3], vec![1, 2, 840, 10045, 3, 1, 7], ];
for components in test_oids {
let oid = ObjectIdentifier::new(&components).unwrap();
let mut encoder = Encoder::new(Encoding::Der);
encoder.encode(&oid).unwrap();
let encoded = encoder.finish().unwrap();
let mut decoder = Decoder::new(&encoded, Encoding::Der);
let decoded: ObjectIdentifier = decoder.decode().unwrap();
assert_eq!(
decoded.components(),
&components[..],
"Roundtrip failed for OID {:?}",
components
);
}
}
#[test]
fn test_oid_known_encodings() {
let oid = ObjectIdentifier::new(&[1, 2, 840, 113549]).unwrap();
let mut encoder = Encoder::new(Encoding::Der);
encoder.encode(&oid).unwrap();
let encoded = encoder.finish().unwrap();
assert_eq!(
encoded,
vec![0x06, 0x06, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D]
);
let mut decoder = Decoder::new(
&[0x06, 0x06, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D],
Encoding::Der,
);
let decoded: ObjectIdentifier = decoder.decode().unwrap();
assert_eq!(decoded.components(), &[1, 2, 840, 113549]);
let oid = ObjectIdentifier::new(&[2, 5, 4, 3]).unwrap();
let mut encoder = Encoder::new(Encoding::Der);
encoder.encode(&oid).unwrap();
let encoded = encoder.finish().unwrap();
assert_eq!(encoded, vec![0x06, 0x03, 0x55, 0x04, 0x03]);
let mut decoder = Decoder::new(&[0x06, 0x03, 0x55, 0x04, 0x03], Encoding::Der);
let decoded: ObjectIdentifier = decoder.decode().unwrap();
assert_eq!(decoded.components(), &[2, 5, 4, 3]);
}
#[test]
fn test_oid_first_component_variations() {
let oid = ObjectIdentifier::new(&[0, 0]).unwrap();
let mut encoder = Encoder::new(Encoding::Der);
encoder.encode(&oid).unwrap();
let encoded = encoder.finish().unwrap();
assert_eq!(&encoded[2..], &[0x00]);
let oid = ObjectIdentifier::new(&[0, 39]).unwrap();
let mut encoder = Encoder::new(Encoding::Der);
encoder.encode(&oid).unwrap();
let encoded = encoder.finish().unwrap();
assert_eq!(&encoded[2..], &[0x27]);
let oid = ObjectIdentifier::new(&[1, 0]).unwrap();
let mut encoder = Encoder::new(Encoding::Der);
encoder.encode(&oid).unwrap();
let encoded = encoder.finish().unwrap();
assert_eq!(&encoded[2..], &[0x28]);
let oid = ObjectIdentifier::new(&[1, 39]).unwrap();
let mut encoder = Encoder::new(Encoding::Der);
encoder.encode(&oid).unwrap();
let encoded = encoder.finish().unwrap();
assert_eq!(&encoded[2..], &[0x4F]);
let oid = ObjectIdentifier::new(&[2, 0]).unwrap();
let mut encoder = Encoder::new(Encoding::Der);
encoder.encode(&oid).unwrap();
let encoded = encoder.finish().unwrap();
assert_eq!(&encoded[2..], &[0x50]);
let oid = ObjectIdentifier::new(&[2, 100]).unwrap();
let mut encoder = Encoder::new(Encoding::Der);
encoder.encode(&oid).unwrap();
let encoded = encoder.finish().unwrap();
assert_eq!(&encoded[2..], &[0x81, 0x34]);
}
#[test]
fn test_oid_large_components() {
let oid = ObjectIdentifier::new(&[1, 2, 16384]).unwrap();
let mut encoder = Encoder::new(Encoding::Der);
encoder.encode(&oid).unwrap();
let encoded = encoder.finish().unwrap();
let mut decoder = Decoder::new(&encoded, Encoding::Der);
let decoded: ObjectIdentifier = decoder.decode().unwrap();
assert_eq!(decoded.components(), &[1, 2, 16384]);
}