// Copyright 2020 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "src/reader/wgsl/parser_impl_test_helper.h"

#include <cmath>
#include <cstring>

namespace tint {
namespace reader {
namespace wgsl {
namespace {

// Makes an IEEE 754 binary32 floating point number with
// - 0 sign if sign is 0, 1 otherwise
// - 'exponent_bits' is placed in the exponent space.
//   So, the exponent bias must already be included.
float MakeFloat(int sign, int biased_exponent, int mantissa) {
  const uint32_t sign_bit = sign ? 0x80000000u : 0u;
  // The binary32 exponent is 8 bits, just below the sign.
  const uint32_t exponent_bits = (biased_exponent & 0xffu) << 23;
  // The mantissa is the bottom 23 bits.
  const uint32_t mantissa_bits = (mantissa & 0x7fffffu);

  uint32_t bits = sign_bit | exponent_bits | mantissa_bits;
  float result = 0.0f;
  static_assert(sizeof(result) == sizeof(bits),
                "expected float and uint32_t to be the same size");
  std::memcpy(&result, &bits, sizeof(bits));
  return result;
}

TEST_F(ParserImplTest, ConstLiteral_Int) {
  auto p = parser("-234");
  auto c = p->const_literal();
  EXPECT_TRUE(c.matched);
  EXPECT_FALSE(c.errored);
  EXPECT_FALSE(p->has_error()) << p->error();
  ASSERT_NE(c.value, nullptr);
  ASSERT_TRUE(c->Is<ast::SintLiteral>());
  EXPECT_EQ(c->As<ast::SintLiteral>()->value, -234);
  EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 5u}}));
}

TEST_F(ParserImplTest, ConstLiteral_Uint) {
  auto p = parser("234u");
  auto c = p->const_literal();
  EXPECT_TRUE(c.matched);
  EXPECT_FALSE(c.errored);
  EXPECT_FALSE(p->has_error()) << p->error();
  ASSERT_NE(c.value, nullptr);
  ASSERT_TRUE(c->Is<ast::UintLiteral>());
  EXPECT_EQ(c->As<ast::UintLiteral>()->value, 234u);
  EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 5u}}));
}

TEST_F(ParserImplTest, ConstLiteral_Float) {
  auto p = parser("234.e12");
  auto c = p->const_literal();
  EXPECT_TRUE(c.matched);
  EXPECT_FALSE(c.errored);
  EXPECT_FALSE(p->has_error()) << p->error();
  ASSERT_NE(c.value, nullptr);
  ASSERT_TRUE(c->Is<ast::FloatLiteral>());
  EXPECT_FLOAT_EQ(c->As<ast::FloatLiteral>()->value, 234e12f);
  EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 8u}}));
}

TEST_F(ParserImplTest, ConstLiteral_InvalidFloat_IncompleteExponent) {
  auto p = parser("1.0e+");
  auto c = p->const_literal();
  EXPECT_FALSE(c.matched);
  EXPECT_TRUE(c.errored);
  EXPECT_EQ(p->error(),
            "1:1: incomplete exponent for floating point literal: 1.0e+");
  ASSERT_EQ(c.value, nullptr);
}

TEST_F(ParserImplTest, ConstLiteral_InvalidFloat_TooSmallMagnitude) {
  auto p = parser("1e-256");
  auto c = p->const_literal();
  EXPECT_FALSE(c.matched);
  EXPECT_TRUE(c.errored);
  EXPECT_EQ(p->error(),
            "1:1: f32 (1e-256) magnitude too small, not representable");
  ASSERT_EQ(c.value, nullptr);
}

TEST_F(ParserImplTest, ConstLiteral_InvalidFloat_TooLargeNegative) {
  auto p = parser("-1.2e+256");
  auto c = p->const_literal();
  EXPECT_FALSE(c.matched);
  EXPECT_TRUE(c.errored);
  EXPECT_EQ(p->error(), "1:1: f32 (-1.2e+256) too large (negative)");
  ASSERT_EQ(c.value, nullptr);
}

TEST_F(ParserImplTest, ConstLiteral_InvalidFloat_TooLargePositive) {
  auto p = parser("1.2e+256");
  auto c = p->const_literal();
  EXPECT_FALSE(c.matched);
  EXPECT_TRUE(c.errored);
  EXPECT_EQ(p->error(), "1:1: f32 (1.2e+256) too large (positive)");
  ASSERT_EQ(c.value, nullptr);
}

struct FloatLiteralTestCase {
  const char* input;
  float expected;
};

inline std::ostream& operator<<(std::ostream& out, FloatLiteralTestCase data) {
  out << data.input;
  return out;
}

class ParserImplFloatLiteralTest
    : public ParserImplTestWithParam<FloatLiteralTestCase> {};
TEST_P(ParserImplFloatLiteralTest, Parse) {
  auto params = GetParam();
  SCOPED_TRACE(params.input);
  auto p = parser(params.input);
  auto c = p->const_literal();
  EXPECT_TRUE(c.matched);
  EXPECT_FALSE(c.errored);
  EXPECT_FALSE(p->has_error()) << p->error();
  ASSERT_NE(c.value, nullptr);
  ASSERT_TRUE(c->Is<ast::FloatLiteral>());
  EXPECT_FLOAT_EQ(c->As<ast::FloatLiteral>()->value, params.expected);
}

FloatLiteralTestCase float_literal_test_cases[] = {
    {"0.0", 0.0f},                         // Zero
    {"1.0", 1.0f},                         // One
    {"-1.0", -1.0f},                       // MinusOne
    {"1000000000.0", 1e9f},                // Billion
    {"-0.0", std::copysign(0.0f, -5.0f)},  // NegativeZero
    {"0.0", MakeFloat(0, 0, 0)},           // Zero
    {"-0.0", MakeFloat(1, 0, 0)},          // NegativeZero
    {"1.0", MakeFloat(0, 127, 0)},         // One
    {"-1.0", MakeFloat(1, 127, 0)},        // NegativeOne
};
INSTANTIATE_TEST_SUITE_P(ParserImplFloatLiteralTest_Float,
                         ParserImplFloatLiteralTest,
                         testing::ValuesIn(float_literal_test_cases));

const float NegInf = MakeFloat(1, 255, 0);
const float PosInf = MakeFloat(0, 255, 0);
FloatLiteralTestCase hexfloat_literal_test_cases[] = {
    // Regular numbers
    {"0x0p+0", 0.f},
    {"0x1p+0", 1.f},
    {"0x1p+1", 2.f},
    {"0x1.8p+1", 3.f},
    {"0x1.99999ap-4", 0.1f},
    {"0x1p-1", 0.5f},
    {"0x1p-2", 0.25f},
    {"0x1.8p-1", 0.75f},
    {"-0x0p+0", -0.f},
    {"-0x1p+0", -1.f},
    {"-0x1p-1", -0.5f},
    {"-0x1p-2", -0.25f},
    {"-0x1.8p-1", -0.75f},

    // Large numbers
    {"0x1p+9", 512.f},
    {"0x1p+10", 1024.f},
    {"0x1.02p+10", 1024.f + 8.f},
    {"-0x1p+9", -512.f},
    {"-0x1p+10", -1024.f},
    {"-0x1.02p+10", -1024.f - 8.f},

    // Small numbers
    {"0x1p-9", 1.0f / 512.f},
    {"0x1p-10", 1.0f / 1024.f},
    {"0x1.02p-3", 1.0f / 1024.f + 1.0f / 8.f},
    {"-0x1p-9", 1.0f / -512.f},
    {"-0x1p-10", 1.0f / -1024.f},
    {"-0x1.02p-3", 1.0f / -1024.f - 1.0f / 8.f},

    // Near lowest non-denorm
    {"0x1p-124", std::ldexp(1.f * 8.f, -127)},
    {"0x1p-125", std::ldexp(1.f * 4.f, -127)},
    {"-0x1p-124", -std::ldexp(1.f * 8.f, -127)},
    {"-0x1p-125", -std::ldexp(1.f * 4.f, -127)},

    // Lowest non-denorm
    {"0x1p-126", std::ldexp(1.f * 2.f, -127)},
    {"-0x1p-126", -std::ldexp(1.f * 2.f, -127)},

    // Denormalized values
    {"0x1p-127", std::ldexp(1.f, -127)},
    {"0x1p-128", std::ldexp(1.f / 2.f, -127)},
    {"0x1p-129", std::ldexp(1.f / 4.f, -127)},
    {"0x1p-130", std::ldexp(1.f / 8.f, -127)},
    {"-0x1p-127", -std::ldexp(1.f, -127)},
    {"-0x1p-128", -std::ldexp(1.f / 2.f, -127)},
    {"-0x1p-129", -std::ldexp(1.f / 4.f, -127)},
    {"-0x1p-130", -std::ldexp(1.f / 8.f, -127)},

    {"0x1.8p-127", std::ldexp(1.f, -127) + (std::ldexp(1.f, -127) / 2.f)},
    {"0x1.8p-128", std::ldexp(1.f, -127) / 2.f + (std::ldexp(1.f, -127) / 4.f)},

    {"0x1p-149", MakeFloat(0, 0, 1)},                 // +SmallestDenormal
    {"0x1p-148", MakeFloat(0, 0, 2)},                 // +BiggerDenormal
    {"0x1.fffffcp-127", MakeFloat(0, 0, 0x7fffff)},   // +LargestDenormal
    {"-0x1p-149", MakeFloat(1, 0, 1)},                // -SmallestDenormal
    {"-0x1p-148", MakeFloat(1, 0, 2)},                // -BiggerDenormal
    {"-0x1.fffffcp-127", MakeFloat(1, 0, 0x7fffff)},  // -LargestDenormal

    {"0x1.2bfaf8p-127", MakeFloat(0, 0, 0xcafebe)},   // +Subnormal
    {"-0x1.2bfaf8p-127", MakeFloat(1, 0, 0xcafebe)},  // -Subnormal
    {"0x1.55554p-130", MakeFloat(0, 0, 0xaaaaa)},     // +Subnormal
    {"-0x1.55554p-130", MakeFloat(1, 0, 0xaaaaa)},    // -Subnormal

    // Nan -> Infinity
    {"0x1.8p+128", PosInf},
    {"0x1.0002p+128", PosInf},
    {"0x1.0018p+128", PosInf},
    {"0x1.01ep+128", PosInf},
    {"0x1.fffffep+128", PosInf},
    {"-0x1.8p+128", NegInf},
    {"-0x1.0002p+128", NegInf},
    {"-0x1.0018p+128", NegInf},
    {"-0x1.01ep+128", NegInf},
    {"-0x1.fffffep+128", NegInf},

    // Infinity
    {"0x1p+128", PosInf},
    {"-0x1p+128", NegInf},
    {"0x32p+127", PosInf},
    {"0x32p+500", PosInf},
    {"-0x32p+127", NegInf},
    {"-0x32p+500", NegInf},

    // Overflow -> Infinity
    {"0x1p+129", PosInf},
    {"0x1.1p+128", PosInf},
    {"-0x1p+129", NegInf},
    {"-0x1.1p+128", NegInf},
    {"0x1.0p2147483520", PosInf},  // INT_MAX - 127 (largest valid exponent)

    // Underflow -> Zero
    {"0x1p-500", 0.f},  // Exponent underflows
    {"-0x1p-500", -0.f},
    {"0x0.00000000001p-126", 0.f},  // Fraction causes underflow
    {"-0x0.0000000001p-127", -0.f},
    {"0x0.01p-142", 0.f},
    {"-0x0.01p-142", -0.f},    // Fraction causes additional underflow
    {"0x1.0p-2147483520", 0},  // -(INT_MAX - 127) (smallest valid exponent)

    // Zero with non-zero exponent -> Zero
    {"0x0p+0", 0.f},
    {"0x0p+1", 0.f},
    {"0x0p-1", 0.f},
    {"0x0p+9999999999", 0.f},
    {"0x0p-9999999999", 0.f},
    // Same, but with very large positive exponents that would cause overflow
    // if the mantissa were non-zero.
    {"0x0p+4000000000", 0.f},    // 4 billion:
    {"0x0p+40000000000", 0.f},   // 40 billion
    {"-0x0p+40000000000", 0.f},  // As above 2, but negative mantissa
    {"-0x0p+400000000000", 0.f},
    {"0x0.00p+4000000000", 0.f},  // As above 4, but with fractional part
    {"0x0.00p+40000000000", 0.f},
    {"-0x0.00p+40000000000", 0.f},
    {"-0x0.00p+400000000000", 0.f},
    {"0x0p-4000000000", 0.f},  // As above 8, but with negative exponents
    {"0x0p-40000000000", 0.f},
    {"-0x0p-40000000000", 0.f},
    {"-0x0p-400000000000", 0.f},
    {"0x0.00p-4000000000", 0.f},
    {"0x0.00p-40000000000", 0.f},
    {"-0x0.00p-40000000000", 0.f},
    {"-0x0.00p-400000000000", 0.f},

    // Test parsing
    {"0x0p0", 0.f},
    {"0x0p-0", 0.f},
    {"0x0p+000", 0.f},
    {"0x00000000000000p+000000000000000", 0.f},
    {"0x00000000000000p-000000000000000", 0.f},
    {"0x00000000000001p+000000000000000", 1.f},
    {"0x00000000000001p-000000000000000", 1.f},
    {"0x0000000000000000000001.99999ap-000000000000000004", 0.1f},
    {"0x2p+0", 2.f},
    {"0xFFp+0", 255.f},
    {"0x0.8p+0", 0.5f},
    {"0x0.4p+0", 0.25f},
    {"0x0.4p+1", 2 * 0.25f},
    {"0x0.4p+2", 4 * 0.25f},
    {"0x123Ep+1", 9340.f},
    {"-0x123Ep+1", -9340.f},
    {"0x1a2b3cP12", 7.024656e+09f},
    {"-0x1a2b3cP12", -7.024656e+09f},

    // Examples without a binary exponent part.
    {"0x1.", 1.0f},
    {"0x.8", 0.5f},
    {"0x1.8", 1.5f},
    {"-0x1.", -1.0f},
    {"-0x.8", -0.5f},
    {"-0x1.8", -1.5f},
};
INSTANTIATE_TEST_SUITE_P(ParserImplFloatLiteralTest_HexFloat,
                         ParserImplFloatLiteralTest,
                         testing::ValuesIn(hexfloat_literal_test_cases));

struct InvalidLiteralTestCase {
  const char* input;
  const char* error_msg;
};
class ParserImplInvalidLiteralTest
    : public ParserImplTestWithParam<InvalidLiteralTestCase> {};
TEST_P(ParserImplInvalidLiteralTest, Parse) {
  auto params = GetParam();
  SCOPED_TRACE(params.input);
  auto p = parser(params.input);
  auto c = p->const_literal();
  EXPECT_FALSE(c.matched);
  EXPECT_TRUE(c.errored);
  EXPECT_EQ(p->error(), params.error_msg);
  ASSERT_EQ(c.value, nullptr);
}

InvalidLiteralTestCase invalid_hexfloat_mantissa_too_large_cases[] = {
    {"0x1.ffffffff8p0", "1:1: mantissa is too large for hex float"},
    {"0x1f.fffffff8p0", "1:1: mantissa is too large for hex float"},
    {"0x1ff.ffffff8p0", "1:1: mantissa is too large for hex float"},
    {"0x1fff.fffff8p0", "1:1: mantissa is too large for hex float"},
    {"0x1ffff.ffff8p0", "1:1: mantissa is too large for hex float"},
    {"0x1fffff.fff8p0", "1:1: mantissa is too large for hex float"},
    {"0x1ffffff.ff8p0", "1:1: mantissa is too large for hex float"},
    {"0x1fffffff.f8p0", "1:1: mantissa is too large for hex float"},
    {"0x1ffffffff.8p0", "1:1: mantissa is too large for hex float"},
    {"0x1ffffffff8.p0", "1:1: mantissa is too large for hex float"},
};
INSTANTIATE_TEST_SUITE_P(
    ParserImplInvalidLiteralTest_HexFloatMantissaTooLarge,
    ParserImplInvalidLiteralTest,
    testing::ValuesIn(invalid_hexfloat_mantissa_too_large_cases));

InvalidLiteralTestCase invalid_hexfloat_exponent_too_large_cases[] = {
    {"0x1p+2147483521", "1:1: exponent is too large for hex float"},
    {"0x1p-2147483521", "1:1: exponent is too large for hex float"},
    {"0x1p+4294967296", "1:1: exponent is too large for hex float"},
    {"0x1p-4294967296", "1:1: exponent is too large for hex float"},
};
INSTANTIATE_TEST_SUITE_P(
    ParserImplInvalidLiteralTest_HexFloatExponentTooLarge,
    ParserImplInvalidLiteralTest,
    testing::ValuesIn(invalid_hexfloat_exponent_too_large_cases));

InvalidLiteralTestCase invalid_hexfloat_exponent_missing_cases[] = {
    // Lower case p
    {"0x0p", "1:1: expected an exponent value for hex float"},
    {"0x0p+", "1:1: expected an exponent value for hex float"},
    {"0x0p-", "1:1: expected an exponent value for hex float"},
    {"0x1.0p", "1:1: expected an exponent value for hex float"},
    {"0x0.1p", "1:1: expected an exponent value for hex float"},
    // Upper case p
    {"0x0P", "1:1: expected an exponent value for hex float"},
    {"0x0P+", "1:1: expected an exponent value for hex float"},
    {"0x0P-", "1:1: expected an exponent value for hex float"},
    {"0x1.0P", "1:1: expected an exponent value for hex float"},
    {"0x0.1P", "1:1: expected an exponent value for hex float"},
};
INSTANTIATE_TEST_SUITE_P(
    ParserImplInvalidLiteralTest_HexFloatExponentMissing,
    ParserImplInvalidLiteralTest,
    testing::ValuesIn(invalid_hexfloat_exponent_missing_cases));

TEST_F(ParserImplTest, ConstLiteral_FloatHighest) {
  const auto highest = std::numeric_limits<float>::max();
  const auto expected_highest = 340282346638528859811704183484516925440.0f;
  if (highest < expected_highest || highest > expected_highest) {
    GTEST_SKIP() << "std::numeric_limits<float>::max() is not as expected for "
                    "this target";
  }
  auto p = parser("340282346638528859811704183484516925440.0");
  auto c = p->const_literal();
  EXPECT_TRUE(c.matched);
  EXPECT_FALSE(c.errored);
  EXPECT_FALSE(p->has_error()) << p->error();
  ASSERT_NE(c.value, nullptr);
  ASSERT_TRUE(c->Is<ast::FloatLiteral>());
  EXPECT_FLOAT_EQ(c->As<ast::FloatLiteral>()->value,
                  std::numeric_limits<float>::max());
  EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 42u}}));
}

TEST_F(ParserImplTest, ConstLiteral_FloatLowest) {
  // Some compilers complain if you test floating point numbers for equality.
  // So say it via two inequalities.
  const auto lowest = std::numeric_limits<float>::lowest();
  const auto expected_lowest = -340282346638528859811704183484516925440.0f;
  if (lowest < expected_lowest || lowest > expected_lowest) {
    GTEST_SKIP()
        << "std::numeric_limits<float>::lowest() is not as expected for "
           "this target";
  }

  auto p = parser("-340282346638528859811704183484516925440.0");
  auto c = p->const_literal();
  EXPECT_TRUE(c.matched);
  EXPECT_FALSE(c.errored);
  EXPECT_FALSE(p->has_error()) << p->error();
  ASSERT_NE(c.value, nullptr);
  ASSERT_TRUE(c->Is<ast::FloatLiteral>());
  EXPECT_FLOAT_EQ(c->As<ast::FloatLiteral>()->value,
                  std::numeric_limits<float>::lowest());
  EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 43u}}));
}

TEST_F(ParserImplTest, ConstLiteral_True) {
  auto p = parser("true");
  auto c = p->const_literal();
  EXPECT_TRUE(c.matched);
  EXPECT_FALSE(c.errored);
  EXPECT_FALSE(p->has_error()) << p->error();
  ASSERT_NE(c.value, nullptr);
  ASSERT_TRUE(c->Is<ast::BoolLiteral>());
  EXPECT_TRUE(c->As<ast::BoolLiteral>()->value);
  EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 5u}}));
}

TEST_F(ParserImplTest, ConstLiteral_False) {
  auto p = parser("false");
  auto c = p->const_literal();
  EXPECT_TRUE(c.matched);
  EXPECT_FALSE(c.errored);
  EXPECT_FALSE(p->has_error()) << p->error();
  ASSERT_NE(c.value, nullptr);
  ASSERT_TRUE(c->Is<ast::BoolLiteral>());
  EXPECT_FALSE(c->As<ast::BoolLiteral>()->value);
  EXPECT_EQ(c->source.range, (Source::Range{{1u, 1u}, {1u, 6u}}));
}

TEST_F(ParserImplTest, ConstLiteral_NoMatch) {
  auto p = parser("another-token");
  auto c = p->const_literal();
  EXPECT_FALSE(c.matched);
  EXPECT_FALSE(c.errored);
  EXPECT_FALSE(p->has_error()) << p->error();
  ASSERT_EQ(c.value, nullptr);
}

}  // namespace
}  // namespace wgsl
}  // namespace reader
}  // namespace tint
