aboutsummaryrefslogtreecommitdiff
path: root/aoc2023/build/packages/adglent/src/showtime/tests/should.gleam
blob: 71578c7899cda24bb9d340d884b1e9a5472d1ae9 (plain)
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import gleam/option.{type Option, None, Some}
import showtime/tests/meta.{type Meta}

pub type Assertion(t, e) {
  Eq(a: t, b: t, meta: Option(Meta))
  NotEq(a: t, b: t, meta: Option(Meta))
  IsOk(a: Result(t, e), meta: Option(Meta))
  IsError(a: Result(t, e), meta: Option(Meta))
  Fail(meta: Option(Meta))
}

pub fn equal(a: t, b: t) {
  evaluate(Eq(a, b, None))
}

pub fn equal_meta(a: t, b: t, meta: Meta) {
  evaluate(Eq(a, b, Some(meta)))
}

pub fn not_equal(a: t, b: t) {
  evaluate(NotEq(a, b, None))
}

pub fn not_equal_meta(a: t, b: t, meta: Meta) {
  evaluate(NotEq(a, b, Some(meta)))
}

pub fn be_ok(a: Result(o, e)) {
  evaluate(IsOk(a, None))
  let assert Ok(value) = a
  value
}

pub fn be_ok_meta(a: Result(o, e), meta: Meta) {
  evaluate(IsOk(a, Some(meta)))
}

pub fn be_error(a: Result(o, e)) {
  evaluate(IsError(a, None))
  let assert Error(value) = a
  value
}

pub fn be_error_meta(a: Result(o, e), meta: Meta) {
  evaluate(IsError(a, Some(meta)))
}

pub fn fail() {
  evaluate(Fail(None))
}

pub fn fail_meta(meta: Meta) {
  evaluate(Fail(Some(meta)))
}

pub fn be_true(a: Bool) {
  a
  |> equal(True)
}

pub fn be_true_meta(a: Bool, meta: Meta) {
  a
  |> equal_meta(True, meta)
}

pub fn be_false(a: Bool) {
  a
  |> equal(False)
}

pub fn be_false_meta(a: Bool, meta: Meta) {
  a
  |> equal_meta(False, meta)
}

@external(erlang, "showtime_ffi", "gleam_error")
fn gleam_error(value: Result(Nil, Assertion(a, b))) -> Nil

pub fn evaluate(assertion) -> Nil {
  case assertion {
    Eq(a, b, _meta) ->
      case a == b {
        True -> Nil
        False -> {
          gleam_error(Error(assertion))
        }
      }
    NotEq(a, b, _meta) ->
      case a != b {
        True -> Nil
        False -> {
          gleam_error(Error(assertion))
        }
      }
    IsOk(a, _meta) ->
      case a {
        Ok(_) -> Nil
        Error(_) -> {
          gleam_error(Error(assertion))
        }
      }
    IsError(a, _meta) ->
      case a {
        Error(_) -> Nil
        Ok(_) -> {
          gleam_error(Error(assertion))
        }
      }
    Fail(_meta) -> {
      gleam_error(Error(assertion))
    }
  }
}