// 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/CST/context_functions.h"

#include "common/text/concrete_syntax_tree.h"
#include "common/text/symbol.h"
#include "common/text/syntax_tree_context.h"
#include "common/text/tree_builder_test_util.h"
#include "common/util/casts.h"
#include "gtest/gtest.h"
#include "verilog/CST/verilog_nonterminals.h"

namespace verilog {
namespace analysis {
namespace {

using verible::down_cast;
using verible::SymbolPtr;
using verible::SyntaxTreeContext;
using verible::SyntaxTreeNode;
using verible::TNode;

const SyntaxTreeNode &CastAsNode(const SymbolPtr &p) {
  return down_cast<const SyntaxTreeNode &>(*p.get());
}

// Test that empty context is handled correctly.
TEST(ContextIsInsideClassTest, EmptyContext) {
  SyntaxTreeContext empty_context;
  EXPECT_FALSE(ContextIsInsideClass(empty_context));
}

// Test that matching context node tag is detected.
TEST(ContextIsInsideClassTest, ClassContextOnly) {
  const auto class_node = TNode(NodeEnum::kClassDeclaration);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop(&context, &CastAsNode(class_node));
  EXPECT_TRUE(ContextIsInsideClass(context));
}

// Test that non-matching context node tag is not detected.
TEST(ContextIsInsideClassTest, ModuleContextOnly) {
  const auto module_node = TNode(NodeEnum::kModuleDeclaration);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop(&context, &CastAsNode(module_node));
  EXPECT_FALSE(ContextIsInsideClass(context));
}

// Test that matching context ignores inner context.
TEST(ContextIsInsideClassTest, OtherInsideClass) {
  const auto class_node = TNode(NodeEnum::kClassDeclaration);
  const auto module_node = TNode(NodeEnum::kModuleDeclaration);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop1(&context, &CastAsNode(class_node));
  SyntaxTreeContext::AutoPop pop2(&context, &CastAsNode(module_node));
  EXPECT_TRUE(ContextIsInsideClass(context));
}

// Test that matching inner context works.
TEST(ContextIsInsideClassTest, ClassInsideOther) {
  const auto class_node = TNode(NodeEnum::kClassDeclaration);
  const auto module_node = TNode(NodeEnum::kModuleDeclaration);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop1(&context, &CastAsNode(module_node));
  SyntaxTreeContext::AutoPop pop2(&context, &CastAsNode(class_node));
  EXPECT_TRUE(ContextIsInsideClass(context));
}

// Test that non-matching context node tag is not detected.
TEST(ContextIsInsideModuleTest, ClassContextOnly) {
  const auto class_node = TNode(NodeEnum::kClassDeclaration);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop(&context, &CastAsNode(class_node));
  EXPECT_FALSE(ContextIsInsideModule(context));
}

// Test that matching context node tag is detected.
TEST(ContextIsInsideModuleTest, ModuleContextOnly) {
  const auto module_node = TNode(NodeEnum::kModuleDeclaration);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop(&context, &CastAsNode(module_node));
  EXPECT_TRUE(ContextIsInsideModule(context));
}

// Test that matching context ignores inner context.
TEST(ContextIsInsideModuleTest, OtherInsideModule) {
  const auto class_node = TNode(NodeEnum::kClassDeclaration);
  const auto module_node = TNode(NodeEnum::kModuleDeclaration);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop1(&context, &CastAsNode(class_node));
  SyntaxTreeContext::AutoPop pop2(&context, &CastAsNode(module_node));
  EXPECT_TRUE(ContextIsInsideModule(context));
}

// Test that matching inner context works.
TEST(ContextIsInsideModuleTest, ModuleInsideOther) {
  const auto class_node = TNode(NodeEnum::kClassDeclaration);
  const auto module_node = TNode(NodeEnum::kModuleDeclaration);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop1(&context, &CastAsNode(module_node));
  SyntaxTreeContext::AutoPop pop2(&context, &CastAsNode(class_node));
  EXPECT_TRUE(ContextIsInsideModule(context));
}

// Test that packed dimensions are found in context.
TEST(ContextIsInsidePackedDimensionsTest, PackedNotUnpacked) {
  const auto data_node = TNode(NodeEnum::kDataDeclaration);
  const auto dimensions_node = TNode(NodeEnum::kPackedDimensions);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop1(&context, &CastAsNode(data_node));
  SyntaxTreeContext::AutoPop pop2(&context, &CastAsNode(dimensions_node));
  EXPECT_TRUE(ContextIsInsidePackedDimensions(context));
  EXPECT_FALSE(ContextIsInsideUnpackedDimensions(context));
}

// Test that unpacked dimensions are found in context.
TEST(ContextIsInsidePackedDimensionsTest, UnpackedNotPacked) {
  const auto data_node = TNode(NodeEnum::kDataDeclaration);
  const auto dimensions_node = TNode(NodeEnum::kUnpackedDimensions);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop1(&context, &CastAsNode(data_node));
  SyntaxTreeContext::AutoPop pop2(&context, &CastAsNode(dimensions_node));
  EXPECT_TRUE(ContextIsInsideUnpackedDimensions(context));
  EXPECT_FALSE(ContextIsInsidePackedDimensions(context));
}

// Test that non-matching context node tag is not detected.
TEST(ContextIsInsidePackageTest, ClassContextOnly) {
  const auto class_node = TNode(NodeEnum::kClassDeclaration);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop(&context, &CastAsNode(class_node));
  EXPECT_FALSE(ContextIsInsidePackage(context));
}

// Test that matching context node tag is detected.
TEST(ContextIsInsidePackageTest, PackageContextOnly) {
  const auto package_node = TNode(NodeEnum::kPackageDeclaration);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop(&context, &CastAsNode(package_node));
  EXPECT_TRUE(ContextIsInsidePackage(context));
}

// Test that matching context ignores inner context.
TEST(ContextIsInsidePackageTest, OtherInsidePackage) {
  const auto package_node = TNode(NodeEnum::kPackageDeclaration);
  const auto module_node = TNode(NodeEnum::kModuleDeclaration);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop1(&context, &CastAsNode(package_node));
  SyntaxTreeContext::AutoPop pop2(&context, &CastAsNode(module_node));
  EXPECT_TRUE(ContextIsInsidePackage(context));
}

// Test that matching inner context works.
TEST(ContextIsInsidePackageTest, PackageInsideOther) {
  const auto package_node = TNode(NodeEnum::kPackageDeclaration);
  const auto module_node = TNode(NodeEnum::kModuleDeclaration);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop1(&context, &CastAsNode(module_node));
  SyntaxTreeContext::AutoPop pop2(&context, &CastAsNode(package_node));
  EXPECT_TRUE(ContextIsInsidePackage(context));
}

// Test that non-matching context node tag is not detected.
TEST(ContextIsInsideFormalParameterListTest, NotAContext) {
  const auto package_node = TNode(NodeEnum::kPackageDeclaration);
  const auto parameter_node = TNode(NodeEnum::kParamDeclaration);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop1(&context, &CastAsNode(package_node));
  SyntaxTreeContext::AutoPop pop2(&context, &CastAsNode(parameter_node));
  EXPECT_FALSE(ContextIsInsideFormalParameterList(context));
}

// Test that matching context node tag is detected.
TEST(ContextIsInsideFormalParameterListTest, FormalContext) {
  const auto module_node = TNode(NodeEnum::kModuleDeclaration);
  const auto formal_param_node = TNode(NodeEnum::kFormalParameterList);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop1(&context, &CastAsNode(module_node));
  SyntaxTreeContext::AutoPop pop2(&context, &CastAsNode(formal_param_node));
  EXPECT_TRUE(ContextIsInsideFormalParameterList(context));
}

// Testing that the matching context node tag is detected.
TEST(ContextIsInsideTaskFunctionPortListTest, PortListInsideFunction) {
  const auto port_list_node = TNode(NodeEnum::kPortList);
  const auto function_node = TNode(NodeEnum::kFunctionDeclaration);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop1(&context, &CastAsNode(function_node));
  EXPECT_FALSE(ContextIsInsideTaskFunctionPortList(context));
  SyntaxTreeContext::AutoPop pop2(&context, &CastAsNode(port_list_node));
  EXPECT_TRUE(ContextIsInsideTaskFunctionPortList(context));
}

// Testing that the matching context node tag is detected.
TEST(ContextIsInsideTaskFunctionPortListTest, PortListInsideTask) {
  const auto port_list_node = TNode(NodeEnum::kPortList);
  const auto task_node = TNode(NodeEnum::kTaskDeclaration);
  SyntaxTreeContext context;
  SyntaxTreeContext::AutoPop pop1(&context, &CastAsNode(task_node));
  EXPECT_FALSE(ContextIsInsideTaskFunctionPortList(context));
  SyntaxTreeContext::AutoPop pop2(&context, &CastAsNode(port_list_node));
  EXPECT_TRUE(ContextIsInsideTaskFunctionPortList(context));
}

}  // namespace
}  // namespace analysis
}  // namespace verilog
