#include <iostream>

#include "test.h"

#include "ConstantString.h"

namespace {

constexpr wchar_t GREEK_SMALL_LETTER_PI{0x03C0};
constexpr wchar_t EMOJI_GRINNING_FACE_HIGH{0xD83D};
constexpr wchar_t EMOJI_GRINNING_FACE_LOW{0xDE00};
constexpr char32_t EMOJI_GRINNING_FACE{0x1F600};

constexpr yekneb::ConstantString ascii{"abc"};
constexpr yekneb::ConstantString greek_pi{"π"};
constexpr yekneb::ConstantString emoji{"😀"};

static_assert(ascii.m_wide_len == 3);
static_assert(ascii.m_wide[0] == L'a');
static_assert(ascii.m_wide[1] == L'b');
static_assert(ascii.m_wide[2] == L'c');

static_assert(greek_pi.m_wide_len == 1);
static_assert(greek_pi.m_wide[0] == GREEK_SMALL_LETTER_PI);

constexpr bool is_utf16_wchar{sizeof(wchar_t) == 2};
static_assert((!is_utf16_wchar && emoji.m_wide_len == 1) || (is_utf16_wchar && emoji.m_wide_len == 2));
static_assert(!is_utf16_wchar || emoji.m_wide[0] == EMOJI_GRINNING_FACE_HIGH);
static_assert(!is_utf16_wchar || emoji.m_wide[1] == EMOJI_GRINNING_FACE_LOW);
static_assert(is_utf16_wchar || emoji.m_wide[0] == EMOJI_GRINNING_FACE);

} // namespace

bool TestConstantString()
{
    std::wcout
        << __func__ << L'\n'
        << L"======================================================================" << L'\n'
        << L"ConstantString successfully processed ASCII, Greek, and Emoji characters at compile time." << L'\n'
        << L"  ASCII (char): " << ascii.get<char>() << L'\n'
        << L"  ASCII (wchar_t): " << ascii.get<wchar_t>() << L'\n'
        << L"  Greek Pi (char): " << greek_pi.get<char>() << L'\n'
        << L"  Greek Pi (wchar_t): " << greek_pi.get<wchar_t>() << L'\n'
        << L"  Emoji (char): " << emoji.get<char>() << L'\n'
        << L"  Emoji (wchar_t): " << emoji.get<wchar_t>() << L'\n'
        << L'\n' << L'\n';
    return true;
}
