// Copyright 2023 The Dawn & Tint Authors
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
//    list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
//    contributors may be used to endorse or promote products derived from
//    this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "src/tint/lang/core/constant/eval_test.h"

#include "src/tint/lang/core/constant/scalar.h"

using namespace tint::core::number_suffixes;  // NOLINT

namespace tint::core::constant::test {
namespace {

class ConstEvalRuntimeSemanticsTest : public ConstEvalTest {
  protected:
    /// Default constructor.
    ConstEvalRuntimeSemanticsTest()
        : eval(Eval(constants, Diagnostics(), /* use_runtime_semantics */ true)) {}

    /// The Eval object used during testing (has runtime semantics enabled).
    Eval eval;

    /// @returns the contents of the diagnostics list as a string
    std::string error() { return Diagnostics().str(); }
};

TEST_F(ConstEvalRuntimeSemanticsTest, Add_AInt_Overflow) {
    auto* a = constants.Get(AInt::Highest());
    auto* b = constants.Get(AInt(1));
    auto result = eval.Plus(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<AInt>(), 0);
    EXPECT_EQ(error(),
              R"(warning: '9223372036854775807 + 1' cannot be represented as 'abstract-int')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Add_AFloat_Overflow) {
    auto* a = constants.Get(AFloat::Highest());
    auto* b = constants.Get(AFloat::Highest());
    auto result = eval.Plus(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<AFloat>(), 0.f);
    EXPECT_EQ(
        error(),
        R"(warning: '179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0 + 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0' cannot be represented as 'abstract-float')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Add_F32_Overflow) {
    auto* a = constants.Get(f32::Highest());
    auto* b = constants.Get(f32::Highest());
    auto result = eval.Plus(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(
        error(),
        R"(warning: '340282346638528859811704183484516925440.0 + 340282346638528859811704183484516925440.0' cannot be represented as 'f32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Sub_AInt_Overflow) {
    auto* a = constants.Get(AInt::Lowest());
    auto* b = constants.Get(AInt(1));
    auto result = eval.Minus(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<AInt>(), 0);
    EXPECT_EQ(error(),
              R"(warning: '-9223372036854775808 - 1' cannot be represented as 'abstract-int')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Sub_AFloat_Overflow) {
    auto* a = constants.Get(AFloat::Lowest());
    auto* b = constants.Get(AFloat::Highest());
    auto result = eval.Minus(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<AFloat>(), 0.f);
    EXPECT_EQ(
        error(),
        R"(warning: '-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0 - 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0' cannot be represented as 'abstract-float')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Sub_F32_Overflow) {
    auto* a = constants.Get(f32::Lowest());
    auto* b = constants.Get(f32::Highest());
    auto result = eval.Minus(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(
        error(),
        R"(warning: '-340282346638528859811704183484516925440.0 - 340282346638528859811704183484516925440.0' cannot be represented as 'f32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Mul_AInt_Overflow) {
    auto* a = constants.Get(AInt::Highest());
    auto* b = constants.Get(AInt(2));
    auto result = eval.Multiply(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<AInt>(), 0);
    EXPECT_EQ(error(),
              R"(warning: '9223372036854775807 * 2' cannot be represented as 'abstract-int')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Mul_AFloat_Overflow) {
    auto* a = constants.Get(AFloat::Highest());
    auto* b = constants.Get(AFloat::Highest());
    auto result = eval.Multiply(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<AFloat>(), 0.f);
    EXPECT_EQ(
        error(),
        R"(warning: '179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0 * 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0' cannot be represented as 'abstract-float')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Mul_F32_Overflow) {
    auto* a = constants.Get(f32::Highest());
    auto* b = constants.Get(f32::Highest());
    auto result = eval.Multiply(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(
        error(),
        R"(warning: '340282346638528859811704183484516925440.0 * 340282346638528859811704183484516925440.0' cannot be represented as 'f32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Div_AInt_ZeroDenominator) {
    auto* a = constants.Get(AInt(42));
    auto* b = constants.Get(AInt(0));
    auto result = eval.Divide(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<AInt>(), 42);
    EXPECT_EQ(error(), R"(warning: '42 / 0' cannot be represented as 'abstract-int')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Div_I32_ZeroDenominator) {
    auto* a = constants.Get(i32(42));
    auto* b = constants.Get(i32(0));
    auto result = eval.Divide(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<i32>(), 42);
    EXPECT_EQ(error(), R"(warning: '42 / 0' cannot be represented as 'i32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Div_U32_ZeroDenominator) {
    auto* a = constants.Get(u32(42));
    auto* b = constants.Get(u32(0));
    auto result = eval.Divide(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<u32>(), 42);
    EXPECT_EQ(error(), R"(warning: '42 / 0' cannot be represented as 'u32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Div_AFloat_ZeroDenominator) {
    auto* a = constants.Get(AFloat(42));
    auto* b = constants.Get(AFloat(0));
    auto result = eval.Divide(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<AFloat>(), 42.f);
    EXPECT_EQ(error(), R"(warning: '42.0 / 0.0' cannot be represented as 'abstract-float')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Div_F32_ZeroDenominator) {
    auto* a = constants.Get(f32(42));
    auto* b = constants.Get(f32(0));
    auto result = eval.Divide(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 42.f);
    EXPECT_EQ(error(), R"(warning: '42.0 / 0.0' cannot be represented as 'f32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Div_I32_MostNegativeByMinInt) {
    auto* a = constants.Get(i32::Lowest());
    auto* b = constants.Get(i32(-1));
    auto result = eval.Divide(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<i32>(), i32::Lowest());
    EXPECT_EQ(error(), R"(warning: '-2147483648 / -1' cannot be represented as 'i32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Mod_AInt_ZeroDenominator) {
    auto* a = constants.Get(AInt(42));
    auto* b = constants.Get(AInt(0));
    auto result = eval.Modulo(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<AInt>(), 0);
    EXPECT_EQ(error(), R"(warning: '42 % 0' cannot be represented as 'abstract-int')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Mod_I32_ZeroDenominator) {
    auto* a = constants.Get(i32(42));
    auto* b = constants.Get(i32(0));
    auto result = eval.Modulo(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<i32>(), 0);
    EXPECT_EQ(error(), R"(warning: '42 % 0' cannot be represented as 'i32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Mod_U32_ZeroDenominator) {
    auto* a = constants.Get(u32(42));
    auto* b = constants.Get(u32(0));
    auto result = eval.Modulo(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<u32>(), 0);
    EXPECT_EQ(error(), R"(warning: '42 % 0' cannot be represented as 'u32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Mod_AFloat_ZeroDenominator) {
    auto* a = constants.Get(AFloat(42));
    auto* b = constants.Get(AFloat(0));
    auto result = eval.Modulo(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<AFloat>(), 0.f);
    EXPECT_EQ(error(), R"(warning: '42.0 % 0.0' cannot be represented as 'abstract-float')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Mod_F32_ZeroDenominator) {
    auto* a = constants.Get(f32(42));
    auto* b = constants.Get(f32(0));
    auto result = eval.Modulo(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(), R"(warning: '42.0 % 0.0' cannot be represented as 'f32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Mod_I32_MostNegativeByMinInt) {
    auto* a = constants.Get(i32::Lowest());
    auto* b = constants.Get(i32(-1));
    auto result = eval.Modulo(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<i32>(), 0);
    EXPECT_EQ(error(), R"(warning: '-2147483648 % -1' cannot be represented as 'i32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, ShiftLeft_AInt_SignChange) {
    auto* a = constants.Get(AInt(0x0FFFFFFFFFFFFFFFll));
    auto* b = constants.Get(u32(9));
    auto result = eval.ShiftLeft(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<AInt>(), static_cast<AInt>(0x0FFFFFFFFFFFFFFFull << 9));
    EXPECT_EQ(error(), R"(warning: shift left operation results in sign change)");
}

TEST_F(ConstEvalRuntimeSemanticsTest, ShiftLeft_I32_SignChange) {
    auto* a = constants.Get(i32(0x0FFFFFFF));
    auto* b = constants.Get(u32(9));
    auto result = eval.ShiftLeft(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<i32>(), static_cast<i32>(0x0FFFFFFFu << 9));
    EXPECT_EQ(error(), R"(warning: shift left operation results in sign change)");
}

TEST_F(ConstEvalRuntimeSemanticsTest, ShiftLeft_I32_MoreThanBitWidth) {
    auto* a = constants.Get(i32(0x1));
    auto* b = constants.Get(u32(33));
    auto result = eval.ShiftLeft(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<i32>(), 2);
    EXPECT_EQ(
        error(),
        R"(warning: shift left value must be less than the bit width of the lhs, which is 32)");
}

TEST_F(ConstEvalRuntimeSemanticsTest, ShiftLeft_U32_MoreThanBitWidth) {
    auto* a = constants.Get(u32(0x1));
    auto* b = constants.Get(u32(33));
    auto result = eval.ShiftLeft(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<u32>(), 2);
    EXPECT_EQ(
        error(),
        R"(warning: shift left value must be less than the bit width of the lhs, which is 32)");
}

TEST_F(ConstEvalRuntimeSemanticsTest, ShiftRight_I32_MoreThanBitWidth) {
    auto* a = constants.Get(i32(0x2));
    auto* b = constants.Get(u32(33));
    auto result = eval.ShiftRight(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<i32>(), 1);
    EXPECT_EQ(
        error(),
        R"(warning: shift right value must be less than the bit width of the lhs, which is 32)");
}

TEST_F(ConstEvalRuntimeSemanticsTest, ShiftRight_U32_MoreThanBitWidth) {
    auto* a = constants.Get(u32(0x2));
    auto* b = constants.Get(u32(33));
    auto result = eval.ShiftRight(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<u32>(), 1);
    EXPECT_EQ(
        error(),
        R"(warning: shift right value must be less than the bit width of the lhs, which is 32)");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Acos_F32_OutOfRange) {
    auto* a = constants.Get(f32(2));
    auto result = eval.acos(a->Type(), Vector{a}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(),
              R"(warning: acos must be called with a value in the range [-1 .. 1] (inclusive))");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Acosh_F32_OutOfRange) {
    auto* a = constants.Get(f32(-1));
    auto result = eval.acosh(a->Type(), Vector{a}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(), R"(warning: acosh must be called with a value >= 1.0)");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Asin_F32_OutOfRange) {
    auto* a = constants.Get(f32(2));
    auto result = eval.asin(a->Type(), Vector{a}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(),
              R"(warning: asin must be called with a value in the range [-1 .. 1] (inclusive))");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Atanh_F32_OutOfRange) {
    auto* a = constants.Get(f32(2));
    auto result = eval.atanh(a->Type(), Vector{a}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(),
              R"(warning: atanh must be called with a value in the range (-1 .. 1) (exclusive))");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Exp_F32_Overflow) {
    auto* a = constants.Get(f32(1000));
    auto result = eval.exp(a->Type(), Vector{a}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(), R"(warning: e^1000.0 cannot be represented as 'f32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Exp2_F32_Overflow) {
    auto* a = constants.Get(f32(1000));
    auto result = eval.exp2(a->Type(), Vector{a}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(), R"(warning: 2^1000.0 cannot be represented as 'f32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, ExtractBits_I32_TooManyBits) {
    auto* a = constants.Get(i32(0x12345678));
    auto* offset = constants.Get(u32(24));
    auto* count = constants.Get(u32(16));
    auto result = eval.extractBits(a->Type(), Vector{a, offset, count}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<i32>(), 0x12);
    EXPECT_EQ(error(),
              R"(warning: 'offset + 'count' must be less than or equal to the bit width of 'e')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, ExtractBits_U32_TooManyBits) {
    auto* a = constants.Get(u32(0x12345678));
    auto* offset = constants.Get(u32(24));
    auto* count = constants.Get(u32(16));
    auto result = eval.extractBits(a->Type(), Vector{a, offset, count}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<u32>(), 0x12);
    EXPECT_EQ(error(),
              R"(warning: 'offset + 'count' must be less than or equal to the bit width of 'e')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, InsertBits_I32_TooManyBits) {
    auto* a = constants.Get(i32(0x99345678));
    auto* b = constants.Get(i32(0x12));
    auto* offset = constants.Get(u32(24));
    auto* count = constants.Get(u32(16));
    auto result = eval.insertBits(a->Type(), Vector{a, b, offset, count}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<i32>(), 0x12345678);
    EXPECT_EQ(error(),
              R"(warning: 'offset + 'count' must be less than or equal to the bit width of 'e')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, InsertBits_U32_TooManyBits) {
    auto* a = constants.Get(u32(0x99345678));
    auto* b = constants.Get(u32(0x12));
    auto* offset = constants.Get(u32(24));
    auto* count = constants.Get(u32(16));
    auto result = eval.insertBits(a->Type(), Vector{a, b, offset, count}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<u32>(), 0x12345678);
    EXPECT_EQ(error(),
              R"(warning: 'offset + 'count' must be less than or equal to the bit width of 'e')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, InverseSqrt_F32_OutOfRange) {
    auto* a = constants.Get(f32(-1));
    auto result = eval.inverseSqrt(a->Type(), Vector{a}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(), R"(warning: inverseSqrt must be called with a value > 0)");
}

TEST_F(ConstEvalRuntimeSemanticsTest, LDExpr_F32_OutOfRange) {
    auto* a = constants.Get(f32(42.f));
    auto* b = constants.Get(f32(200));
    auto result = eval.ldexp(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(), R"(warning: e2 must be less than or equal to 128)");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Log_F32_OutOfRange) {
    auto* a = constants.Get(f32(-1));
    auto result = eval.log(a->Type(), Vector{a}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(), R"(warning: log must be called with a value > 0)");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Log2_F32_OutOfRange) {
    auto* a = constants.Get(f32(-1));
    auto result = eval.log2(a->Type(), Vector{a}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(), R"(warning: log2 must be called with a value > 0)");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Normalize_ZeroLength) {
    auto* zero = constants.Get(f32(0));
    auto* vec =
        eval.VecSplat(create<core::type::Vector>(create<core::type::F32>(), 4u), Vector{zero}, {})
            .Get();
    auto result = eval.normalize(vec->Type(), Vector{vec}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->Index(0)->ValueAs<f32>(), 0.f);
    EXPECT_EQ(result.Get()->Index(1)->ValueAs<f32>(), 0.f);
    EXPECT_EQ(result.Get()->Index(2)->ValueAs<f32>(), 0.f);
    EXPECT_EQ(result.Get()->Index(3)->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(), R"(warning: zero length vector can not be normalized)");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Pack2x16Float_OutOfRange) {
    auto* a = constants.Get(f32(75250.f));
    auto* b = constants.Get(f32(42.1f));
    auto* vec =
        eval.VecInitS(create<core::type::Vector>(create<core::type::F32>(), 2u), Vector{a, b}, {})
            .Get();
    auto result = eval.pack2x16float(create<core::type::U32>(), Vector{vec}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<u32>(), 0x51430000);
    EXPECT_EQ(error(), R"(warning: value 75250.0 cannot be represented as 'f16')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Pow_F32_Overflow) {
    auto* a = constants.Get(f32(2));
    auto* b = constants.Get(f32(1000));
    auto result = eval.pow(a->Type(), Vector{a, b}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(), R"(warning: '2.0 ^ 1000.0' cannot be represented as 'f32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Unpack2x16Float_OutOfRange) {
    auto* a = constants.Get(u32(0x51437C00));
    auto result = eval.unpack2x16float(create<core::type::U32>(), Vector{a}, {});
    ASSERT_TRUE(result);
    EXPECT_FLOAT_EQ(result.Get()->Index(0)->ValueAs<f32>(), 0.f);
    EXPECT_FLOAT_EQ(result.Get()->Index(1)->ValueAs<f32>(), 42.09375f);
    EXPECT_EQ(error(), R"(warning: value inf cannot be represented as 'f32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, QuantizeToF16_OutOfRange) {
    auto* a = constants.Get(f32(75250.f));
    auto result = eval.quantizeToF16(create<core::type::U32>(), Vector{a}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<u32>(), 0);
    EXPECT_EQ(error(), R"(warning: value 75250.0 cannot be represented as 'f16')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Sqrt_F32_OutOfRange) {
    auto* a = constants.Get(f32(-1));
    auto result = eval.sqrt(a->Type(), Vector{a}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(), R"(warning: sqrt must be called with a value >= 0)");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Clamp_F32_LowGreaterThanHigh) {
    auto* e = constants.Get(f32(-1));
    auto* low = constants.Get(f32(2));
    auto* high = constants.Get(f32(1));
    auto result = eval.clamp(e->Type(), Vector{e, low, high}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 1.f);
    EXPECT_EQ(error(), R"(warning: clamp called with 'low' (2.0) greater than 'high' (1.0))");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Bitcast_Infinity) {
    auto* a = constants.Get(u32(0x7F800000));
    auto result = eval.Bitcast(create<core::type::F32>(), a, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(), R"(warning: value inf cannot be represented as 'f32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Bitcast_NaN) {
    auto* a = constants.Get(u32(0x7FC00000));
    auto result = eval.Bitcast(create<core::type::F32>(), a, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), 0.f);
    EXPECT_EQ(error(), R"(warning: value nan cannot be represented as 'f32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Convert_F32_TooHigh) {
    auto* a = constants.Get(AFloat::Highest());
    auto result = eval.Convert(create<core::type::F32>(), a, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), f32::kHighestValue);
    EXPECT_EQ(
        error(),
        R"(warning: value 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0 cannot be represented as 'f32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Convert_F32_TooLow) {
    auto* a = constants.Get(AFloat::Lowest());
    auto result = eval.Convert(create<core::type::F32>(), a, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), f32::kLowestValue);
    EXPECT_EQ(
        error(),
        R"(warning: value -179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0 cannot be represented as 'f32')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Convert_F16_TooHigh) {
    auto* a = constants.Get(f32(1000000.0));
    auto result = eval.Convert(create<core::type::F16>(), a, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), f16::kHighestValue);
    EXPECT_EQ(error(), R"(warning: value 1000000.0 cannot be represented as 'f16')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Convert_F16_TooLow) {
    auto* a = constants.Get(f32(-1000000.0));
    auto result = eval.Convert(create<core::type::F16>(), a, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->ValueAs<f32>(), f16::kLowestValue);
    EXPECT_EQ(error(), R"(warning: value -1000000.0 cannot be represented as 'f16')");
}

TEST_F(ConstEvalRuntimeSemanticsTest, Vec_Overflow_SingleComponent) {
    // Test that overflow for an element-wise vector operation only affects a single component.
    auto* vec4f = create<core::type::Vector>(create<core::type::F32>(), 4u);
    auto* a = eval.VecInitS(vec4f,
                            Vector{
                                constants.Get(f32(1)),
                                constants.Get(f32(4)),
                                constants.Get(f32(-1)),
                                constants.Get(f32(65536)),
                            },
                            {})
                  .Get();
    auto result = eval.sqrt(a->Type(), Vector{a}, {});
    ASSERT_TRUE(result);
    EXPECT_EQ(result.Get()->Index(0)->ValueAs<f32>(), 1);
    EXPECT_EQ(result.Get()->Index(1)->ValueAs<f32>(), 2);
    EXPECT_EQ(result.Get()->Index(2)->ValueAs<f32>(), 0);
    EXPECT_EQ(result.Get()->Index(3)->ValueAs<f32>(), 256);
    EXPECT_EQ(error(), R"(warning: sqrt must be called with a value >= 0)");
}

}  // namespace
}  // namespace tint::core::constant::test
