aboutsummaryrefslogtreecommitdiff
path: root/common/object/src/tests.rs
blob: 616ac69459ba8e0d3f9c78c645808e508c082782 (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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
    This file is part of jellything (https://codeberg.org/metamuffin/jellything)
    which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
    Copyright (C) 2026 metamuffin <metamuffin.org>
*/

use crate::{Object, ObjectBuffer, Registry, fields, inspect::Inspector};
use std::sync::LazyLock;

pub static TAGREG: LazyLock<Registry> = LazyLock::new(|| {
    let mut reg = Registry::default();
    register_fields(&mut reg);
    reg
});
fields! {
    NAME: &str = 15 "name";
    AGE: u32 = 13 "age";
    FRIEND: &str = 54321 "friend";
    STUFF: Object = 3 "stuff";
}

fn test_object() -> ObjectBuffer {
    ObjectBuffer::new(&mut [
        (NAME.0, &"Bob"),
        (AGE.0, &35_u32),
        (FRIEND.0, &"Alice"),
        (FRIEND.0, &"Charlie"),
    ])
}

#[test]
fn read_single_field() {
    let bob = test_object();
    let bob = bob.as_object();
    assert_eq!(bob.get(NAME), Some("Bob"));
    assert_eq!(bob.get(AGE), Some(35));
}

#[test]
fn read_multi_field() {
    let bob = test_object();
    let bob = bob.as_object();

    let mut friends = bob.iter(FRIEND);
    assert_eq!(friends.next(), Some("Alice"));
    assert_eq!(friends.next(), Some("Charlie"));
    assert_eq!(friends.next(), None);
}

#[test]
fn vec_align_test() {
    let mut c = 0;
    for _ in 0..10_000 {
        let x = Vec::<u8>::with_capacity(16);
        if x.as_ptr().align_offset(4) == 0 {
            c += 1;
        }
    }
    assert_eq!(c, 10_000, "correctly aligned vecs by system allocator")
}

#[test]
fn insert() {
    let bob = test_object();
    let edward = bob.as_object().insert(NAME, "Edward");

    eprintln!("{:#?}", bob.as_object());
    let edward = edward.as_object();
    eprintln!("{edward:#?}");
    assert_eq!(edward.get(NAME), Some("Edward"));
    assert_eq!(edward.get(AGE), Some(35));

    let mut friends = edward.iter(FRIEND);
    assert_eq!(friends.next(), Some("Alice"));
    assert_eq!(friends.next(), Some("Charlie"));
    assert_eq!(friends.next(), None);
}

#[test]
fn insert_empty() {
    let ob = Object::EMPTY.insert(NAME, "Romeo");
    assert_eq!(ob.as_object().get(NAME), Some("Romeo"));

    let ob = Object::EMPTY.insert(STUFF, Object::EMPTY);
    assert_eq!(ob.as_object().get(STUFF), Some(Object::EMPTY));
}

#[test]
fn inspect_object() {
    let bob = test_object();
    eprintln!("{:#?}", Inspector(&TAGREG, bob.as_object()));
    // panic!()
}

#[test]
fn inspect_tag() {
    assert_eq!(
        format!("{:?}", Inspector(&TAGREG, FRIEND)),
        "TypedTag<&str>(\"friend\")"
    );
    assert_eq!(
        format!("{:?}", Inspector(&TAGREG, AGE)),
        "TypedTag<u32>(\"age\")"
    );
    assert_eq!(format!("{:?}", Inspector(&TAGREG, NAME.0)), "Tag(\"name\")");
}