//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

// <string>

// string to_string(int val);
// string to_string(unsigned val);
// string to_string(long val);
// string to_string(unsigned long val);
// string to_string(long long val);
// string to_string(unsigned long long val);
// string to_string(float val);
// string to_string(double val);
// string to_string(long double val);

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

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

template <class T>
void test_signed() {
  {
    std::string s = std::to_string(T(0));
    assert(s.size() == 1);
    assert(s[s.size()] == 0);
    assert(s == "0");
  }
  {
    std::string s = std::to_string(T(12345));
    assert(s.size() == 5);
    assert(s[s.size()] == 0);
    assert(s == "12345");
  }
  {
    std::string s = std::to_string(T(-12345));
    assert(s.size() == 6);
    assert(s[s.size()] == 0);
    assert(s == "-12345");
  }
  {
    std::string s = std::to_string(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::string s = std::to_string(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::string s = std::to_string(T(0));
    assert(s.size() == 1);
    assert(s[s.size()] == 0);
    assert(s == "0");
  }
  {
    std::string s = std::to_string(T(12345));
    assert(s.size() == 5);
    assert(s[s.size()] == 0);
    assert(s == "12345");
  }
  {
    std::string s = std::to_string(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::string s = std::to_string(T(0));
    assert(s.size() == 8);
    assert(s[s.size()] == 0);
    assert(s == "0.000000");
  }
  {
    std::string s = std::to_string(T(12345));
    assert(s.size() == 12);
    assert(s[s.size()] == 0);
    assert(s == "12345.000000");
  }
  {
    std::string s = std::to_string(T(-12345));
    assert(s.size() == 13);
    assert(s[s.size()] == 0);
    assert(s == "-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;
}
