about summary refs log tree commit diff
path: root/src/rt/test/rust_test_util.cpp
blob: 9c6c5d7e2e3b54844a5feecea5e6fb042bbbba9c (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
#include "../rust_internal.h"

#define COUNT 1000
#define LARGE_COUNT 10000
#define THREADS 10

bool
rust_array_list_test::run() {
    array_list<int> list;

    for (int i = 0; i < COUNT; i++) {
        list.append(i);
    }

    for (int i = 0; i < COUNT; i++) {
        CHECK (list[i] == i);
    }

    for (int i = 0; i < COUNT; i++) {
        CHECK (list.index_of(i) == i);
    }

    for (int i = 0; i < COUNT; i++) {
        CHECK (list.replace(i, -i));
        CHECK (list.replace(-i, i));
        CHECK (list.index_of(i) == i);
    }

    for (int i = COUNT - 1; i >= 0; i--) {
        CHECK (list.pop(NULL));
    }

    return true;
}

bool
rust_synchronized_indexed_list_test::run() {
    array_list<worker*> workers;

    for (int i = 0; i < THREADS; i++) {
        worker *worker =
            new rust_synchronized_indexed_list_test::worker(this);
        workers.append(worker);
    }

    for (uint32_t i = 0; i < workers.size(); i++) {
        workers[i]->start();
    }

    while(workers.is_empty() == false) {
        worker *worker;
        workers.pop(&worker);
        worker->join();
        delete worker;
    }

    size_t expected_items = LARGE_COUNT * THREADS;

    CHECK(list.length() == expected_items);

    long long sum = 0;
    for (size_t i = 0; i < list.length(); i++) {
        sum += list[i]->value;
    }

    long long expected_sum = LARGE_COUNT;
    expected_sum = expected_sum * (expected_sum - 1) / 2 * THREADS;
    CHECK (sum == expected_sum);
    return true;
}

void
rust_synchronized_indexed_list_test::worker::run() {
    for (int i = 0; i < LARGE_COUNT; i++) {
        parent->list.append(new indexed_list_element<int>(i));
    }
    return;
}