Skip to content

Commit

Permalink
track task usage in task state callback
Browse files Browse the repository at this point in the history
  • Loading branch information
rdaci23 committed Oct 23, 2023
1 parent efcdb05 commit 69c353a
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 76 deletions.
74 changes: 47 additions & 27 deletions src/source/core/Tasks.bs
Original file line number Diff line number Diff line change
Expand Up @@ -114,18 +114,6 @@ namespace mc.tasks

if asBoolean(globalObj.isTrackingTaskUsage)
mc.tasks.observeNodeField(task, "state", mc.tasks.onTaskStateChange, "both")
if globalObj.taskUsage = invalid
taskUsage = mc.createSGNode("Node")
mc.setOrAddNodeField(taskUsage, taskType, 1)
else
taskUsage = globalObj.taskUsage

if taskUsage[taskType] = invalid
mc.setOrAddNodeField(taskUsage, taskType, 0)
end if
taskUsage[taskType] += 1
end if
mc.setOrAddNodeField(globalObj, "taskUsage", taskUsage)
end if

if isRunning
Expand Down Expand Up @@ -381,25 +369,57 @@ namespace mc.tasks
end function

function onTaskStateChange(state as string, task as mc.types.node)
if state = "done" or state = "stop"
globalObj = mc.getGlobal()
if asBoolean(globalObj.isTrackingTaskUsage)
taskUsage = globalObj.taskUsage
taskType = task.subType()
if taskUsage[taskType] <> invalid
if taskUsage[taskType] > 0
taskUsage[taskType] = taskUsage[taskType] - 1
end if
if taskUsage[taskType] = 0
taskUsage.removeField(taskType)
end if
mc.setOrAddNodeField(globalObj, "taskUsage", taskUsage)
end if
mc.tasks.unObserveNodeField(task, "state", mc.tasks.onTaskStateChange)
isRunning = state = "run"
wasRunning = asBoolean(task._mIsRunning) = true
if not wasRunning and state = "run"
mc.setOrAddNodeField(task, "_mIsRunning", true)
else if wasRunning and state = "stop" or state = "done"
mc.setOrAddNodeField(task, "_mIsRunning", false)
end if

if isRunning
mc.tasks.trackTaskUsage(task)
else if wasRunning <> (task._mIsRunning = true)
mc.tasks.updateTaskUsage(task, wasRunning)
end if
end function

function trackTaskUsage(task as mc.types.node)
globalObj = mc.getGlobal()
taskType = task.subType()
m.log.info("Tracking task usage for", taskType)
if globalObj.taskUsage = invalid
taskUsage = mc.createSGNode("Node")
mc.setOrAddNodeField(taskUsage, taskType, 1)
else
taskUsage = globalObj.taskUsage
if taskUsage[taskType] = invalid
mc.setOrAddNodeField(taskUsage, taskType, 0)
end if
taskUsage[taskType] += 1
end if
mc.setOrAddNodeField(globalObj, "taskUsage", taskUsage)
m.log.info("Task usage for", taskType, "is now", taskUsage[taskType])
end function

function updateTaskUsage(task as mc.types.node, wasRunning as boolean)
globalObj = mc.getGlobal()
taskType = task.subType()
m.log.info(taskType, "was finished or canceled.Updating task usage")
taskUsage = globalObj.taskUsage
if taskUsage[taskType] <> invalid
if taskUsage[taskType] > 0
taskUsage[taskType] -= 1
end if
if taskUsage[taskType] = 0
taskUsage.removeField(taskType)
end if
mc.setOrAddNodeField(globalObj, "taskUsage", taskUsage)
m.log.info("Task usage for", taskType, "is now", taskUsage[taskType])
end if
end function


'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'++ ValueObserver class
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Expand Down
62 changes: 14 additions & 48 deletions src/source/core/Tasks.spec.bs
Original file line number Diff line number Diff line change
Expand Up @@ -63,27 +63,6 @@ namespace tests
m.assertEqual(t.control, "init")
end function

@it("tracks task usage if isTrackingTaskUsage global flag is set to true")
function _()
fields = {
args: {
"fv1": "d"
"fv2": "e"
}
}
mc.setOrAddNodeField(m.global, "isTrackingTaskUsage", true)
t = mc.tasks.createTask("mc_RequestTask", fields, m.taskCallback, false, "none", m)
mc.tasks.createTask("mc_RequestTask", fields, m.taskCallback, false, "none", m)
mc.tasks.createTask("mc_LaunchSequence", invalid, m.taskCallback, false, "none", m)

m.assertSubType(t, "mc_RequestTask")
m.assertEqual(t.args.fv1, "d")
m.assertEqual(t.args.fv2, "e")
m.assertEqual(t.control, "init")
m.assertEqual(m.global.taskUsage["mc_RequestTask"], 2)
m.assertEqual(m.global.taskUsage["mc_LaunchSequence"], 1)
end function

@it("starts a task")
function _()
fields = {
Expand All @@ -102,57 +81,46 @@ namespace tests
@describe("onTaskStateChange")
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

@it("it gets called when a task changes state and does't do anything if state is run or init")
@params("run")
@params("init")
function _(state)
@it("sets track usage when state is run")
function _()
task = { "id": "task" }
mc.setOrAddNodeField(m.global, "taskUsage", { "mc_RequestTask": 2 })

m.expectNotCalled(task.subType)
m.expectCalled(task.subType(), "mc_RequestTask")

mc.tasks.onTaskStateChange(state, task)
m.assertEqual(m.global.taskUsage["mc_RequestTask"], 2)
mc.tasks.onTaskStateChange("run", task)
m.assertEqual(m.global.taskUsage["mc_RequestTask"], 1)
end function

@it("doesn't do anything if state is done or stop and isTrackingTaskUsage global flag is set to false")
@params("done")
@params("stop")
function _(state)
@it("updates count when state is run and task is already tracked")
function _()
task = { "id": "task" }
mc.setOrAddNodeField(m.global, "taskUsage", { "mc_RequestTask": 2 })
mc.setOrAddNodeField(m.global, "isTrackingTaskUsage", false)

m.expectNotCalled(task.subType)
mc.setOrAddNodeField(m.global, "taskUsage", { "mc_RequestTask": 1 })
m.expectCalled(task.subType(), "mc_RequestTask")

mc.tasks.onTaskStateChange(state, task)
mc.tasks.onTaskStateChange("run", task)
m.assertEqual(m.global.taskUsage["mc_RequestTask"], 2)
end function

@it("decreases the task usage if state is done or stop and isTrackingTaskUsage global flag is set to true")
@it("update tracking usage count when state is done or stop")
@params("done")
@params("stop")
function _(state)
task = { "id": "task" }
task = { "id": "task", _mIsRunning: true }
mc.setOrAddNodeField(m.global, "taskUsage", { "mc_RequestTask": 2 })
mc.setOrAddNodeField(m.global, "isTrackingTaskUsage", true)

m.expectCalled(task.subType(), "mc_RequestTask")
m.expectNotCalled(taskUsage.removeField)

mc.tasks.onTaskStateChange(state, task)
m.assertEqual(m.global.taskUsage["mc_RequestTask"], 1)
end function

@it("removes entries from taskUsage if there are no more entries and state is done or stop and isTrackingTaskUsage global flag is set to true")
@it("removes entries from taskUsage if there are no more entries and state is done or stop")
@params("done")
@params("stop")
function _(state)
task = { "id": "task" }
task = { "id": "task", _mIsRunning: true }
taskUsage = mc.createSGNode("Node")
mc.setOrAddNodeField(taskUsage, "mc_RequestTask", 1)
mc.setOrAddNodeField(m.global, "taskUsage", taskUsage)
mc.setOrAddNodeField(m.global, "isTrackingTaskUsage", true)

m.expectCalled(task.subType(), "mc_RequestTask")

Expand All @@ -176,10 +144,8 @@ namespace tests
m.assertEqual(`${timer.duration}`, `${duration}`)
m.assertEqual(timer.control, "start")
m.assertTrue(timer.isFrameTimer)

end function


'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'++ utils
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Expand Down
1 change: 0 additions & 1 deletion src/source/view/FontManager.spec.bs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import "pkg:/source/tests/ViewBaseTestSuite.spec.bs"
import "pkg:/source/view/FontManager.bs"

namespace tests
@only
@suite("FontManager tests")
class FontManagerTests extends mv.tests.BaseTestSuite

Expand Down

0 comments on commit 69c353a

Please sign in to comment.