//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

#include <stdlib.h>

#include "swift/SwiftDemangle/SwiftDemangle.h"
#include "gtest/gtest.h"

TEST(FunctionNameDemangleTests, CorrectlyDemangles) {
  char OutputBuffer[128];

  const char *FunctionName = "_TFC3foo3bar3basfT3zimCS_3zim_T_";
  const char *DemangledName = "foo.bar.bas (zim : foo.zim) -> ()";

  size_t Result = swift_demangle_getDemangledName(FunctionName, OutputBuffer,
                                                  sizeof(OutputBuffer));

  EXPECT_STREQ(DemangledName, OutputBuffer);
  EXPECT_EQ(Result, strlen(DemangledName));

  // Make sure the SynthesizeSugarOnTypes option is functioning.
  const char *FunctionNameWithSugar = "_TF4main3fooFT3argGSqGSaSi___T_";
  const char *DemangledNameWithSugar = "main.foo (arg : [Swift.Int]?) -> ()";

  Result = swift_demangle_getDemangledName(FunctionNameWithSugar, OutputBuffer,
                                           sizeof(OutputBuffer));

  EXPECT_STREQ(DemangledNameWithSugar, OutputBuffer);
  EXPECT_EQ(Result, strlen(DemangledNameWithSugar));
}

TEST(FunctionNameDemangledTests, WorksWithNULLBuffer) {
  const char *FunctionName = "_TFC3foo3bar3basfT3zimCS_3zim_T_";
  const char *DemangledName = "foo.bar.bas (zim : foo.zim) -> ()";

  // When given a null buffer, swift_demangle_getDemangledName should still be
  // able to return the size of the demangled string.
  size_t Result = swift_demangle_getDemangledName(FunctionName, nullptr, 0);

  EXPECT_EQ(Result, strlen(DemangledName));
}

TEST(FunctionNameDemangleTests, IgnoresNonMangledInputs) {
  const char *FunctionName = "printf";
  char OutputBuffer[] = "0123456789abcdef";

  size_t Result = swift_demangle_getDemangledName(FunctionName, OutputBuffer,
                                                  sizeof(OutputBuffer));

  EXPECT_EQ(0U, Result);
  EXPECT_STREQ("0123456789abcdef", OutputBuffer);
}

