summaryrefslogtreecommitdiff
path: root/rust/tests/type_parser.rs
blob: 64771404d24ef48459fabce214ba54cef1ed04cc (plain)
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
use binaryninja::headless::Session;
use binaryninja::platform::Platform;
use binaryninja::types::{CoreTypeParser, Type, TypeParser, TypeParserError};
use binaryninjacore_sys::BNTypeParserErrorSeverity::ErrorSeverity;

const TEST_TYPES: &str = r#"
typedef int int32_t;
typedef unsigned int uint32_t;
typedef float float_t;
typedef double double_t;
typedef char char_t;
typedef unsigned char uchar_t;
typedef short short_t;
typedef unsigned short ushort_t;
typedef long long_t;
typedef unsigned long ulong_t;
typedef long long longlong_t;
typedef unsigned long long ulonglong_t;
typedef void* void_ptr_t;
typedef int (*function_type)(int arg1, float arg2);
// This should be 2 types
typedef struct {
    int a;
    float b;
} struct_type;
"#;

#[test]
fn test_string_to_type() {
    let _session = Session::new().expect("Failed to initialize session");
    let platform = Platform::by_name("windows-x86_64").expect("windows-x86_64 exists");
    let plat_type_container = platform.type_container();
    let parser = CoreTypeParser::default();
    let parsed_type = parser
        .parse_type_string("int32_t", &platform, &plat_type_container)
        .expect("Parsed int32_t");
    let test_type = Type::int(4, true);
    assert_eq!(test_type, parsed_type.ty);
}

#[test]
fn test_string_to_types() {
    let _session = Session::new().expect("Failed to initialize session");
    let platform = Platform::by_name("windows-x86_64").expect("windows-x86_64 exists");
    let plat_type_container = platform.type_container();
    let parser = CoreTypeParser::default();
    let parsed_type = parser
        .parse_types_from_source(
            TEST_TYPES,
            "test_file.h",
            &platform,
            &plat_type_container,
            &[],
            &[],
            "",
        )
        .expect("Parsed types");
    assert_eq!(14, parsed_type.types.len());
}

#[test]
fn test_parse_error() {
    let _session = Session::new().expect("Failed to initialize session");
    let platform = Platform::by_name("windows-x86_64").expect("windows-x86_64 exists");
    let plat_type_container = platform.type_container();
    let parser = CoreTypeParser::default();
    let parser_error = parser
        .parse_type_string("AAAAA", &platform, &plat_type_container)
        .expect_err("Parsing should fail!");
    assert_eq!(
        parser_error,
        vec![TypeParserError {
            severity: ErrorSeverity,
            message: "a type specifier is required for all declarations".to_string(),
            file_name: "string.hpp".to_string(),
            line: 1,
            column: 1
        }]
    );
}