// Copyright 2017-2020 The Verible Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "verilog/parser/verilog_token_classifications.h"

#include "gtest/gtest.h"
#include "verilog/parser/verilog_token_enum.h"

namespace verilog {
namespace {

TEST(VerilogTokenTest, IsWhitespaceTest) {
  EXPECT_TRUE(IsWhitespace(verilog_tokentype::TK_NEWLINE));
  EXPECT_TRUE(IsWhitespace(verilog_tokentype::TK_SPACE));
  EXPECT_FALSE(IsWhitespace(verilog_tokentype::TK_class));
  EXPECT_FALSE(IsWhitespace(verilog_tokentype::SymbolIdentifier));
}

// Given a verilog_tokentype, test that IsComment returns true only for comments
TEST(VerilogTokenTest, IsCommentTest) {
  EXPECT_TRUE(IsComment(verilog_tokentype::TK_COMMENT_BLOCK));
  EXPECT_TRUE(IsComment(verilog_tokentype::TK_EOL_COMMENT));
  EXPECT_FALSE(IsComment(verilog_tokentype::DR_begin_keywords));
  EXPECT_FALSE(IsComment(verilog_tokentype::SymbolIdentifier));
}

TEST(VerilogTokenTest, IsUnaryOperatorTest) {
  EXPECT_FALSE(IsUnaryOperator(verilog_tokentype('*')));
  EXPECT_FALSE(IsUnaryOperator(verilog_tokentype('/')));
  EXPECT_TRUE(IsUnaryOperator(verilog_tokentype('+')));
  EXPECT_TRUE(IsUnaryOperator(verilog_tokentype('-')));
  EXPECT_TRUE(IsUnaryOperator(verilog_tokentype('~')));
  EXPECT_TRUE(IsUnaryOperator(verilog_tokentype('&')));
  EXPECT_TRUE(IsUnaryOperator(verilog_tokentype('!')));
  EXPECT_TRUE(IsUnaryOperator(verilog_tokentype('|')));
  EXPECT_TRUE(IsUnaryOperator(verilog_tokentype('^')));
  EXPECT_TRUE(IsUnaryOperator(verilog_tokentype::TK_NAND));
  EXPECT_TRUE(IsUnaryOperator(verilog_tokentype::TK_NOR));
  EXPECT_TRUE(IsUnaryOperator(verilog_tokentype::TK_NXOR));
  EXPECT_TRUE(IsUnaryOperator(verilog_tokentype::TK_INCR));
  EXPECT_TRUE(IsUnaryOperator(verilog_tokentype::TK_DECR));
  EXPECT_FALSE(IsUnaryOperator(verilog_tokentype(':')));
  EXPECT_FALSE(IsUnaryOperator(verilog_tokentype('?')));
  EXPECT_FALSE(IsUnaryOperator(verilog_tokentype(',')));
  EXPECT_FALSE(IsUnaryOperator(verilog_tokentype('.')));
  EXPECT_FALSE(IsUnaryOperator(verilog_tokentype(';')));
  EXPECT_FALSE(IsUnaryOperator(verilog_tokentype('#')));
}

TEST(VerilogTokenTest, IsAssociativeOperatorTest) {
  EXPECT_TRUE(IsAssociativeOperator(verilog_tokentype('*')));
  EXPECT_FALSE(IsAssociativeOperator(verilog_tokentype('/')));
  EXPECT_FALSE(IsAssociativeOperator(verilog_tokentype('%')));
  EXPECT_TRUE(IsAssociativeOperator(verilog_tokentype('+')));
  EXPECT_FALSE(IsAssociativeOperator(verilog_tokentype('-')));
  EXPECT_FALSE(IsAssociativeOperator(verilog_tokentype('~')));
  EXPECT_TRUE(IsAssociativeOperator(verilog_tokentype('&')));
  EXPECT_FALSE(IsAssociativeOperator(verilog_tokentype('!')));
  EXPECT_TRUE(IsAssociativeOperator(verilog_tokentype('|')));
  EXPECT_TRUE(IsAssociativeOperator(verilog_tokentype('^')));
  EXPECT_TRUE(IsAssociativeOperator(verilog_tokentype::TK_LAND));
  EXPECT_TRUE(IsAssociativeOperator(verilog_tokentype::TK_LOR));
  EXPECT_FALSE(IsAssociativeOperator(verilog_tokentype::TK_NAND));
  EXPECT_FALSE(IsAssociativeOperator(verilog_tokentype::TK_NOR));
  EXPECT_TRUE(IsAssociativeOperator(verilog_tokentype::TK_NXOR));
  EXPECT_FALSE(IsAssociativeOperator(verilog_tokentype::TK_INCR));
  EXPECT_FALSE(IsAssociativeOperator(verilog_tokentype::TK_DECR));
  EXPECT_FALSE(IsAssociativeOperator(verilog_tokentype(':')));
  EXPECT_FALSE(IsAssociativeOperator(verilog_tokentype('?')));
  EXPECT_FALSE(IsAssociativeOperator(verilog_tokentype(',')));
  EXPECT_FALSE(IsAssociativeOperator(verilog_tokentype('.')));
  EXPECT_FALSE(IsAssociativeOperator(verilog_tokentype(';')));
  EXPECT_FALSE(IsAssociativeOperator(verilog_tokentype('#')));
}

TEST(VerilogTokenTest, IsTernaryOperatorTest) {
  EXPECT_FALSE(IsTernaryOperator(verilog_tokentype('*')));
  EXPECT_FALSE(IsTernaryOperator(verilog_tokentype('/')));
  EXPECT_FALSE(IsTernaryOperator(verilog_tokentype('+')));
  EXPECT_FALSE(IsTernaryOperator(verilog_tokentype('-')));
  EXPECT_TRUE(IsTernaryOperator(verilog_tokentype('?')));
  EXPECT_TRUE(IsTernaryOperator(verilog_tokentype(':')));
}

TEST(VerilogTokenTest, IsUnlexedTest) {
  EXPECT_TRUE(IsUnlexed(verilog_tokentype::PP_define_body));
  EXPECT_TRUE(IsUnlexed(verilog_tokentype::MacroArg));
  EXPECT_FALSE(IsUnlexed(verilog_tokentype::TK_COMMENT_BLOCK));
  EXPECT_FALSE(IsUnlexed(verilog_tokentype::SymbolIdentifier));
}

TEST(VerilogTokenTest, IsIdentifierLikeTest) {
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::SymbolIdentifier));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::PP_Identifier));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::MacroIdentifier));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::MacroIdItem));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::MacroCallId));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::SystemTFIdentifier));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::EscapedIdentifier));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::TK_Swidth));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::TK_Srecrem));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::TK_Ssetuphold));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::TK_Speriod));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::TK_Shold));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::TK_Srecovery));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::TK_Sremoval));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::TK_Ssetup));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::TK_Sskew));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::TK_Stimeskew));
  EXPECT_TRUE(IsIdentifierLike(verilog_tokentype::TK_Swidth));
  EXPECT_FALSE(IsIdentifierLike(verilog_tokentype::TK_StringLiteral));
  EXPECT_FALSE(IsIdentifierLike(verilog_tokentype::TK_DecNumber));
  EXPECT_FALSE(IsIdentifierLike(verilog_tokentype::TK_DecBase));
  EXPECT_FALSE(IsIdentifierLike(verilog_tokentype::TK_DecDigits));
  EXPECT_FALSE(IsIdentifierLike(verilog_tokentype::TK_always));
  EXPECT_FALSE(IsIdentifierLike(verilog_tokentype::TK_wire));
  EXPECT_FALSE(IsIdentifierLike(verilog_tokentype::TK_EOL_COMMENT));
  EXPECT_FALSE(IsIdentifierLike(verilog_tokentype::TK_COMMENT_BLOCK));
  EXPECT_FALSE(IsIdentifierLike(verilog_tokentype::TKK_attribute));
  EXPECT_FALSE(IsIdentifierLike(verilog_tokentype::TK_ATTRIBUTE));
  EXPECT_FALSE(IsIdentifierLike(verilog_tokentype('+')));
}

}  // namespace
}  // namespace verilog
