#include "passmanager.h"

#include "gtest/gtest.h"

using namespace std;

TEST(Loop, Break1){
    string code =
R"CODE(
    main = function:: int; entry {
        input  = [0..10]:: [int].

        loop fold(input->el::int, 0->a)::[int]
        {
            if (a>=5)::int {
                5:: int; break

            } else {a+el}
        }
    }

)CODE";

    xreate::PassManager* man = xreate::PassManager::prepareForCode(move(code));
    int (*funcMain)() = (int (*)()) man->run();

    int answerActual = funcMain();
    ASSERT_EQ(5, answerActual);
}

TEST(Loop, InfiniteLoop1){

    string code =
R"Code(
    fac = function(x:: int):: int{
        range = [2..x] :: [int].

        loop fold(range->i::int, 1->acc)::int {
            acc * i
        }
    }

    main = function:: int; entry {
        loop fold inf(2->state) :: int {
            if (fac(state)==120)::int {
                state::int; break

            } else {state + 1}
        }
    }

)Code" ;

    xreate::PassManager* man = xreate::PassManager::prepareForCode(move(code));
    int (*funcMain)() = (int (*)()) man->run();

    int answerActual = funcMain();
    ASSERT_EQ(5, answerActual);
}