import { Observable } from "rxjs" import { RunHelpers, TestScheduler } from "rxjs/testing" export type MappedHelpers = Omit & { expect: ( observable: Observable, subscriptionMarbles?: string | null, ) => { toBe: (marbles: string, values?: unknown, errorValue?: unknown) => void toBeObservable: (other: Observable) => void } scheduler: TestScheduler } export const marbles = (callback: (helpers: MappedHelpers) => T): (() => T) => { const testScheduler = new TestScheduler((actual, expected) => expect(actual).toEqual(expected)) return () => testScheduler.run((helpers: RunHelpers) => { const mappedHelpers: MappedHelpers = { ...helpers, scheduler: testScheduler, expect: (observable$: Observable, subscriptionMarbles: string | null = null) => { const result = helpers.expectObservable(observable$, subscriptionMarbles) return { ...result, toBeObservable: result.toEqual, } }, } return callback(mappedHelpers) }) }