// Copyright 2016 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 "base/test/scoped_feature_list.h"

#include <string>

namespace base {
namespace test {

namespace {

static std::string GetFeatureString(
    const std::initializer_list<base::Feature>& features) {
  std::string output;
  for (const base::Feature& feature : features) {
    if (!output.empty())
      output += ",";
    output += feature.name;
  }
  return output;
}

}  // namespace

ScopedFeatureList::ScopedFeatureList() {}

ScopedFeatureList::~ScopedFeatureList() {
  if (original_feature_list_) {
    base::FeatureList::ClearInstanceForTesting();
    base::FeatureList::RestoreInstanceForTesting(
        std::move(original_feature_list_));
  }
}

void ScopedFeatureList::Init() {
  std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
  feature_list->InitializeFromCommandLine(std::string(), std::string());
  InitWithFeatureList(std::move(feature_list));
}

void ScopedFeatureList::InitWithFeatures(
    const std::initializer_list<base::Feature>& enabled_features,
    const std::initializer_list<base::Feature>& disabled_features) {
  InitFromCommandLine(GetFeatureString(enabled_features),
                      GetFeatureString(disabled_features));
}

void ScopedFeatureList::InitWithFeatureList(
    std::unique_ptr<FeatureList> feature_list) {
  DCHECK(!original_feature_list_);
  original_feature_list_ = base::FeatureList::ClearInstanceForTesting();
  base::FeatureList::SetInstance(std::move(feature_list));
}

void ScopedFeatureList::InitFromCommandLine(
    const std::string& enable_features,
    const std::string& disable_features) {
  std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
  feature_list->InitializeFromCommandLine(enable_features, disable_features);
  InitWithFeatureList(std::move(feature_list));
}

void ScopedFeatureList::InitAndEnableFeature(const base::Feature& feature) {
  InitFromCommandLine(feature.name, std::string());
}

void ScopedFeatureList::InitAndDisableFeature(const base::Feature& feature) {
  InitFromCommandLine(std::string(), feature.name);
}

}  // namespace test
}  // namespace base