#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(
    interface(extern-c){
        libFake = library:: pkgconfig("libxml-2.0").
    
        include {
            libFake = ["math.h"]
        }.
    }
    
    main = function:: int; entry {
        loop fold inf(0->state) :: int {
            if (pow(2, state)==32)::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);
}