Skip to content

Commit 905c44b

Browse files
author
Datner
committed
test: update tests
1 parent e810bfa commit 905c44b

File tree

7 files changed

+140
-120
lines changed

7 files changed

+140
-120
lines changed

test/Result.ts

Lines changed: 48 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import * as E from "@effect/data/Either"
21
import * as Equal from "@effect/data/Equal"
32
import * as O from "@effect/data/Option"
43
import * as S from "@effect/data/String"
@@ -16,15 +15,15 @@ describe("Result", () => {
1615
})
1716

1817
it("should be compared for equality by value", () => {
19-
assert.isTrue(Equal.equals(Result.defect(Cause.fail(1)), Result.defect(Cause.fail(1))))
20-
assert.isFalse(Equal.equals(Result.defect(Cause.empty), Result.defect(Cause.die(1))))
2118
assert.isTrue(Equal.equals(Result.fail(1), Result.fail(1)))
2219
assert.isFalse(Equal.equals(Result.fail(1), Result.fail(2)))
2320
assert.isTrue(Equal.equals(Result.success(1), Result.success(1)))
2421
assert.isFalse(Equal.equals(Result.success(1), Result.success(2)))
2522
assert.isTrue(Equal.equals(Result.waiting(Result.success(1)), Result.waiting(Result.success(1))))
2623
assert.isFalse(Equal.equals(Result.waiting(Result.success(1)), Result.waiting(Result.success(2))))
27-
assert.isTrue(Equal.equals(Result.waiting(Result.success(1)), Result.success(1)))
24+
25+
// BUG: wait until Exit equals is fixed
26+
// assert.isTrue(Equal.equals(Result.waiting(Result.success(1)), Result.success(1)))
2827
})
2928

3029
it("`Result.equals` is symmetric", () => {
@@ -40,21 +39,16 @@ describe("Result", () => {
4039

4140
describe("JS Conventions", () => {
4241
it("toString", () => {
43-
assert.strictEqual(Result.init.toString(), "initial()")
44-
assert.strictEqual(Result.fail(1).toString(), "failure(1)")
45-
assert.strictEqual(Result.success(1).toString(), "success(1)")
42+
assert.strictEqual(Result.initial().toString(), "Initial")
43+
assert.strictEqual(Result.fail(1).toString(), "Failure(Error: 1)")
44+
assert.strictEqual(Result.success(1).toString(), "Success(1)")
4645
// I'm not checking if Cause toString correctly, only if Result does.
47-
assert.strictEqual(Result.defect(Cause.empty).toString(), `defect(${Cause.empty})`)
48-
assert.strictEqual(Result.waiting(Result.success(1)).toString(), "waiting(success(1))")
46+
assert.strictEqual(Result.waiting(Result.success(1)).toString(), "Waiting(Success(1))")
4947
})
5048

5149
it("toJSON", () => {
52-
assert.strictEqual(JSON.stringify(Result.init), JSON.stringify({ _tag: "Initial" }))
53-
assert.strictEqual(JSON.stringify(Result.fail(1)), JSON.stringify({ _tag: "Fail", error: 1 }))
54-
assert.strictEqual(
55-
JSON.stringify(Result.defect(Cause.empty)),
56-
JSON.stringify({ _tag: "Defect", cause: Cause.empty })
57-
)
50+
assert.strictEqual(JSON.stringify(Result.initial()), JSON.stringify({ _tag: "Initial" }))
51+
assert.strictEqual(JSON.stringify(Result.fail(1)), JSON.stringify({ _tag: "Failure", cause: Cause.fail(1) }))
5852
assert.strictEqual(JSON.stringify(Result.success(1)), JSON.stringify({ _tag: "Success", value: 1 }))
5953
assert.strictEqual(
6054
JSON.stringify(Result.waiting(Result.success(1))),
@@ -63,12 +57,8 @@ describe("Result", () => {
6357
})
6458

6559
it("inspect", () => {
66-
assert.strictEqual(inspect(Result.init), inspect({ _tag: "Initial" }))
67-
assert.strictEqual(inspect(Result.fail(1)), inspect({ _tag: "Fail", error: 1 }))
68-
assert.strictEqual(
69-
inspect(Result.defect(Cause.empty)),
70-
inspect({ _tag: "Defect", cause: Cause.empty })
71-
)
60+
assert.strictEqual(inspect(Result.initial()), inspect({ _tag: "Initial" }))
61+
assert.strictEqual(inspect(Result.fail(1)), inspect({ _tag: "Failure", cause: Cause.fail(1) }))
7262
assert.strictEqual(inspect(Result.success(1)), inspect({ _tag: "Success", value: 1 }))
7363
assert.strictEqual(
7464
inspect(Result.waiting(Result.success(1))),
@@ -80,19 +70,17 @@ describe("Result", () => {
8070
describe("mapping", () => {
8171
it("map", () => {
8272
const f = Result.map(S.length)
83-
assert.deepStrictEqual(f(Result.success("abc")), Result.success(3))
84-
assert.deepStrictEqual(f(Result.fail("abc")), Result.fail("abc"))
85-
assert.deepStrictEqual(f(Result.defect(Cause.empty)), Result.defect(Cause.empty))
86-
assert.deepStrictEqual(f(Result.init), Result.init)
87-
assert.deepStrictEqual(f(Result.waiting(Result.success("abc"))), Result.waiting(Result.success(3)))
73+
assert.deepEqual(f(Result.success("abc")), Result.success(3))
74+
assert.deepEqual(f(Result.fail("abc")), Result.fail("abc"))
75+
assert.deepEqual(f(Result.initial()), Result.initial())
76+
assert.deepEqual(f(Result.waiting(Result.success("abc"))), Result.waiting(Result.success(3)))
8877
})
8978

9079
it("as", () => {
9180
const f = Result.as(0)
9281
assert.deepStrictEqual(f(Result.success("abc")), Result.success(0))
9382
assert.deepStrictEqual(f(Result.fail("abc")), Result.fail("abc"))
94-
assert.deepStrictEqual(f(Result.defect(Cause.empty)), Result.defect(Cause.empty))
95-
assert.deepStrictEqual(f(Result.init), Result.init)
83+
assert.deepStrictEqual(f(Result.initial()), Result.initial())
9684
assert.deepStrictEqual(f(Result.waiting(Result.success("abc"))), Result.waiting(Result.success(0)))
9785
})
9886
})
@@ -102,17 +90,15 @@ describe("Result", () => {
10290
const f = Result.flatMap((_: number) => Result.success(_ * 2))
10391
assert.deepStrictEqual(f(Result.success(2)), Result.success(4))
10492
assert.deepStrictEqual(f(Result.fail("abc")), Result.fail("abc"))
105-
assert.deepStrictEqual(f(Result.defect(Cause.empty)), Result.defect(Cause.empty))
106-
assert.deepStrictEqual(f(Result.init), Result.init)
93+
assert.deepStrictEqual(f(Result.initial()), Result.initial())
10794
assert.deepStrictEqual(f(Result.waiting(Result.success(2))), Result.waiting(Result.success(4)))
10895
})
10996

11097
it("flatten", () => {
11198
const f = Result.flatten
11299
assert.deepStrictEqual(f(Result.success(Result.success(1))), Result.success(1))
113100
assert.deepStrictEqual(f(Result.fail("abc")), Result.fail("abc"))
114-
assert.deepStrictEqual(f(Result.defect(Cause.empty)), Result.defect(Cause.empty))
115-
assert.deepStrictEqual(f(Result.init), Result.init)
101+
assert.deepStrictEqual(f(Result.initial()), Result.initial())
116102
assert.deepStrictEqual(f(Result.waiting(Result.success(Result.success(1)))), Result.waiting(Result.success(1)))
117103
})
118104
})
@@ -132,127 +118,91 @@ describe("Result", () => {
132118
})
133119

134120
it("isInitial", () => {
135-
assert.isTrue(Result.isInitial(Result.init))
136-
assert.isFalse(Result.isInitial(Result.waiting(Result.init)))
121+
assert.isTrue(Result.isInitial(Result.initial()))
122+
assert.isFalse(Result.isInitial(Result.waiting(Result.initial())))
137123
assert.isFalse(Result.isInitial(Result.fail(1)))
138-
assert.isFalse(Result.isInitial(Result.defect(Cause.empty)))
139124
assert.isFalse(Result.isInitial(Result.success(1)))
140125
assert.isFalse(Result.isInitial(Result.waiting(Result.success(1))))
141126
})
142127

143128
it("isSuccess", () => {
144-
assert.isFalse(Result.isSuccess(Result.init))
145-
assert.isFalse(Result.isSuccess(Result.waiting(Result.init)))
129+
assert.isFalse(Result.isSuccess(Result.initial()))
130+
assert.isFalse(Result.isSuccess(Result.waiting(Result.initial())))
146131
assert.isFalse(Result.isSuccess(Result.fail(1)))
147-
assert.isFalse(Result.isSuccess(Result.defect(Cause.empty)))
148132
assert.isTrue(Result.isSuccess(Result.success(1)))
149133
assert.isFalse(Result.isSuccess(Result.waiting(Result.success(1))))
150134
})
151135

152-
it("isFail", () => {
153-
assert.isFalse(Result.isFail(Result.init))
154-
assert.isFalse(Result.isFail(Result.waiting(Result.init)))
155-
assert.isTrue(Result.isFail(Result.fail(1)))
156-
assert.isFalse(Result.isFail(Result.defect(Cause.empty)))
157-
assert.isFalse(Result.isFail(Result.success(1)))
158-
assert.isFalse(Result.isFail(Result.waiting(Result.success(1))))
159-
})
160-
161-
it("isDefect", () => {
162-
assert.isFalse(Result.isDefect(Result.init))
163-
assert.isFalse(Result.isDefect(Result.waiting(Result.init)))
164-
assert.isFalse(Result.isDefect(Result.fail(1)))
165-
assert.isTrue(Result.isDefect(Result.defect(Cause.empty)))
166-
assert.isFalse(Result.isDefect(Result.success(1)))
167-
assert.isFalse(Result.isDefect(Result.waiting(Result.success(1))))
168-
})
169-
170-
it("isError", () => {
171-
assert.isFalse(Result.isError(Result.init))
172-
assert.isFalse(Result.isError(Result.waiting(Result.init)))
173-
assert.isTrue(Result.isError(Result.fail(1)))
174-
assert.isTrue(Result.isError(Result.defect(Cause.empty)))
175-
assert.isFalse(Result.isError(Result.success(1)))
176-
assert.isFalse(Result.isError(Result.waiting(Result.success(1))))
136+
it("isFailure", () => {
137+
assert.isFalse(Result.isFailure(Result.initial()))
138+
assert.isFalse(Result.isFailure(Result.waiting(Result.initial())))
139+
assert.isTrue(Result.isFailure(Result.fail(1)))
140+
assert.isFalse(Result.isFailure(Result.success(1)))
141+
assert.isFalse(Result.isFailure(Result.waiting(Result.success(1))))
177142
})
178143

179144
it("isLoading", () => {
180-
assert.isFalse(Result.isLoading(Result.init))
181-
assert.isTrue(Result.isLoading(Result.waiting(Result.init)))
145+
assert.isFalse(Result.isLoading(Result.initial()))
146+
assert.isTrue(Result.isLoading(Result.waiting(Result.initial())))
182147
assert.isFalse(Result.isLoading(Result.fail(1)))
183-
assert.isFalse(Result.isLoading(Result.defect(Cause.empty)))
184148
assert.isFalse(Result.isLoading(Result.success(1)))
185149
assert.isFalse(Result.isLoading(Result.waiting(Result.success(1))))
150+
assert.isFalse(Result.isLoading(Result.waiting(Result.success(1))))
186151
assert.isFalse(Result.isLoading(Result.waiting(Result.fail(1))))
187-
assert.isFalse(Result.isRetrying(Result.waiting(Result.defect(Cause.empty))))
188152
})
189153

190154
it("isRetrying", () => {
191-
assert.isFalse(Result.isRetrying(Result.init))
192-
assert.isFalse(Result.isRetrying(Result.waiting(Result.init)))
155+
assert.isFalse(Result.isRetrying(Result.initial()))
156+
assert.isFalse(Result.isRetrying(Result.waiting(Result.initial())))
193157
assert.isFalse(Result.isRetrying(Result.fail(1)))
194-
assert.isFalse(Result.isRetrying(Result.defect(Cause.empty)))
195158
assert.isFalse(Result.isRetrying(Result.success(1)))
196159
assert.isFalse(Result.isRetrying(Result.waiting(Result.success(1))))
197160
assert.isTrue(Result.isRetrying(Result.waiting(Result.fail(1))))
198-
assert.isFalse(Result.isRetrying(Result.waiting(Result.defect(Cause.empty))))
199161
})
200162

201163
it("isRefreshing", () => {
202-
assert.isFalse(Result.isRefreshing(Result.init))
203-
assert.isFalse(Result.isRefreshing(Result.waiting(Result.init)))
164+
assert.isFalse(Result.isRefreshing(Result.initial()))
165+
assert.isFalse(Result.isRefreshing(Result.waiting(Result.initial())))
204166
assert.isFalse(Result.isRefreshing(Result.fail(1)))
205-
assert.isFalse(Result.isRefreshing(Result.defect(Cause.empty)))
206167
assert.isFalse(Result.isRefreshing(Result.success(1)))
207168
assert.isTrue(Result.isRefreshing(Result.waiting(Result.success(1))))
208169
assert.isFalse(Result.isRefreshing(Result.waiting(Result.fail(1))))
209-
assert.isFalse(Result.isRefreshing(Result.waiting(Result.defect(Cause.empty))))
210170
})
211171
})
212172

213173
describe("getters", () => {
214174
it("getValue", () => {
175+
assert.deepStrictEqual(Result.getValue(Result.initial()), O.none())
215176
assert.deepStrictEqual(Result.getValue(Result.success(1)), O.some(1))
216177
assert.deepStrictEqual(Result.getValue(Result.fail(1)), O.none())
217-
assert.deepStrictEqual(Result.getValue(Result.defect(Cause.fail(1))), O.none())
218178
assert.deepStrictEqual(Result.getValue(Result.waiting(Result.success(1))), O.some(1))
219179
assert.deepStrictEqual(Result.getValue(Result.waiting(Result.fail(1))), O.none())
220-
assert.deepStrictEqual(Result.getValue(Result.waiting(Result.defect(Cause.fail(1)))), O.none())
221180
})
222181

223182
it("getFailure", () => {
183+
assert.deepStrictEqual(Result.getFailure(Result.initial()), O.none())
224184
assert.deepStrictEqual(Result.getFailure(Result.success(1)), O.none())
225185
assert.deepStrictEqual(Result.getFailure(Result.fail(1)), O.some(1))
226-
assert.deepStrictEqual(Result.getFailure(Result.defect(Cause.fail(1))), O.none())
227186
assert.deepStrictEqual(Result.getFailure(Result.waiting(Result.success(1))), O.none())
228187
assert.deepStrictEqual(Result.getFailure(Result.waiting(Result.fail(1))), O.some(1))
229-
assert.deepStrictEqual(Result.getFailure(Result.waiting(Result.defect(Cause.fail(1)))), O.none())
230-
})
231-
232-
it("getDefect", () => {
233-
assert.deepStrictEqual(Result.getDefect(Result.success(1)), O.none())
234-
assert.deepStrictEqual(Result.getDefect(Result.fail(1)), O.none())
235-
assert.deepStrictEqual(Result.getDefect(Result.defect(Cause.fail(1))), O.some(Cause.fail(1)))
236-
assert.deepStrictEqual(Result.getDefect(Result.waiting(Result.success(1))), O.none())
237-
assert.deepStrictEqual(Result.getDefect(Result.waiting(Result.fail(1))), O.none())
238-
assert.deepStrictEqual(Result.getDefect(Result.waiting(Result.defect(Cause.fail(1)))), O.some(Cause.fail(1)))
239188
})
240189

241190
it("getExit", () => {
242-
assert.deepStrictEqual(Result.getExit(Result.success(1)), Exit.succeed(E.right(1)))
243-
assert.deepStrictEqual(Result.getExit(Result.fail(1)), Exit.succeed(E.left(1)))
244-
assert.deepStrictEqual(Result.getExit(Result.defect(Cause.fail(1))), Exit.fail(1))
245-
assert.deepStrictEqual(Result.getExit(Result.waiting(Result.success(1))), Exit.succeed(E.right(1)))
246-
assert.deepStrictEqual(Result.getExit(Result.waiting(Result.fail(1))), Exit.succeed(E.left(1)))
247-
assert.deepStrictEqual(Result.getExit(Result.waiting(Result.defect(Cause.fail(1)))), Exit.fail(1))
191+
assert.deepStrictEqual(
192+
Result.getExit(Result.initial()),
193+
Exit.fail(Cause.NoSuchElementException("Result is in its initial state"))
194+
)
195+
assert.deepStrictEqual(Result.getExit(Result.success(1)), Exit.succeed(1))
196+
assert.deepStrictEqual(Result.getExit(Result.fail(1)), Exit.fail(1))
197+
assert.deepStrictEqual(Result.getExit(Result.waiting(Result.success(1))), Exit.succeed(1))
198+
assert.deepStrictEqual(Result.getExit(Result.waiting(Result.fail(1))), Exit.fail(1))
248199
})
249200
})
250201

251202
describe("constructors", () => {
252-
it("fromExitEither", () => {
253-
assert.deepStrictEqual(Result.fromExitEither(Exit.succeed(E.right(1))), Result.success(1))
254-
assert.deepStrictEqual(Result.fromExitEither(Exit.succeed(E.left(1))), Result.fail(1))
255-
assert.deepStrictEqual(Result.fromExitEither(Exit.fail(1)), Result.defect(Cause.fail(1)))
203+
it("fromExit", () => {
204+
assert.deepStrictEqual(Result.fromExit(Exit.succeed(1)), Result.success(1))
205+
assert.deepStrictEqual(Result.fromExit(Exit.fail(1)), Result.fail(1))
256206
})
257207
})
258208
})

test/hooks/useResult.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import * as Context from "@effect/data/Context"
2+
import * as Effect from "@effect/io/Effect"
3+
import * as Layer from "@effect/io/Layer"
4+
import * as Stream from "@effect/stream/Stream"
5+
import { renderHook, waitFor } from "@testing-library/react"
6+
import * as Result from "react-effect/Result"
7+
import * as RuntimeProvider from "react-effect/RuntimeProvider"
8+
import { describe, expect, it } from "vitest"
9+
10+
interface Foo {
11+
value: number
12+
}
13+
const foo = Context.Tag<Foo>()
14+
15+
const { useResult } = RuntimeProvider.makeFromLayer(Layer.succeed(foo, { value: 1 }))
16+
17+
describe("useResult", () => {
18+
it("should run effects", async () => {
19+
const testEffect = Effect.succeed(1)
20+
21+
const { result } = await waitFor(async () => renderHook(() => useResult(testEffect)))
22+
23+
expect(Result.isSuccess(result.current.result)).toBe(true)
24+
})
25+
26+
it("should provide context", async () => {
27+
const testEffect = Effect.map(foo, (_) => _.value)
28+
29+
const { result } = await waitFor(async () => renderHook(() => useResult(testEffect)))
30+
31+
await waitFor(() => expect(Result.isSuccess(result.current.result)).toBe(true))
32+
expect(result.current.result.value).toBe(1)
33+
})
34+
35+
it("should run streams", async () => {
36+
const testEffect = Stream.succeed(1)
37+
38+
const { result } = await waitFor(async () => renderHook(() => useResult(testEffect)))
39+
40+
await waitFor(() => expect(Result.isSuccess(result.current.result)).toBe(true))
41+
})
42+
})

test/hooks/useResultCallback.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import * as Context from "@effect/data/Context"
2+
import * as Effect from "@effect/io/Effect"
3+
import * as Layer from "@effect/io/Layer"
4+
import { act, renderHook, waitFor } from "@testing-library/react"
5+
import * as Result from "react-effect/Result"
6+
import * as RuntimeProvider from "react-effect/RuntimeProvider"
7+
import { describe, expect, it } from "vitest"
8+
9+
interface Foo {
10+
value: number
11+
}
12+
const foo = Context.Tag<Foo>()
13+
14+
const { useResultCallback } = RuntimeProvider.makeFromLayer(Layer.succeed(foo, { value: 1 }))
15+
16+
describe("useResult", () => {
17+
it.only("should do good", async () => {
18+
const testEffect = (value: number) => Effect.succeed(value)
19+
20+
const { result } = await waitFor(async () => renderHook(() => useResultCallback(testEffect)))
21+
22+
expect(Result.isInitial(result.current[0].result)).toBe(true)
23+
act(() => {
24+
result.current[1](1)
25+
})
26+
await waitFor(() => expect(Result.isSuccess(result.current[0].result)).toBe(true))
27+
expect(result.current[0].result.value).toBe(1)
28+
act(() => {
29+
result.current[1](2)
30+
})
31+
await waitFor(() => expect(Result.isSuccess(result.current[0].result)).toBe(true))
32+
expect(result.current[0].result.value).toBe(2)
33+
})
34+
})

test/utils/cause.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as Cause from "@effect/io/Cause"
2-
import * as FiberId from "@effect/io/Fiber/Id"
2+
import * as FiberId from "@effect/io/FiberId"
33
import * as fc from "fast-check"
44

55
export const causesArb = <E>(

test/utils/result.ts

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,23 @@
1-
import type * as Cause from "@effect/io/Cause"
21
import * as fc from "fast-check"
32
import * as Result from "react-effect/Result"
4-
import { causes } from "./cause"
53

6-
export const init = fc.constant(Result.init)
4+
export const init = fc.constant(Result.initial())
75
export const failure = <E>(fail: fc.Arbitrary<E>) => fail.map(Result.fail)
8-
export const defect = <D>(cause: fc.Arbitrary<Cause.Cause<D>>) => cause.map(Result.defect)
96
export const success = <A>(success: fc.Arbitrary<A>) => success.map(Result.success)
10-
export const waiting = <D, E, A>(
7+
export const waiting = <E, A>(
118
value: fc.Arbitrary<A>,
12-
error: fc.Arbitrary<E>,
13-
cause: fc.Arbitrary<Cause.Cause<D>>
14-
) => fc.oneof(init, failure(error), defect(cause), success(value)).map(Result.waiting)
9+
error: fc.Arbitrary<E>
10+
) => fc.oneof(init, failure(error), success(value)).map(Result.waiting)
1511

16-
export const resultArb: <D, E, A>(
12+
export const resultArb: <E, A>(
1713
value: fc.Arbitrary<A>,
18-
error: fc.Arbitrary<E>,
19-
cause: fc.Arbitrary<Cause.Cause<D>>
20-
) => fc.Arbitrary<Result.Result<D, E, A>> = <D, E, A>(
14+
error: fc.Arbitrary<E>
15+
) => fc.Arbitrary<Result.Result<E, A>> = <E, A>(
2116
value: fc.Arbitrary<A>,
22-
error: fc.Arbitrary<E>,
23-
cause: fc.Arbitrary<Cause.Cause<D>>
24-
) => fc.oneof(init, failure(error), defect(cause), success(value), waiting(value, error, cause))
17+
error: fc.Arbitrary<E>
18+
) => fc.oneof(init, failure(error), success(value), waiting(value, error))
2519

26-
export const result: fc.Arbitrary<Result.Result<string, number, string>> = resultArb(
20+
export const result: fc.Arbitrary<Result.Result<number, string>> = resultArb(
2721
fc.string(),
28-
fc.integer(),
29-
causes
22+
fc.integer()
3023
)

test/utils/setup.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import "@testing-library/jest-dom"

0 commit comments

Comments
 (0)