• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2016 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // ConstantFoldingNaN_test.cpp:
7 //   Tests for constant folding that results in NaN according to IEEE and should also generate a
8 //   warning. The ESSL spec does not mandate generating NaNs, but this is reasonable behavior in
9 //   this case.
10 //
11 
12 #include "tests/test_utils/ConstantFoldingTest.h"
13 
14 using namespace sh;
15 
16 namespace
17 {
18 
19 class ConstantFoldingNaNExpressionTest : public ConstantFoldingExpressionTest
20 {
21   public:
ConstantFoldingNaNExpressionTest()22     ConstantFoldingNaNExpressionTest() {}
23 
evaluateFloatNaN(const std::string & floatString)24     void evaluateFloatNaN(const std::string &floatString)
25     {
26         evaluateFloat(floatString);
27         ASSERT_TRUE(constantFoundInAST(std::numeric_limits<float>::quiet_NaN()));
28         ASSERT_TRUE(hasWarning());
29     }
30 };
31 
32 }  // anonymous namespace
33 
34 // Test that infinity - infinity evaluates to NaN.
TEST_F(ConstantFoldingNaNExpressionTest,FoldInfinityMinusInfinity)35 TEST_F(ConstantFoldingNaNExpressionTest, FoldInfinityMinusInfinity)
36 {
37     const std::string &floatString = "1.0e2048 - 1.0e2048";
38     evaluateFloatNaN(floatString);
39 }
40 
41 // Test that infinity + negative infinity evaluates to NaN.
TEST_F(ConstantFoldingNaNExpressionTest,FoldInfinityPlusNegativeInfinity)42 TEST_F(ConstantFoldingNaNExpressionTest, FoldInfinityPlusNegativeInfinity)
43 {
44     const std::string &floatString = "1.0e2048 + (-1.0e2048)";
45     evaluateFloatNaN(floatString);
46 }
47 
48 // Test that infinity multiplied by zero evaluates to NaN.
TEST_F(ConstantFoldingNaNExpressionTest,FoldInfinityMultipliedByZero)49 TEST_F(ConstantFoldingNaNExpressionTest, FoldInfinityMultipliedByZero)
50 {
51     const std::string &floatString = "1.0e2048 * 0.0";
52     evaluateFloatNaN(floatString);
53 }
54 
55 // Test that infinity divided by infinity evaluates to NaN.
TEST_F(ConstantFoldingNaNExpressionTest,FoldInfinityDividedByInfinity)56 TEST_F(ConstantFoldingNaNExpressionTest, FoldInfinityDividedByInfinity)
57 {
58     const std::string &floatString = "1.0e2048 / 1.0e2048";
59     evaluateFloatNaN(floatString);
60 }
61 
62 // Test that zero divided by zero evaluates to NaN.
TEST_F(ConstantFoldingNaNExpressionTest,FoldZeroDividedByZero)63 TEST_F(ConstantFoldingNaNExpressionTest, FoldZeroDividedByZero)
64 {
65     const std::string &floatString = "0.0 / 0.0";
66     evaluateFloatNaN(floatString);
67 }
68