zrequire('list_cursor');

run_test('config errors', () => {
    blueslip.expect('error', 'Programming error');
    list_cursor({});
});

function basic_conf() {
    const list = {
        scroll_container_sel: 'whatever',
        find_li: () => {},
        first_key: () => {},
        prev_key: () => {},
        next_key: () => {},
    };

    const conf = {
        list: list,
        highlight_class: 'highlight',
    };

    return conf;
}

run_test('misc errors', () => {
    const conf = basic_conf();

    const cursor = list_cursor(conf);

    // Test that we just ignore empty
    // lists for unknown keys.
    conf.list.find_li = (opts) => {
        assert.equal(opts.key, 'nada');
        assert.equal(opts.force_render, true);
        return [];
    };

    cursor.get_row('nada');

    blueslip.expect('error', 'Caller is not checking keys for list_cursor.go_to');
    cursor.go_to(undefined);

    blueslip.expect('error', 'Cannot highlight key for list_cursor: nada');
    cursor.go_to('nada');

    cursor.prev();
    cursor.next();
});

run_test('single item list', () => {
    const conf = basic_conf();
    const cursor = list_cursor(conf);

    const valid_key = '42';
    const li_stub = {
        length: 1,
        addClass: () => {},
    };

    cursor.adjust_scroll = () => {};

    conf.list.find_li = () => {
        return li_stub;
    };

    cursor.go_to(valid_key);

    // Test prev/next, which should just silently do nothing.
    // (Our basic_conf() has prev_key and next_key return undefined.)
    cursor.prev();
    cursor.next();

    // The next line is also a noop designed to just give us test
    // coverage.
    cursor.go_to(valid_key);
});
