blob: ad4e81c8eedee47c88a5dd4c6a4dc93bc3182edd [file] [log] [blame]
//
// Copyright 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 <tuple>
#include "PreprocessorTest.h"
#include "compiler/preprocessor/Token.h"
namespace angle
{
#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_SUITE_P(InvalidIntegers, InvalidNumberTest, testing::Values("1a", "08", "0xG"));
INSTANTIATE_TEST_SUITE_P(InvalidFloats,
InvalidNumberTest,
testing::Values("1eg", "0.a", "0.1.2", ".0a", ".0.1"));
typedef std::tuple<const char *, char> IntegerParams;
class IntegerTest : public SimplePreprocessorTest, public testing::WithParamInterface<IntegerParams>
{};
TEST_P(IntegerTest, Identified)
{
std::string str(std::get<0>(GetParam())); // prefix.
str.push_back(std::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_SUITE_P(DecimalInteger,
IntegerTest,
testing::Combine(testing::Values(""), CLOSED_RANGE('0', '9')));
INSTANTIATE_TEST_SUITE_P(OctalInteger,
IntegerTest,
testing::Combine(testing::Values("0"), CLOSED_RANGE('0', '7')));
INSTANTIATE_TEST_SUITE_P(HexadecimalInteger_0_9,
IntegerTest,
testing::Combine(testing::Values("0x", "0X"), CLOSED_RANGE('0', '9')));
INSTANTIATE_TEST_SUITE_P(HexadecimalInteger_a_f,
IntegerTest,
testing::Combine(testing::Values("0x", "0X"), CLOSED_RANGE('a', 'f')));
INSTANTIATE_TEST_SUITE_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::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::get<0>(GetParam())); // significand [0-9].
str.push_back(std::get<1>(GetParam())); // separator [eE].
str.append(std::get<2>(GetParam())); // sign [" " "+" "-"].
str.push_back(std::get<3>(GetParam())); // exponent [0-9].
SCOPED_TRACE("FloatScientificTest");
expectFloat(str);
}
INSTANTIATE_TEST_SUITE_P(FloatScientific,
FloatScientificTest,
testing::Combine(CLOSED_RANGE('0', '9'),
testing::Values('e', 'E'),
testing::Values("", "+", "-"),
CLOSED_RANGE('0', '9')));
typedef std::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::get<0>(GetParam());
if (significand != '\0')
str.push_back(significand);
str.push_back('.');
char fraction = std::get<1>(GetParam());
if (fraction != '\0')
str.push_back(fraction);
SCOPED_TRACE("FloatFractionTest");
expectFloat(str);
}
INSTANTIATE_TEST_SUITE_P(FloatFraction_X_X,
FloatFractionTest,
testing::Combine(CLOSED_RANGE('0', '9'), CLOSED_RANGE('0', '9')));
INSTANTIATE_TEST_SUITE_P(FloatFraction_0_X,
FloatFractionTest,
testing::Combine(testing::Values('\0'), CLOSED_RANGE('0', '9')));
INSTANTIATE_TEST_SUITE_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");
}
} // namespace angle