Annotation of nono/vm/test_eventqueue.cpp, revision 1.1.1.1

1.1       root        1: #include "test_tool.h"
                      2: #include "event.h"
                      3: #include "eventqueue.h"
                      4: #include <string>
                      5: 
                      6: static void
                      7: do_test()
                      8: {
                      9:        eventqueue q {};
                     10:        std::vector<Event> events {};
                     11:        Event *e;
                     12:        int N;
                     13: 
                     14:        // 実体を用意する
                     15:        N = 9;
                     16:        for (int i = 0; i < N; i++) {
                     17:                Event ev;
                     18:                ev.vtime = i + 1;
                     19:                events.emplace_back(ev);
                     20:        }
                     21: 
                     22:        //
                     23:        // Test1. 正順に追加
                     24:        //
                     25:        for (int i = 0; i < N; i++) {
                     26:                q.push(&events[i]);
                     27:        }
                     28:        // 取り出して検査
                     29:        for (int i = 0; i < N; i++) {
                     30:                // 先頭を参照
                     31:                e = q.front();
                     32:                if (e == NULL) {
                     33:                        printf("%s:%d: e expects non-null but null\n", __func__, __LINE__);
                     34:                        exit(1);
                     35:                }
                     36:                xp_eq(i + 1, e->vtime, string_format("i=%d", i));
                     37: 
                     38:                // 取り出す
                     39:                q.pop_front();
                     40:                xp_eq(N - 1 - i, q.size());
                     41:        }
                     42:        // 全部なくなった (q.front() は empty() 時に呼んではいけない)
                     43:        xp_eq(true, q.empty());
                     44: 
                     45:        //
                     46:        // Test2. 逆順に追加
                     47:        //
                     48:        for (int i = N - 1; i >= 0; i--) {
                     49:                q.push(&events[i]);
                     50:        }
                     51:        // 取り出して検査
                     52:        for (int i = 0; i < N; i++) {
                     53:                // 先頭を参照
                     54:                e = q.front();
                     55:                if (e == NULL) {
                     56:                        printf("%s:%d: e expects non-null but null\n", __func__, __LINE__);
                     57:                        exit(1);
                     58:                }
                     59:                xp_eq(i + 1, e->vtime);
                     60: 
                     61:                // 取り出す
                     62:                q.pop_front();
                     63:                xp_eq(N - 1 - i, q.size());
                     64:        }
                     65:        // 全部なくなった (q.front() は empty() 時に呼んではいけない)
                     66:        xp_eq(true, q.empty());
                     67: 
                     68:        //
                     69:        // Test3. 同値を含む。(同値同士はどう評価しても構わない)
                     70:        //
                     71:        N = 4;
                     72:        events[0].vtime = 10;
                     73:        events[1].vtime = 40;
                     74:        events[2].vtime = 20;
                     75:        events[3].vtime = 20;
                     76:        for (int i = 0; i < N; i++) {
                     77:                q.push(&events[i]);
                     78:        }
                     79:        // 取り出して検査
                     80:        for (int i = 0; i < N; i++) {
                     81:                // 先頭を取り出す。この辺が動いてることはすでに確認済み
                     82:                e = q.front();
                     83:                q.pop_front();
                     84:                // 評価する。同値同士の順序は問わない
                     85:                switch (i) {
                     86:                 case 0:
                     87:                        xp_eq(10, e->vtime);
                     88:                        break;
                     89:                 case 1:
                     90:                 case 2:
                     91:                        xp_eq(20, e->vtime);
                     92:                        break;
                     93:                 case 3:
                     94:                        xp_eq(40, e->vtime);
                     95:                        break;
                     96:                }
                     97:        }
                     98: 
                     99:        //
                    100:        // Test4. 削除
                    101:        //
                    102:        N = 4;
                    103:        // 中間の events[2] を削除
                    104:        events[0].vtime = 10;
                    105:        events[1].vtime = 40;
                    106:        events[2].vtime = 20;
                    107:        events[3].vtime = 20;
                    108:        for (int i = 0; i < N; i++) {
                    109:                q.push(&events[i]);
                    110:        }
                    111:        q.erase(&events[2]);
                    112:        e = q.front(); q.pop_front(); xp_eq(10, e->vtime);
                    113:        e = q.front(); q.pop_front(); xp_eq(20, e->vtime);
                    114:        e = q.front(); q.pop_front(); xp_eq(40, e->vtime);
                    115:        xp_eq(true, q.empty());
                    116: 
                    117:        // 末尾を削除
                    118:        N = 4;
                    119:        events[0].vtime = 10;
                    120:        events[1].vtime = 40;
                    121:        events[2].vtime = 20;
                    122:        events[3].vtime = 20;
                    123:        for (int i = 0; i < N; i++) {
                    124:                q.push(&events[i]);
                    125:        }
                    126:        q.erase(&events[1]);
                    127:        e = q.front(); q.pop_front(); xp_eq(10, e->vtime);
                    128:        e = q.front(); q.pop_front(); xp_eq(20, e->vtime);
                    129:        e = q.front(); q.pop_front(); xp_eq(20, e->vtime);
                    130:        xp_eq(true, q.empty());
                    131: 
                    132:        // 先頭を削除
                    133:        N = 2;
                    134:        events[0].vtime = 10;
                    135:        events[1].vtime = 20;
                    136:        for (int i = 0; i < N; i++) {
                    137:                q.push(&events[i]);
                    138:        }
                    139:        q.erase(&events[0]);
                    140:        e = q.front(); xp_eq(20, e->vtime);
                    141:        xp_eq(false, q.empty());
                    142:        // 最後の一つを削除
                    143:        q.erase(&events[1]);
                    144:        xp_eq(true, q.empty());
                    145: }
                    146: 
                    147: static void
                    148: do_perf()
                    149: {
                    150: }
                    151: 
                    152: static void
                    153: usage()
                    154: {
                    155:        fprintf(stderr, "usage: %s [test | perf]\n", getprogname());
                    156:        exit(1);
                    157: }
                    158: 
                    159: int
                    160: main(int ac, char *av[])
                    161: {
                    162:        bool perf = false;
                    163: 
                    164:        for (int i = 1; i < ac; i++) {
                    165:                std::string cmd = av[i];
                    166:                if (cmd == "test") {
                    167:                        // default
                    168:                } else if (cmd == "perf") {
                    169:                        perf = true;
                    170:                } else {
                    171:                        usage();
                    172:                }
                    173:        }
                    174: 
                    175:        // テストは常に実施
                    176:        do_test();
                    177:        // 測定は指定された時だけ
                    178:        if (perf) {
                    179:                do_perf();
                    180:        }
                    181:        return 0;
                    182: }
                    183: 
                    184: // 以下リンカを通すためのダミー
                    185: Event::Event()
                    186: {
                    187: }
                    188: Event::~Event()
                    189: {
                    190: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.