Path: blob/main_old/src/tests/compiler_tests/FloatLex_test.cpp
1693 views
//1// Copyright 2016 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// FloatLex_test.cpp:6// Tests for parsing floats in GLSL source.7//89#include <sstream>10#include <string>1112#include "common/debug.h"13#include "common/mathutil.h"14#include "compiler/translator/util.h"15#include "gtest/gtest.h"1617namespace18{1920class StrtofClampParser21{22public:23static float Parse(std::string str)24{25float value;26sh::strtof_clamp(str, &value);27return value;28}29};3031class NumericLexFloatParser32{33public:34static float Parse(std::string str) { return sh::NumericLexFloat32OutOfRangeToInfinity(str); }35};3637} // anonymous namespace3839template <typename T>40class FloatLexTest : public ::testing::Test41{42public:43FloatLexTest() {}4445protected:46void SetUp() override {}4748void TearDown() override {}4950static bool ParsedMatches(std::string str, float expected)51{52return (T::Parse(str) == expected);53}5455static bool IsInfinity(std::string str)56{57float f = T::Parse(str);58return gl::isInf(f);59}6061static std::string Zeros(size_t count) { return std::string(count, '0'); }62};6364typedef ::testing::Types<StrtofClampParser, NumericLexFloatParser> FloatParserTypes;65TYPED_TEST_SUITE(FloatLexTest, FloatParserTypes);6667TYPED_TEST(FloatLexTest, One)68{69ASSERT_TRUE(TestFixture::ParsedMatches("1.0", 1.0f));70}7172TYPED_TEST(FloatLexTest, Ten)73{74ASSERT_TRUE(TestFixture::ParsedMatches("10.0", 10.0f));75}7677TYPED_TEST(FloatLexTest, TenScientific)78{79ASSERT_TRUE(TestFixture::ParsedMatches("1.0e1", 10.0f));80}8182TYPED_TEST(FloatLexTest, ScientificWithSmallMantissa)83{84std::stringstream ss;85ss << "0." << TestFixture::Zeros(100) << "125e102";86ASSERT_TRUE(TestFixture::ParsedMatches(ss.str(), 12.5f));87}8889TYPED_TEST(FloatLexTest, ScientificWithLargeMantissa)90{91std::stringstream ss;92ss << "9" << TestFixture::Zeros(100) << ".0e-100";93ASSERT_TRUE(TestFixture::ParsedMatches(ss.str(), 9.0f));94}9596TYPED_TEST(FloatLexTest, ScientificWithVerySmallMantissa)97{98std::stringstream ss;99ss << "0." << TestFixture::Zeros(5000) << "125e5002";100ASSERT_TRUE(TestFixture::ParsedMatches(ss.str(), 12.5f));101}102103TYPED_TEST(FloatLexTest, ScientificWithVeryLargeMantissa)104{105std::stringstream ss;106ss << "9" << TestFixture::Zeros(5000) << ".0e-5000";107ASSERT_TRUE(TestFixture::ParsedMatches(ss.str(), 9.0f));108}109110TYPED_TEST(FloatLexTest, StartWithDecimalDot)111{112ASSERT_TRUE(TestFixture::ParsedMatches(".125", 0.125f));113}114115TYPED_TEST(FloatLexTest, EndWithDecimalDot)116{117ASSERT_TRUE(TestFixture::ParsedMatches("123.", 123.0f));118}119120TYPED_TEST(FloatLexTest, NoDecimalDot)121{122ASSERT_TRUE(TestFixture::ParsedMatches("125e-2", 1.25f));123}124125TYPED_TEST(FloatLexTest, EndStartWithDecimalDotScientific)126{127ASSERT_TRUE(TestFixture::ParsedMatches(".625e-1", 0.0625f));128}129130TYPED_TEST(FloatLexTest, EndWithDecimalDotScientific)131{132ASSERT_TRUE(TestFixture::ParsedMatches("102400.e-2", 1024.0f));133}134135TYPED_TEST(FloatLexTest, UppercaseE)136{137ASSERT_TRUE(TestFixture::ParsedMatches("125E-2", 1.25f));138}139140TYPED_TEST(FloatLexTest, PlusInExponent)141{142ASSERT_TRUE(TestFixture::ParsedMatches("1E+2", 100.0f));143}144145TYPED_TEST(FloatLexTest, SlightlyAboveMaxFloat)146{147ASSERT_TRUE(TestFixture::IsInfinity("3.4029e38"));148}149150TYPED_TEST(FloatLexTest, SlightlyBelowMaxFloat)151{152ASSERT_FALSE(TestFixture::IsInfinity("3.4028e38"));153ASSERT_TRUE(TestFixture::ParsedMatches("3.4028e38", 3.4028e38f));154}155156TYPED_TEST(FloatLexTest, SlightlyAboveMaxFloatLargerMantissa)157{158ASSERT_TRUE(TestFixture::IsInfinity("34.029e37"));159}160161TYPED_TEST(FloatLexTest, SlightlyBelowMaxFloatLargerMantissa)162{163ASSERT_FALSE(TestFixture::IsInfinity("34.028e37"));164ASSERT_TRUE(TestFixture::ParsedMatches("34.028e37", 3.4028e38f));165}166167TYPED_TEST(FloatLexTest, SlightlyAboveMaxFloatSmallerMantissa)168{169ASSERT_TRUE(TestFixture::IsInfinity("0.34029e39"));170}171172TYPED_TEST(FloatLexTest, SlightlyBelowMaxFloatSmallerMantissa)173{174ASSERT_FALSE(TestFixture::IsInfinity("0.34028e39"));175ASSERT_TRUE(TestFixture::ParsedMatches("0.34028e39", 3.4028e38f));176}177178TYPED_TEST(FloatLexTest, SlightlyBelowMinSubnormalFloat)179{180ASSERT_TRUE(TestFixture::ParsedMatches("1.0e-48", 0.0f));181}182183TYPED_TEST(FloatLexTest, SlightlyAboveMinNormalFloat)184{185ASSERT_FALSE(TestFixture::ParsedMatches("1.0e-37", 0.0f));186}187188TYPED_TEST(FloatLexTest, ManySignificantDigits)189{190ASSERT_TRUE(TestFixture::ParsedMatches("1.23456789", 1.23456789f));191}192193TYPED_TEST(FloatLexTest, MantissaBitAboveMaxUint)194{195ASSERT_TRUE(TestFixture::ParsedMatches("4294967299.", 4294967299.0f));196}197198TYPED_TEST(FloatLexTest, ExponentBitAboveMaxInt)199{200ASSERT_TRUE(TestFixture::IsInfinity("1.0e2147483649"));201}202203TYPED_TEST(FloatLexTest, ExponentBitBelowMaxIntAndLargeMantissa)204{205std::stringstream ss;206ss << "1" << TestFixture::Zeros(32) << ".0e2147483640";207ASSERT_TRUE(TestFixture::IsInfinity(ss.str()));208}209210TYPED_TEST(FloatLexTest, ExponentBitAboveMinIntAndSmallMantissa)211{212std::stringstream ss;213ss << "0." << TestFixture::Zeros(32) << "1e-2147483640";214ASSERT_TRUE(TestFixture::ParsedMatches(ss.str(), 0.0f));215}216217218