// 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, 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
