blob: 33bdb69f736a0e9e7389fbaa2e067db22ec7cba3 [file] [log] [blame]
//
// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// ConstantFoldingNaN_test.cpp:
// Tests for constant folding that results in NaN according to IEEE and should also generate a
// warning. The ESSL spec does not mandate generating NaNs, but this is reasonable behavior in
// this case.
//
#include "tests/test_utils/ConstantFoldingTest.h"
using namespace sh;
namespace
{
class ConstantFoldingNaNExpressionTest : public ConstantFoldingExpressionTest
{
public:
ConstantFoldingNaNExpressionTest() {}
void evaluateFloatNaN(const std::string &floatString)
{
evaluateFloat(floatString);
ASSERT_TRUE(constantFoundInAST(std::numeric_limits<float>::quiet_NaN()));
ASSERT_TRUE(hasWarning());
}
};
} // anonymous namespace
// Test that infinity - infinity evaluates to NaN.
TEST_F(ConstantFoldingNaNExpressionTest, FoldInfinityMinusInfinity)
{
const std::string &floatString = "1.0e2048 - 1.0e2048";
evaluateFloatNaN(floatString);
}
// Test that infinity + negative infinity evaluates to NaN.
TEST_F(ConstantFoldingNaNExpressionTest, FoldInfinityPlusNegativeInfinity)
{
const std::string &floatString = "1.0e2048 + (-1.0e2048)";
evaluateFloatNaN(floatString);
}
// Test that infinity multiplied by zero evaluates to NaN.
TEST_F(ConstantFoldingNaNExpressionTest, FoldInfinityMultipliedByZero)
{
const std::string &floatString = "1.0e2048 * 0.0";
evaluateFloatNaN(floatString);
}
// Test that infinity divided by infinity evaluates to NaN.
TEST_F(ConstantFoldingNaNExpressionTest, FoldInfinityDividedByInfinity)
{
const std::string &floatString = "1.0e2048 / 1.0e2048";
evaluateFloatNaN(floatString);
}
// Test that zero divided by zero evaluates to NaN.
TEST_F(ConstantFoldingNaNExpressionTest, FoldZeroDividedByZero)
{
const std::string &floatString = "0.0 / 0.0";
evaluateFloatNaN(floatString);
}