diff options
Diffstat (limited to 'gfx/angle/src/tests/preprocessor_tests/space_test.cpp')
-rwxr-xr-x | gfx/angle/src/tests/preprocessor_tests/space_test.cpp | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/gfx/angle/src/tests/preprocessor_tests/space_test.cpp b/gfx/angle/src/tests/preprocessor_tests/space_test.cpp new file mode 100755 index 000000000..0c3494be5 --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/space_test.cpp @@ -0,0 +1,106 @@ +// +// 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" + +class SpaceTest : public PreprocessorTest +{ + protected: + void expectSpace(const std::string& str) + { + const char* cstr = str.c_str(); + ASSERT_TRUE(mPreprocessor.init(1, &cstr, 0)); + + pp::Token token; + // "foo" is returned after ignoring the whitespace characters. + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::IDENTIFIER, token.type); + EXPECT_EQ("foo", token.text); + // The whitespace character is however recorded with the next token. + EXPECT_TRUE(token.hasLeadingSpace()); + } +}; + +// Whitespace characters allowed in GLSL. +// Note that newline characters (\n) will be tested separately. +static const char kSpaceChars[] = {' ', '\t', '\v', '\f'}; + +// This test fixture tests the processing of a single whitespace character. +// All tests in this fixture are ran with all possible whitespace character +// allowed in GLSL. +class SpaceCharTest : public SpaceTest, + public testing::WithParamInterface<char> +{ +}; + +TEST_P(SpaceCharTest, SpaceIgnored) +{ + // Construct test string with the whitespace char before "foo". + std::string str(1, GetParam()); + str.append("foo"); + + expectSpace(str); +} + +INSTANTIATE_TEST_CASE_P(SingleSpaceChar, + SpaceCharTest, + testing::ValuesIn(kSpaceChars)); + +// This test fixture tests the processing of a string containing consecutive +// whitespace characters. All tests in this fixture are ran with all possible +// combinations of whitespace characters allowed in GLSL. +typedef std::tr1::tuple<char, char, char> SpaceStringParams; +class SpaceStringTest : public SpaceTest, + public testing::WithParamInterface<SpaceStringParams> +{ +}; + +TEST_P(SpaceStringTest, SpaceIgnored) +{ + // Construct test string with the whitespace char before "foo". + std::string str; + str.push_back(std::tr1::get<0>(GetParam())); + str.push_back(std::tr1::get<1>(GetParam())); + str.push_back(std::tr1::get<2>(GetParam())); + str.append("foo"); + + expectSpace(str); +} + +INSTANTIATE_TEST_CASE_P(SpaceCharCombination, + SpaceStringTest, + testing::Combine(testing::ValuesIn(kSpaceChars), + testing::ValuesIn(kSpaceChars), + testing::ValuesIn(kSpaceChars))); + +// The tests above make sure that the space char is recorded in the +// next token. This test makes sure that a token is not incorrectly marked +// to have leading space. +TEST_F(SpaceTest, LeadingSpace) +{ + const char* str = " foo+ -bar"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::IDENTIFIER, token.type); + EXPECT_EQ("foo", token.text); + EXPECT_TRUE(token.hasLeadingSpace()); + + mPreprocessor.lex(&token); + EXPECT_EQ('+', token.type); + EXPECT_FALSE(token.hasLeadingSpace()); + + mPreprocessor.lex(&token); + EXPECT_EQ('-', token.type); + EXPECT_TRUE(token.hasLeadingSpace()); + + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::IDENTIFIER, token.type); + EXPECT_EQ("bar", token.text); + EXPECT_FALSE(token.hasLeadingSpace()); +} |