/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/
 * 
 * exploitation.cpp
 *
 * Author: pgess <v.melnychenko@xreate.org>
 * Created on February 15, 2018, 6:17 PM
 */

#include "xreatemanager.h"
#include "analysis/cfagraph.h"
#include "pass/cfapass.h"
#include "pass/cfatemporalseqpass.h"
#include "supplemental/docutils.h"
#include "supplemental/defines.h"
#include "gtest/gtest.h"

using namespace xreate;
using namespace xreate::cfa;
using namespace std;

TEST(Exploitation, Doc_ResourceInit_1) {
  string example = getDocumentationExampleFromFile("scripts/exploitation/test1.xreate");
  string body = getDocumentationExampleById("documentation/exploitation.xml", "ResourceInit_1");
  replace(example, "<BODY>", body);

  details::tier1::XreateManager* man = details::tier1::XreateManager::prepare(move(example));
  CFATemporalSeqPass* pass = new CFATemporalSeqPass(man);
  man->registerPass(pass, PassId::CFATemporalSeqPass);
  man->analyse();

  int (* main)() = (int (*)()) man->run();
  int result = main();
  delete pass;
  delete man;

  ASSERT_EQ(1, result);
}

TEST(Exploitation, Doc_ExampleEov_1){
  string code = getDocumentationExampleFromFile("scripts/execution-order/test-1.xreate");
  string codeSpecializations = getDocumentationExampleById("documentation/index.xml", "ExampleEov_1_Specializations");
  
  string script = getDocumentationExampleFromFile("/private/prg/code/xreate/scripts/execution-order/test-1.assembly.lp");
  string scriptExpectation = getDocumentationExampleById("documentation/index.xml", "ExampleEov_1_Expectation");
  string scriptRegistration = getDocumentationExampleById("documentation/index.xml", "ExampleEov_1_Registration");
  
  replace(script, "<insert ExampleEov_1_Expectation>", scriptExpectation);
  replace(script, "<insert ExampleEov_1_Registration>", scriptRegistration);
  replace(code, "<insert ExampleEov_1_Specializations>", codeSpecializations); 
    
  auto man = details::tier1::XreateManager::prepare(move(code));
  man->transcend->addRawScript(move(script));
  
  man->analyse();
  FnNoArgs program = (FnNoArgs)man->run();
  delete man;
  
  testing::internal::CaptureStdout();
  program();
  std::string outputActual = testing::internal::GetCapturedStdout();
  ASSERT_NE(std::string::npos, outputActual.find("HeaderBodyFooter"));
}