File: error.liq

package info (click to toggle)
liquidsoap 2.3.2-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 11,912 kB
  • sloc: ml: 67,867; javascript: 24,842; ansic: 273; xml: 114; sh: 96; lisp: 96; makefile: 26
file content (215 lines) | stat: -rw-r--r-- 3,311 bytes parent folder | download
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
def f() =
  # Works as expected with no errors
  ret =
    try
      4
    catch _ do
      5
    end

  test.equal(ret, 4)
  e = error.register("foo")

  # Works as expected with no errors
  ret =
    try
      4
    catch _ : [e] do
      5
    end

  test.equal(ret, 4)

  # Can report kind
  ret =
    try
      error.raise(e)
      "bla"
    catch err do
      err.kind
    end

  test.equal(ret, "foo")

  # Can report empty message
  ret =
    try
      error.raise(e)
      "bla"
    catch err do
      err.message
    end

  test.equal(ret, "")

  # Can report set message
  ret =
    try
      error.raise(e, "msg")
      "bla"
    catch err do
      err.message ?? "blo"
    end

  test.equal(ret, "msg")

  # Can report stack trace
  trace =
    try
      error.raise(e, "msg")
      []
    catch err do
      err.trace
    end

  pos =
    string.concat(
      separator=
        ", ",
      list.map(fun (pos) -> pos.to_string(), trace)
    )

  test.equal(r/error.liq, line 58 char 4 - line 63 char 7/.test(pos), true)
  test.equal(r/thread.liq, line 19, char 11-14/.test(pos), true)
  e' = error.register("bla")
  test.equal(false, (e == e'))

  # Ignores errors when not in list
  ret =
    try
      try
        error.raise(e, "msg")
        "bla"
      catch _ : [e'] do
        "blo"
      end
    catch _ : [e] do
      "gni"
    end

  test.equal(ret, "gni")

  # Ignore errors when list is empty
  ret =
    try
      try
        error.raise(e, "msg")
        "bla"
      catch _ : [] do
        "blo"
      end
    catch _ : [e] do
      "gni"
    end

  test.equal(ret, "gni")

  # Catches error when in list
  ret =
    try
      try
        error.raise(e, "msg")
        "bla"
      catch _ : [e, e'] do
        "blo"
      end
    catch _ : [e] do
      "gni"
    end

  test.equal(ret, "blo")
  on_error = ref(error.register("dummy"))
  error.on_error(fun (e) -> on_error := e)
  try
    error.raise(
      e,
      "On done callback"
    )
  catch _ : [e] do
    ()
  end

  if (on_error()).kind != e.kind then test.fail() end
  if
    (on_error()).message !=
      "On done callback"
  then
    test.fail()
  end

  def on_done() =
    test.pass()
  end

  # Works as expected with finally
  ret = ref(false)
  try
    ()
  finally
    ret := true
  end
  test.equal(ret(), true)

  ret = ref(false)
  try
    ()
  catch _ do
    ()
  finally
    ret := true
  end
  test.equal(ret(), true)

  ret = ref(false)
  try
    error.raise(error.not_found)
  catch _ do
    ()
  finally
    ret := true
  end
  test.equal(ret(), true)

  ret = ref(false)
  try
    error.raise(error.not_found)
  catch _ : [error.not_found] do
    ()
  finally
    ret := true
  end
  test.equal(ret(), true)

  ret = ref(false)
  try
    try
      error.raise(error.not_found)
    catch _ : [error.not_found] do
      error.raise(error.failure)
    finally
      ret := true
    end
  catch _ : [error.failure] do
    ()
  end
  test.equal(ret(), true)

  # Catches error
  def on_error(~backtrace, e) =
    print(
      "caught error #{e} from thread and backtrace:\n#{backtrace}"
    )
    if e.kind == "foo" then on_done() else test.fail() end
  end

  thread.on_error(e, on_error)
  thread.run(
    fun () ->
      error.raise(
        e,
        "Asynchronous error"
      )
  )
end

test.check(f)