| // |
| // 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<char>((y) + 1)) |
| |
| class InvalidNumberTest : public SimplePreprocessorTest, |
| public testing::WithParamInterface<const char *> |
| { |
| }; |
| |
| TEST_P(InvalidNumberTest, InvalidNumberIdentified) |
| { |
| const char* str = GetParam(); |
| |
| using testing::_; |
| EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_INVALID_NUMBER, _, str)); |
| |
| preprocess(str); |
| } |
| |
| 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<const char*, char> IntegerParams; |
| class IntegerTest : public SimplePreprocessorTest, public testing::WithParamInterface<IntegerParams> |
| { |
| }; |
| |
| 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(); |
| |
| pp::Token token; |
| lexSingleToken(cstr, &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 SimplePreprocessorTest |
| { |
| protected: |
| void expectFloat(const std::string& str) |
| { |
| const char* cstr = str.c_str(); |
| |
| pp::Token token; |
| lexSingleToken(cstr, &token); |
| EXPECT_EQ(pp::Token::CONST_FLOAT, token.type); |
| EXPECT_EQ(str, token.text); |
| } |
| }; |
| |
| typedef std::tr1::tuple<char, char, const char*, char> FloatScientificParams; |
| class FloatScientificTest : |
| public FloatTest, |
| public testing::WithParamInterface<FloatScientificParams> |
| { |
| }; |
| |
| // 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<char, char> FloatFractionParams; |
| class FloatFractionTest : |
| public FloatTest, |
| public testing::WithParamInterface<FloatFractionParams> |
| { |
| }; |
| |
| // 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"); |
| } |