/* vi:set ts=8 sts=4 sw=4:
 *
 * VIM - Vi IMproved	by Bram Moolenaar
 *
 * Do ":help uganda"  in Vim to read copying and usage conditions.
 * Do ":help credits" in Vim to see a list of people who contributed.
 * See README.txt for an overview of the Vim source code.
 */

/*
 * json_test.c: Unittests for json.c
 */

#undef NDEBUG
#include <assert.h>

/* Must include main.c because it contains much more than just main() */
#define NO_VIM_MAIN
#include "main.c"

/* This file has to be included because the tested functions are static */
#include "json.c"

#if defined(FEAT_EVAL)
/*
 * Test json_find_end() with imcomplete items.
 */
    static void
test_decode_find_end(void)
{
    js_read_T reader;

    reader.js_fill = NULL;
    reader.js_used = 0;

    /* string and incomplete string */
    reader.js_buf = (char_u *)"\"hello\"";
    assert(json_find_end(&reader) == OK);
    reader.js_buf = (char_u *)"  \"hello\" ";
    assert(json_find_end(&reader) == OK);
    reader.js_buf = (char_u *)"\"hello";
    assert(json_find_end(&reader) == MAYBE);

    /* number and dash (incomplete number) */
    reader.js_buf = (char_u *)"123";
    assert(json_find_end(&reader) == OK);
    reader.js_buf = (char_u *)"-";
    assert(json_find_end(&reader) == MAYBE);

    /* false, true and null, also incomplete */
    reader.js_buf = (char_u *)"false";
    assert(json_find_end(&reader) == OK);
    reader.js_buf = (char_u *)"f";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"fa";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"fal";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"fals";
    assert(json_find_end(&reader) == MAYBE);

    reader.js_buf = (char_u *)"true";
    assert(json_find_end(&reader) == OK);
    reader.js_buf = (char_u *)"t";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"tr";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"tru";
    assert(json_find_end(&reader) == MAYBE);

    reader.js_buf = (char_u *)"null";
    assert(json_find_end(&reader) == OK);
    reader.js_buf = (char_u *)"n";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"nu";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"nul";
    assert(json_find_end(&reader) == MAYBE);

    /* object without white space */
    reader.js_buf = (char_u *)"{\"a\":123}";
    assert(json_find_end(&reader) == OK);
    reader.js_buf = (char_u *)"{\"a\":123";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"{\"a\":";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"{\"a\"";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"{\"a";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"{\"";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"{";
    assert(json_find_end(&reader) == MAYBE);

    /* object with white space */
    reader.js_buf = (char_u *)"  {  \"a\"  :  123  }  ";
    assert(json_find_end(&reader) == OK);
    reader.js_buf = (char_u *)"  {  \"a\"  :  123  ";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"  {  \"a\"  :  ";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"  {  \"a\"  ";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"  {  \"a  ";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"  {   ";
    assert(json_find_end(&reader) == MAYBE);

    /* array without white space */
    reader.js_buf = (char_u *)"[\"a\",123]";
    assert(json_find_end(&reader) == OK);
    reader.js_buf = (char_u *)"[\"a\",123";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"[\"a\",";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"[\"a\"";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"[\"a";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"[\"";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"[";
    assert(json_find_end(&reader) == MAYBE);

    /* array with white space */
    reader.js_buf = (char_u *)"  [  \"a\"  ,  123  ]  ";
    assert(json_find_end(&reader) == OK);
    reader.js_buf = (char_u *)"  [  \"a\"  ,  123  ";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"  [  \"a\"  ,  ";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"  [  \"a\"  ";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"  [  \"a  ";
    assert(json_find_end(&reader) == MAYBE);
    reader.js_buf = (char_u *)"  [  ";
    assert(json_find_end(&reader) == MAYBE);
}

    static int
fill_from_cookie(js_read_T *reader)
{
    reader->js_buf = reader->js_cookie;
    return TRUE;
}

/*
 * Test json_find_end with an incomplete array, calling the fill function.
 */
    static void
test_fill_called_on_find_end(void)
{
    js_read_T reader;

    reader.js_fill = fill_from_cookie;
    reader.js_used = 0;
    reader.js_buf = (char_u *)"  [  \"a\"  ,  123  ";
    reader.js_cookie =        "  [  \"a\"  ,  123  ]  ";
    assert(json_find_end(&reader) == OK);
    reader.js_buf = (char_u *)"  [  \"a\"  ,  ";
    assert(json_find_end(&reader) == OK);
    reader.js_buf = (char_u *)"  [  \"a\"  ";
    assert(json_find_end(&reader) == OK);
    reader.js_buf = (char_u *)"  [  \"a";
    assert(json_find_end(&reader) == OK);
    reader.js_buf = (char_u *)"  [  ";
    assert(json_find_end(&reader) == OK);
}

/*
 * Test json_find_end with an incomplete string, calling the fill function.
 */
    static void
test_fill_called_on_string(void)
{
    js_read_T reader;

    reader.js_fill = fill_from_cookie;
    reader.js_used = 0;
    reader.js_buf = (char_u *)" \"foo";
    reader.js_end = reader.js_buf + STRLEN(reader.js_buf);
    reader.js_cookie =        " \"foobar\"  ";
    assert(json_decode_string(&reader, NULL) == OK);
}
#endif

    int
main(void)
{
#if defined(FEAT_EVAL)
    test_decode_find_end();
    test_fill_called_on_find_end();
    test_fill_called_on_string();
#endif
    return 0;
}
