Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Effect/*
Browse files Browse the repository at this point in the history
gcanti committed Jan 29, 2025
1 parent 7c614ee commit abeeed4
Showing 45 changed files with 761 additions and 713 deletions.
3 changes: 2 additions & 1 deletion packages/effect/test/Config.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {
Cause,
Chunk,
Config,
ConfigError,
@@ -23,7 +24,7 @@ const assertConfigError = <A>(
) => {
const configProvider = ConfigProvider.fromMap(new Map(map))
const result = Effect.runSyncExit(configProvider.load(config))
assertFailure(result, error)
assertFailure(result, Cause.fail(error))
}

const assertConfig = <A>(
23 changes: 12 additions & 11 deletions packages/effect/test/Effect/acquire-release.test.ts
Original file line number Diff line number Diff line change
@@ -5,8 +5,9 @@ import { equals } from "effect/Equal"
import * as Exit from "effect/Exit"
import { pipe } from "effect/Function"
import * as Ref from "effect/Ref"
import { assertTrue, strictEqual } from "effect/test/util"
import * as it from "effect/test/utils/extend"
import { assert, describe } from "vitest"
import { describe } from "vitest"

describe("Effect", () => {
it.effect("acquireUseRelease - happy path", () =>
@@ -20,8 +21,8 @@ describe("Effect", () => {
)
)
const released = yield* $(Ref.get(release))
assert.strictEqual(result, 43)
assert.isTrue(released)
strictEqual(result, 43)
assertTrue(released)
}))
it.effect("acquireUseRelease - happy path + disconnect", () =>
Effect.gen(function*($) {
@@ -35,8 +36,8 @@ describe("Effect", () => {
Effect.disconnect
)
const released = yield* $(Ref.get(release))
assert.strictEqual(result, 43)
assert.isTrue(released)
strictEqual(result, 43)
assertTrue(released)
}))
it.effect("acquireUseRelease - error handling", () =>
Effect.gen(function*($) {
@@ -53,8 +54,8 @@ describe("Effect", () => {
exit,
Exit.matchEffect({ onFailure: Effect.succeed, onSuccess: () => Effect.fail("effect should have failed") })
)
assert.isTrue(equals(Cause.failures(result), Chunk.of("use failed")))
assert.isTrue(equals(Cause.defects(result), Chunk.of(releaseDied)))
assertTrue(equals(Cause.failures(result), Chunk.of("use failed")))
assertTrue(equals(Cause.defects(result), Chunk.of(releaseDied)))
}))
it.effect("acquireUseRelease - error handling + disconnect", () =>
Effect.gen(function*($) {
@@ -75,8 +76,8 @@ describe("Effect", () => {
onSuccess: () => Effect.fail("effect should have failed")
})
)
assert.isTrue(equals(Cause.failures(result), Chunk.of("use failed")))
assert.isTrue(equals(Cause.defects(result), Chunk.of(releaseDied)))
assertTrue(equals(Cause.failures(result), Chunk.of("use failed")))
assertTrue(equals(Cause.defects(result), Chunk.of(releaseDied)))
}))
it.effect("acquireUseRelease - beast mode error handling + disconnect", () =>
Effect.gen(function*($) {
@@ -105,7 +106,7 @@ describe("Effect", () => {
)
)
const released = yield* $(Ref.get(release))
assert.isTrue(equals(Cause.defects(result), Chunk.of(useDied)))
assert.isTrue(released)
assertTrue(equals(Cause.defects(result), Chunk.of(useDied)))
assertTrue(released)
}))
})
11 changes: 6 additions & 5 deletions packages/effect/test/Effect/applicative.test.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import * as Effect from "effect/Effect"
import * as Either from "effect/Either"
import { deepStrictEqual, strictEqual } from "effect/test/util"
import * as it from "effect/test/utils/extend"
import { assert, describe } from "vitest"
import { describe } from "vitest"

describe("Effect", () => {
const add = (a: number) => (b: number) => a + b

it.effect("two successes should succeed", () =>
Effect.gen(function*($) {
const result = yield* $(Effect.succeed(add).pipe(Effect.ap(Effect.succeed(1)), Effect.ap(Effect.succeed(2))))
assert.strictEqual(result, 3)
strictEqual(result, 3)
}))

it.effect("one failure in data-last position should fail", () =>
@@ -18,7 +19,7 @@ describe("Effect", () => {
Effect.succeed(add).pipe(Effect.ap(Effect.succeed(1)), Effect.ap(Effect.fail("c"))),
Effect.either
)
assert.deepStrictEqual(result, Either.left("c"))
deepStrictEqual(result, Either.left("c"))
}))

it.effect("one failure in data-first position should fail", () =>
@@ -27,7 +28,7 @@ describe("Effect", () => {
Effect.succeed(add).pipe(Effect.ap(Effect.fail("b")), Effect.ap(Effect.fail("c"))),
Effect.either
)
assert.deepStrictEqual(result, Either.left("b"))
deepStrictEqual(result, Either.left("b"))
}))

it.effect("an applicative operation that starts with a failure should fail", () =>
@@ -39,6 +40,6 @@ describe("Effect", () => {
),
Effect.either
)
assert.deepStrictEqual(result, Either.left("a"))
deepStrictEqual(result, Either.left("a"))
}))
})
27 changes: 14 additions & 13 deletions packages/effect/test/Effect/async.test.ts
Original file line number Diff line number Diff line change
@@ -9,22 +9,23 @@ import { pipe } from "effect/Function"
import * as Option from "effect/Option"
import * as Ref from "effect/Ref"
import * as Runtime from "effect/Runtime"
import { assert, describe, it } from "effect/test/utils/extend"
import { deepStrictEqual, strictEqual } from "effect/test/util"
import { describe, it } from "effect/test/utils/extend"

describe("Effect", () => {
it.effect("simple async must return", () =>
Effect.gen(function*($) {
const result = yield* $(Effect.async<number, unknown, never>((cb) => {
cb(Effect.succeed(42))
}))
assert.strictEqual(result, 42)
strictEqual(result, 42)
}))
it.effect("simple asyncEffect must return", () =>
Effect.gen(function*($) {
const result = yield* $(Effect.asyncEffect<number, never, never, never, never, never>((resume) => {
return Effect.succeed(resume(Effect.succeed(42)))
}))
assert.strictEqual(result, 42)
strictEqual(result, 42)
}))
if (typeof window === "undefined") {
// eslint-disable-next-line @typescript-eslint/no-var-requires
@@ -45,7 +46,7 @@ describe("Effect", () => {
}
const procNum = Effect.sync(() => os.cpus().length)
const result = yield* $(procNum, Effect.flatMap(stackIOs))
assert.strictEqual(result, 42)
strictEqual(result, 42)
}))
}
it.effect("interrupt of asyncEffect register", () =>
@@ -68,7 +69,7 @@ describe("Effect", () => {
yield* $(Deferred.await(acquire))
yield* $(Fiber.interruptFork(fiber))
const result = yield* $(Deferred.await(release))
assert.isUndefined(result)
strictEqual(result, undefined)
}))
it.live("async should not resume fiber twice after interruption", () =>
Effect.gen(function*($) {
@@ -91,8 +92,8 @@ describe("Effect", () => {
)
const result = yield* $(Fiber.interrupt(fiber), Effect.timeout(Duration.seconds(1)), Effect.option)
const unexpected = yield* $(Ref.get(unexpectedPlace))
assert.deepStrictEqual(unexpected, Chunk.empty())
assert.deepStrictEqual(result, Option.none()) // the timeout should happen
deepStrictEqual(unexpected, Chunk.empty())
deepStrictEqual(result, Option.none()) // the timeout should happen
}))
it.live("async should not resume fiber twice after synchronous result", () =>
Effect.gen(function*($) {
@@ -119,13 +120,13 @@ describe("Effect", () => {
)
const result = yield* $(Fiber.interrupt(fiber), Effect.timeout(Duration.seconds(1)), Effect.option)
const unexpected = yield* $(Ref.get(unexpectedPlace))
assert.deepStrictEqual(unexpected, Chunk.empty())
assert.deepStrictEqual(result, Option.none()) // timeout should happen
deepStrictEqual(unexpected, Chunk.empty())
deepStrictEqual(result, Option.none()) // timeout should happen
}))
it.effect("sleep 0 must return", () =>
Effect.gen(function*($) {
const result = yield* $(Effect.sleep(Duration.zero))
assert.isUndefined(result)
strictEqual(result, undefined)
}))
it.effect("shallow bind of async chain", () =>
Effect.gen(function*($) {
@@ -139,7 +140,7 @@ describe("Effect", () => {
})
)
), Effect.succeed(0)))
assert.strictEqual(result, 10)
strictEqual(result, 10)
}))
it.effect("asyncEffect can fail before registering", () =>
Effect.gen(function*($) {
@@ -149,7 +150,7 @@ describe("Effect", () => {
}),
Effect.flip
)
assert.strictEqual(result, "ouch")
strictEqual(result, "ouch")
}))
it.effect("asyncEffect can defect before registering", () =>
Effect.gen(function*($) {
@@ -170,6 +171,6 @@ describe("Effect", () => {
onSuccess: () => Option.none()
}))
)
assert.deepStrictEqual(result, Option.some("ouch"))
deepStrictEqual(result, Option.some("ouch"))
}))
})
23 changes: 12 additions & 11 deletions packages/effect/test/Effect/caching.test.ts
Original file line number Diff line number Diff line change
@@ -2,9 +2,10 @@ import * as Duration from "effect/Duration"
import * as Effect from "effect/Effect"
import { pipe } from "effect/Function"
import * as Ref from "effect/Ref"
import { assertTrue, strictEqual } from "effect/test/util"
import * as it from "effect/test/utils/extend"
import * as TestClock from "effect/TestClock"
import { assert, describe } from "vitest"
import { describe } from "vitest"

describe("Effect", () => {
it.effect("cached - returns new instances after duration", () =>
@@ -21,9 +22,9 @@ describe("Effect", () => {
const c = yield* $(cache)
yield* $(TestClock.adjust(Duration.minutes(59)))
const d = yield* $(cache)
assert.strictEqual(a, b)
assert.notStrictEqual(b, c)
assert.strictEqual(c, d)
strictEqual(a, b)
assertTrue(b !== c)
strictEqual(c, d)
}))
it.effect("cached - correctly handles an infinite duration time to live", () =>
Effect.gen(function*($) {
@@ -35,9 +36,9 @@ describe("Effect", () => {
const a = yield* $(cached)
const b = yield* $(cached)
const c = yield* $(cached)
assert.strictEqual(a, 0)
assert.strictEqual(b, 0)
assert.strictEqual(c, 0)
strictEqual(a, 0)
strictEqual(b, 0)
strictEqual(c, 0)
}))
it.effect("cachedInvalidate - returns new instances after duration", () =>
Effect.gen(function*($) {
@@ -57,9 +58,9 @@ describe("Effect", () => {
const d = yield* $(cached)
yield* $(TestClock.adjust(Duration.minutes(59)))
const e = yield* $(cached)
assert.strictEqual(a, b)
assert.notStrictEqual(b, c)
assert.strictEqual(c, d)
assert.notStrictEqual(d, e)
strictEqual(a, b)
assertTrue(b !== c)
strictEqual(c, d)
assertTrue(d !== e)
}))
})
Loading

0 comments on commit abeeed4

Please sign in to comment.