Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/diagnostic/fpsdebugger.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { App, AppSchedule, Plugin } from '../app/index.js'
import { World } from '../ecs/index.js'
import { Timer, TimerMode, VirtualClock } from '../time/index.js'
import { TimerMode, VirtualClock } from '../time/index.js'
import { RAFTimer } from './resources/index.js'

export class FPSDebugger extends Plugin {
Expand All @@ -10,7 +10,7 @@ export class FPSDebugger extends Plugin {
*/
register(app) {
app
.setResource(new RAFTimer(1, TimerMode.Repeat))
.setResource(new RAFTimer({ duration: 1, mode: TimerMode.Repeat }))
.registerSystem(AppSchedule.Startup, setUpUI)
.registerSystem(AppSchedule.Update, updateFPSCounter)
.registerSystem(AppSchedule.Update, updateRAFTimer)
Expand Down Expand Up @@ -41,7 +41,7 @@ function updateFPSCounter(world) {
const clock = world.getResource(VirtualClock)
const timer = world.getResource(RAFTimer)

if (!timer.finished) return
if (!timer.cycleStarted()) return

const container = document.querySelector('#fps-container')
const fps = Math.round(clock.getFrameRate())
Expand All @@ -56,5 +56,5 @@ function updateRAFTimer(world) {
const clock = world.getResource(VirtualClock)
const timer = world.getResource(RAFTimer)

Timer.update(timer, clock.getDelta())
timer.update(clock.getDelta())
}
8 changes: 4 additions & 4 deletions src/profiler/plugin.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Profiler, ProfilerTimer } from './resources/index.js'
import { Timer, TimerMode, VirtualClock } from '../time/index.js'
import { TimerMode, VirtualClock } from '../time/index.js'
import { App, AppSchedule, Plugin } from '../app/index.js'
import { World } from '../ecs/index.js'
import { warn } from '../logger/index.js'
Expand All @@ -11,7 +11,7 @@ export class ProfilerPlugin extends Plugin {
*/
register(app) {
app.setResource(new Profiler())
app.setResource(new ProfilerTimer(1, TimerMode.Repeat))
app.setResource(new ProfilerTimer({ duration: 1, mode: TimerMode.Repeat }))
setupProfileViewer(document.body)
app.registerSystem(AppSchedule.Update, updateProfileViewer)
app.registerSystem(AppSchedule.Update, updateProfileTimer)
Expand Down Expand Up @@ -39,7 +39,7 @@ function updateProfileTimer(registry) {
const timer = registry.getResource(ProfilerTimer)
const clock = registry.getResource(VirtualClock)

Timer.update(timer, clock.getDelta())
timer.update(clock.getDelta())
}

/**
Expand All @@ -49,7 +49,7 @@ function updateProfileViewer(registry) {
const profiler = registry.getResource(Profiler)
const timer = registry.getResource(ProfilerTimer)

if (!timer.finished) return
if (!timer.cycleEnded()) return

const container = document.getElementById('profile-view')

Expand Down
214 changes: 214 additions & 0 deletions src/time/tests/timer.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
import { test, describe } from "node:test";
import { Timer, TimerMode } from "../timer.js";
import { strictEqual } from "node:assert";

describe("Testing `Timer`", () => {
test('`Timer` on once mode completes', () => {
const timer = new Timer({ duration: 1, mode: TimerMode.Once })

timer.update(1)

strictEqual(timer.completed(), true)
})

test('`Timer` on repeat mode never completes', () => {
const timer = new Timer({ duration: 1, mode: TimerMode.Repeat })

timer.update(100000)

strictEqual(timer.completed(), false)
})

test('`Timer` on once gives correct elapsed time', () => {
const timer1 = new Timer({ duration: 10, mode: TimerMode.Once })
const timer2 = new Timer({ duration: 10, mode: TimerMode.Once })
const timer3 = new Timer({ duration: 10, mode: TimerMode.Once })
const timer4 = new Timer({ duration: 10, mode: TimerMode.Once })
const timer5 = new Timer({ duration: 10, mode: TimerMode.Once })

timer1.update(0)
timer2.update(5)
timer3.update(5)
timer3.update(3)
timer4.update(10)
timer5.update(14)

strictEqual(timer1.elapsed(), 0)
strictEqual(timer2.elapsed(), 5)
strictEqual(timer3.elapsed(), 8)
strictEqual(timer4.elapsed(), 10)
strictEqual(timer5.elapsed(), 10)
})

test('`Timer` on repeat gives correct elapsed time', () => {
const timer1 = new Timer({ duration: 10, mode: TimerMode.Repeat })
const timer2 = new Timer({ duration: 10, mode: TimerMode.Repeat })
const timer3 = new Timer({ duration: 10, mode: TimerMode.Repeat })
const timer4 = new Timer({ duration: 10, mode: TimerMode.Repeat })
const timer5 = new Timer({ duration: 10, mode: TimerMode.Repeat })

timer1.update(0)
timer2.update(5)
timer3.update(5)
timer3.update(3)
timer4.update(10)
timer5.update(14)

strictEqual(timer1.elapsed(), 0)
strictEqual(timer2.elapsed(), 5)
strictEqual(timer3.elapsed(), 8)
strictEqual(timer4.elapsed(), 0)
strictEqual(timer5.elapsed(), 4)
})

test('`Timer` gives correct progress', () => {
const timer1 = new Timer({ duration: 10, mode: TimerMode.Repeat })
const timer2 = new Timer({ duration: 10, mode: TimerMode.Repeat })
const timer3 = new Timer({ duration: 10, mode: TimerMode.Repeat })

timer1.update(9)
timer2.update(5)
timer3.update(0)

strictEqual(timer1.progress(), 0.9)
strictEqual(timer2.progress(), 0.5)
strictEqual(timer3.progress(), 0)
})

test('`Timer` gives correct completed cycles', () => {
const timer1 = new Timer({ duration: 1, mode: TimerMode.Once })
const timer2 = new Timer({ duration: 1, mode: TimerMode.Repeat })

timer1.update(100)
timer2.update(100)

strictEqual(timer1.cyclesCompleted(), 1)
strictEqual(timer2.cyclesCompleted(), 100)
})

test('`Timer` gives correct completed cycles per frame', () => {
const timer1 = new Timer({ duration: 1, mode: TimerMode.Repeat })
const timer2 = new Timer({ duration: 1, mode: TimerMode.Repeat })

timer1.update(100)
strictEqual(timer1.cyclesCompletedThisFrame(), 100)
timer2.update(100)
strictEqual(timer2.cyclesCompletedThisFrame(), 100)

})

test('`Timer` speed dilates time.', () => {
const timer1 = new Timer({ duration: 1, mode: TimerMode.Repeat,speed: 2 })
const timer2 = new Timer({ duration: 1, mode: TimerMode.Repeat, speed: 0.5 })

timer1.update(0.4)
timer2.update(0.4)
strictEqual(timer1.elapsed(), 0.8)
strictEqual(timer2.elapsed(), 0.2)

})

test('playback requested on play', () => {
const timer = new Timer()

timer.play()
timer.update(100)

strictEqual(timer.playbackChanged(), true)
})

test('playback requested on pause', () => {
const timer = new Timer()

timer.pause()
timer.update(100)

strictEqual(timer.playbackChanged(), true)
})

test('playback requested on reset', () => {
const timer = new Timer()

timer.reset()
timer.update(100)

strictEqual(timer.playbackChanged(), true)
})

test('playback requested on start', () => {
const timer = new Timer()

timer.start()
timer.update(100)

strictEqual(timer.playbackChanged(), true)
})

test('playback requested on stop', () => {
const timer = new Timer()

timer.stop()
timer.update(100)

strictEqual(timer.playbackChanged(), true)
})

test('playback requested on seek', () => {
const timer = new Timer()

timer.seek(0)
timer.update(100)

strictEqual(timer.playbackChanged(), true)
})

test('detect cycle started correctly.', () => {
const timer1 = new Timer({ duration: 1, mode: TimerMode.Once })
const timer2 = new Timer({ duration: 1, mode: TimerMode.Repeat })

timer1.update(0)
timer2.update(0)
strictEqual(timer1.cycleStarted(), false)
strictEqual(timer2.cycleStarted(), false)

timer1.update(0.1)
timer2.update(0.1)
strictEqual(timer1.cycleStarted(), true)
strictEqual(timer2.cycleStarted(), true)

timer1.update(0.1)
timer2.update(0.1)
strictEqual(timer1.cycleStarted(), false)
strictEqual(timer2.cycleStarted(), false)

timer1.update(1)
timer2.update(1)
strictEqual(timer1.cycleStarted(), false)
strictEqual(timer2.cycleStarted(), true)
})

test('detect cycle ended correctly.', () => {
const timer1 = new Timer({ duration: 1, mode: TimerMode.Once })
const timer2 = new Timer({ duration: 1, mode: TimerMode.Repeat })

timer1.update(0)
timer2.update(0)
strictEqual(timer1.cycleEnded(), false)
strictEqual(timer2.cycleEnded(), false)

timer1.update(0.1)
timer2.update(0.1)
strictEqual(timer1.cycleEnded(), false)
strictEqual(timer2.cycleEnded(), false)

timer1.update(1)
timer2.update(1)
strictEqual(timer1.cycleEnded(), true)
strictEqual(timer2.cycleEnded(), true)

timer1.update(1)
timer2.update(1)
strictEqual(timer1.cycleEnded(), false)
strictEqual(timer2.cycleEnded(), true)
})
})
Loading