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

// double stod(const string& str, size_t *idx = 0);
// double stod(const wstring& str, size_t *idx = 0);

#include <string>
#include <cmath>
#include <cassert>
#include <stdexcept>

#include "test_macros.h"

int main(int, char**) {
  // char
  {
    assert(std::stod("0") == 0);
    assert(std::stod("-0") == 0);
    assert(std::stod("-10") == -10);
    assert(std::stod(" 10") == 10);
    {
      std::size_t idx = 0;
      assert(std::stod("10g", &idx) == 10);
      assert(idx == 2);
    }
    {
      std::size_t idx = 0;
      assert(std::stod("1.e60", &idx) == 1.e60);
      assert(idx == 5);
    }
    {
      std::size_t idx = 0;
      assert(std::stod("INF", &idx) == INFINITY);
      assert(idx == 3);
    }
    {
      std::size_t idx = 0;
      assert(std::isnan(std::stod("NAN", &idx)));
      assert(idx == 3);
    }

#ifndef TEST_HAS_NO_EXCEPTIONS
    {
      std::size_t idx = 0;
      try {
        assert(std::stod("1.e360", &idx) == INFINITY);
        assert(false);
      } catch (const std::out_of_range&) {
        assert(idx == 0);
      }
    }
    {
      std::size_t idx = 0;
      try {
        (void)std::stod("", &idx);
        assert(false);
      } catch (const std::invalid_argument&) {
        assert(idx == 0);
      }
    }
    {
      std::size_t idx = 0;
      try {
        (void)std::stod("  - 8", &idx);
        assert(false);
      } catch (const std::invalid_argument&) {
        assert(idx == 0);
      }
    }
    {
      std::size_t idx = 0;
      try {
        (void)std::stod("a1", &idx);
        assert(false);
      } catch (const std::invalid_argument&) {
        assert(idx == 0);
      }
    }
#endif // TEST_HAS_NO_EXCEPTIONS
  }

  // wchar_t
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
  {
    assert(std::stod(L"0") == 0);
    assert(std::stod(L"-0") == 0);
    assert(std::stod(L"-10.5") == -10.5);
    assert(std::stod(L" 10") == 10);
    {
      std::size_t idx = 0;
      assert(std::stod(L"10g", &idx) == 10);
      assert(idx == 2);
    }
    {
      std::size_t idx = 0;
      assert(std::stod(L"1.e60", &idx) == 1.e60);
      assert(idx == 5);
    }
    {
      std::size_t idx = 0;
      assert(std::stod(L"INF", &idx) == INFINITY);
      assert(idx == 3);
    }
    {
      std::size_t idx = 0;
      assert(std::isnan(std::stod(L"NAN", &idx)));
      assert(idx == 3);
    }
#  ifndef TEST_HAS_NO_EXCEPTIONS
    {
      std::size_t idx = 0;
      try {
        assert(std::stod(L"1.e360", &idx) == INFINITY);
        assert(false);
      } catch (const std::out_of_range&) {
        assert(idx == 0);
      }
    }
    {
      std::size_t idx = 0;
      try {
        (void)std::stod(L"", &idx);
        assert(false);
      } catch (const std::invalid_argument&) {
        assert(idx == 0);
      }
    }
    {
      std::size_t idx = 0;
      try {
        (void)std::stod(L"  - 8", &idx);
        assert(false);
      } catch (const std::invalid_argument&) {
        assert(idx == 0);
      }
    }
    {
      std::size_t idx = 0;
      try {
        (void)std::stod(L"a1", &idx);
        assert(false);
      } catch (const std::invalid_argument&) {
        assert(idx == 0);
      }
    }
#  endif // TEST_HAS_NO_EXCEPTIONS
  }
#endif // TEST_HAS_NO_WIDE_CHARACTERS

  return 0;
}
