/* 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"
using namespace xreate;
using namespace std;

TEST(Virtualization, UniqueSizoPrefix_1) {
    FILE* input = fopen("scripts/virtualization/test1.xreate", "r");
    assert(input != nullptr);

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

    ExpandedType typeDictSizoS = man->root->findType("DictSizo");
    ExpandedType typeDictSizo  = interpretation::dereferenceSlaveType(typeDictSizoS, man->transcend);
    ASSERT_EQ(TypeOperator::LIST_NAMED, typeDictSizo->__operator);
    int (*main)() = (int (*)())man->run();
    
    testing::internal::CaptureStdout();
    main();
    std::string outputActual = testing::internal::GetCapturedStdout();
    cout << outputActual << endl;
    ASSERT_STREQ("file opened: /0/test1 file opened: /1/test1 ", outputActual.c_str());
}

TEST(Virtualization, GlobalDereferenceStrategy_1) {
    FILE* input = fopen("scripts/virtualization/test2.xreate", "r");
    assert(input != nullptr);
    std::unique_ptr<XreateManager> man(XreateManager::prepare(input));
    int (*main)() = (int (*)())man->run();
    
    testing::internal::CaptureStdout();
    main();
    std::string outputActual = testing::internal::GetCapturedStdout();
    cout << outputActual << endl;
    ASSERT_STREQ("file opened: test1 file opened: test1 ", outputActual.c_str());
}

TEST(Virtualization, LocalDereferenceStrategy_1) {
FILE* input = fopen("scripts/virtualization/test3.xreate", "r");
    assert(input != nullptr);
    std::unique_ptr<XreateManager> man(XreateManager::prepare(input));
    int (*main)() = (int (*)())man->run();
    
    testing::internal::CaptureStdout();
    main();
    std::string outputActual = testing::internal::GetCapturedStdout();
    cout << outputActual << endl;
    ASSERT_STREQ("file opened: test1 file opened: 1/test1 ", outputActual.c_str());
}
