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

#include "xreatemanager.h"
#include "ast.h"
#include "analysis/interpretation.h"
#include "gtest/gtest.h"
#include "supplemental/docutils.h"

using namespace xreate;
using namespace std;

TEST(Virtualization, Doc_AccControl_1) {
  string example = getDocumentationExampleFromFile("scripts/virtualization/test-AccControl_1.xreate");
  string exampleBody = getDocumentationExampleById("documentation/virtualization.xml", "AccControl_1");
  string output = getDocumentationExampleById("documentation/virtualization.xml", "Output_AccControl_1");
  replace(example, "<BODY>", exampleBody);

  std::unique_ptr<XreateManager> man(XreateManager::prepare(move(example)));
  int (* main)() = (int (*)()) man->run();

  testing::internal::CaptureStdout();
  main();
  std::string outputActual = testing::internal::GetCapturedStdout();
  cout << outputActual << endl;
  ASSERT_STREQ(output.c_str(), outputActual.c_str());
}

TEST(Virtualization, Doc_Isolation_1) {
  string example = getDocumentationExampleFromFile("scripts/virtualization/test-Isolation_1.xreate");
  string partA = getDocumentationExampleById("documentation/virtualization.xml", "Isolation_1");
  string partB = getDocumentationExampleById("documentation/virtualization.xml", "Isolation_2");
  string output = getDocumentationExampleById("documentation/virtualization.xml", "Output_Isolation_1");
  replace(example, "<PART-A-BODY>", partA);
  replace(example, "<PART-B-BODY>", partB);

  std::unique_ptr<details::tier1::XreateManager> man(details::tier1::XreateManager::prepare(move(example)));
  man->analyse();

  ExpandedType typeDictSizoS = man->root->findType("DictSizo");
  ExpandedType typeDictSizo = interpretation::dereferenceSlaveType(typeDictSizoS, man->transcend);
  ASSERT_EQ(TypeOperator::LIST_RECORD, typeDictSizo->__operator);
  int (* main)() = (int (*)()) man->run();

  testing::internal::CaptureStdout();
  main();
  std::string outputActual = testing::internal::GetCapturedStdout();
  cout << outputActual << endl;
  ASSERT_STREQ(output.c_str(), outputActual.c_str());
}

TEST(Virtualization, Doc_IsolationCat_1) {
  string content = getDocumentationExampleFromFile("scripts/virtualization/test-IsolationCat_1.xreate");
  string example = getDocumentationExampleById("documentation/virtualization.xml", "IsolationCat_1");
  string output = getDocumentationExampleById("documentation/virtualization.xml", "Output_IsolationCat_1");
  replace(content, "<EXAMPLE>", example);

  std::unique_ptr<XreateManager> man(XreateManager::prepare(move(content)));
  int (* main)() = (int (*)()) man->run();

  testing::internal::CaptureStdout();
  main();
  std::string outputActual = testing::internal::GetCapturedStdout();
  cout << outputActual << endl;
  ASSERT_STREQ(output.c_str(), outputActual.c_str());
}