/*
 * 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/SkTArray.h"
#include "src/core/SkStringUtils.h"
#include "tests/Test.h"

#include <array>
#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"));

    struct Rec {
        SkScalar    fValue;
        const char* fString;
    };
    static constexpr auto gRec = std::to_array<Rec>({
            Rec{             0,               "0"},
            Rec{    SK_Scalar1,               "1"},
            Rec{   -SK_Scalar1,              "-1"},
            Rec{SK_Scalar1 / 2,             "0.5"},
            Rec{      INFINITY,             "inf"},
            Rec{     -INFINITY,            "-inf"},
            Rec{           NAN,             "nan"},
            Rec{          -NAN,             "nan"},
#if defined(SK_BUILD_FOR_WIN) && (_MSC_VER < 1900)
            Rec{ 3.4028234e38f,  "3.4028235e+038"},
            Rec{-3.4028234e38f, "-3.4028235e+038"},
#else
            Rec{ 3.4028234e38f,   "3.4028235e+38"},
            Rec{-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);
}
