// Copyright 2014 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 <sstream>

#include "test/test.h"
#include "tools/gn/config.h"
#include "tools/gn/config_values_extractors.h"
#include "tools/gn/target.h"
#include "tools/gn/test_with_scope.h"

namespace {

struct FlagWriter {
  void operator()(const std::string& dir, std::ostream& out) const {
    out << dir << " ";
  }
};

struct IncludeWriter {
  void operator()(const SourceDir& dir, std::ostream& out) const {
    out << dir.value() << " ";
  }
};

}  // namespace

TEST(ConfigValuesExtractors, IncludeOrdering) {
  TestWithScope setup;
  Err err;

  // Construct a chain of dependencies: target -> dep1 -> dep2
  // Add representative values: cflags (opaque, always copied) and include_dirs
  // (uniquified) to each one so we can check what comes out the other end.

  // Set up dep2, direct and all dependent configs.
  Config dep2_all(setup.settings(), Label(SourceDir("//dep2/"), "all"));
  dep2_all.own_values().cflags().push_back("--dep2-all");
  dep2_all.own_values().include_dirs().push_back(SourceDir("//dep2/all/"));
  ASSERT_TRUE(dep2_all.OnResolved(&err));

  Config dep2_direct(setup.settings(), Label(SourceDir("//dep2/"), "direct"));
  dep2_direct.own_values().cflags().push_back("--dep2-direct");
  dep2_direct.own_values().include_dirs().push_back(
      SourceDir("//dep2/direct/"));
  ASSERT_TRUE(dep2_direct.OnResolved(&err));

  Target dep2(setup.settings(), Label(SourceDir("//dep2/"), "dep2"));
  dep2.set_output_type(Target::SOURCE_SET);
  dep2.visibility().SetPublic();
  dep2.SetToolchain(setup.toolchain());
  dep2.all_dependent_configs().push_back(LabelConfigPair(&dep2_all));
  dep2.public_configs().push_back(LabelConfigPair(&dep2_direct));

  // Set up dep1, direct and all dependent configs. Also set up a subconfig
  // on "dep1_all" to test sub configs.
  Config dep1_all_sub(setup.settings(), Label(SourceDir("//dep1"), "allch"));
  dep1_all_sub.own_values().cflags().push_back("--dep1-all-sub");
  ASSERT_TRUE(dep1_all_sub.OnResolved(&err));

  Config dep1_all(setup.settings(), Label(SourceDir("//dep1/"), "all"));
  dep1_all.own_values().cflags().push_back("--dep1-all");
  dep1_all.own_values().include_dirs().push_back(SourceDir("//dep1/all/"));
  dep1_all.configs().push_back(LabelConfigPair(&dep1_all_sub));
  ASSERT_TRUE(dep1_all.OnResolved(&err));

  Config dep1_direct(setup.settings(), Label(SourceDir("//dep1/"), "direct"));
  dep1_direct.own_values().cflags().push_back("--dep1-direct");
  dep1_direct.own_values().include_dirs().push_back(
      SourceDir("//dep1/direct/"));
  ASSERT_TRUE(dep1_direct.OnResolved(&err));

  Target dep1(setup.settings(), Label(SourceDir("//dep1/"), "dep1"));
  dep1.set_output_type(Target::SOURCE_SET);
  dep1.visibility().SetPublic();
  dep1.SetToolchain(setup.toolchain());
  dep1.all_dependent_configs().push_back(LabelConfigPair(&dep1_all));
  dep1.public_configs().push_back(LabelConfigPair(&dep1_direct));
  dep1.private_deps().push_back(LabelTargetPair(&dep2));

  // Set up target, direct and all dependent configs.
  Config target_all(setup.settings(), Label(SourceDir("//target/"), "all"));
  target_all.own_values().cflags().push_back("--target-all");
  target_all.own_values().include_dirs().push_back(SourceDir("//target/all/"));
  ASSERT_TRUE(target_all.OnResolved(&err));

  Config target_direct(setup.settings(),
                       Label(SourceDir("//target/"), "direct"));
  target_direct.own_values().cflags().push_back("--target-direct");
  target_direct.own_values().include_dirs().push_back(
      SourceDir("//target/direct/"));
  ASSERT_TRUE(target_direct.OnResolved(&err));

  // This config is applied directly to target.
  Config target_config(setup.settings(),
                       Label(SourceDir("//target/"), "config"));
  target_config.own_values().cflags().push_back("--target-config");
  target_config.own_values().include_dirs().push_back(
      SourceDir("//target/config/"));
  ASSERT_TRUE(target_config.OnResolved(&err));

  Target target(setup.settings(), Label(SourceDir("//target/"), "target"));
  target.set_output_type(Target::SOURCE_SET);
  target.SetToolchain(setup.toolchain());
  target.all_dependent_configs().push_back(LabelConfigPair(&target_all));
  target.public_configs().push_back(LabelConfigPair(&target_direct));
  target.configs().push_back(LabelConfigPair(&target_config));
  target.private_deps().push_back(LabelTargetPair(&dep1));

  // Additionally add some values directly on "target".
  target.config_values().cflags().push_back("--target");
  target.config_values().include_dirs().push_back(
      SourceDir("//target/"));

  // Mark targets resolved. This should push dependent configs.
  ASSERT_TRUE(dep2.OnResolved(&err));
  ASSERT_TRUE(dep1.OnResolved(&err));
  ASSERT_TRUE(target.OnResolved(&err));

  // Verify cflags by serializing.
  std::ostringstream flag_out;
  FlagWriter flag_writer;
  RecursiveTargetConfigToStream<std::string, FlagWriter>(
      &target, &ConfigValues::cflags, flag_writer, flag_out);
  EXPECT_EQ(flag_out.str(),
            "--target --target-config --target-all --target-direct "
            "--dep1-all --dep1-all-sub --dep2-all --dep1-direct ");

  // Verify include dirs by serializing.
  std::ostringstream include_out;
  IncludeWriter include_writer;
  RecursiveTargetConfigToStream<SourceDir, IncludeWriter>(
      &target, &ConfigValues::include_dirs, include_writer, include_out);
  EXPECT_EQ(include_out.str(),
            "//target/ //target/config/ //target/all/ //target/direct/ "
            "//dep1/all/ //dep2/all/ //dep1/direct/ ");
}
