/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

#include "test_case.h"
#include <stdio.h>
#include <string.h>
#include <qpid/dispatch/ctools.h>
#include <qpid/dispatch/bitmask.h>
#include "alloc.h"

typedef struct item_t {
    DEQ_LINKS(struct item_t);
    char letter;
} item_t;

DEQ_DECLARE(item_t, item_list_t);


typedef struct multi_item_t {
    DEQ_LINKS(struct multi_item_t);
    DEQ_LINKS_N(second, struct multi_item_t);
    char letter;
} multi_item_t;

DEQ_DECLARE(multi_item_t, multi_item_list_t);


static char* list_well_formed(item_list_t list, char *key)
{
    item_t *ptr;
    item_t *last  = 0;
    int     size  = DEQ_SIZE(list);
    int     count = 0;
    char    str[32];

    ptr = DEQ_HEAD(list);
    while (ptr) {
        str[count] = ptr->letter;
        count++;
        if (DEQ_PREV(ptr) != last) return "Corrupt previous link";
        last = ptr;
        ptr = DEQ_NEXT(ptr);
    }
    str[count] = '\0';
    if (strcmp(str, key) != 0) return "Invalid key";

    if (count != size) return "Size different from number of items (forward)";

    count = 0;
    last  = 0;
    ptr   = DEQ_TAIL(list);
    while (ptr) {
        count++;
        if (DEQ_NEXT(ptr) != last) return "Corrupt next link";
        last = ptr;
        ptr = DEQ_PREV(ptr);
    }

    if (count != size) return "Size different from number of items (backward)";

    return 0;
}


static char* test_deq_basic(void *context)
{
    item_list_t  list;
    item_t       item[10];
    item_t      *ptr;
    int          idx;
    char        *subtest;

    DEQ_INIT(list);
    if (DEQ_SIZE(list) != 0) return "Expected zero initial size";

    for (idx = 0; idx < 10; idx++) {
        DEQ_ITEM_INIT(&item[idx]);
        item[idx].letter = 'A' + idx;
        DEQ_INSERT_TAIL(list, &item[idx]);
    }
    if (DEQ_SIZE(list) != 10) return "Expected 10 items in list";

    ptr = DEQ_HEAD(list);
    if (!ptr)               return "Expected valid head item";
    if (DEQ_PREV(ptr))      return "Head item has non-null previous link";
    if (ptr->letter != 'A') return "Expected item A at the head";
    if (DEQ_NEXT(ptr) == 0) return "Head item has null next link";
    subtest = list_well_formed(list, "ABCDEFGHIJ");
    if (subtest) return subtest;

    DEQ_REMOVE_HEAD(list);
    if (DEQ_SIZE(list) != 9) return "Expected 9 items in list";
    ptr = DEQ_HEAD(list);
    if (ptr->letter != 'B')  return "Expected item B at the head";
    subtest = list_well_formed(list, "BCDEFGHIJ");
    if (subtest) return subtest;

    DEQ_REMOVE_TAIL(list);
    if (DEQ_SIZE(list) != 8) return "Expected 8 items in list";
    ptr = DEQ_TAIL(list);
    if (ptr->letter != 'I')  return "Expected item I at the tail";
    subtest = list_well_formed(list, "BCDEFGHI");
    if (subtest) return subtest;

    DEQ_REMOVE(list, &item[4]);
    if (DEQ_SIZE(list) != 7) return "Expected 7 items in list";
    subtest = list_well_formed(list, "BCDFGHI");
    if (subtest) return subtest;

    DEQ_REMOVE(list, &item[1]);
    if (DEQ_SIZE(list) != 6) return "Expected 6 items in list";
    subtest = list_well_formed(list, "CDFGHI");
    if (subtest) return subtest;

    DEQ_REMOVE(list, &item[8]);
    if (DEQ_SIZE(list) != 5) return "Expected 5 items in list";
    subtest = list_well_formed(list, "CDFGH");
    if (subtest) return subtest;

    DEQ_INSERT_HEAD(list, &item[8]);
    if (DEQ_SIZE(list) != 6) return "Expected 6 items in list";
    ptr = DEQ_HEAD(list);
    if (ptr->letter != 'I')  return "Expected item I at the head";
    subtest = list_well_formed(list, "ICDFGH");
    if (subtest) return subtest;

    DEQ_INSERT_AFTER(list, &item[4], &item[7]);
    if (DEQ_SIZE(list) != 7) return "Expected 7 items in list";
    ptr = DEQ_TAIL(list);
    if (ptr->letter != 'E')  return "Expected item E at the head";
    subtest = list_well_formed(list, "ICDFGHE");
    if (subtest) return subtest;

    DEQ_INSERT_AFTER(list, &item[1], &item[5]);
    if (DEQ_SIZE(list) != 8) return "Expected 8 items in list";
    subtest = list_well_formed(list, "ICDFBGHE");
    if (subtest) return subtest;

    if (item[0].prev || item[0].next) return "Unlisted item A has non-null pointers";
    if (item[9].prev || item[9].next) return "Unlisted item J has non-null pointers";

    return 0;
}


static char* test_deq_basic2(void *context)
{
    item_list_t  list;
    item_t       item[10];
    item_t      *ptr;
    int          idx;
    char        *subtest;

    DEQ_INIT(list);
    if (DEQ_SIZE(list) != 0) return "Expected zero initial size";

    for (idx = 0; idx < 10; idx++) {
        DEQ_ITEM_INIT(&item[idx]);
        item[idx].letter = '0' + idx;
    }

    DEQ_INSERT_TAIL(list, &item[0]);
    if (DEQ_SIZE(list) != 1) return "Expected 1 items in list";
    subtest = list_well_formed(list, "0");
    if (subtest) return subtest;

    ptr = DEQ_HEAD(list);
    DEQ_REMOVE_HEAD(list);
    if (ptr->letter != '0')  return "Expected item '0'";
    if (DEQ_SIZE(list) != 0) return "Expected 0 items in list";

    DEQ_INSERT_TAIL(list, &item[0]);
    if (DEQ_SIZE(list) != 1) return "Expected 1 items in list";
    subtest = list_well_formed(list, "0");
    if (subtest) return subtest;

    ptr = DEQ_HEAD(list);
    DEQ_REMOVE_HEAD(list);
    if (ptr->letter != '0')  return "Expected item '0'";
    if (DEQ_SIZE(list) != 0) return "Expected 0 items in list";

    return 0;
}


static char* test_deq_multi(void *context)
{
    multi_item_list_t  list1;
    multi_item_list_t  list2;
    multi_item_t       item[10];
    multi_item_t      *ptr;
    int                idx;

    DEQ_INIT(list1);
    DEQ_INIT(list2);
    if (DEQ_SIZE(list1) != 0) return "Expected zero initial size 1";
    if (DEQ_SIZE(list2) != 0) return "Expected zero initial size 2";

    for (idx = 0; idx < 10; idx++) {
        DEQ_ITEM_INIT(&item[idx]);
        DEQ_ITEM_INIT_N(second, &item[idx]);
        item[idx].letter = '0' + idx;

        DEQ_INSERT_TAIL(list1, &item[idx]);
        if ((idx & 1) == 0) // even index
            DEQ_INSERT_TAIL_N(second, list2, &item[idx]);
    }

    if (DEQ_SIZE(list1) != 10) return "Expected list 1 size to be 10";
    if (DEQ_SIZE(list2) != 5)  return "Expected list 2 size to be 5";

    idx = 0;
    while (DEQ_HEAD(list1)) {
        ptr = DEQ_HEAD(list1);
        DEQ_REMOVE_HEAD(list1);
        if (ptr->letter != '0' + idx) return "Incorrect value in list 1";
        idx++;
    }

    idx = 0;
    while (DEQ_HEAD(list2)) {
        ptr = DEQ_HEAD(list2);
        DEQ_REMOVE_HEAD_N(second, list2);
        if (ptr->letter != '0' + idx) return "Incorrect value in list 2";
        idx += 2;
    }

    return 0;
}


static char* test_bitmask(void *context)
{
    qd_bitmask_t *bm;
    int           num;
    int           old;
    int           c;
    int           total;
    int           count;

    bm = qd_bitmask(0);
    if (!bm)                             return "Can't allocate a bit mask";
    if (qd_bitmask_first_set(bm, &num))  return "Expected no first set bit";
    if (qd_bitmask_cardinality(bm) != 0) return "Expected cardinality == 0";

    old = qd_bitmask_set_bit(bm, 3);
    if (old)                             return "Expected old value to be zero";
    if (qd_bitmask_cardinality(bm) != 1) return "Expected cardinality == 1";
    old = qd_bitmask_set_bit(bm, 3);
    if (!old)                            return "Expected old value to be one";
    qd_bitmask_set_bit(bm, 100);
    if (qd_bitmask_cardinality(bm) != 2) return "Expected cardinality == 2";

    if (!qd_bitmask_first_set(bm, &num)) return "Expected first set bit";
    if (num != 3)                        return "Expected first set bit to be 3";

    old = qd_bitmask_clear_bit(bm, num);
    if (!old)                            return "Expected old value to be one(2)";
    old = qd_bitmask_clear_bit(bm, num);
    if (old)                             return "Expected old value to be zero(2)";

    if (!qd_bitmask_first_set(bm, &num)) return "Expected first set bit (2)";
    if (num != 100)                      return "Expected first set bit to be 100";

    qd_bitmask_clear_bit(bm, num);
    if (qd_bitmask_first_set(bm, &num)) return "Expected no first set bit (2)";

    qd_bitmask_set_bit(bm, 6);
    qd_bitmask_set_bit(bm, 2);
    qd_bitmask_set_bit(bm, 4);
    qd_bitmask_set_bit(bm, 8);
    qd_bitmask_set_bit(bm, 70);
    qd_bitmask_clear_bit(bm, 8);
    qd_bitmask_clear_bit(bm, 80);

    if (qd_bitmask_cardinality(bm) != 4) return "Expected cardinality == 4";

    total = 0;
    count = 0;
    for (QD_BITMASK_EACH(bm, num, c)) {
        total += num;
        count++;
    }
    if (count != 4)  return "Expected count to be 4";
    if (total != 82) return "Expected bit-number total to be 82";

    qd_bitmask_free(bm);

    return 0;
}


int tool_tests(void)
{
    int result = 0;

    TEST_CASE(test_deq_basic, 0);
    TEST_CASE(test_deq_basic2, 0);
    TEST_CASE(test_deq_multi, 0);
    TEST_CASE(test_bitmask, 0);

    return result;
}

