use super::*;
#[test]
fn test_parse_decimal_number() {
assert_eq!(parse_decimal_number("123"), Ok(("", 123)));
assert_eq!(parse_decimal_number("0"), Ok(("", 0)));
assert_eq!(parse_decimal_number("999"), Ok(("", 999)));
assert!(parse_decimal_number("abc").is_err());
assert!(parse_decimal_number("").is_err());
}
#[test]
fn test_parse_hex_number() {
assert_eq!(parse_hex_number("0x0"), Ok(("", 0)));
assert_eq!(parse_hex_number("0x10"), Ok(("", 16)));
assert_eq!(parse_hex_number("0xFF"), Ok(("", 255)));
assert_eq!(parse_hex_number("0xabc"), Ok(("", 2748)));
assert_eq!(parse_hex_number("0xABC"), Ok(("", 2748)));
assert!(parse_hex_number("FF").is_err());
assert!(parse_hex_number("10").is_err());
assert!(parse_hex_number("0xGG").is_err());
}
#[test]
fn test_parse_number_positive() {
assert_eq!(parse_number("0"), Ok(("", 0)));
assert_eq!(parse_number("123"), Ok(("", 123)));
assert_eq!(parse_number("999"), Ok(("", 999)));
assert_eq!(parse_number("0x0"), Ok(("", 0)));
assert_eq!(parse_number("0x10"), Ok(("", 16)));
assert_eq!(parse_number("0xFF"), Ok(("", 255)));
assert_eq!(parse_number("0xabc"), Ok(("", 2748)));
}
#[test]
fn test_parse_number_negative() {
assert_eq!(parse_number("-1"), Ok(("", -1)));
assert_eq!(parse_number("-123"), Ok(("", -123)));
assert_eq!(parse_number("-999"), Ok(("", -999)));
assert_eq!(parse_number("-0x1"), Ok(("", -1)));
assert_eq!(parse_number("-0x10"), Ok(("", -16)));
assert_eq!(parse_number("-0xFF"), Ok(("", -255)));
assert_eq!(parse_number("-0xabc"), Ok(("", -2748)));
}
#[test]
fn test_parse_number_edge_cases() {
assert_eq!(parse_number("0"), Ok(("", 0)));
assert_eq!(parse_number("-0"), Ok(("", 0)));
assert_eq!(parse_number("0x0"), Ok(("", 0)));
assert_eq!(parse_number("-0x0"), Ok(("", 0)));
assert_eq!(parse_number("2147483647"), Ok(("", 2_147_483_647))); assert_eq!(parse_number("-2147483648"), Ok(("", -2_147_483_648))); assert_eq!(parse_number("0x7FFFFFFF"), Ok(("", 2_147_483_647)));
assert!(parse_number("").is_err());
assert!(parse_number("abc").is_err());
assert!(parse_number("0xGG").is_err());
assert!(parse_number("--123").is_err());
}
#[test]
fn test_parse_number_with_remaining_input() {
test_number_with_remaining_input();
}
#[test]
fn test_parse_offset_absolute_positive() {
assert_eq!(parse_offset("0"), Ok(("", OffsetSpec::Absolute(0))));
assert_eq!(parse_offset("123"), Ok(("", OffsetSpec::Absolute(123))));
assert_eq!(parse_offset("999"), Ok(("", OffsetSpec::Absolute(999))));
assert_eq!(parse_offset("0x0"), Ok(("", OffsetSpec::Absolute(0))));
assert_eq!(parse_offset("0x10"), Ok(("", OffsetSpec::Absolute(16))));
assert_eq!(parse_offset("0xFF"), Ok(("", OffsetSpec::Absolute(255))));
assert_eq!(parse_offset("0xabc"), Ok(("", OffsetSpec::Absolute(2748))));
}
#[test]
fn test_parse_offset_absolute_negative() {
assert_eq!(parse_offset("-1"), Ok(("", OffsetSpec::Absolute(-1))));
assert_eq!(parse_offset("-123"), Ok(("", OffsetSpec::Absolute(-123))));
assert_eq!(parse_offset("-999"), Ok(("", OffsetSpec::Absolute(-999))));
assert_eq!(parse_offset("-0x1"), Ok(("", OffsetSpec::Absolute(-1))));
assert_eq!(parse_offset("-0x10"), Ok(("", OffsetSpec::Absolute(-16))));
assert_eq!(parse_offset("-0xFF"), Ok(("", OffsetSpec::Absolute(-255))));
assert_eq!(
parse_offset("-0xabc"),
Ok(("", OffsetSpec::Absolute(-2748)))
);
}
#[test]
fn test_parse_offset_with_whitespace() {
assert_eq!(parse_offset(" 123"), Ok(("", OffsetSpec::Absolute(123))));
assert_eq!(parse_offset(" 0x10"), Ok(("", OffsetSpec::Absolute(16))));
assert_eq!(parse_offset("\t-42"), Ok(("", OffsetSpec::Absolute(-42))));
assert_eq!(parse_offset("123 "), Ok(("", OffsetSpec::Absolute(123))));
assert_eq!(parse_offset("0x10 "), Ok(("", OffsetSpec::Absolute(16))));
assert_eq!(parse_offset("-42\t"), Ok(("", OffsetSpec::Absolute(-42))));
assert_eq!(parse_offset(" 123 "), Ok(("", OffsetSpec::Absolute(123))));
assert_eq!(parse_offset(" 0x10 "), Ok(("", OffsetSpec::Absolute(16))));
assert_eq!(parse_offset("\t-42\t"), Ok(("", OffsetSpec::Absolute(-42))));
}
#[test]
fn test_parse_offset_with_remaining_input() {
assert_eq!(
parse_offset("123 byte"),
Ok(("byte", OffsetSpec::Absolute(123)))
);
assert_eq!(parse_offset("0xFF ="), Ok(("=", OffsetSpec::Absolute(255))));
assert_eq!(
parse_offset("-42,next"),
Ok((",next", OffsetSpec::Absolute(-42)))
);
assert_eq!(
parse_offset("0x10\tlong"),
Ok(("long", OffsetSpec::Absolute(16)))
);
}
#[test]
fn test_parse_offset_edge_cases() {
assert_eq!(parse_offset("0"), Ok(("", OffsetSpec::Absolute(0))));
assert_eq!(parse_offset("-0"), Ok(("", OffsetSpec::FromEnd(0))));
assert_eq!(parse_offset("0x0"), Ok(("", OffsetSpec::Absolute(0))));
assert_eq!(parse_offset("-0x0"), Ok(("", OffsetSpec::FromEnd(0))));
assert_eq!(
parse_offset("2147483647"),
Ok(("", OffsetSpec::Absolute(2_147_483_647)))
);
assert_eq!(
parse_offset("-2147483648"),
Ok(("", OffsetSpec::Absolute(-2_147_483_648)))
);
assert_eq!(
parse_offset("0x7FFFFFFF"),
Ok(("", OffsetSpec::Absolute(2_147_483_647)))
);
assert!(parse_offset("").is_err());
assert!(parse_offset("abc").is_err());
assert!(parse_offset("0xGG").is_err());
assert!(parse_offset("--123").is_err());
}
#[test]
fn test_parse_offset_common_magic_file_values() {
assert_eq!(parse_offset("0"), Ok(("", OffsetSpec::Absolute(0)))); assert_eq!(parse_offset("4"), Ok(("", OffsetSpec::Absolute(4)))); assert_eq!(parse_offset("16"), Ok(("", OffsetSpec::Absolute(16)))); assert_eq!(parse_offset("0x10"), Ok(("", OffsetSpec::Absolute(16)))); assert_eq!(parse_offset("512"), Ok(("", OffsetSpec::Absolute(512)))); assert_eq!(parse_offset("0x200"), Ok(("", OffsetSpec::Absolute(512))));
assert_eq!(parse_offset("-4"), Ok(("", OffsetSpec::Absolute(-4)))); assert_eq!(parse_offset("-16"), Ok(("", OffsetSpec::Absolute(-16)))); assert_eq!(parse_offset("-0x10"), Ok(("", OffsetSpec::Absolute(-16)))); }
#[test]
fn test_parse_offset_boundary_values() {
assert_eq!(parse_offset("1"), Ok(("", OffsetSpec::Absolute(1))));
assert_eq!(parse_offset("-1"), Ok(("", OffsetSpec::Absolute(-1))));
assert_eq!(parse_offset("256"), Ok(("", OffsetSpec::Absolute(256))));
assert_eq!(parse_offset("0x100"), Ok(("", OffsetSpec::Absolute(256))));
assert_eq!(parse_offset("1024"), Ok(("", OffsetSpec::Absolute(1024))));
assert_eq!(parse_offset("0x400"), Ok(("", OffsetSpec::Absolute(1024))));
assert_eq!(
parse_offset("1048576"),
Ok(("", OffsetSpec::Absolute(1_048_576)))
); assert_eq!(
parse_offset("0x100000"),
Ok(("", OffsetSpec::Absolute(1_048_576)))
);
}
#[test]
fn test_parse_offset_relative() {
assert_eq!(parse_offset("&0"), Ok(("", OffsetSpec::Relative(0))));
assert_eq!(parse_offset("&4"), Ok(("", OffsetSpec::Relative(4))));
assert_eq!(parse_offset("&+4"), Ok(("", OffsetSpec::Relative(4))));
assert_eq!(parse_offset("&-4"), Ok(("", OffsetSpec::Relative(-4))));
assert_eq!(parse_offset("&0x10"), Ok(("", OffsetSpec::Relative(16))));
assert_eq!(parse_offset("&-0x10"), Ok(("", OffsetSpec::Relative(-16))));
assert_eq!(parse_offset(" &0 "), Ok(("", OffsetSpec::Relative(0))));
assert_eq!(
parse_offset("&0 ubyte"),
Ok(("ubyte", OffsetSpec::Relative(0)))
);
assert!(parse_offset("&").is_err(), "bare `&` must fail");
assert!(parse_offset("& ").is_err(), "`&` with only space must fail");
}
#[test]
fn test_parse_rule_offset_indirect_child() {
assert_eq!(
parse_rule_offset(">(0x3c.l)"),
Ok((
"",
(
1,
OffsetSpec::Indirect {
base_offset: 0x3c,
base_relative: false,
pointer_type: TypeKind::Long {
endian: Endianness::Little,
signed: true
},
adjustment: 0,
adjustment_op: IndirectAdjustmentOp::Add,
result_relative: false,
endian: Endianness::Little,
}
)
))
);
assert_eq!(
parse_rule_offset(">>(0x3c.l)+4"),
Ok((
"",
(
2,
OffsetSpec::Indirect {
base_offset: 0x3c,
base_relative: false,
pointer_type: TypeKind::Long {
endian: Endianness::Little,
signed: true
},
adjustment: 4,
adjustment_op: IndirectAdjustmentOp::Add,
result_relative: false,
endian: Endianness::Little,
}
)
))
);
}
#[test]
fn test_parse_rule_offset_indirect_with_remaining() {
assert_eq!(
parse_rule_offset(">(0x3c.l) string"),
Ok((
"string",
(
1,
OffsetSpec::Indirect {
base_offset: 0x3c,
base_relative: false,
pointer_type: TypeKind::Long {
endian: Endianness::Little,
signed: true
},
adjustment: 0,
adjustment_op: IndirectAdjustmentOp::Add,
result_relative: false,
endian: Endianness::Little,
}
)
))
);
assert_eq!(
parse_rule_offset(">(0x3c.l)+4 string"),
Ok((
"string",
(
1,
OffsetSpec::Indirect {
base_offset: 0x3c,
base_relative: false,
pointer_type: TypeKind::Long {
endian: Endianness::Little,
signed: true
},
adjustment: 4,
adjustment_op: IndirectAdjustmentOp::Add,
result_relative: false,
endian: Endianness::Little,
}
)
))
);
}
#[test]
fn test_parse_rule_offset_absolute() {
assert_eq!(
parse_rule_offset("0"),
Ok(("", (0, OffsetSpec::Absolute(0))))
);
assert_eq!(
parse_rule_offset("16"),
Ok(("", (0, OffsetSpec::Absolute(16))))
);
assert_eq!(
parse_rule_offset("0x10"),
Ok(("", (0, OffsetSpec::Absolute(16))))
);
assert_eq!(
parse_rule_offset("-4"),
Ok(("", (0, OffsetSpec::Absolute(-4))))
);
}
#[test]
fn test_parse_rule_offset_child_rules() {
assert_eq!(
parse_rule_offset(">4"),
Ok(("", (1, OffsetSpec::Absolute(4))))
);
assert_eq!(
parse_rule_offset(">>8"),
Ok(("", (2, OffsetSpec::Absolute(8))))
);
assert_eq!(
parse_rule_offset(">>>12"),
Ok(("", (3, OffsetSpec::Absolute(12))))
);
}
#[test]
fn test_parse_rule_offset_with_whitespace() {
assert_eq!(
parse_rule_offset(" 0 "),
Ok(("", (0, OffsetSpec::Absolute(0))))
);
assert_eq!(
parse_rule_offset(" >4 "),
Ok(("", (1, OffsetSpec::Absolute(4))))
);
assert_eq!(
parse_rule_offset("\t>>0x10\t"),
Ok(("", (2, OffsetSpec::Absolute(16))))
);
}
#[test]
fn test_parse_rule_offset_with_remaining_input() {
assert_eq!(
parse_rule_offset("0 byte"),
Ok(("byte", (0, OffsetSpec::Absolute(0))))
);
assert_eq!(
parse_rule_offset(">4 string"),
Ok(("string", (1, OffsetSpec::Absolute(4))))
);
}