-- require "lfs"
-- Clean Function --
newaction {
    trigger = "clean",
    description = "clean the build",
    execute = function()
        print("clean the build...")
        os.rmdir("build")
        os.remove("Makefile")
        -- no wildcards in os.remove, so use shell
        os.execute("rm *.make")
        print("build cleaned")
    end
}

workspace "rive_tests"
configurations {"debug"}

project("tests")
kind "ConsoleApp"
language "C++"
cppdialect "C++17"
targetdir "build/bin/%{cfg.buildcfg}"
objdir "build/obj/%{cfg.buildcfg}"

buildoptions {"-Wall", "-fno-exceptions", "-fno-rtti"}

includedirs {"./include", "../../include"}

files {"../../src/**.cpp", -- the Rive runtime source
"../../test/**.cpp" -- the tests
}

defines {"TESTING", "ENABLE_QUERY_FLAT_VERTICES"}

filter "configurations:debug"
defines {"DEBUG"}
symbols "On"

--[[

-- Recursively iterate through all files in a dir
function dirtree(dir)

    assert(dir and dir ~= "", "Provide a directory")
    if string.sub(dir, -1) == "/" then
        dir = string.sub(dir, 1, -2)
    end

    local function yieldtree(dir)
        for entry in lfs.dir(dir) do
            if entry ~= "." and entry ~= ".." then
                entry = dir .. "/" .. entry
                local attr = lfs.attributes(entry)
                coroutine.yield(entry, attr)
                if attr.mode == "directory" then
                    yieldtree(entry)
                end
            end
        end
    end
    return coroutine.wrap(function()
        yieldtree(dir)
    end)
end

-- Get the file extension from a string
function getFileExtension(path)
    return path:match("^.+(%..+)$")
end

-- Get file paths to all files ending in the given file extension in a given dir
-- This will recurse through subdirs
function getFilesByExtension(extension, dir)
    local function yieldfile(dir)
        for filename, attr in dirtree(dir) do
            if attr.mode == "file" and getFileExtension(filename) == extension then
                coroutine.yield(filename)
            end
        end
    end
    return coroutine.wrap(function()
        yieldfile(dir)
    end)
end

-- Build test executable for a cpp file
local function test(filepath)

    local filename = filepath:match("([^/]+)$")
    local projectname = filename:match("^[^%.]+")
    -- print("Filepath: " .. filepath)
    -- print("Filename: " .. filename)
    -- print("Projectname: " .. projectname)

    project(projectname)
    kind "ConsoleApp"
    language "C++"
    cppdialect "C++17"
    targetdir "build/bin/%{cfg.buildcfg}"
    objdir "build/obj/%{cfg.buildcfg}"
    
    buildoptions {
        "-Wall", 
        "-fno-exceptions", 
        "-fno-rtti"
    }

    includedirs {
        "./include",
        "../../rive/include"
    }

    files {
        "../../rive/src/**.cpp",
        filepath
    }

    filter "configurations:debug"
        defines { "DEBUG" }
        symbols "On"
end

-- Build all cpp test files in Rive's test directory
for cppFile in getFilesByExtension(".cpp", "../../rive/test/") do
    test(cppFile)
end

-- Build test executable for a cpp file and link to the precompiled rive lib
local function test_precompiled(filepath)

    local filename = filepath:match("([^/]+)$") .. "_linked"
    local projectname = filename:match("^[^%.]+") .. "_linked"
    -- print("Filepath: " .. filepath)
    -- print("Filename: " .. filename)
    -- print("Projectname: " .. projectname)

    project(projectname)
    kind "ConsoleApp"
    language "C++"
    cppdialect "C++17"
    targetdir "build/bin/%{cfg.buildcfg}"
    objdir "build/obj/%{cfg.buildcfg}"
    
    buildoptions {
        "-Wall", 
        "-fno-exceptions", 
        "-fno-rtti"
    }

    includedirs {
        "./include",
        "../../rive/include"
    }

    files { filepath }

    links
    {
        "../../rive/build/bin/debug/librive.a"
    }

    filter "configurations:debug"
        defines { "DEBUG" }
        symbols "On"
end

-- Build all cpp test files in Rive's test directory
for cppFile in getFilesByExtension(".cpp", "../../rive/test/") do
    test_precompiled(cppFile)
end

--]]
