aboutsummaryrefslogtreecommitdiff
path: root/tests/builtins.spec.ts
blob: cd4b5c4e99109514f087205837284c9cf5dd87bc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import { Bind, BindTo, Do, Effect, Label, Pure } from '../stdlib/effect'
import { Throw, Try } from '../stdlib/exception'
import { PutStringLn } from '../stdlib/stdio'
import { DefineEffect, JsExpr, SetEvalEnvironment } from '../stdlib/sys'
import { Test, AssertEqualsK, AssertEquals } from '../stdlib/test'

type testBind = Do<[
  PutStringLn<'Bind & BindTo'>,

  Test<'should bind value to function and kind', [
    Bind<Pure<[1,2,3]>, <val extends number[]>() =>
      AssertEquals<val, [1, 2, 3]>>,

    Bind<Pure<[1,2,3]>, AssertEqualsK<[1,2,3]>>,
  ]>,

  Test<'should bind label correctly', [
    BindTo<"value", Pure<{ a: 'b', c: { d: 1 } }>>,

    Bind<Label<"value">, AssertEqualsK<{ a: 'b', c: { d: 1 } }>>,
  ]>,

  Test<'should bind only inside Do scope', [
    Do<[
      BindTo<"value", Pure<"some value">>,
      Bind<Label<"value">, AssertEqualsK<"some value">>,
    ]>,

    Bind<
      Try<Label<"value">, <_>() => Pure<"none">>,
      AssertEqualsK<"none">
    >,
  ]>,

  Test<'should bind only inside Bind scope', [
    Bind<
      BindTo<"value", Pure<"some value">>,
      <_>() => Bind<Label<"value">, AssertEqualsK<"some value">>
    >,

    Bind<
      Try<Label<"value">, <_>() => Pure<"none">>,
      AssertEqualsK<"none">
    >,
  ]>,
]>

type testExcpt = Do<[
  PutStringLn<'Try/Throw'>,

  Test<'should return the result of effect', [
    Bind<Try<Pure<20>, <_>() => Pure<0>>,
      AssertEqualsK<20>>,
  ]>,

  Test<'should return the result of error handler', [
    Bind<Try<Do<[ Throw<"wow">, Pure<20> ]>, <_>() => Pure<0>>,
      AssertEqualsK<0>>,

    Bind<Try<Do<[ Throw<"wow">, Pure<20> ]>, <e>() => Pure<e>>,
      AssertEqualsK<"wow">>,
  ]>,
]>

interface MyEffect<_a extends number, _b extends string, _c extends unknown> extends Effect {}
type testFFI = Do<[
  PutStringLn<'FFI'>,

  Test<'should return the result of js expression', [
    Bind<JsExpr<'69 * 420'>, AssertEqualsK<28980>>,
  ]>,

  Test<'should test custom effect', [
    DefineEffect<'MyEffect', `([a, b, c], ctx) => {
      return [
        ctx.getTypeValue(a) * 2,
        ctx.getTypeValue(b) + '!',
        [...ctx.getTypeValue(c), 'wow'],
      ]
    }`>,
    Bind<MyEffect<4, "hey", [1, 2]>, AssertEqualsK<[
      8, "hey!", [1, 2, 'wow'],
    ]>>,
  ]>,
]>

export type main = [
  SetEvalEnvironment<'test.node'>,

  PutStringLn<'====================='>,
  PutStringLn<'=== Running tests ==='>,
  PutStringLn<'=====================\n\n'>,
  testBind,
  testExcpt,
  testFFI,
]