//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// XFAIL: no-wide-characters

// <string>

// wstring to_wstring(int val);
// wstring to_wstring(unsigned val);
// wstring to_wstring(long val);
// wstring to_wstring(unsigned long val);
// wstring to_wstring(long long val);
// wstring to_wstring(unsigned long long val);
// wstring to_wstring(float val);
// wstring to_wstring(double val);
// wstring to_wstring(long double val);

#include <string>
#include <cassert>
#include <limits>

#include "parse_integer.h"
#include "test_macros.h"

template <class T>
void test_signed() {
  {
    std::wstring s = std::to_wstring(T(0));
    assert(s.size() == 1);
    assert(s[s.size()] == 0);
    assert(s == L"0");
  }
  {
    std::wstring s = std::to_wstring(T(12345));
    assert(s.size() == 5);
    assert(s[s.size()] == 0);
    assert(s == L"12345");
  }
  {
    std::wstring s = std::to_wstring(T(-12345));
    assert(s.size() == 6);
    assert(s[s.size()] == 0);
    assert(s == L"-12345");
  }
  {
    std::wstring s = std::to_wstring(std::numeric_limits<T>::max());
    assert(s.size() == std::numeric_limits<T>::digits10 + 1);
    T t = parse_integer<T>(s);
    assert(t == std::numeric_limits<T>::max());
  }
  {
    std::wstring s = std::to_wstring(std::numeric_limits<T>::min());
    T t            = parse_integer<T>(s);
    assert(t == std::numeric_limits<T>::min());
  }
}

template <class T>
void test_unsigned() {
  {
    std::wstring s = std::to_wstring(T(0));
    assert(s.size() == 1);
    assert(s[s.size()] == 0);
    assert(s == L"0");
  }
  {
    std::wstring s = std::to_wstring(T(12345));
    assert(s.size() == 5);
    assert(s[s.size()] == 0);
    assert(s == L"12345");
  }
  {
    std::wstring s = std::to_wstring(std::numeric_limits<T>::max());
    assert(s.size() == std::numeric_limits<T>::digits10 + 1);
    T t = parse_integer<T>(s);
    assert(t == std::numeric_limits<T>::max());
  }
}

template <class T>
void test_float() {
  {
    std::wstring s = std::to_wstring(T(0));
    assert(s.size() == 8);
    assert(s[s.size()] == 0);
    assert(s == L"0.000000");
  }
  {
    std::wstring s = std::to_wstring(T(12345));
    assert(s.size() == 12);
    assert(s[s.size()] == 0);
    assert(s == L"12345.000000");
  }
  {
    std::wstring s = std::to_wstring(T(-12345));
    assert(s.size() == 13);
    assert(s[s.size()] == 0);
    assert(s == L"-12345.000000");
  }
}

int main(int, char**) {
  test_signed<int>();
  test_signed<long>();
  test_signed<long long>();
  test_unsigned<unsigned>();
  test_unsigned<unsigned long>();
  test_unsigned<unsigned long long>();
  test_float<float>();
  test_float<double>();
  test_float<long double>();

  return 0;
}
