use super::*;
use yog_script_analyze::index::access;
fn class_bytes() -> Vec<u8> {
let mut b = MAGIC.to_be_bytes().to_vec();
b.extend([0, 0, 0, 65]);
let utf8 = |s: &str| {
let mut e = vec![1];
e.extend((s.len() as u16).to_be_bytes());
e.extend(s.as_bytes());
e
};
let mut pool: Vec<Vec<u8>> = vec![
utf8("a/B"), vec![7, 0, 1], utf8("java/lang/Object"), vec![7, 0, 3], utf8("a/I"), vec![7, 0, 5], vec![5, 0, 0, 0, 0, 0, 0, 0, 42], utf8("x"), utf8("I"), utf8("f"), utf8("(F)Z"), utf8("Code"), ];
let count: u16 = 14;
b.extend(count.to_be_bytes());
pool.iter_mut().for_each(|e| b.append(e));
b.extend((access::PUBLIC).to_be_bytes());
b.extend([0, 2, 0, 4]);
b.extend([0, 1, 0, 6]);
b.extend([0, 1, 0, 0, 0, 9, 0, 10, 0, 0]);
b.extend([0, 1, 0, 1, 0, 11, 0, 12, 0, 1, 0, 13, 0, 0, 0, 3, 1, 2, 3]);
b.extend([0, 0]);
b
}
#[test]
fn a_class_reads() {
let c = read(&class_bytes()).unwrap();
assert_eq!(c.name, "a/B");
assert_eq!(c.extends.as_deref(), Some("java/lang/Object"));
assert_eq!(c.implements, ["a/I"]);
assert_eq!(c.access, access::PUBLIC);
assert_eq!(
(c.fields[0].name.as_str(), c.fields[0].desc.as_str()),
("x", "I")
);
let f = &c.methods[0];
assert_eq!(
(f.name.as_str(), f.desc.as_str(), f.access),
("f", "(F)Z", access::PUBLIC)
);
}
#[test]
fn what_isnt_a_class_doesnt_read() {
assert_eq!(read(b"not a class"), None);
let mut cut = class_bytes();
cut.truncate(cut.len() - 5);
assert_eq!(read(&cut), None);
}