123ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org// 223ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. 323ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org// Use of this source code is governed by a BSD-style license that can be 423ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org// found in the LICENSE file. 523ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org// 623ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org 723ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org#include <algorithm> 828182485765b0fb9cfc86abd0649f500ccb050c7alokp@chromium.org#include <climits> 923ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org 10fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org#include "PreprocessorTest.h" 1123ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org#include "Token.h" 1223ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org 13fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.orgclass CharTest : public PreprocessorTest, 14fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org public testing::WithParamInterface<int> 1523ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org{ 1623ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org}; 1723ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org 1823ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.orgstatic const char kPunctuators[] = { 1923ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org '.', '+', '-', '/', '*', '%', '<', '>', '[', ']', '(', ')', '{', '}', 2023ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org '^', '|', '&', '~', '=', '!', ':', ';', ',', '?'}; 2123ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.orgstatic const int kNumPunctuators = 2223ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org sizeof(kPunctuators) / sizeof(kPunctuators[0]); 2323ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org 242c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.orgbool isPunctuator(char c) 252c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org{ 262c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org static const char* kPunctuatorBeg = kPunctuators; 272c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org static const char* kPunctuatorEnd = kPunctuators + kNumPunctuators; 282c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org return std::find(kPunctuatorBeg, kPunctuatorEnd, c) != kPunctuatorEnd; 292c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org} 302c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org 3123ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.orgstatic const char kWhitespaces[] = {' ', '\t', '\v', '\f', '\n', '\r'}; 3223ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.orgstatic const int kNumWhitespaces = 3323ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org sizeof(kWhitespaces) / sizeof(kWhitespaces[0]); 3423ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org 352c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.orgbool isWhitespace(char c) 362c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org{ 372c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org static const char* kWhitespaceBeg = kWhitespaces; 382c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org static const char* kWhitespaceEnd = kWhitespaces + kNumWhitespaces; 392c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org return std::find(kWhitespaceBeg, kWhitespaceEnd, c) != kWhitespaceEnd; 402c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org} 412c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org 4223ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.orgTEST_P(CharTest, Identified) 4323ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org{ 4471117e2c977d6839020b5fa64a358db76e906559Peter Kasting std::string str(1, static_cast<char>(GetParam())); 4523ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org const char* cstr = str.c_str(); 4623ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org int length = 1; 4723ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org 4823ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org // Note that we pass the length param as well because the invalid 4923ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org // string may contain the null character. 50fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org ASSERT_TRUE(mPreprocessor.init(1, &cstr, &length)); 5123ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org 522c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org int expectedType = pp::Token::LAST; 532c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org std::string expectedValue; 5423ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org 552c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org if (str[0] == '#') 5623ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org { 572c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org // Lone '#' is ignored. 5823ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org } 592c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org else if ((str[0] == '_') || 602c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org ((str[0] >= 'a') && (str[0] <= 'z')) || 612c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org ((str[0] >= 'A') && (str[0] <= 'Z'))) 6223ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org { 632c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org expectedType = pp::Token::IDENTIFIER; 642c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org expectedValue = str; 6523ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org } 662c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org else if (str[0] >= '0' && str[0] <= '9') 6723ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org { 682c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org expectedType = pp::Token::CONST_INT; 692c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org expectedValue = str; 7023ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org } 712c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org else if (isPunctuator(str[0])) 722c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org { 732c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org expectedType = str[0]; 7407d921de027a386f39c712c3c034f5ebd5f57262alokp@chromium.org expectedValue = str; 752c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org } 762c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org else if (isWhitespace(str[0])) 7723ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org { 7823ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org // Whitespace is ignored. 7923ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org } 802c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org else 8123ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org { 822c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org // Everything else is invalid. 832c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org using testing::_; 84fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org EXPECT_CALL(mDiagnostics, 85a9b3e4c834c0f450b9b396615bb6d282ebd730bdGeoff Lang print(pp::Diagnostics::PP_INVALID_CHARACTER, _, str)); 8623ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org } 8723ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org 882c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org pp::Token token; 89fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org mPreprocessor.lex(&token); 902c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org EXPECT_EQ(expectedType, token.type); 915b6a68e04a7d27dab71524fa481f42818f84a240alokp@chromium.org EXPECT_EQ(expectedValue, token.text); 9223ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org}; 9323ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org 9423ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org// Note +1 for the max-value in range. It is there because the max-value 9523ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org// not included in the range. 9628182485765b0fb9cfc86abd0649f500ccb050c7alokp@chromium.orgINSTANTIATE_TEST_CASE_P(All, CharTest, 9728182485765b0fb9cfc86abd0649f500ccb050c7alokp@chromium.org testing::Range(CHAR_MIN, CHAR_MAX + 1)); 9823ff36a03d80588f25062fc625019a190ad9e621alokp@chromium.org 99