// // Copyright 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::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); }