#include "libterm"

proc main()
{
    using namespace term;
    var fail = 27;

    try { Start(main); } catch (e) { fail--; }

    try { RawInput(); } catch (e) { fail--; }
    try { RawInput(main); } catch (e) { fail--; }

    try { GotoRC(); } catch (e) { fail--; }
    try { GotoRC(main,main); } catch (e) { fail--; }

    try { Reverse(); } catch (e) { fail--; }
    try { Reverse(main); } catch (e) { fail--; }

    try { Bold(); } catch (e) { fail--; }
    try { Bold(main); } catch (e) { fail--; }

    try { Bold(); } catch (e) { fail--; }
    try { Bold(main); } catch (e) { fail--; }

    try { ColorPair(); } catch (e) { fail--; }
    try { ColorPair(main,main,main); } catch (e) { fail--; }
    try { ColorPair(16384,WHITE,BLACK); } catch (e) { fail--; }
    try { ColorPair(1,100,BLACK); } catch (e) { fail--; }
    try { ColorPair(1,WHITE,100); } catch (e) { fail--; }

    try { SetColor(); } catch (e) { fail--; }
    try { SetColor(main); } catch (e) { fail--; }
    try { SetColor(16384); } catch (e) { fail--; }

    try { ScrollRegion(); } catch (e) { fail--; }
    try { ScrollRegion(main,main); } catch (e) { fail--; }

    try { Scroll(); } catch (e) { fail--; }
    try { ScrollRegion(main); } catch (e) { fail--; }

    try { Query(); } catch (e) { fail--; }
    try { Query(main); } catch (e) { fail--; }
    try { Query(16384); } catch (e) { fail--; }
    var queries = {IS_RAW_IN, IS_COLOR, CAN_SCROLL, WIDTH, HEIGHT, FG, BG,
                    COLOR, NCOLORS, BOLD, REVERSE, CURS_ROW, CURS_COL};
    forall (queries[i]) {
        try { Query(queries[i]); } catch (e) { fail--; }
    }

    if (fail != 0) { "FAIL: ", fail, '\n'; }

    Start();
    RawInput(1);

    "Press keys: up,down,left,right,home,end,pgup,pgdn,shift-tab,\n";
    "            bs (^H),del,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12\n";
    "(or just press esc)\n";
    var keys = <<<
        UP,      "up",    DOWN, "down", LEFT, "left", RIGHT, "right",
        HOME,    "home",  END,  "end",  PGDN, "pgdn", PGUP,  "pgup",
        BACKTAB, "bktab", '\b', "bs",   127,  "del",
        F1,      "f1",    F2,   "f2",   F3,   "f3",   F4,    "f4",
        F5,      "f5",    F6,   "f6",   F7,   "f7",   F8,    "f8",
        F9,      "f9",    F10,  "f10",  F11,  "f11",  F12,   "f12">>>;
    var numKeys = keys.length();
    var done;
    while (numKeys) {
        var key = Getch();
        if (key == '\x1b') { // escape
            numKeys = 0;
        }
        else {
            var name = keys[key];
            if (name != nil) {
                "", name, ' ';
                keys[key] = nil;
                numKeys--;
            }
        }
    }

    Stop();
}