//
//  OmLuaTests.cpp
//  OmUtil
//
//  Created by David Van Brink on 3/12/17.
//  Copyright (c) 2017 omino.com. All rights reserved.
//

#include "OmLuaTests.h"
#include "Om.h"
#include "OmAsserts.h"

OMTEST(minimalLuaTest)
{
    OmLua *oLua = new OmLua();
    oLua->capturePrints();
    oLua->execute("print(2/5)");
    std::string s = oLua->getPrints();
    ASSERT_EQUALS_STRING("lua output", "0.4", s);
    delete (oLua);
}

OMTEST(testErrorReturn)
{
    OmLua *oLua = new OmLua();
    std::string eS;
    int eN;
    
    eN = oLua->execute("a = 3");
    eS = oLua->getLastExecuteError();
    ASSERT_EQUALS_INT("no error", 0, eN);
    ASSERT_EQUALS_INT("no error", 0, eS.length());

    eN = oLua->execute("a = 3x");
    eS = oLua->getLastExecuteError();
    ASSERT_NOT_EQUALS_INT("error", 0, eN);
    ASSERT_NOT_EQUALS_INT("error", 0, eS.length());
    
    OMDELETE(oLua);

}
#include <math.h>
static int ir(int low, int high)
{
    int result = (int) floor(rr(low,high));
    if(result == high)
        result -= 1;
    return result;
}

OMTEST(thrashTest)
{
    OmLua *oLua = new OmLua();
    int k = 10000;
    for(int ix = 0; ix < k; ix++)
    {
        std::string s = "";
        for(int jx = 0; jx < ir(10,20); jx++)
        {
            s += (char)ir('a','z'+1);
            s += " (3))";
        }
        auto eN = oLua->execute(s);
        auto eS = oLua->getLastExecuteError();
        ASSERT_NOT_EQUALS_INT_SHUSH("error", 0, eN);
        ASSERT_NOT_EQUALS_INT_SHUSH("error", 0, eS.length());
    }
    OMDELETE(oLua);
}

OMTEST(testGetNumber)
{
    // accessors for simple retrieval
    OmLua oLua;
    
    oLua.execute("a = 23 ");
    float a = oLua.getNumber("a");
    ASSERT_EQUALS_FLOAT("got from lua?", 23, a);
}

void allLuaTests()
{
    minimalLuaTest();
    testErrorReturn();
    thrashTest();
    
    testGetNumber();
}