/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/
 *
 * polymorph.cpp
 *
 * Author: pgess <v.melnychenko@xreate.org>
 * Created on October 11, 2017, 8:37 PM
 */

#include "xreatemanager.h"
#include "ast.h"
#include <list>
#include "gtest/gtest.h"

using namespace std;
using namespace xreate;
using namespace std;
TEST(Polymorphs, ast1) {
    xreate::XreateManager* man = xreate::XreateManager::prepare(
R"CODE(
    guard:: a {
        test = function:: int {0}
    }

    guard:: b {
        test = function:: int {1}
    }

    main = function:: int; entry { test() }

)CODE");

    const std::list<ManagedFnPtr>& specs = man->root->getFunctionSpecializations("test");
    ASSERT_EQ(2, specs.size());

    auto itSpecs = specs.begin();
    ASSERT_EQ("a", (*itSpecs)->guard.getValueString());
    itSpecs++;
    ASSERT_EQ("b", (*itSpecs)->guard.getValueString());
}

TEST(Polymorphs, call1) {
    xreate::details::tier1::XreateManager* man = xreate::details::tier1::XreateManager::prepare(
R"CODE(
    import raw("scripts/dfa/polymorphism.lp").

    guard:: a {
        test = function:: int {0}
    }

    guard:: b {
        test = function:: int {1}
    }

    main = function:: int; entry { test()::int; callguard(b);dfa_polym(ret)}

)CODE");

    man->analyse();
    int (*main)() = (int (*)()) man->run();

    ASSERT_EQ(1, main());
}