aboutsummaryrefslogtreecommitdiff
path: root/tests/builtins.spec.ts
blob: cbac0d3555340b16807325184cf1d2af704bf1d2 (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'

interface MyEffect<_a extends number, _b extends string, _c extends unknown> extends Effect {}

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

  PutStringLn<'====================='>,
  PutStringLn<'=== Running tests ==='>,
  PutStringLn<'=====================\n\n'>,

  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">
      >,
    ]>,
  ]>,

  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">>,
    ]>,
  ]>,

  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'],
      ]>>,
    ]>,
  ]>,

  PutStringLn<"">,
]