/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 **/

#include "utility/TemplateUtil.hpp"

#include <memory>
#include <string>
#include <sstream>
#include <tuple>
#include <utility>

#include "utility/Macros.hpp"

#include "gtest/gtest.h"

namespace quickstep {

class SomeArgType {
 public:
  explicit SomeArgType(const std::string &value)
      : value_(value) {
  }

  SomeArgType(SomeArgType &&arg)
      : value_(std::move(arg.value_)) {
  }

  std::string toString() const {
    return value_;
  }

 private:
  const std::string value_;

  DISALLOW_COPY_AND_ASSIGN(SomeArgType);
};

class BaseClass {
 public:
  virtual ~BaseClass() {}

  virtual std::string toString() const = 0;
};

template <bool c1, bool c2, bool c3, bool c4, bool c5, bool c6>
class SomeClass : public BaseClass {
 public:
  SomeClass(const int a1, SomeArgType &&a2)
      : a1_(a1), a2_(std::forward<SomeArgType>(a2)) {
  }

  ~SomeClass() override {};

  std::string toString() const override {
    std::ostringstream oss;
    oss << "{ ";
    if (c1) {
      oss << "c1 ";
    }
    if (c2) {
      oss << "c2 ";
    }
    if (c3) {
      oss << "c3 ";
    }
    if (c4) {
      oss << "c4 ";
    }
    if (c5) {
      oss << "c5 ";
    }
    if (c6) {
      oss << "c6 ";
    }
    oss << "} " << a1_ << " " << a2_.toString();
    return oss.str();
  }

 private:
  const int a1_;
  const SomeArgType a2_;
};

void RunTest(const bool c1, const bool c2, const bool c3,
             const bool c4, const bool c5, const bool c6,
             const std::string &expected) {
  // arg should be perfectly forwarded.
  SomeArgType arg("xyz");

  std::unique_ptr<BaseClass> base(
      CreateBoolInstantiatedInstance<SomeClass, BaseClass>(std::forward_as_tuple(10, std::move(arg)),
                                                           c1, c2, c3, c4, c5, c6));
  EXPECT_STREQ(expected.c_str(), base->toString().c_str());
}

TEST(TemplateUtilTest, TemplateUtilTest) {
  RunTest(true, false, true, false, true, false, "{ c1 c3 c5 } 10 xyz");
  RunTest(true, true, true, true, true, true, "{ c1 c2 c3 c4 c5 c6 } 10 xyz");
  RunTest(false, false, true, true, false, false, "{ c3 c4 } 10 xyz");
  RunTest(false, false, false, false, false, false, "{ } 10 xyz");
}

}  // namespace quickstep
