1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
pub mod bytes_ext;
pub mod descriptor;
pub mod encoding;
// FIXME: get the system lib for this in CI.. somehow
// pub mod unwind;

#[cfg(test)]
mod tests {
    use crate::descriptor::{BaseType, FieldType, MethodType, ObjectType};
    use anyhow::Result;

    #[test]
    fn it_parses_simple_descriptors() -> Result<()> {
        let descriptor = FieldType::parse("Z".to_string())?;
        let descriptor = descriptor.into_base().unwrap();

        assert!(descriptor.is_boolean());

        Ok(())
    }

    #[test]
    fn it_parses_array_descriptors() -> Result<()> {
        let descriptor = FieldType::parse("[D".to_string())?;
        let descriptor = descriptor.into_array().unwrap();

        let field = descriptor.field_type;
        let field = field.into_base().unwrap();

        assert!(field.is_double());

        Ok(())
    }

    #[test]
    fn it_parses_method_descriptors() -> Result<()> {
        let descriptor = MethodType::parse("(IDLjava/lang/Thread;)Ljava/lang/Object;".to_string())?;
        assert_eq!(
            descriptor.parameters,
            vec![
                FieldType::Base(BaseType::Int),
                FieldType::Base(BaseType::Double),
                FieldType::Object(ObjectType {
                    class_name: "java/lang/Thread".to_string()
                })
            ]
        );

        assert_eq!(
            descriptor.return_type,
            FieldType::Object(ObjectType {
                class_name: "java/lang/Object".to_string()
            })
        );

        Ok(())
    }

    #[test]
    fn it_unparses_simple_descriptors() -> Result<()> {
        let descriptor = FieldType::parse("Z".to_string())?;
        let unparsed = descriptor.to_string();
        assert_eq!(unparsed, "Z");

        Ok(())
    }

    #[test]
    fn it_unparses_array_descriptors() -> Result<()> {
        let descriptor = FieldType::parse("[D".to_string())?;
        let unparsed = descriptor.to_string();

        assert_eq!(unparsed, "[D");

        Ok(())
    }

    #[test]
    fn it_unparses_method_descriptors() -> Result<()> {
        let descriptor = MethodType::parse("(IDLjava/lang/Thread;)Ljava/lang/Object;".to_string())?;
        let unparsed = descriptor.to_string();

        assert_eq!(unparsed, "(IDLjava/lang/Thread;)Ljava/lang/Object;");

        Ok(())
    }
    #[test]
    fn it_unparses_arraycopy_descriptors() -> Result<()> {
        let descriptor =
            MethodType::parse("(Ljava/lang/Object;ILjava/lang/Object;II)V".to_string())?;
        let unparsed = descriptor.to_string();

        assert_eq!(unparsed, "(Ljava/lang/Object;ILjava/lang/Object;II)V");

        Ok(())
    }
}