//
// 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 "Input.h"
#include "Token.h"

class InitTest : public PreprocessorTest
{
};

TEST_F(InitTest, NegativeCount)
{
    EXPECT_FALSE(mPreprocessor.init(-1, NULL, NULL));
}

TEST_F(InitTest, ZeroCount)
{
    EXPECT_TRUE(mPreprocessor.init(0, NULL, NULL));

    pp::Token token;
    mPreprocessor.lex(&token);
    EXPECT_EQ(pp::Token::LAST, token.type);
}

TEST_F(InitTest, NullString)
{
    EXPECT_FALSE(mPreprocessor.init(1, NULL, NULL));
}

TEST(InputTest, DefaultConstructor)
{
    pp::Input input;
    EXPECT_EQ(0u, input.count());
    EXPECT_EQ(0u, input.read(NULL, 1));
}

TEST(InputTest, NullLength)
{
    const char* str[] = {"foo"};
    pp::Input input(1, str, NULL);
    EXPECT_EQ(3u, input.length(0));
}

TEST(InputTest, NegativeLength)
{
    const char* str[] = {"foo"};
    int length[] = {-1};
    pp::Input input(1, str, length);
    EXPECT_EQ(3u, input.length(0));
}

TEST(InputTest, ActualLength)
{
    const char* str[] = {"foobar"};
    int length[] = {3};
    pp::Input input(1, str, length);
    // Note that strlen(str[0]) != length[0].
    // Even then Input should just accept any non-negative number.
    EXPECT_EQ(static_cast<size_t>(length[0]), input.length(0));
}

TEST(InputTest, String)
{
    const char* str[] = {"foo"};
    pp::Input input(1, str, NULL);
    EXPECT_STREQ(str[0], input.string(0));
}

TEST(InputTest, ReadSingleString)
{
    int count = 1;
    const char* str[] = {"foo"};
    char buf[4] = {'\0', '\0', '\0', '\0'};

    int maxSize = 1;
    pp::Input input1(count, str, NULL);
    EXPECT_EQ(1u, input1.read(buf, maxSize));
    EXPECT_EQ('f', buf[0]);
    EXPECT_EQ(1u, input1.read(buf, maxSize));
    EXPECT_EQ('o', buf[0]);
    EXPECT_EQ(1u, input1.read(buf, maxSize));
    EXPECT_EQ('o', buf[0]);
    EXPECT_EQ(0u, input1.read(buf, maxSize));

    maxSize = 2;
    pp::Input input2(count, str, NULL);
    EXPECT_EQ(2u, input2.read(buf, maxSize));
    EXPECT_STREQ("fo", buf);
    EXPECT_EQ(1u, input2.read(buf, maxSize));
    EXPECT_EQ('o', buf[0]);
    EXPECT_EQ(0u, input2.read(buf, maxSize));

    maxSize = 3;
    pp::Input input3(count, str, NULL);
    EXPECT_EQ(3u, input3.read(buf, maxSize));
    EXPECT_STREQ("foo", buf);
    EXPECT_EQ(0u, input3.read(buf, maxSize));

    maxSize = 4;
    pp::Input input4(count, str, NULL);
    EXPECT_EQ(3u, input4.read(buf, maxSize));
    EXPECT_STREQ("foo", buf);
    EXPECT_EQ(0u, input4.read(buf, maxSize));
}

TEST(InputTest, ReadMultipleStrings)
{
    int count = 3;
    const char* str[] = {"f", "o", "o"};
    char buf[4] = {'\0', '\0', '\0', '\0'};

    int maxSize = 1;
    pp::Input input1(count, str, NULL);
    EXPECT_EQ(1u, input1.read(buf, maxSize));
    EXPECT_EQ('f', buf[0]);
    EXPECT_EQ(1u, input1.read(buf, maxSize));
    EXPECT_EQ('o', buf[0]);
    EXPECT_EQ(1u, input1.read(buf, maxSize));
    EXPECT_EQ('o', buf[0]);
    EXPECT_EQ(0u, input1.read(buf, maxSize));

    maxSize = 2;
    pp::Input input2(count, str, NULL);
    EXPECT_EQ(2u, input2.read(buf, maxSize));
    EXPECT_STREQ("fo", buf);
    EXPECT_EQ(1u, input2.read(buf, maxSize));
    EXPECT_EQ('o', buf[0]);
    EXPECT_EQ(0u, input2.read(buf, maxSize));

    maxSize = 3;
    pp::Input input3(count, str, NULL);
    EXPECT_EQ(3u, input3.read(buf, maxSize));
    EXPECT_STREQ("foo", buf);
    EXPECT_EQ(0u, input3.read(buf, maxSize));

    maxSize = 4;
    pp::Input input4(count, str, NULL);
    EXPECT_EQ(3u, input4.read(buf, maxSize));
    EXPECT_STREQ("foo", buf);
    EXPECT_EQ(0u, input4.read(buf, maxSize));
}

TEST(InputTest, ReadStringsWithLength)
{
    int count = 2;
    const char* str[] = {"foo", "bar"};
    // Note that the length for the first string is 2 which is less than
    // strlen(str[0]. We want to make sure that the last character is ignored.
    int length[] = {2, 3};
    char buf[6] = {'\0', '\0', '\0', '\0', '\0', '\0'};
    size_t maxSize = 5;

    pp::Input input(count, str, length);
    EXPECT_EQ(maxSize, input.read(buf, maxSize));
    EXPECT_STREQ("fobar", buf);
}

