/*
 * Copyright 2009-2020 The VOTCA Development Team (http://www.votca.org)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 *
 *     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.
 *
 */
#define BOOST_TEST_MAIN

#define BOOST_TEST_MODULE rateengine_test

// Third party includes
#include <boost/test/tools/floating_point_comparison.hpp>
#include <boost/test/unit_test.hpp>

// Local VOTCA includes
#include "votca/xtp/rate_engine.h"

using namespace votca::xtp;

BOOST_AUTO_TEST_SUITE(rateengine_test)
BOOST_AUTO_TEST_CASE(sign) {

  Segment seg1("null", 0);

  Segment seg2("one", 0);
  Eigen::Vector3d deltaR = {5, 0, 0};
  QMPair pair(0, &seg1, &seg2, deltaR);
  QMStateType e = QMStateType::Electron;
  QMStateType h = QMStateType::Hole;
  seg1.setU_nX_nN(0.002, e);
  seg1.setU_xN_xX(0.001, e);
  seg1.setU_xX_nN(0.001, e);
  seg2.setU_nX_nN(0.002, e);
  seg2.setU_xN_xX(0.001, e);
  seg2.setU_xX_nN(0.001, e);
  seg1.setU_nX_nN(0.002, h);
  seg1.setU_xN_xX(0.001, h);
  seg1.setU_xX_nN(0.001, h);
  seg2.setU_nX_nN(0.002, h);
  seg2.setU_xN_xX(0.001, h);
  seg2.setU_xX_nN(0.001, h);
  pair.setJeff2(1.00e-06, h);
  pair.setJeff2(1.00e-06, e);

  Eigen::Vector3d field = {1.0, 0.0, 0.0};
  field *= 9.72345198649679e-05;
  double temperature = 0.000950043476927;  // 300K
  Rate_Engine engine(temperature, field);
  Rate_Engine::PairRates pr_e = engine.Rate(pair, e);
  Rate_Engine::PairRates pr_h = engine.Rate(pair, h);
  BOOST_CHECK_EQUAL(pr_e.rate12 < pr_e.rate21, true);
  BOOST_CHECK_EQUAL(pr_h.rate12 > pr_h.rate21, true);
}

BOOST_AUTO_TEST_CASE(markus) {

  Segment seg1("null", 0);

  Segment seg2("one", 0);
  Eigen::Vector3d deltaR = {5, 0, 0};
  QMPair pair(0, &seg1, &seg2, deltaR);
  QMStateType e = QMStateType::Electron;
  seg1.setEMpoles(e, -0.003674932248085);
  seg2.setEMpoles(e, -0.005512398372128);
  seg1.setU_nX_nN(0.003674932248085, e);
  seg1.setU_xN_xX(0.004042425472894, e);
  seg1.setU_xX_nN(0.036749322480855, e);
  seg2.setU_nX_nN(0.006614878046554, e);
  seg2.setU_xN_xX(0.004777411922511, e);
  seg2.setU_xX_nN(0.062473848217453, e);
  double J = 1.00e-03;
  pair.setJeff2(J * J, e);

  Eigen::Vector3d field = {1.0, 0.0, 0.0};
  field *= 9.72345198649679e-05;
  double temperature = 0.000950043476927;  // 300K
  Rate_Engine engine(temperature, field);
  Rate_Engine::PairRates pr = engine.Rate(pair, e);
  BOOST_CHECK_CLOSE(pr.rate12, 0.069766184455863, 1e-5);
  BOOST_CHECK_CLOSE(pr.rate21, 221259502589.522, 1e-5);
}

BOOST_AUTO_TEST_SUITE_END()
