/*
    Copyright (c) 2013 250bpm s.r.o.  All rights reserved.

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"),
    to deal in the Software without restriction, including without limitation
    the rights to use, copy, modify, merge, publish, distribute, sublicense,
    and/or sell copies of the Software, and to permit persons to whom
    the Software is furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included
    in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
    THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
    IN THE SOFTWARE.
*/

#include "../src/protocols/pubsub/trie.c"
#include "../src/utils/alloc.c"
#include "../src/utils/err.c"

int main ()
{
    int rc;
    struct nn_trie trie;

    /*  Try matching with an empty trie. */
    nn_trie_init (&trie);
    rc = nn_trie_match (&trie, (const uint8_t*) "", 0);
    nn_assert (rc == 0);
    rc = nn_trie_match (&trie, (const uint8_t*) "ABC", 3);
    nn_assert (rc == 0);
    nn_trie_term (&trie);

    /*  Try matching with "all" subscription. */
    nn_trie_init (&trie);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "", 0);
    nn_assert (rc == 1);
    rc = nn_trie_match (&trie, (const uint8_t*) "", 0);
    nn_assert (rc == 1);
    rc = nn_trie_match (&trie, (const uint8_t*) "ABC", 3);
    nn_assert (rc == 1);
    nn_trie_term (&trie);

    /*  Try some simple matching. */
    nn_trie_init (&trie);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "ABC", 3);
    nn_assert (rc == 1);
    rc = nn_trie_match (&trie, (const uint8_t*) "DEF", 3);
    nn_assert (rc == 0);
    rc = nn_trie_match (&trie, (const uint8_t*) "AB", 2);
    nn_assert (rc == 0);
    rc = nn_trie_match (&trie, (const uint8_t*) "ABC", 3);
    nn_assert (rc == 1);
    rc = nn_trie_match (&trie, (const uint8_t*) "ABCDE", 5);
    nn_assert (rc == 1);
    nn_trie_term (&trie);

    /*  Try a long subcsription. */
    nn_trie_init (&trie);
    rc = nn_trie_subscribe (&trie,
        (const uint8_t*) "01234567890123456789012345678901234", 35);
    nn_assert (rc == 1);
    rc = nn_trie_match (&trie, (const uint8_t*) "", 0);
    nn_assert (rc == 0);
    rc = nn_trie_match (&trie, (const uint8_t*) "012456789", 10);
    nn_assert (rc == 0);
    rc = nn_trie_match (&trie, (const uint8_t*) "012345678901234567", 18);
    nn_assert (rc == 0);
    rc = nn_trie_match (&trie,
        (const uint8_t*) "01234567890123456789012345678901234", 35);
    nn_assert (rc == 1);
    nn_trie_term (&trie);

    /*  Try matching with a sparse node involved. */
    nn_trie_init (&trie);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "ABC", 3);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "ADE", 3);
    nn_assert (rc == 1);
    rc = nn_trie_match (&trie, (const uint8_t*) "A", 1);
    nn_assert (rc == 0);
    rc = nn_trie_match (&trie, (const uint8_t*) "AD", 2);
    nn_assert (rc == 0);
    nn_trie_term (&trie);

    /*  Try matching with a dense node involved. */
    nn_trie_init (&trie);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "A", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "B", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "C", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "0", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "E", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "F", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "1", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "@", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "b", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "f", 1);
    nn_assert (rc == 1);
    rc = nn_trie_match (&trie, (const uint8_t*) "0", 1);
    nn_assert (rc == 1);
    rc = nn_trie_match (&trie, (const uint8_t*) "A", 1);
    nn_assert (rc == 1);
    rc = nn_trie_match (&trie, (const uint8_t*) "f", 1);
    nn_assert (rc == 1);
    rc = nn_trie_match (&trie, (const uint8_t*) "000", 3);
    nn_assert (rc == 1);
    rc = nn_trie_match (&trie, (const uint8_t*) "a", 1);
    nn_assert (rc == 0);
    rc = nn_trie_match (&trie, (const uint8_t*) "c", 1);
    nn_assert (rc == 0);
    nn_trie_term (&trie);

    /*  Check prefix splitting and compaction. */
    nn_trie_init (&trie);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "ABCD", 4);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "AB", 2);
    nn_assert (rc == 1);
    rc = nn_trie_unsubscribe (&trie, (const uint8_t*) "AB", 2);
    nn_assert (rc == 1);
    rc = nn_trie_match (&trie, (const uint8_t*) "AB", 2);
    nn_assert (rc == 0);
    rc = nn_trie_match (&trie, (const uint8_t*) "ABCDEF", 6);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "ABEF", 4);
    nn_assert (rc == 1);
    rc = nn_trie_unsubscribe (&trie, (const uint8_t*) "ABCD", 4);
    nn_assert (rc == 1);
    rc = nn_trie_match (&trie, (const uint8_t*) "ABCD", 4);
    nn_assert (rc == 0);
    rc = nn_trie_match (&trie, (const uint8_t*) "ABEF", 4);
    nn_assert (rc == 1);
    nn_trie_term (&trie);

    /*  Check whether there's no problem with removing all subscriptions. */
    nn_trie_init (&trie);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "A", 1);
    nn_assert (rc == 1);
    rc = nn_trie_unsubscribe (&trie, (const uint8_t*) "A", 1);
    nn_assert (rc == 1);
    rc = nn_trie_match (&trie, (const uint8_t*) "", 0);
    nn_assert (rc == 0);
    rc = nn_trie_match (&trie, (const uint8_t*) "A", 1);
    nn_assert (rc == 0);
    nn_trie_term (&trie);

    /*  Check converting from sparse node to dense node and vice versa. */
    nn_trie_init (&trie);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "A", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "B", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "C", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "0", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "E", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "F", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "1", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "@", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "b", 1);
    nn_assert (rc == 1);
    rc = nn_trie_subscribe (&trie, (const uint8_t*) "f", 1);
    nn_assert (rc == 1);
    rc = nn_trie_unsubscribe (&trie, (const uint8_t*) "0", 1);
    nn_assert (rc == 1);
    rc = nn_trie_unsubscribe (&trie, (const uint8_t*) "f", 1);
    nn_assert (rc == 1);
    rc = nn_trie_unsubscribe (&trie, (const uint8_t*) "E", 1);
    nn_assert (rc == 1);
    rc = nn_trie_unsubscribe (&trie, (const uint8_t*) "B", 1);
    nn_assert (rc == 1);
    rc = nn_trie_unsubscribe (&trie, (const uint8_t*) "A", 1);
    nn_assert (rc == 1);
    rc = nn_trie_unsubscribe (&trie, (const uint8_t*) "1", 1);
    nn_assert (rc == 1);
    rc = nn_trie_unsubscribe (&trie, (const uint8_t*) "@", 1);
    nn_assert (rc == 1);
    rc = nn_trie_unsubscribe (&trie, (const uint8_t*) "F", 1);
    nn_assert (rc == 1);
    rc = nn_trie_unsubscribe (&trie, (const uint8_t*) "C", 1);
    nn_assert (rc == 1);
    rc = nn_trie_unsubscribe (&trie, (const uint8_t*) "b", 1);
    nn_assert (rc == 1);
    nn_trie_term (&trie);

    return 0;
}

