Skip to content
Source
Sign inSign up

KeepAwake.test.ts

36 lines1.4 KB

1import { describe, expect, it } from "@effect/vitest";
2import * as Effect from "effect/Effect";
3import * as Queue from "effect/Queue";
4import * as Stream from "effect/Stream";
5import * as TestClock from "effect/testing/TestClock";
6​
7import * as KeepAwake from "./KeepAwake.ts";
8​
9describe("KeepAwake.holdWhileWanted", () => {
10 it.effect("keeps one hold across a gap shorter than the grace and releases after it", () =>
11 Effect.gen(function* () {
12 const wanted = yield* Queue.unbounded<boolean>();
13 const transitions = yield* Queue.unbounded<"held" | "released">();
14 const hold = Effect.acquireRelease(Queue.offer(transitions, "held"), () =>
15 Queue.offer(transitions, "released"),
16 ).pipe(Effect.andThen(Effect.never), Effect.scoped);
17 yield* KeepAwake.holdWhileWanted(Stream.fromQueue(wanted), hold, "60 seconds").pipe(
18 Effect.forkScoped,
19 );
20​
21 yield* Queue.offer(wanted, true);
22 expect(yield* Queue.take(transitions)).toBe("held");
23​
24 yield* Queue.offer(wanted, false);
25 yield* TestClock.adjust("30 seconds");
26 yield* Queue.offer(wanted, true);
27 yield* TestClock.adjust("120 seconds");
28 expect(yield* Queue.size(transitions)).toBe(0);
29​
30 yield* Queue.offer(wanted, false);
31 yield* TestClock.adjust("120 seconds");
32 expect(yield* Queue.take(transitions)).toBe("released");
33 expect(yield* Queue.size(transitions)).toBe(0);
34 }),
35 );
36});