// Copyright 2018 The Fuchsia 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 "src/developer/debug/zxdb/symbols/member_ptr.h"

#include <gtest/gtest.h>

#include "src/developer/debug/zxdb/symbols/base_type.h"
#include "src/developer/debug/zxdb/symbols/collection.h"
#include "src/developer/debug/zxdb/symbols/function_type.h"
#include "src/developer/debug/zxdb/symbols/modified_type.h"
#include "src/developer/debug/zxdb/symbols/type_test_support.h"
#include "src/developer/debug/zxdb/symbols/variable.h"

namespace zxdb {

TEST(MemberPtr, Function) {
  // This type is "void (*)()"
  auto standalone = fxl::MakeRefCounted<FunctionType>(LazySymbol(), std::vector<LazySymbol>());
  auto standalone_ptr = fxl::MakeRefCounted<ModifiedType>(DwarfTag::kPointerType, standalone);

  // Class to be the containing class for the pointer to member func.
  auto containing = fxl::MakeRefCounted<Collection>(DwarfTag::kClassType);
  containing->set_assigned_name("MyClass");

  // A parameter type.
  auto int32_type = MakeInt32Type();

  // Make a function pointer ("int32_t (*)(void (*)(), int32_t)". This specified names for the
  // variables which we don't use, but ensures the behavior about named parameters in function
  // pointers is consistent.
  std::vector<LazySymbol> params{fxl::MakeRefCounted<Variable>(DwarfTag::kFormalParameter, "val1",
                                                               standalone_ptr, VariableLocation()),
                                 fxl::MakeRefCounted<Variable>(DwarfTag::kFormalParameter, "val2",
                                                               int32_type, VariableLocation())};
  auto function = fxl::MakeRefCounted<FunctionType>(int32_type, params);
  auto function_ptr = fxl::MakeRefCounted<ModifiedType>(DwarfTag::kPointerType, function);
  EXPECT_EQ("int32_t (*)(void (*)(), int32_t)", function_ptr->GetFullName());

  // Make that function pointer a member pointer.
  auto member_ptr = fxl::MakeRefCounted<MemberPtr>(containing, function);
  EXPECT_EQ("int32_t (MyClass::*)(void (*)(), int32_t)", member_ptr->GetFullName());
}

TEST(MemberPtr, Data) {
  // Class to be the containing class for the pointer to member func.
  auto containing = fxl::MakeRefCounted<Collection>(DwarfTag::kClassType);
  containing->set_assigned_name("MyClass");

  auto int32_type = MakeInt32Type();

  // MyClass member of int.
  auto int_ptr = fxl::MakeRefCounted<MemberPtr>(containing, int32_type);
  EXPECT_EQ("int32_t MyClass::*", int_ptr->GetFullName());

  // MyClass member of MyClass.
  auto class_ptr = fxl::MakeRefCounted<MemberPtr>(containing, containing);
  EXPECT_EQ("MyClass MyClass::*", class_ptr->GetFullName());
}

}  // namespace zxdb
