QT = core gui qml testlib scxml
CONFIG += testcase c++11 console
CONFIG -= app_bundle
TARGET = tst_scion

TEMPLATE = app

RESOURCES = $$OUT_PWD/scion.qrc
DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII

SOURCES += \
    tst_scion.cpp

defineReplace(nameTheNamespace) {
    sn=$$relative_path($$absolute_path($$dirname(1), $$OUT_PWD),$$SCXMLS_DIR)
    sn~=s/\\.txml$//
    sn~=s/[^a-zA-Z_0-9]/_/
    return ($$sn)
}
defineReplace(nameTheClass) {
    cn = $$basename(1)
    cn ~= s/\\.scxml$//
    cn ~=s/\\.txml$//
    cn ~= s/[^a-zA-Z_0-9]/_/
    return ($$cn)
}

qtPrepareTool(QMAKE_QSCXMLC, qscxmlc)

win32 {
    msvc: QMAKE_CXXFLAGS += /bigobj
}

myscxml.commands = $$QMAKE_QSCXMLC --header scxml/${QMAKE_FUNC_nameTheNamespace}_${QMAKE_FILE_IN_BASE}.h --impl ${QMAKE_FILE_OUT} --namespace ${QMAKE_FUNC_nameTheNamespace} --classname ${QMAKE_FUNC_nameTheClass} ${QMAKE_FILE_IN}
myscxml.depends += $$QMAKE_QSCXMLC_EXE
myscxml.output = scxml/${QMAKE_FUNC_nameTheNamespace}_${QMAKE_FILE_IN_BASE}.cpp
myscxml.input = SCXMLS
myscxml.variable_out = SOURCES
QMAKE_EXTRA_COMPILERS += myscxml

myscxml_hdr.input = SCXMLS
myscxml_hdr.variable_out = SCXML_HEADERS
myscxml_hdr.commands = $$escape_expand(\\n)
myscxml_hdr.depends = scxml/${QMAKE_FUNC_nameTheNamespace}_${QMAKE_FILE_IN_BASE}.cpp
myscxml_hdr.output = scxml/${QMAKE_FUNC_nameTheNamespace}_${QMAKE_FILE_IN_BASE}.h
QMAKE_EXTRA_COMPILERS += myscxml_hdr

SCXMLS_DIR += $$absolute_path($$PWD/../../3rdparty/scion-tests/scxml-test-framework/test)
ALLSCXMLS = $$files($$SCXMLS_DIR/*.scxml, true)

# For a better explanation about the "blacklisted" tests, see tst_scion.cpp
# <invoke>
BLACKLISTED = \
    test216sub1.scxml \
    test226sub1.txml \
    test239sub1.scxml \
    test242sub1.scxml \
    test276sub1.scxml \
    test530.txml.scxml

# other
BLACKLISTED += \
    test301.txml.scxml \
    test441a.txml.scxml \
    test441b.txml.scxml \
    test557.txml.scxml

for (f,ALLSCXMLS) {
    cn = $$basename(f)
    if (!contains(BLACKLISTED, $$cn)) {
        SCXMLS += $$f

        cn ~= s/\\.scxml$//
        hn = $$cn
        cn ~=s/\\.txml$//
        sn = $$relative_path($$dirname(f), $$SCXMLS_DIR)
        sn ~=s/[^a-zA-Z_0-9]/_/

        inc_list += "$${LITERAL_HASH}include \"scxml/$${sn}_$${hn}.h\""
        func_list += "    []()->QScxmlStateMachine*{return new $${sn}::$${cn};},"

        base = $$relative_path($$f,$$absolute_path($$SCXMLS_DIR))
        tn = $$base
        tn ~= s/\\.scxml$//
        testBases += "    \"$$tn\","
    }
}

ALLFILES = $$files($$SCXMLS_DIR/*.*, true)
for (f,ALLFILES) {
    base = $$relative_path($$f,$$absolute_path($$SCXMLS_DIR))
    file = $$relative_path($$f, $$absolute_path($$OUT_PWD))
    qrc += '<file alias="$$base">$$file</file>'
}

contents = $$inc_list "std::function<QScxmlStateMachine *()> creators[] = {" $$func_list "};"
write_file("$$OUT_PWD/scxml/compiled_tests.h", contents)|error("Aborting.")

contents = "const char *testBases[] = {" $$testBases "};"
write_file("$$OUT_PWD/scxml/scion.h", contents)|error("Aborting.")

contents = '<!DOCTYPE RCC><RCC version=\"1.0\">' '<qresource>' $$qrc '</qresource></RCC>'
write_file("$$OUT_PWD/scion.qrc", contents)|error("Aborting.")
