//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17

// <string_view>

//   constexpr bool starts_with(string_view x) const noexcept;

#include <string_view>
#include <cassert>

#include "test_macros.h"
#include "constexpr_char_traits.hpp"

int main(int, char**)
{
    {
    typedef std::string_view SV;
    const char *s = "abcde";
    SV  sv0 {};
    SV  sv1 { s, 1 };
    SV  sv2 { s, 2 };
    SV  sv3 { s, 3 };
    SV  sv4 { s, 4 };
    SV  sv5 { s, 5 };
    SV  svNot {"def", 3 };

    ASSERT_NOEXCEPT(sv0.starts_with(sv0));

    assert ( sv0.starts_with(sv0));
    assert (!sv0.starts_with(sv1));

    assert ( sv1.starts_with(sv0));
    assert ( sv1.starts_with(sv1));
    assert (!sv1.starts_with(sv2));
    assert (!sv1.starts_with(sv3));
    assert (!sv1.starts_with(sv4));
    assert (!sv1.starts_with(sv5));
    assert (!sv1.starts_with(svNot));

    assert ( sv2.starts_with(sv0));
    assert ( sv2.starts_with(sv1));
    assert ( sv2.starts_with(sv2));
    assert (!sv2.starts_with(sv3));
    assert (!sv2.starts_with(sv4));
    assert (!sv2.starts_with(sv5));
    assert (!sv2.starts_with(svNot));

    assert ( svNot.starts_with(sv0));
    assert (!svNot.starts_with(sv1));
    assert (!svNot.starts_with(sv2));
    assert (!svNot.starts_with(sv3));
    assert (!svNot.starts_with(sv4));
    assert (!svNot.starts_with(sv5));
    assert ( svNot.starts_with(svNot));
    }

#if TEST_STD_VER > 11
    {
    typedef std::basic_string_view<char, constexpr_char_traits<char>> SV;
    constexpr const char *s = "abcde";
    constexpr SV  sv0 {};
    constexpr SV  sv1 { s, 1 };
    constexpr SV  sv2 { s, 2 };
    constexpr SV  sv3 { s, 3 };
    constexpr SV  sv4 { s, 4 };
    constexpr SV  sv5 { s, 5 };
    constexpr SV  svNot {"def", 3 };

    static_assert ( sv0.starts_with(sv0), "" );
    static_assert (!sv0.starts_with(sv1), "" );

    static_assert ( sv1.starts_with(sv0), "" );
    static_assert ( sv1.starts_with(sv1), "" );
    static_assert (!sv1.starts_with(sv2), "" );
    static_assert (!sv1.starts_with(sv3), "" );
    static_assert (!sv1.starts_with(sv4), "" );
    static_assert (!sv1.starts_with(sv5), "" );
    static_assert (!sv1.starts_with(svNot), "" );

    static_assert ( sv2.starts_with(sv0), "" );
    static_assert ( sv2.starts_with(sv1), "" );
    static_assert ( sv2.starts_with(sv2), "" );
    static_assert (!sv2.starts_with(sv3), "" );
    static_assert (!sv2.starts_with(sv4), "" );
    static_assert (!sv2.starts_with(sv5), "" );
    static_assert (!sv2.starts_with(svNot), "" );

    static_assert ( svNot.starts_with(sv0), "" );
    static_assert (!svNot.starts_with(sv1), "" );
    static_assert (!svNot.starts_with(sv2), "" );
    static_assert (!svNot.starts_with(sv3), "" );
    static_assert (!svNot.starts_with(sv4), "" );
    static_assert (!svNot.starts_with(sv5), "" );
    static_assert ( svNot.starts_with(svNot), "" );
    }
#endif

  return 0;
}
