return function() local spring = require(script.Parent.spring) it("should have all expected APIs", function() expect(spring).to.be.a("function") local s = spring(1, { dampingRatio = 0.1, frequency = 10, }) expect(s).to.be.a("table") expect(s.step).to.be.a("function") -- handle when spring lacks option table s = spring(1) expect(s).to.be.a("table") expect(s.step).to.be.a("function") end) it("should handle being still correctly", function() local s = spring(1, { dampingRatio = 0.1, frequency = 10, }) local state = s:step({ value = 1, velocity = 0, complete = false, }, 1) expect(state.value).to.equal(1) expect(state.velocity).to.equal(0) expect(state.complete).to.equal(true) end) it("should return not complete when in motion", function() local goal = spring(100, { dampingRatio = 0.1, frequency = 10, }) local state = { value = 1, velocity = 0, complete = false, } state = goal:step(state, 1e-3) expect(state.value < 100).to.equal(true) expect(state.velocity > 0).to.equal(true) expect(state.complete).to.equal(false) end) describe("should eventaully complete when", function() it("is critically damped", function() local s = spring(3, { dampingRatio = 1, frequency = 0.5, }) local state = { value = 1, velocity = 0, complete = false, } while not state.complete do state = s:step(state, 0.5) end expect(state.complete).to.equal(true) expect(state.value).to.equal(3) expect(state.velocity).to.equal(0) end) it("is over damped", function() local s = spring(3, { dampingRatio = 10, frequency = 0.5, }) local state = { value = 1, velocity = 0, complete = false, } while not state.complete do state = s:step(state, 0.5) end expect(state.complete).to.equal(true) expect(state.value).to.equal(3) expect(state.velocity).to.equal(0) end) it("is under damped", function() local s = spring(3, { dampingRatio = 0.1, frequency = 0.5, }) local state = { value = 1, velocity = 0, complete = false, } while not state.complete do state = s:step(state, 0.5) end expect(state.complete).to.equal(true) expect(state.value).to.equal(3) expect(state.velocity).to.equal(0) end) end) it("should remain complete when completed", function() local s = spring(3, { dampingRatio = 1, frequency = 0.5, }) local state = { value = 1, velocity = 0, complete = false, } while not state.complete do state = s:step(state, 0.5) end state = s:step(state, 0.5) expect(state.complete).to.equal(true) expect(state.value).to.equal(3) expect(state.velocity).to.equal(0) end) end