Quantcast
-- Number of specializations for each class.
local NUM_SPECIALIZATIONS = {
	DEATHKNIGHT = 3,
	DRUID = 4,
	HUNTER = 3,
	MAGE = 3,
	MONK = 3,
	PALADIN = 3,
	PRIEST = 3,
	ROGUE = 3,
	SHAMAN = 3,
	WARLOCK = 3,
	WARRIOR = 3,
}

-- Addon files needed to run methods from OvaleCompile.
-- The order of files is as listed in Ovale.toc.
local addonFiles = {
	"Ovale.lua",
	"Localization.lua",
	"Options.lua",
	"Debug.lua",
	-- Profiling module.
	"Profiler.lua",
	-- Utility modules.
	"Pool.lua",
	"PoolRefCount.lua",
	"Queue.lua",
	-- Core modules.
	"AST.lua",
	"Compile.lua",
	"Condition.lua",
	"Cooldown.lua",
	"Data.lua",
	"Equipment.lua",
	"Lexer.lua",
	"PaperDoll.lua",
	"Runes.lua",
	"Score.lua",
	"Scripts.lua",
	"SpellBook.lua",
	"Stance.lua",
	"State.lua",
	-- Additional modules.
	"conditions.lua",
	"scripts/files.xml",
}

local root = "../"
for class, numSpecializations in pairs(NUM_SPECIALIZATIONS) do
	for specialization = 1, numSpecializations do
		-- Create WoWMock sandbox.
		dofile(root .. "WoWMock.lua")
		local config = {
			class = class,
			specialization = specialization,
		}
		local sandbox = WoWMock:NewSandbox(config)

		-- Load addon files into the sandbox.
		sandbox:SetAddonName("Ovale")
		for _, filename in ipairs(addonFiles) do
			sandbox:LoadAddonFile(filename, root)
		end

		-- Fire events to simulate the addon-loading process.
		sandbox:Fire("ADDON_LOADED")
		sandbox:Fire("SPELLS_CHANGED")
		sandbox:Fire("PLAYER_LOGIN")
		sandbox:Fire("PLAYER_ENTERING_WORLD")

		-- Enter sandbox.
		setfenv(1, sandbox)

		local OvaleAST = Ovale.OvaleAST
		local OvaleCompile = Ovale.OvaleCompile
		local OvalePaperDoll = Ovale.OvalePaperDoll

		-- Parse the default Ovale script for the class.
		local class = UnitClass()
		local specialization = OvalePaperDoll:GetSpecialization()
		local source = "Ovale"
		print(string.format("Compiling '%s' script for %s (%s).", source, class, specialization))
		OvaleCompile:CompileScript(source)
		OvaleCompile:EvaluateScript(true)
	end
end