/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "include/core/SkScalar.h"
#include "include/core/SkString.h"
#include "include/core/SkTypes.h"
#include "include/private/base/SkTArray.h"
#include "src/core/SkStringUtils.h"
#include "tests/Test.h"

#include <cmath>
#include <cstdarg>
#include <cstdint>
#include <cstring>
#include <string_view>
#include <thread>

using namespace skia_private;

DEF_TEST(String, reporter) {
    SkString    a;
    SkString    b((size_t)0);
    SkString    c("");
    SkString    d(nullptr, 0);
    SkString    v{std::string_view()};

    REPORTER_ASSERT(reporter, a.isEmpty());
    REPORTER_ASSERT(reporter, a == b && a == c && a == d && a == v);

    a.set("hello");
    b.set("hellox", 5);
    c.set(a);
    d.resize(5);
    memcpy(d.data(), "helloz", 5);
    v.set(std::string_view("hellooooo").substr(0, 5));

    REPORTER_ASSERT(reporter, !a.isEmpty());
    REPORTER_ASSERT(reporter, a.size() == 5);
    REPORTER_ASSERT(reporter, a == b && a == c && a == d && a == v);
    REPORTER_ASSERT(reporter, a.equals("hello", 5));
    REPORTER_ASSERT(reporter, a.equals("hello"));
    REPORTER_ASSERT(reporter, !a.equals("help"));

    REPORTER_ASSERT(reporter,  a.startsWith("hell"));
    REPORTER_ASSERT(reporter,  a.startsWith('h'));
    REPORTER_ASSERT(reporter, !a.startsWith( "ell"));
    REPORTER_ASSERT(reporter, !a.startsWith( 'e'));
    REPORTER_ASSERT(reporter,  a.startsWith(""));
    REPORTER_ASSERT(reporter,  a.endsWith("llo"));
    REPORTER_ASSERT(reporter,  a.endsWith('o'));
    REPORTER_ASSERT(reporter, !a.endsWith("ll" ));
    REPORTER_ASSERT(reporter, !a.endsWith('l'));
    REPORTER_ASSERT(reporter,  a.endsWith(""));
    REPORTER_ASSERT(reporter,  a.contains("he"));
    REPORTER_ASSERT(reporter,  a.contains("ll"));
    REPORTER_ASSERT(reporter,  a.contains("lo"));
    REPORTER_ASSERT(reporter,  a.contains("hello"));
    REPORTER_ASSERT(reporter, !a.contains("hellohello"));
    REPORTER_ASSERT(reporter,  a.contains(""));
    REPORTER_ASSERT(reporter,  a.contains('e'));
    REPORTER_ASSERT(reporter, !a.contains('z'));

    v.prepend(std::string_view("[["));
    v.append(std::string_view("]]"));
    REPORTER_ASSERT(reporter, v.equals("[[hello]]"));

    v.insert(2, std::string_view("?!").substr(0, 1));
    REPORTER_ASSERT(reporter, v.equals("[[?hello]]"));

    SkString    e(a);
    SkString    f("hello");
    SkString    g("helloz", 5);

    REPORTER_ASSERT(reporter, a == e && a == f && a == g);

    b.set("world");
    c = b;
    REPORTER_ASSERT(reporter, a != b && a != c && b == c);

    a.append(" world");
    e.append("worldz", 5);
    e.insert(5, " ");
    f.set("world");
    f.prepend("hello ");
    REPORTER_ASSERT(reporter, a.equals("hello world") && a == e && a == f);

    a.reset();
    b.resize(0);
    REPORTER_ASSERT(reporter, a.isEmpty() && b.isEmpty() && a == b);

    a.set("a");
    a.set("ab");
    a.set("abc");
    a.set("abcd");

    a.set("");
    a.appendS32(0x7FFFFFFFL);
    REPORTER_ASSERT(reporter, a.equals("2147483647"));
    a.set("");
    a.appendS32(0x80000001L);
    REPORTER_ASSERT(reporter, a.equals("-2147483647"));
    a.set("");
    a.appendS32(0x80000000L);
    REPORTER_ASSERT(reporter, a.equals("-2147483648"));

    a.set("");
    a.appendU32(0x7FFFFFFFUL);
    REPORTER_ASSERT(reporter, a.equals("2147483647"));
    a.set("");
    a.appendU32(0x80000001UL);
    REPORTER_ASSERT(reporter, a.equals("2147483649"));
    a.set("");
    a.appendU32(0xFFFFFFFFUL);
    REPORTER_ASSERT(reporter, a.equals("4294967295"));

    a.set("");
    a.appendS64(0x7FFFFFFFFFFFFFFFLL, 0);
    REPORTER_ASSERT(reporter, a.equals("9223372036854775807"));
    a.set("");
    a.appendS64(0x8000000000000001LL, 0);
    REPORTER_ASSERT(reporter, a.equals("-9223372036854775807"));
    a.set("");
    a.appendS64(0x8000000000000000LL, 0);
    REPORTER_ASSERT(reporter, a.equals("-9223372036854775808"));
    a.set("");
    a.appendS64(0x0000000001000000LL, 15);
    REPORTER_ASSERT(reporter, a.equals("000000016777216"));
    a.set("");
    a.appendS64(0xFFFFFFFFFF000000LL, 15);
    REPORTER_ASSERT(reporter, a.equals("-000000016777216"));

    a.set("");
    a.appendU64(0x7FFFFFFFFFFFFFFFULL, 0);
    REPORTER_ASSERT(reporter, a.equals("9223372036854775807"));
    a.set("");
    a.appendU64(0x8000000000000001ULL, 0);
    REPORTER_ASSERT(reporter, a.equals("9223372036854775809"));
    a.set("");
    a.appendU64(0xFFFFFFFFFFFFFFFFULL, 0);
    REPORTER_ASSERT(reporter, a.equals("18446744073709551615"));
    a.set("");
    a.appendU64(0x0000000001000000ULL, 15);
    REPORTER_ASSERT(reporter, a.equals("000000016777216"));

    a.printf("%i", 0);
    REPORTER_ASSERT(reporter, a.equals("0"));
    a.printf("%g", 3.14);
    REPORTER_ASSERT(reporter, a.equals("3.14"));
    a.printf("hello %s", "skia");
    REPORTER_ASSERT(reporter, a.equals("hello skia"));

    static const struct {
        SkScalar    fValue;
        const char* fString;
    } gRec[] = {
        { 0,             "0" },
        { SK_Scalar1,    "1" },
        { -SK_Scalar1,   "-1" },
        { SK_Scalar1/2,  "0.5" },
        { INFINITY,      "inf" },
        { -INFINITY,     "-inf" },
        { NAN,           "nan" },
        { -NAN,          "nan" },
  #if defined(SK_BUILD_FOR_WIN) && (_MSC_VER < 1900)
        { 3.4028234e38f,   "3.4028235e+038" },
        { -3.4028234e38f, "-3.4028235e+038" },
  #else
        { 3.4028234e38f,   "3.4028235e+38" },
        { -3.4028234e38f, "-3.4028235e+38" },
  #endif
    };
    for (size_t i = 0; i < std::size(gRec); i++) {
        a.reset();
        a.appendScalar(gRec[i].fValue);
        REPORTER_ASSERT(reporter, a.size() <= kSkStrAppendScalar_MaxSize);
        if (!a.equals(gRec[i].fString)) {
            ERRORF(reporter, "received <%s> expected <%s>\n", a.c_str(), gRec[i].fString);
        }
    }

    REPORTER_ASSERT(reporter, SkStringPrintf("%i", 0).equals("0"));
}

static void assert_2000_spaces(skiatest::Reporter* reporter, const SkString& str) {
    REPORTER_ASSERT(reporter, str.size() == 2000);
    for (size_t i = 0; i < str.size(); ++i) {
        REPORTER_ASSERT(reporter, str[i] == ' ');
    }
}

DEF_TEST(String_overflow, reporter) {
    // 2000 is larger than the static buffer size inside SkString.cpp
    SkString a = SkStringPrintf("%2000s", " ");
    assert_2000_spaces(reporter, a);

    a = "X";
    a.printf("%2000s", " ");
    assert_2000_spaces(reporter, a);

    a = "X";
    a.appendf("%1999s", " ");
    REPORTER_ASSERT(reporter, a[0] == 'X');
    a[0] = ' ';
    assert_2000_spaces(reporter, a);

    a = "X";
    a.prependf("%1999s", " ");
    REPORTER_ASSERT(reporter, a[1999] == 'X');
    a[1999] = ' ';
    assert_2000_spaces(reporter, a);
}

DEF_TEST(String_SkStrSplit, r) {
    TArray<SkString> results;

    SkStrSplit("a-_b_c-dee--f-_-_-g-", "-_", &results);
    REPORTER_ASSERT(r, results.size() == 6);
    REPORTER_ASSERT(r, results[0].equals("a"));
    REPORTER_ASSERT(r, results[1].equals("b"));
    REPORTER_ASSERT(r, results[2].equals("c"));
    REPORTER_ASSERT(r, results[3].equals("dee"));
    REPORTER_ASSERT(r, results[4].equals("f"));
    REPORTER_ASSERT(r, results[5].equals("g"));

    results.clear();
    SkStrSplit("\n", "\n", &results);
    REPORTER_ASSERT(r, results.size() == 0);

    results.clear();
    SkStrSplit("", "\n", &results);
    REPORTER_ASSERT(r, results.size() == 0);

    results.clear();
    SkStrSplit("a", "\n", &results);
    REPORTER_ASSERT(r, results.size() == 1);
    REPORTER_ASSERT(r, results[0].equals("a"));
}
DEF_TEST(String_SkStrSplit_All, r) {
    TArray<SkString> results;
    SkStrSplit("a-_b_c-dee--f-_-_-g-", "-_", kStrict_SkStrSplitMode, &results);
    REPORTER_ASSERT(r, results.size() == 13);
    REPORTER_ASSERT(r, results[0].equals("a"));
    REPORTER_ASSERT(r, results[1].equals(""));
    REPORTER_ASSERT(r, results[2].equals("b"));
    REPORTER_ASSERT(r, results[3].equals("c"));
    REPORTER_ASSERT(r, results[4].equals("dee"));
    REPORTER_ASSERT(r, results[5].equals(""));
    REPORTER_ASSERT(r, results[6].equals("f"));
    REPORTER_ASSERT(r, results[7].equals(""));
    REPORTER_ASSERT(r, results[8].equals(""));
    REPORTER_ASSERT(r, results[9].equals(""));
    REPORTER_ASSERT(r, results[10].equals(""));
    REPORTER_ASSERT(r, results[11].equals("g"));
    REPORTER_ASSERT(r, results[12].equals(""));

    results.clear();
    SkStrSplit("\n", "\n", kStrict_SkStrSplitMode, &results);
    REPORTER_ASSERT(r, results.size() == 2);
    REPORTER_ASSERT(r, results[0].equals(""));
    REPORTER_ASSERT(r, results[1].equals(""));

    results.clear();
    SkStrSplit("", "\n", kStrict_SkStrSplitMode, &results);
    REPORTER_ASSERT(r, results.size() == 0);

    results.clear();
    SkStrSplit("a", "\n", kStrict_SkStrSplitMode, &results);
    REPORTER_ASSERT(r, results.size() == 1);
    REPORTER_ASSERT(r, results[0].equals("a"));

    results.clear();
    SkStrSplit(",,", ",", kStrict_SkStrSplitMode, &results);
    REPORTER_ASSERT(r, results.size() == 3);
    REPORTER_ASSERT(r, results[0].equals(""));
    REPORTER_ASSERT(r, results[1].equals(""));
    REPORTER_ASSERT(r, results[2].equals(""));

    results.clear();
    SkStrSplit(",a,b,", ",", kStrict_SkStrSplitMode, &results);
    REPORTER_ASSERT(r, results.size() == 4);
    REPORTER_ASSERT(r, results[0].equals(""));
    REPORTER_ASSERT(r, results[1].equals("a"));
    REPORTER_ASSERT(r, results[2].equals("b"));
    REPORTER_ASSERT(r, results[3].equals(""));
}

// https://bugs.chromium.org/p/skia/issues/detail?id=7107
DEF_TEST(String_Threaded, r) {
    SkString str("foo");

    std::thread threads[5];
    for (auto& thread : threads) {
        thread = std::thread([&] {
            SkString copy = str;  // NOLINT(performance-unnecessary-copy-initialization)
            (void)copy.equals("test");
        });
    }
    for (auto& thread : threads) {
        thread.join();
    }
}

// Ensure that the string allocate doesn't internally overflow any calculations, and accidentally
// let us create a string with a requested length longer than we can manage.
DEF_TEST(String_huge, r) {
    // start testing slightly below max 32
    size_t size = UINT32_MAX - 16;
    // See where we crash, and manually check that its at the right point.
    //
    //  To test, change the false to true
    if ((false)) {
        for (;;) {
            // On a 64bit build, this should crash when size == 1 << 32, since we can't store
            // that length in the string's header (which has a u32 slot for the length).
            //
            // On a 32bit build, this should crash the first time around, since we can't allocate
            // anywhere near this amount.
            //
            SkString str(size);
            size += 1;
        }
    }
}

DEF_TEST(String_fromUTF16, r) {
    // test data produced with `iconv`.
    const uint16_t test1[] = {
        0xD835, 0xDCD0, 0xD835, 0xDCD1, 0xD835, 0xDCD2, 0xD835, 0xDCD3, 0xD835, 0xDCD4, 0x0020,
        0xD835, 0xDCD5, 0xD835, 0xDCD6, 0xD835, 0xDCD7, 0xD835, 0xDCD8, 0xD835, 0xDCD9
    };
    REPORTER_ASSERT(r, SkStringFromUTF16(test1, std::size(test1)).equals("𝓐𝓑𝓒𝓓𝓔 𝓕𝓖𝓗𝓘𝓙"));

    const uint16_t test2[] = {
        0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0020, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A,
    };
    REPORTER_ASSERT(r, SkStringFromUTF16(test2, std::size(test2)).equals("ABCDE FGHIJ"));

    const uint16_t test3[] = {
        0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x0020, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA,
    };
    REPORTER_ASSERT(r, SkStringFromUTF16(test3, std::size(test3)).equals("αβγδε ζηθικ"));
}

static void test_va_list_print(skiatest::Reporter* r, const char format[], ...)
        SK_PRINTF_LIKE(2, 3);

static void test_va_list_print(skiatest::Reporter* r, const char format[], ...) {
    va_list args;
    va_start(args, format);

    SkString str("123");
    str.printVAList(format, args);
    REPORTER_ASSERT(r, str.equals("hello world"));

    va_end(args);
}

static void test_va_list_append(skiatest::Reporter* r, const char format[], ...)
        SK_PRINTF_LIKE(2, 3);

static void test_va_list_append(skiatest::Reporter* r, const char format[], ...) {
    va_list args;
    va_start(args, format);

    SkString str("123");
    str.appendVAList(format, args);
    REPORTER_ASSERT(r, str.equals("123hello world"));

    va_end(args);
}

static void test_va_list_prepend(skiatest::Reporter* r, const char format[], ...)
        SK_PRINTF_LIKE(2, 3);

static void test_va_list_prepend(skiatest::Reporter* r, const char format[], ...) {
    va_list args;
    va_start(args, format);

    SkString str("123");
    str.prependVAList(format, args);
    REPORTER_ASSERT(r, str.equals("hello world123"));

    va_end(args);
}

DEF_TEST(String_VAList, r) {
    test_va_list_print(r, "%s %c%c%c%c%c", "hello", 'w', 'o', 'r', 'l', 'd');
    test_va_list_append(r, "%s %c%c%c%c%c", "hello", 'w', 'o', 'r', 'l', 'd');
    test_va_list_prepend(r, "%s %c%c%c%c%c", "hello", 'w', 'o', 'r', 'l', 'd');
}

static void test_va_list_overflow_print(skiatest::Reporter* r, const char format[], ...)
        SK_PRINTF_LIKE(2, 3);

static void test_va_list_overflow_print(skiatest::Reporter* r, const char format[], ...) {
    va_list args;
    va_start(args, format);

    SkString str("X");
    str.printVAList(format, args);
    assert_2000_spaces(r, str);

    va_end(args);
}

static void test_va_list_overflow_append(skiatest::Reporter* r, const char format[], ...)
        SK_PRINTF_LIKE(2, 3);

static void test_va_list_overflow_append(skiatest::Reporter* r, const char format[], ...) {
    va_list args;
    va_start(args, format);

    SkString str("X");
    str.appendVAList(format, args);
    REPORTER_ASSERT(r, str[0] == 'X');
    str[0] = ' ';
    assert_2000_spaces(r, str);

    va_end(args);
}

static void test_va_list_overflow_prepend(skiatest::Reporter* r, const char format[], ...)
        SK_PRINTF_LIKE(2, 3);

static void test_va_list_overflow_prepend(skiatest::Reporter* r, const char format[], ...) {
    va_list args;
    va_start(args, format);

    SkString str("X");
    str.prependVAList(format, args);
    REPORTER_ASSERT(r, str[1999] == 'X');
    str[1999] = ' ';
    assert_2000_spaces(r, str);

    va_end(args);
}

DEF_TEST(String_VAList_overflow, r) {
    test_va_list_overflow_print(r, "%2000s", " ");
    test_va_list_overflow_append(r, "%1999s", " ");
    test_va_list_overflow_prepend(r, "%1999s", " ");
}

DEF_TEST(String_resize_to_nothing, r) {
    SkString s("hello world!");
    REPORTER_ASSERT(r, s.equals("hello world!"));
    s.resize(0);
    REPORTER_ASSERT(r, s.equals(""));
}

DEF_TEST(String_resize_shrink, r) {
    SkString s("hello world!");
    REPORTER_ASSERT(r, s.equals("hello world!"));
    s.resize(5);
    REPORTER_ASSERT(r, s.equals("hello"));
}

DEF_TEST(String_resize_grow, r) {
    SkString s("hello world!");
    REPORTER_ASSERT(r, s.equals("hello world!"));
    s.resize(25);
    REPORTER_ASSERT(r, 0 == strcmp(s.c_str(), "hello world!"));  // no promises about data past \0
    REPORTER_ASSERT(r, s.size() == 25);
}

DEF_TEST(String_resize_after_assignment, r) {
    SkString s("hello world!");
    SkString t;
    t = s;
    REPORTER_ASSERT(r, s.equals("hello world!"));
    s.resize(25);
    REPORTER_ASSERT(r, 0 == strcmp(s.c_str(), "hello world!"));
    REPORTER_ASSERT(r, s.size() == 25);
    s.resize(5);
    REPORTER_ASSERT(r, s.equals("hello"));
}

static void resize_helper_function(skiatest::Reporter* r, SkString s) {
    REPORTER_ASSERT(r, s.equals("hello world!"));
    s.resize(5);
    REPORTER_ASSERT(r, s.equals("hello"));
    s.resize(25);
    REPORTER_ASSERT(r, 0 == strcmp(s.c_str(), "hello"));
    REPORTER_ASSERT(r, s.size() == 25);
}

DEF_TEST(String_resize_after_copy_construction, r) {
    SkString s("hello world!");
    resize_helper_function(r, s);
}
