-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
example.cr
63 lines (51 loc) · 1.81 KB
/
example.cr
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
require "./item"
module Spec
# Each example (`it`) in a spec suite.
class Example
include Item
# :nodoc:
getter block : (->) | Nil
# :nodoc:
def initialize(@parent : Context, @description : String,
@file : String, @line : Int32, @end_line : Int32,
@focus : Bool, tags,
@block : (->) | Nil)
initialize_tags(tags)
end
# :nodoc:
def run
Spec.root_context.check_nesting_spec(file, line) do
Spec.formatters.each(&.before_example(description))
unless block = @block
@parent.report(:pending, description, file, line)
return
end
non_nil_block = block
start = Time.monotonic
Spec.run_before_each_hooks
ran = @parent.run_around_each_hooks(Example::Procsy.new(self) { internal_run(start, non_nil_block) })
ran || internal_run(start, non_nil_block)
Spec.run_after_each_hooks
# We do this to give a chance for signals (like CTRL+C) to be handled,
# which currently are only handled when there's a fiber switch
# (IO stuff, sleep, etc.). Without it the user might wait more than needed
# after pressing CTRL+C to quit the tests.
Fiber.yield
end
end
private def internal_run(start, block)
@parent.run_before_each_hooks
block.call
@parent.report(:success, description, file, line, Time.monotonic - start)
rescue ex : Spec::AssertionFailed
@parent.report(:fail, description, file, line, Time.monotonic - start, ex)
Spec.abort! if Spec.fail_fast?
rescue ex
@parent.report(:error, description, file, line, Time.monotonic - start, ex)
Spec.abort! if Spec.fail_fast?
ensure
@parent.run_after_each_hooks
end
end
end
require "./example/procsy"