void test__create_priority_queue_auxiliary__c_builtin(void** state)
{
    priority_queue_t* pque = malloc(sizeof(priority_queue_t));
    assert_true(_create_priority_queue_auxiliary(pque, "double"));

    priority_queue_destroy(pque);
}
void test__create_priority_queue_auxiliary__libcstl_builtin(void** state)
{
    priority_queue_t* pque = malloc(sizeof(priority_queue_t));
    assert_true(_create_priority_queue_auxiliary(pque, "priority_queue_t<   vector_t     <     string_t>>       "));

    priority_queue_destroy(pque);
}
void test__create_priority_queue__libcstl_builtin_type(void** state)
{
    priority_queue_t* ppque = _create_priority_queue("vector_t         <      int>     ");
    assert_true(ppque != NULL);

    priority_queue_destroy(ppque);
}
void test__create_priority_queue__c_builtin_type(void** state)
{
    priority_queue_t* ppque = _create_priority_queue("unsigned int");
    assert_true(ppque != NULL);

    priority_queue_destroy(ppque);
}
void test__create_priority_queue_auxiliary__user_defined_dup(void** state)
{
    priority_queue_t* pque = NULL;
    type_duplicate(struct _tag_test__create_priority_queue_auxiliary__user_defined, _test__create_priority_queue_auxiliary__user_defined_t);
    pque = malloc(sizeof(priority_queue_t));
    assert_true(_create_priority_queue_auxiliary(pque, "_test__create_priority_queue_auxiliary__user_defined_t"));

    priority_queue_destroy(pque);
}
void test__create_priority_queue_auxiliary__user_defined(void** state)
{
    priority_queue_t* pque = NULL;
    type_register(struct _tag_test__create_priority_queue_auxiliary__user_defined, NULL, NULL, NULL, NULL);
    pque = malloc(sizeof(priority_queue_t));
    assert_true(_create_priority_queue_auxiliary(pque, "struct _tag_test__create_priority_queue_auxiliary__user_defined"));

    priority_queue_destroy(pque);
}
void test__create_priority_queue__user_defined_type(void** state)
{
    priority_queue_t* ppque = NULL;

    type_register(struct _tag_test__create_priority_queue__user_defined_type, NULL, NULL, NULL, NULL);
    ppque = _create_priority_queue("struct      _tag_test__create_priority_queue__user_defined_type");
    assert_true(ppque != NULL);

    priority_queue_destroy(ppque);
}
/* TODO do random inserts and deletes */
int main(void)
{
    float numbers[8] = {0.5f, 1.0f, 0.1f, 10.0f, 5.0f, 0.3f, 0.0f, 42.0f};
    int ordered[8] = {6, 2, 5, 0, 1, 4, 3, 7};

    struct PriorityQueue *queue = priority_queue_create();
    
    for (int i = 0; i < 8; ++i)
        priority_queue_insert(queue, i, numbers[i]);

    for (int i = 0; priority_queue_length(queue); ++i) {
        int id;
        float value;
        priority_queue_minimum(queue, &id, &value);
        assert(ordered[i] == id);
        assert(numbers[ordered[i]] == value);

        priority_queue_extract_min(queue);
    }

    /* worst case test */
    for (int i = 10000000; i >= 0; --i)
        priority_queue_insert(queue, 10000000 - i, i);
    
    /* should be sorted */
    int previous = -1;
    for (int i = 0; i < 10000000; ++i) {
        int id;
        float value;
        priority_queue_minimum(queue, &id, &value);
        priority_queue_extract_min(queue);

        if (previous > value)
            printf("%g[%d] ", value, id);
        previous = value;
    }
    printf("\n"); 

    priority_queue_destroy(queue);

    return 0;
}