summaryrefslogtreecommitdiffstats
path: root/gfx/angle/src/tests/preprocessor_tests/space_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/angle/src/tests/preprocessor_tests/space_test.cpp')
-rwxr-xr-xgfx/angle/src/tests/preprocessor_tests/space_test.cpp106
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());
+}