// Copyright 2018 The Chromium 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 "tools/gn/metadata.h"
#include "tools/gn/test_with_scope.h"
#include "util/test/test.h"

TEST(MetadataTest, SetContents) {
  Metadata metadata;

  ASSERT_TRUE(metadata.contents().empty());

  Value a_expected(nullptr, Value::LIST);
  a_expected.list_value().push_back(Value(nullptr, "foo"));
  Value b_expected(nullptr, Value::LIST);
  b_expected.list_value().push_back(Value(nullptr, true));

  Metadata::Contents contents;
  contents.insert(std::pair<base::StringPiece, Value>("a", a_expected));
  contents.insert(std::pair<base::StringPiece, Value>("b", b_expected));

  metadata.set_contents(std::move(contents));

  ASSERT_EQ(metadata.contents().size(), 2);
  auto a_actual = metadata.contents().find("a");
  auto b_actual = metadata.contents().find("b");
  ASSERT_FALSE(a_actual == metadata.contents().end());
  ASSERT_FALSE(b_actual == metadata.contents().end());
  ASSERT_EQ(a_actual->second, a_expected);
  ASSERT_EQ(b_actual->second, b_expected);
}

TEST(MetadataTest, Walk) {
  TestWithScope setup;
  Metadata metadata;
  metadata.set_source_dir(SourceDir("/usr/home/files/"));

  Value a_expected(nullptr, Value::LIST);
  a_expected.list_value().push_back(Value(nullptr, "foo.cpp"));
  a_expected.list_value().push_back(Value(nullptr, "bar.h"));

  metadata.contents().insert(
      std::pair<base::StringPiece, Value>("a", a_expected));

  std::vector<std::string> data_keys;
  data_keys.emplace_back("a");
  std::vector<std::string> walk_keys;
  std::vector<Value> next_walk_keys;
  std::vector<Value> results;

  std::vector<Value> expected;
  expected.emplace_back(Value(nullptr, "foo.cpp"));
  expected.emplace_back(Value(nullptr, "bar.h"));

  std::vector<Value> expected_walk_keys;
  expected_walk_keys.emplace_back(nullptr, "");

  Err err;
  EXPECT_TRUE(metadata.WalkStep(setup.settings()->build_settings(), data_keys,
                                walk_keys, SourceDir(), &next_walk_keys,
                                &results, &err));
  EXPECT_FALSE(err.has_error());
  EXPECT_EQ(next_walk_keys, expected_walk_keys);
  EXPECT_EQ(results, expected);
}

TEST(MetadataTest, WalkWithRebase) {
  TestWithScope setup;
  Metadata metadata;
  metadata.set_source_dir(SourceDir("/usr/home/files/"));

  Value a_expected(nullptr, Value::LIST);
  a_expected.list_value().push_back(Value(nullptr, "foo.cpp"));
  a_expected.list_value().push_back(Value(nullptr, "foo/bar.h"));

  metadata.contents().insert(
      std::pair<base::StringPiece, Value>("a", a_expected));

  std::vector<std::string> data_keys;
  data_keys.emplace_back("a");
  std::vector<std::string> walk_keys;
  std::vector<Value> next_walk_keys;
  std::vector<Value> results;

  std::vector<Value> expected;
  expected.emplace_back(Value(nullptr, "../home/files/foo.cpp"));
  expected.emplace_back(Value(nullptr, "../home/files/foo/bar.h"));

  std::vector<Value> expected_walk_keys;
  expected_walk_keys.emplace_back(nullptr, "");

  Err err;
  EXPECT_TRUE(metadata.WalkStep(setup.settings()->build_settings(), data_keys,
                                walk_keys, SourceDir("/usr/foo_dir/"),
                                &next_walk_keys, &results, &err));
  EXPECT_FALSE(err.has_error());
  EXPECT_EQ(next_walk_keys, expected_walk_keys);
  EXPECT_EQ(results, expected);
}

TEST(MetadataTest, WalkWithRebaseNonString) {
  TestWithScope setup;
  Metadata metadata;
  metadata.set_source_dir(SourceDir("/usr/home/files/"));

  Value a(nullptr, Value::LIST);
  Value inner_list(nullptr, Value::LIST);
  Value inner_scope(nullptr, Value::SCOPE);
  inner_list.list_value().push_back(Value(nullptr, "foo.cpp"));
  inner_list.list_value().push_back(Value(nullptr, "foo/bar.h"));
  a.list_value().push_back(inner_list);

  std::unique_ptr<Scope> scope(new Scope(setup.settings()));
  scope->SetValue("a1", Value(nullptr, "foo2.cpp"), nullptr);
  scope->SetValue("a2", Value(nullptr, "foo/bar2.h"), nullptr);
  inner_scope.SetScopeValue(std::move(scope));
  a.list_value().push_back(inner_scope);

  metadata.contents().insert(std::pair<base::StringPiece, Value>("a", a));
  std::vector<std::string> data_keys;
  data_keys.emplace_back("a");
  std::vector<std::string> walk_keys;
  std::vector<Value> next_walk_keys;
  std::vector<Value> results;

  std::vector<Value> expected;
  Value inner_list_expected(nullptr, Value::LIST);
  Value inner_scope_expected(nullptr, Value::SCOPE);
  inner_list_expected.list_value().push_back(
      Value(nullptr, "../home/files/foo.cpp"));
  inner_list_expected.list_value().push_back(
      Value(nullptr, "../home/files/foo/bar.h"));
  expected.push_back(inner_list_expected);

  std::unique_ptr<Scope> scope_expected(new Scope(setup.settings()));
  scope_expected->SetValue("a1", Value(nullptr, "../home/files/foo2.cpp"),
                           nullptr);
  scope_expected->SetValue("a2", Value(nullptr, "../home/files/foo/bar2.h"),
                           nullptr);
  inner_scope_expected.SetScopeValue(std::move(scope_expected));
  expected.push_back(inner_scope_expected);

  std::vector<Value> expected_walk_keys;
  expected_walk_keys.emplace_back(nullptr, "");

  Err err;
  EXPECT_TRUE(metadata.WalkStep(setup.settings()->build_settings(), data_keys,
                                walk_keys, SourceDir("/usr/foo_dir/"),
                                &next_walk_keys, &results, &err));
  EXPECT_FALSE(err.has_error());
  EXPECT_EQ(next_walk_keys, expected_walk_keys);
  EXPECT_EQ(results, expected);
}

TEST(MetadataTest, WalkKeysToWalk) {
  TestWithScope setup;
  Metadata metadata;
  metadata.set_source_dir(SourceDir("/usr/home/files/"));

  Value a_expected(nullptr, Value::LIST);
  a_expected.list_value().push_back(Value(nullptr, "//target"));

  metadata.contents().insert(
      std::pair<base::StringPiece, Value>("a", a_expected));

  std::vector<std::string> data_keys;
  std::vector<std::string> walk_keys;
  walk_keys.emplace_back("a");
  std::vector<Value> next_walk_keys;
  std::vector<Value> results;

  std::vector<Value> expected_walk_keys;
  expected_walk_keys.emplace_back(nullptr, "//target");

  Err err;
  EXPECT_TRUE(metadata.WalkStep(setup.settings()->build_settings(), data_keys,
                                walk_keys, SourceDir(), &next_walk_keys,
                                &results, &err));
  EXPECT_FALSE(err.has_error());
  EXPECT_EQ(next_walk_keys, expected_walk_keys);
  EXPECT_TRUE(results.empty());
}

TEST(MetadataTest, WalkNoContents) {
  TestWithScope setup;
  Metadata metadata;
  metadata.set_source_dir(SourceDir("/usr/home/files/"));

  std::vector<std::string> data_keys;
  std::vector<std::string> walk_keys;
  std::vector<Value> next_walk_keys;
  std::vector<Value> results;

  std::vector<Value> expected_walk_keys;
  expected_walk_keys.emplace_back(nullptr, "");

  Err err;
  EXPECT_TRUE(metadata.WalkStep(setup.settings()->build_settings(), data_keys,
                                walk_keys, SourceDir(), &next_walk_keys,
                                &results, &err));
  EXPECT_FALSE(err.has_error());
  EXPECT_EQ(next_walk_keys, expected_walk_keys);
  EXPECT_TRUE(results.empty());
}

TEST(MetadataTest, WalkNoKeysWithContents) {
  TestWithScope setup;
  Metadata metadata;
  metadata.set_source_dir(SourceDir("/usr/home/files/"));

  Value a_expected(nullptr, Value::LIST);
  a_expected.list_value().push_back(Value(nullptr, "//target"));

  metadata.contents().insert(
      std::pair<base::StringPiece, Value>("a", a_expected));

  std::vector<std::string> data_keys;
  std::vector<std::string> walk_keys;
  std::vector<Value> next_walk_keys;
  std::vector<Value> results;

  std::vector<Value> expected_walk_keys;
  expected_walk_keys.emplace_back(nullptr, "");

  Err err;
  EXPECT_TRUE(metadata.WalkStep(setup.settings()->build_settings(), data_keys,
                                walk_keys, SourceDir(), &next_walk_keys,
                                &results, &err));
  EXPECT_FALSE(err.has_error());
  EXPECT_EQ(next_walk_keys, expected_walk_keys);
  EXPECT_TRUE(results.empty());
}
