First Test Success

This commit is contained in:
Cooldude2606
2019-08-27 19:23:25 +01:00
parent 6c39335b80
commit 32f41ff722
6 changed files with 207 additions and 16 deletions

View File

@@ -51,5 +51,5 @@ return {
'config.expcore-commands.auth_runtime_disable', -- allows commands to be enabled and disabled during runtime
'config.permission_groups', -- loads some predefined permission groups
'config.roles', -- loads some predefined roles
--'expcore.gui.test' -- loads multiple gui defines to test the gui system
'expcore.gui.test' -- loads multiple gui defines to test the gui system
}

View File

@@ -17,6 +17,31 @@ end)
properties.caption = nil
properties.type = 'sprite-button'
end)
:define_draw(function(properties,parent,element)
-- Note that element might be nil if this is the first draw function
-- in this case button is a new concept so we know this is the first function and element is nil
if properties.type == 'button' then
element = parent.draw{
type = properties.type,
name = properties.name,
caption = properties.caption,
tooltip = properties.tooltip
}
else
element = parent.draw{
type = properties.type,
name = properties.name,
sprite = properties.sprite,
tooltip = properties.tooltip
}
end
-- We must return the element or what we want to be seen as the instance, this is so other draw functions have access to it
-- for example if our custom button defined a draw function to change the font color to red
return element
end)
@usage-- Makeing a alternative button based on the first
local custom_button =

View File

@@ -14,21 +14,53 @@ local Gui = {
concepts = {}
}
--[[-- Gets the gui concept with this name
@tparam string name the name of the concept that you want to get
@usage-- Getting a gui concept
local button = Gui.get_concept('Button')
]]
function Gui.get_concept(name)
return Gui.concepts[name] or error('Gui concept "'..name..'" is not defind',2)
end
--[[-- Used internally to save concept names to the core gui module
@function Prototype:change_name
@tparam[opt=self.name] string new_name the new name of the concept
@usage-- Internal Saving
-- this is never needed to be done, internal use only!
local button = Gui.get_concept('Button')
button:change_name('Not Button')
]]
function Prototype:change_name(new_name)
if new_name then
Gui.concepts[self.name] = nil
self.name = new_name
self.properties.name = new_name
end
Gui.concepts[self.name] = self
return self
end
--[[-- Returns a new gui concept with no properties or events
@tparam string name the name that you want this concept to have
@usage-- Making a new concept, see module usage
local button = Gui.new_concept('Button')
]]
function Gui.new_concept(name)
if Gui.concepts[name] then
error('Gui concept "'..name..'" is already defind',2)
end
local concept = Prototype:clone(name)
Gui.concepts[name] = concept
return concept
end
function Gui.get_concept(name)
return Gui.concepts[name] or error('Gui concept "'..name..'" is not defind',2)
return Prototype:clone(name)
end
--[[-- Making anew concept based on the properties and drawing of another
@tparam string name the name of the concept that you want as the base
@tparam string new_name the name that you want the new concept to have
@usage-- Making a new concept from another, see module usage
local custom_button = Gui.clone_concept('Button','CustomButton')
]]
function Gui.clone_concept(name,new_name)
local concept = Gui.concepts[name] or error('Gui concept "'..name..'" is not defind',2)
@@ -36,10 +68,7 @@ function Gui.clone_concept(name,new_name)
error('Gui concept "'..name..'" is already defind',2)
end
local new_concept = concept:clone(new_name)
Gui.concepts[new_name] = new_concept
return new_concept
return concept:clone(new_name)
end
return Gui

View File

@@ -18,6 +18,31 @@ end)
properties.caption = nil
properties.type = 'sprite-button'
end)
:define_draw(function(properties,parent,element)
-- Note that element might be nil if this is the first draw function
-- in this case button is a new concept so we know this is the first function and element is nil
if properties.type == 'button' then
element = parent.draw{
type = properties.type,
name = properties.name,
caption = properties.caption,
tooltip = properties.tooltip
}
else
element = parent.draw{
type = properties.type,
name = properties.name,
sprite = properties.sprite,
tooltip = properties.tooltip
}
end
-- We must return the element or what we want to be seen as the instance, this is so other draw functions have access to it
-- for example if our custom button defined a draw function to change the font color to red
return element
end)
local custom_button =
button:clone('CustomButton')
@@ -117,9 +142,27 @@ function Prototype:clone(concept_name)
concept.set_store_from_instance = nil
end
-- Sets the concept name
concept:change_name()
return concept
end
--[[-- Used internally to save concept names to the core gui module
@function Prototype:change_name
@tparam[opt=self.name] string new_name the new name of the concept
@usage-- Internal Saving
-- this is never needed to be done, internal use only!
local button = Gui.get_concept('Button')
button:change_name('Not Button')
]]
function Prototype:change_name(new_name)
-- over writen in core file
self.name = new_name or self.name
self.properties.name = self.name
return self
end
--[[-- Adds a new event trigger to the concept which can be linked to a factorio event
@tparam string event_name the name of the event to add, must be unique, recomented to start with "on_"
@tparam[opt] defines.events factorio_event when given will fire the custom event when the factorio event is raised
@@ -293,6 +336,7 @@ Gui.get_concept('Button')
:define_draw(function(properties,parent,element)
-- Note that element might be nil if this is the first draw function
-- for this example we assume button was cloned from Prototype and so has no other draw functions defined
-- this means that there is no element yet and what we return will be the first time the element is returned
-- although not shown here you also can recive any extra arguments here from the call to draw
if properties.type == 'button' then
element = parent.draw{
@@ -312,8 +356,8 @@ Gui.get_concept('Button')
end
-- We must return the element or what we want to be seen as the instance
-- this is so other draw functions have access to it, say if our custom button defined a draw function to change the font color to red
-- We must return the element or what we want to be seen as the instance, this is so other draw functions have access to it
-- for example if our custom button defined a draw function to change the font color to red
return element
end)
]]

93
expcore/gui/test.lua Normal file
View File

@@ -0,0 +1,93 @@
--[[-- Core Module - Gui
@module Gui
@alias Gui
]]
local Gui = require 'expcore.gui'
local tests = {}
--[[-- Runs a set of gui tests to ensure that the system is working
@tparam LuaPlayer player the player that the guis are made for and who recives the results
@tparam[opt] string category when given only tests in this category are ran
@usage-- Run all gui tests
Gui.run_tests(Gui.test_string_return(game.print))
]]
function Gui.run_tests(player,category)
local results = {
passed = 0,
failed = 0,
total = 0,
errors = {}
}
if not category then
results.breakdown = {}
for cat,_ in pairs(tests) do
local rtn = Gui.run_tests(player,cat)
results.passed = results.passed + rtn.passed
results.failed = results.failed + rtn.failed
results.total = results.total + rtn.total
for test_name, err in pairs(rtn.errors) do
results.errors[cat..'/'..test_name] = err
end
results.breakdown[cat] = rtn
end
player.print(string.format('All Tests Complete. %d failed.',results.failed))
return results
end
local cat_tests = tests[category]
results.total = #cat_tests
local output = player.print
for test_name, callback in pairs(cat_tests) do
local success, err = pcall(callback,player)
if success then
results.passed = results.passed + 1
else
results.erorrs[test_name] = err
output(string.format('Test "%s / %s" failed:\n%s',category,test_name,err))
end
end
output(string.format('Test Complete "%s". %d failed.',category,results.failed))
return results
end
--[[
Basic frame creation
]]
local test_frame =
Gui.new_concept('test_frame')
:define_draw(function(properties,parent,element)
element =
parent.add{
name = properties.name,
type = 'frame',
caption = 'Gui Tests'
}
element.add{
type = 'label',
caption = 'Hello, World!'
}
return element
end)
tests.Frame = {
['Draw Frame'] = function(player)
test_frame:draw(player.gui.center)
end
}

View File

@@ -16,7 +16,7 @@ local interface_modules = {
['Group']='expcore.permission_groups',
['Roles']='expcore.roles',
['Store']='expcore.store',
--['Gui']='expcore.gui',
['Gui']='expcore.gui',
['Sudo']='expcore.sudo'
}