#include "nwnx_effect"
#include "nwnx_tests"

void printeff(struct NWNX_EffectUnpacked n)
{
    string s = "Unpacked effect: \n";
    s += "nType = " + IntToString(n.nType) + "\n";
    s += "nSubType = " + IntToString(n.nSubType) + "\n";

    s += "fDuration = " + FloatToString(n.fDuration) + "\n";
    s += "nExpiryCalendarDay = " + IntToString(n.nExpiryCalendarDay) + "\n";
    s += "nExpiryTimeOfDay = " + IntToString(n.nExpiryTimeOfDay) + "\n";

    s += "oCreator = " + ObjectToString(n.oCreator) + "\n";
    s += "nSpellId = " + IntToString(n.nSpellId) + "\n";
    s += "bExpose = " + IntToString(n.bExpose) + "\n";
    s += "bShowIcon = " + IntToString(n.bShowIcon) + "\n";
    s += "nCasterLevel = " + IntToString(n.nCasterLevel) + "\n";

    s += "bLinkLeftValid = " + IntToString(n.bLinkLeftValid) + "\n";
    struct NWNX_EffectUnpacked link = NWNX_Effect_UnpackEffect(n.eLinkLeft);
    s += "bLinkLeft (nType) = " + IntToString(link.nType) + "\n";
    s += "bLinkRightValid = " + IntToString(n.bLinkRightValid) + "\n";
    link = NWNX_Effect_UnpackEffect(n.eLinkRight);
    s += "bLinkRight (nType) = " + IntToString(link.nType) + "\n";

    s += "nNumIntegers = " + IntToString(n.nNumIntegers) + "\n";
    s += "nParam0 = " + IntToString(n.nParam0) + "\n";
    s += "nParam1 = " + IntToString(n.nParam1) + "\n";
    s += "nParam2 = " + IntToString(n.nParam2) + "\n";
    s += "nParam3 = " + IntToString(n.nParam3) + "\n";
    s += "nParam4 = " + IntToString(n.nParam4) + "\n";
    s += "nParam5 = " + IntToString(n.nParam5) + "\n";
    s += "nParam6 = " + IntToString(n.nParam6) + "\n";
    s += "nParam7 = " + IntToString(n.nParam7) + "\n";
    s += "fParam0 = " + FloatToString(n.fParam0) + "\n";
    s += "fParam1 = " + FloatToString(n.fParam1) + "\n";
    s += "fParam2 = " + FloatToString(n.fParam2) + "\n";
    s += "fParam3 = " + FloatToString(n.fParam3) + "\n";
    s += "sParam0 = " + "'" + n.sParam0 + "'" + "\n";
    s += "sParam1 = " + "'" + n.sParam1 + "'" + "\n";
    s += "sParam2 = " + "'" + n.sParam2 + "'" + "\n";
    s += "sParam3 = " + "'" + n.sParam3 + "'" + "\n";
    s += "sParam4 = " + "'" + n.sParam4 + "'" + "\n";
    s += "sParam5 = " + "'" + n.sParam5 + "'" + "\n";
    s += "oParam0 = " + ObjectToString(n.oParam0) + "\n";
    s += "oParam1 = " + ObjectToString(n.oParam1) + "\n";
    s += "oParam2 = " + ObjectToString(n.oParam2) + "\n";
    s += "oParam3 = " + ObjectToString(n.oParam3) + "\n";

    s += "sTag = " + "'" + n.sTag + "'" + "\n";

    WriteTimestampedLogEntry(s);
}

void main()
{
    WriteTimestampedLogEntry("NWNX_Effect unit test begin..");

    effect eCurse = EffectCurse(1, 2, 3, 4, 5, 6);
    effect eVis = EffectVisualEffect(VFX_DUR_PROT_STONESKIN);
    effect e = EffectLinkEffects(eCurse, eVis);
    e = TagEffect(e, "NWNX_EFFECT_TEST");

    struct NWNX_EffectUnpacked unpacked = NWNX_Effect_UnpackEffect(e);
    printeff(unpacked);
    NWNX_Tests_Report("NWNX_Effect", "UnpackEffect", unpacked.sTag == "NWNX_EFFECT_TEST");

    effect packed = NWNX_Effect_PackEffect(unpacked);
    NWNX_Tests_Report("NWNX_Effect", "PackEffect", GetEffectTag(packed) == "NWNX_EFFECT_TEST");

    object oCreature = CreateObject(OBJECT_TYPE_CREATURE, "nw_chicken", GetStartingLocation());
    ApplyEffectToObject(DURATION_TYPE_PERMANENT, packed, oCreature);

    e = NWNX_Effect_SetEffectExpiredScript(EffectDarkness(), "effect_test");
    unpacked = NWNX_Effect_UnpackEffect(e);
    NWNX_Tests_Report("NWNX_Effect", "SetEffectExpiredScript", unpacked.sParam4 == "effect_test");

    WriteTimestampedLogEntry("NWNX_Effect unit test end.");
}