/**
 *   Copyright 2016, Quickstep Research Group, Computer Sciences Department,
 *   University of Wisconsin—Madison.
 *
 *   Licensed 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 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)) {
  }

  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
