//
// 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 <algorithm>
#include <climits>

#include "PreprocessorTest.h"
#include "Token.h"

class CharTest : public PreprocessorTest,
                 public testing::WithParamInterface<int>
{
};

static const char kPunctuators[] = {
    '.', '+', '-', '/', '*', '%', '<', '>', '[', ']', '(', ')', '{', '}',
    '^', '|', '&', '~', '=', '!', ':', ';', ',', '?'};
static const int kNumPunctuators =
    sizeof(kPunctuators) / sizeof(kPunctuators[0]);

bool isPunctuator(char c)
{
    static const char* kPunctuatorBeg = kPunctuators;
    static const char* kPunctuatorEnd = kPunctuators + kNumPunctuators;
    return std::find(kPunctuatorBeg, kPunctuatorEnd, c) != kPunctuatorEnd;
}

static const char kWhitespaces[] = {' ', '\t', '\v', '\f', '\n', '\r'};
static const int kNumWhitespaces =
    sizeof(kWhitespaces) / sizeof(kWhitespaces[0]);

bool isWhitespace(char c)
{
    static const char* kWhitespaceBeg = kWhitespaces;
    static const char* kWhitespaceEnd = kWhitespaces + kNumWhitespaces;
    return std::find(kWhitespaceBeg, kWhitespaceEnd, c) != kWhitespaceEnd;
}

TEST_P(CharTest, Identified)
{
    std::string str(1, GetParam());
    const char* cstr = str.c_str();
    int length = 1;

    // Note that we pass the length param as well because the invalid
    // string may contain the null character.
    ASSERT_TRUE(mPreprocessor.init(1, &cstr, &length));

    int expectedType = pp::Token::LAST;
    std::string expectedValue;

    if (str[0] == '#')
    {
        // Lone '#' is ignored.
    }
    else if ((str[0] == '_') ||
             ((str[0] >= 'a') && (str[0] <= 'z')) ||
             ((str[0] >= 'A') && (str[0] <= 'Z')))
    {
        expectedType = pp::Token::IDENTIFIER;
        expectedValue = str;
    }
    else if (str[0] >= '0' && str[0] <= '9')
    {
        expectedType = pp::Token::CONST_INT;
        expectedValue = str;
    }
    else if (isPunctuator(str[0]))
    {
        expectedType = str[0];
        expectedValue = str;
    }
    else if (isWhitespace(str[0]))
    {
        // Whitespace is ignored.
    }
    else
    {
        // Everything else is invalid.
        using testing::_;
        EXPECT_CALL(mDiagnostics,
            print(pp::Diagnostics::INVALID_CHARACTER, _, str));
    }

    pp::Token token;
    mPreprocessor.lex(&token);
    EXPECT_EQ(expectedType, token.type);
    EXPECT_EQ(expectedValue, token.text);
};

// Note +1 for the max-value in range. It is there because the max-value
// not included in the range.
INSTANTIATE_TEST_CASE_P(All, CharTest,
                        testing::Range(CHAR_MIN, CHAR_MAX + 1));

