// Test suite for util.c
//
// This is rather thin just now, but if we encounter any bugs in
// util.c, then that would be an excellent opportunity to expand
// coverage here.
//
//
// This file is part of Beastie <https://purl.org/nxg/dist/beastie>
// SPDX-FileCopyrightText: 2024 Norman Gray <https://nxg.me.uk>
// SPDX-License-Identifier: BSD-2-Clause

#include <stdio.h>

#include "util.h"
#include "c-unit.h"

s7_scheme* S7;

static void test_stringbuilder(void)
{
    StringBuilder sb = make_stringbuilder_with_size(8);

    stringbuilder_append_c(sb, 'a');
    stringbuilder_append_s(sb, "bcdefghijk"); // requires an extend
    stringbuilder_append_sn(sb, "lmnopqrs", 4); // appends only lmno
    stringbuilder_terminate(sb);
    assert_equal_sn(sb->buf, sb->len, "abcdefghijklmno");
    assert_equal_s(sb->buf, "abcdefghijklmno");
    assert_equal_uint(sb->len, 15);

    stringbuilder_reset(sb);

    StringBuilder sb2 = make_stringbuilder();
    stringbuilder_append_s(sb2, "abcd");
    stringbuilder_append_sb(sb, sb2);
    stringbuilder_printf(sb, "+%d+%s", 99, "efgh");
    stringbuilder_terminate(sb);
    assert_equal_sn(sb->buf, sb->len, "abcd+99+efgh");

    stringbuilder_free(sb);
    stringbuilder_free(sb2);

    sb = make_stringbuilder_with_size(8); // new allocation
    // the following requires more than one doubling
    stringbuilder_printf(sb, "s=%s", "12345678901234567890123456789012");
    assert_equal_uint(sb->len, 34);
    assert_equal_sn(sb->buf, sb->len, "s=12345678901234567890123456789012");

    stringbuilder_free(sb);
}

int main(int argc, char** argv)
{
    int rval;

    run_test_suite("stringbuilder basics", test_stringbuilder);

    exit(report_status());
}

