summaryrefslogtreecommitdiff
path: root/rust/tests/types.rs
blob: a661b4ed71844fa77d9c10a5bced0421febe6454 (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
use binaryninja::binary_view::BinaryView;
use binaryninja::confidence::Conf;
use binaryninja::file_metadata::FileMetadata;
use binaryninja::headless::Session;
use binaryninja::platform::Platform;
use binaryninja::types::{MemberAccess, MemberScope, StructureBuilder, StructureMember, Type};

#[test]
fn test_type_to_string() {
    let _session = Session::new().expect("Failed to initialize session");
    let test_type = Type::int(4, true);
    assert_eq!(test_type.to_string(), "int32_t".to_string());

    let platform = Platform::by_name("x86").expect("Failed to get platform");
    let calling_conv = platform
        .get_default_calling_convention()
        .expect("Failed to get calling convention");
    let test_fn_type =
        Type::function_with_opts(&test_type, &[], false, calling_conv, Conf::new(0, 0));
    assert_eq!(test_fn_type.to_string(), "int32_t()");
}

#[test]
fn test_structure_builder() {
    let _session = Session::new().expect("Failed to initialize session");
    let mut builder = StructureBuilder::new();
    builder.insert(
        &Type::int(4, true),
        "field_1",
        0,
        false,
        MemberAccess::PrivateAccess,
        MemberScope::FriendScope,
    );
    builder.insert(
        &Type::float(8),
        "field_2",
        4,
        false,
        MemberAccess::PublicAccess,
        MemberScope::NoScope,
    );

    let structure = builder.finalize();
    let members = structure.members();
    assert_eq!(members.len(), 2);
    assert_eq!(
        members[0],
        StructureMember {
            name: "field_1".to_string(),
            ty: Type::int(4, true).into(),
            offset: 0,
            access: MemberAccess::PrivateAccess,
            scope: MemberScope::FriendScope,
            bit_position: None,
            bit_width: None,
        }
    );
}

#[test]
fn add_type_to_view() {
    let _session = Session::new().expect("Failed to initialize session");
    let empty_view = BinaryView::from_data(&FileMetadata::new(), &[]);
    let test_type = Type::int(4, true);
    empty_view.define_auto_type("test", "me", &test_type);
    assert!(empty_view.type_by_name("test").is_some());
    empty_view.undefine_auto_type(
        &empty_view
            .type_id_by_name("test")
            .expect("Failed to get type id"),
    );
    assert!(empty_view.type_by_name("test").is_none());
}