//===- llvm/tools/gollvm/unittests/BackendCore/LinemapTests.cpp -----===//
//
// Copyright 2018 The Go 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 "TestUtils.h"
#include "gtest/gtest.h"
#include "go-llvm-linemap.h"
#include "go-location.h"

#include "llvm/Support/Path.h"

namespace {

TEST(LinemapTests, CreateLinemap) {
  std::unique_ptr<Linemap> lm(go_get_linemap());
}

TEST(LinemapTests, BasicLinemap) {
  std::unique_ptr<Llvm_linemap> lm(new Llvm_linemap());

  Location ul = Linemap::unknown_location();
  Location pdl = Linemap::predeclared_location();
  EXPECT_TRUE(ul.handle() != pdl.handle());
  EXPECT_EQ(lm->to_string(ul), "");
  EXPECT_EQ(lm->to_string(pdl), "<built-in>");
  EXPECT_EQ(lm->get_initial_file(), "");

  lm->start_file("foo.go", 10);
  EXPECT_EQ(lm->to_string(ul), "");
  EXPECT_EQ(lm->to_string(pdl), "<built-in>");
  EXPECT_EQ(lm->get_initial_file(), "foo.go");
  Location f10 = lm->get_location(1);
  lm->start_line(12, 256);
  Location f12 = lm->get_location(1);
  Location f12c5 = lm->get_location(5);
  Location f12x = lm->get_location(1);
  EXPECT_TRUE(f10.handle() != ul.handle());
  EXPECT_TRUE(f10.handle() != pdl.handle());
  EXPECT_TRUE(f12.handle() != f10.handle());
  EXPECT_TRUE(f12.handle() != f12c5.handle());
  EXPECT_NE(f12x.handle(), f12.handle()); // no line/col hashing currently
  EXPECT_EQ(lm->to_string(f12x), lm->to_string(f12));
  EXPECT_EQ(lm->location_line(f10), 10);
  EXPECT_EQ(lm->location_file(f10), std::string("foo.go"));
  EXPECT_EQ(lm->location_line(f12), 12);
  EXPECT_EQ(lm->location_column(f12), 1u);
  EXPECT_EQ(lm->location_column(f12c5), 5u);
  EXPECT_EQ(lm->location_line(f12x), 12);
  EXPECT_EQ(lm->location_line(f12c5), 12);

  lm->start_file("blix.go", 89);
  EXPECT_EQ(lm->get_initial_file(), "foo.go");
  lm->start_file("/tmp/bar.go", 1);
  Location b1 = lm->get_location(1);
  lm->start_line(22, 0);
  Location b22 = lm->get_location(1);
  Location b22c9 = lm->get_location(9);
  EXPECT_TRUE(b22.handle() != b22c9.handle());
  std::string b22s = lm->to_string(b22);
  std::string b22c9s = lm->to_string(b22c9);
  EXPECT_EQ(b22s, b22c9s);
  EXPECT_EQ(b22s, "bar.go:22");
  lm->start_file("foo.go", 10);
  Location x10 = lm->get_location(1);
  EXPECT_EQ(lm->to_string(b22), b22s);
  EXPECT_TRUE(x10.handle() != b1.handle());
  lm->start_line(12, 256);
  Location x12 = lm->get_location(1);
  EXPECT_NE(x12.handle(), f12.handle());
  EXPECT_EQ(lm->to_string(x12), lm->to_string(f12));

  std::string stats = lm->statistics();
  EXPECT_EQ(stats, "accesses=9 files=5 segments=4 "
            "locmem=22 bytes/location=2.4");
}

}
