@cycle/time
Advanced tools
Comparing version 0.3.1 to 0.4.0
import xs from 'xstream'; | ||
declare function makeAssertEqual(schedule: any, currentTime: any, interval: any, addAssert: any): (actual: xs<any>, expected: xs<any>) => void; | ||
declare function makeAssertEqual(timeSource: any, schedule: any, currentTime: any, interval: any, addAssert: any): (actual: xs<any>, expected: xs<any>) => void; | ||
export { makeAssertEqual }; |
"use strict"; | ||
var xstream_1 = require("xstream"); | ||
var deepEqual = require("deep-equal"); | ||
@@ -55,6 +56,7 @@ function checkEqual(completeStore, assert, interval) { | ||
} | ||
function makeAssertEqual(schedule, currentTime, interval, addAssert) { | ||
function makeAssertEqual(timeSource, schedule, currentTime, interval, addAssert) { | ||
return function assertEqual(actual, expected) { | ||
var calledComplete = 0; | ||
var completeStore = {}; | ||
var Time = timeSource(); | ||
var assert = { | ||
@@ -69,27 +71,14 @@ state: 'pending', | ||
addAssert(assert); | ||
function complete(label, diagram) { | ||
calledComplete++; | ||
if (calledComplete === 2) { | ||
var actualLog$ = actual.compose(Time.record); | ||
var expectedLog$ = expected.compose(Time.record); | ||
xstream_1.default.combine(actualLog$, expectedLog$).addListener({ | ||
next: function (_a) { | ||
var aLog = _a[0], bLog = _a[1]; | ||
completeStore['actual'] = aLog; | ||
completeStore['expected'] = bLog; | ||
}, | ||
complete: function () { | ||
checkEqual(completeStore, assert, interval); | ||
} | ||
} | ||
var completeListener = function (label) { | ||
var entries = []; | ||
completeStore[label] = entries; | ||
return { | ||
next: function (ev) { | ||
entries.push({ type: 'next', value: ev, time: currentTime() }); | ||
}, | ||
complete: function () { | ||
entries.push({ type: 'complete', time: currentTime() }); | ||
complete(label, entries); | ||
}, | ||
error: function (error) { | ||
entries.push({ type: 'error', time: currentTime(), error: error }); | ||
complete(label, entries); | ||
} | ||
}; | ||
}; | ||
actual.addListener(completeListener('actual')); | ||
expected.addListener(completeListener('expected')); | ||
}); | ||
}; | ||
@@ -96,0 +85,0 @@ } |
@@ -6,2 +6,3 @@ import xs from 'xstream'; | ||
diagram: (diagramString: string, values?: {}) => xs<any>; | ||
record: (stream: xs<any>) => xs<any>; | ||
assertEqual: (actual: xs<any>, expected: xs<any>) => void; | ||
@@ -18,4 +19,5 @@ delay: (delayTime: number) => <T>(stream: xs<T>) => xs<T>; | ||
throttleAnimation: <T>(stream: xs<T>) => xs<T>; | ||
run(doneCallback?: (err: any) => void): void; | ||
run(doneCallback?: (err: any) => void, timeToRunTo?: any): void; | ||
_scheduler: { | ||
_schedule: () => any[]; | ||
next(stream: any, time: any, value: any, f?: () => void): any; | ||
@@ -25,3 +27,4 @@ error(stream: any, time: any, error: any): any; | ||
}; | ||
_time: () => number; | ||
}; | ||
export { mockTimeSource }; |
"use strict"; | ||
var combineErrors = require("combine-errors"); | ||
require('setimmediate'); | ||
var scheduler_1 = require("./scheduler"); | ||
@@ -12,2 +11,4 @@ var delay_1 = require("./delay"); | ||
var throttle_animation_1 = require("./throttle-animation"); | ||
var record_1 = require("./record"); | ||
var run_virtually_1 = require("./run-virtually"); | ||
function raiseError(err) { | ||
@@ -46,30 +47,9 @@ if (err) { | ||
} | ||
function processEvent() { | ||
var eventToProcess = scheduler.shiftNextEntry(); | ||
if (!eventToProcess) { | ||
finish(asserts, done); | ||
return; | ||
} | ||
if (eventToProcess.cancelled) { | ||
setImmediate(processEvent); | ||
return; | ||
} | ||
time = eventToProcess.time; | ||
if (eventToProcess.f) { | ||
eventToProcess.f(eventToProcess, time); | ||
} | ||
if (eventToProcess.type === 'next') { | ||
eventToProcess.stream.shamefullySendNext(eventToProcess.value); | ||
} | ||
if (eventToProcess.type === 'error') { | ||
eventToProcess.stream.shamefullySendError(eventToProcess.error); | ||
} | ||
if (eventToProcess.type === 'complete') { | ||
eventToProcess.stream.shamefullySendComplete(); | ||
} | ||
setImmediate(processEvent); | ||
function setTime(newTime) { | ||
time = newTime; | ||
} | ||
var timeSource = { | ||
diagram: diagram_1.makeDiagram(scheduler.add, currentTime, interval), | ||
assertEqual: assert_equal_1.makeAssertEqual(scheduler.add, currentTime, interval, addAssert), | ||
record: record_1.makeRecord(scheduler.add, currentTime, interval), | ||
assertEqual: assert_equal_1.makeAssertEqual(function () { return timeSource; }, scheduler.add, currentTime, interval, addAssert), | ||
delay: delay_1.makeDelay(scheduler.add, currentTime), | ||
@@ -81,8 +61,10 @@ debounce: debounce_1.makeDebounce(scheduler.add, currentTime), | ||
throttleAnimation: throttle_animation_1.makeThrottleAnimation(function () { return timeSource; }, scheduler.add, currentTime), | ||
run: function (doneCallback) { | ||
run: function (doneCallback, timeToRunTo) { | ||
if (doneCallback === void 0) { doneCallback = raiseError; } | ||
if (timeToRunTo === void 0) { timeToRunTo = null; } | ||
done = doneCallback; | ||
setImmediate(processEvent); | ||
run_virtually_1.runVirtually(scheduler, function () { return finish(asserts, done); }, currentTime, setTime, timeToRunTo); | ||
}, | ||
_scheduler: scheduler.add | ||
_scheduler: scheduler.add, | ||
_time: currentTime | ||
}; | ||
@@ -89,0 +71,0 @@ return timeSource; |
@@ -6,3 +6,3 @@ "use strict"; | ||
var stopped = false; | ||
function scheduleNextEvent(entry, time) { | ||
function scheduleNextEvent(entry, time, schedule, currentTime) { | ||
if (stopped) { | ||
@@ -9,0 +9,0 @@ return; |
@@ -6,2 +6,3 @@ declare function makeScheduler(): { | ||
add: { | ||
_schedule: () => any[]; | ||
next(stream: any, time: any, value: any, f?: () => void): any; | ||
@@ -8,0 +9,0 @@ error(stream: any, time: any, error: any): any; |
@@ -5,2 +5,5 @@ "use strict"; | ||
var schedule = []; | ||
function getSchedule() { | ||
return schedule; | ||
} | ||
var addScheduleEntry = makeAccumulator({ | ||
@@ -26,2 +29,3 @@ key: function (entry) { return entry.time; }, | ||
add: { | ||
_schedule: getSchedule, | ||
next: function (stream, time, value, f) { | ||
@@ -28,0 +32,0 @@ if (f === void 0) { f = noop; } |
@@ -13,3 +13,13 @@ import xs from 'xstream'; | ||
throttleAnimation: <T>(stream: xs<T>) => xs<T>; | ||
_time: () => number; | ||
_scheduler: { | ||
_schedule: () => any[]; | ||
next(stream: any, time: any, value: any, f?: () => void): any; | ||
error(stream: any, time: any, error: any): any; | ||
completion(stream: any, time: any): any; | ||
}; | ||
_pause: () => boolean; | ||
_resume: (time: any) => void; | ||
_runVirtually: (done: any, timeToRunTo: any) => void; | ||
}; | ||
export { timeDriver }; |
@@ -10,2 +10,3 @@ "use strict"; | ||
var throttle_animation_1 = require("./throttle-animation"); | ||
var run_virtually_1 = require("./run-virtually"); | ||
function popAll(array) { | ||
@@ -18,14 +19,16 @@ var poppedItems = []; | ||
} | ||
function timeDriver(_, streamAdapter) { | ||
var time = 0; | ||
var frameCallbacks = []; | ||
var scheduler = scheduler_1.makeScheduler(); | ||
function currentTime() { | ||
return time; | ||
} | ||
function addFrameCallback(callback) { | ||
frameCallbacks.push(callback); | ||
} | ||
function runRealtime(scheduler, frameCallbacks, currentTime, setTime) { | ||
var paused = false; | ||
var pause = function () { return paused = true; }; | ||
var resume = function (time) { | ||
setTime(time); | ||
paused = false; | ||
}; | ||
function processEvent(eventTime) { | ||
time = eventTime; | ||
if (paused) { | ||
requestAnimationFrame(processEvent); | ||
return; | ||
} | ||
var time = eventTime; | ||
setTime(time); | ||
var currentCallbacks = popAll(frameCallbacks); | ||
@@ -42,3 +45,3 @@ currentCallbacks.forEach(function (callback) { return callback(time); }); | ||
if (eventToProcess.f) { | ||
eventToProcess.f(eventToProcess, time); | ||
eventToProcess.f(eventToProcess, time, scheduler.add, currentTime); | ||
} | ||
@@ -56,4 +59,20 @@ if (eventToProcess.type === 'next') { | ||
} | ||
requestAnimationFrame(processEvent); | ||
return { pause: pause, resume: resume }; | ||
} | ||
function timeDriver(_, streamAdapter) { | ||
var time = 0; | ||
var frameCallbacks = []; | ||
var scheduler = scheduler_1.makeScheduler(); | ||
function currentTime() { | ||
return time; | ||
} | ||
function setTime(newTime) { | ||
time = newTime; | ||
} | ||
function addFrameCallback(callback) { | ||
frameCallbacks.push(callback); | ||
} | ||
// TODO - cancel requestAnimationFrame on dispose | ||
requestAnimationFrame(processEvent); | ||
var _a = runRealtime(scheduler, frameCallbacks, currentTime, setTime), pause = _a.pause, resume = _a.resume; | ||
var timeSource = { | ||
@@ -65,3 +84,11 @@ animationFrames: animation_frames_1.makeAnimationFrames(addFrameCallback, currentTime), | ||
throttle: throttle_1.makeThrottle(scheduler.add, currentTime), | ||
throttleAnimation: throttle_animation_1.makeThrottleAnimation(function () { return timeSource; }, scheduler.add, currentTime) | ||
throttleAnimation: throttle_animation_1.makeThrottleAnimation(function () { return timeSource; }, scheduler.add, currentTime), | ||
_time: currentTime, | ||
_scheduler: scheduler.add, | ||
_pause: pause, | ||
_resume: resume, | ||
_runVirtually: function (done, timeToRunTo) { | ||
// TODO - frameCallbacks? | ||
run_virtually_1.runVirtually(scheduler, done, currentTime, setTime, timeToRunTo); | ||
} | ||
}; | ||
@@ -68,0 +95,0 @@ return timeSource; |
{ | ||
"name": "@cycle/time", | ||
"version": "0.3.1", | ||
"version": "0.4.0", | ||
"description": "A time driver designed to enable awesome testing and dev tooling", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.js", |
47248
31
789