// // Copyright (c) 2012 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. // #include "PreprocessorTest.h" #include "compiler/preprocessor/Token.h" #define CLOSED_RANGE(x, y) testing::Range(x, static_cast((y) + 1)) class InvalidNumberTest : public PreprocessorTest, public testing::WithParamInterface { }; TEST_P(InvalidNumberTest, InvalidNumberIdentified) { const char* str = GetParam(); ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); using testing::_; EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_INVALID_NUMBER, _, str)); pp::Token token; mPreprocessor.lex(&token); } INSTANTIATE_TEST_CASE_P(InvalidIntegers, InvalidNumberTest, testing::Values("1a", "08", "0xG")); INSTANTIATE_TEST_CASE_P(InvalidFloats, InvalidNumberTest, testing::Values("1eg", "0.a", "0.1.2", ".0a", ".0.1")); typedef std::tr1::tuple IntegerParams; class IntegerTest : public PreprocessorTest, public testing::WithParamInterface { }; TEST_P(IntegerTest, Identified) { std::string str(std::tr1::get<0>(GetParam())); // prefix. str.push_back(std::tr1::get<1>(GetParam())); // digit. const char* cstr = str.c_str(); ASSERT_TRUE(mPreprocessor.init(1, &cstr, 0)); pp::Token token; mPreprocessor.lex(&token); EXPECT_EQ(pp::Token::CONST_INT, token.type); EXPECT_EQ(str, token.text); } INSTANTIATE_TEST_CASE_P(DecimalInteger, IntegerTest, testing::Combine(testing::Values(""), CLOSED_RANGE('0', '9'))); INSTANTIATE_TEST_CASE_P(OctalInteger, IntegerTest, testing::Combine(testing::Values("0"), CLOSED_RANGE('0', '7'))); INSTANTIATE_TEST_CASE_P(HexadecimalInteger_0_9, IntegerTest, testing::Combine(testing::Values("0x", "0X"), CLOSED_RANGE('0', '9'))); INSTANTIATE_TEST_CASE_P(HexadecimalInteger_a_f, IntegerTest, testing::Combine(testing::Values("0x", "0X"), CLOSED_RANGE('a', 'f'))); INSTANTIATE_TEST_CASE_P(HexadecimalInteger_A_F, IntegerTest, testing::Combine(testing::Values("0x", "0X"), CLOSED_RANGE('A', 'F'))); class FloatTest : public PreprocessorTest { protected: void expectFloat(const std::string& str) { const char* cstr = str.c_str(); ASSERT_TRUE(mPreprocessor.init(1, &cstr, 0)); pp::Token token; mPreprocessor.lex(&token); EXPECT_EQ(pp::Token::CONST_FLOAT, token.type); EXPECT_EQ(str, token.text); } }; typedef std::tr1::tuple FloatScientificParams; class FloatScientificTest : public FloatTest, public testing::WithParamInterface { }; // This test covers floating point numbers of form [0-9][eE][+-]?[0-9]. TEST_P(FloatScientificTest, FloatIdentified) { std::string str; str.push_back(std::tr1::get<0>(GetParam())); // significand [0-9]. str.push_back(std::tr1::get<1>(GetParam())); // separator [eE]. str.append(std::tr1::get<2>(GetParam())); // sign [" " "+" "-"]. str.push_back(std::tr1::get<3>(GetParam())); // exponent [0-9]. SCOPED_TRACE("FloatScientificTest"); expectFloat(str); } INSTANTIATE_TEST_CASE_P(FloatScientific, FloatScientificTest, testing::Combine(CLOSED_RANGE('0', '9'), testing::Values('e', 'E'), testing::Values("", "+", "-"), CLOSED_RANGE('0', '9'))); typedef std::tr1::tuple FloatFractionParams; class FloatFractionTest : public FloatTest, public testing::WithParamInterface { }; // This test covers floating point numbers of form [0-9]"." and [0-9]?"."[0-9]. TEST_P(FloatFractionTest, FloatIdentified) { std::string str; char significand = std::tr1::get<0>(GetParam()); if (significand != '\0') str.push_back(significand); str.push_back('.'); char fraction = std::tr1::get<1>(GetParam()); if (fraction != '\0') str.push_back(fraction); SCOPED_TRACE("FloatFractionTest"); expectFloat(str); } INSTANTIATE_TEST_CASE_P(FloatFraction_X_X, FloatFractionTest, testing::Combine(CLOSED_RANGE('0', '9'), CLOSED_RANGE('0', '9'))); INSTANTIATE_TEST_CASE_P(FloatFraction_0_X, FloatFractionTest, testing::Combine(testing::Values('\0'), CLOSED_RANGE('0', '9'))); INSTANTIATE_TEST_CASE_P(FloatFraction_X_0, FloatFractionTest, testing::Combine(CLOSED_RANGE('0', '9'), testing::Values('\0'))); // In the tests above we have tested individual parts of a float separately. // This test has all parts of a float. TEST_F(FloatTest, FractionScientific) { SCOPED_TRACE("FractionScientific"); expectFloat("0.1e+2"); }