Class: Shindo::Tests

Inherits:
Object
  • Object
show all
Defined in:
lib/shindo.rb,
lib/shindo/verbose.rb,
lib/shindo/taciturn.rb

Instance Method Summary collapse

Constructor Details

#initialize(description, tags = [], &block) ⇒ Tests

Returns a new instance of Tests.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/shindo.rb', line 18

def initialize(description, tags = [], &block)
  @afters     = []
  @befores    = []
  @description_stack  = []
  @tag_stack          = []
  Thread.current[:reload] = false
  Thread.current[:tags] ||= []
  Thread.current[:totals] ||= { :failed => 0, :pending => 0, :skipped => 0, :succeeded => 0 }
  @if_tagged = []
  @unless_tagged = []
  for tag in Thread.current[:tags]
    case tag[0...1]
    when '+'
      @if_tagged << tag[1..-1]
    when '-'
      @unless_tagged << tag[1..-1]
    end
  end
  @pending = nil
  Formatador.display_line
  tests(description, tags, &block)
end

Instance Method Details

#after(&block) ⇒ Object



41
42
43
# File 'lib/shindo.rb', line 41

def after(&block)
  @afters.last.push(block)
end

#before(&block) ⇒ Object



45
46
47
# File 'lib/shindo.rb', line 45

def before(&block)
  @befores.last.push(block)
end

#pendingObject

Raises:



49
50
51
# File 'lib/shindo.rb', line 49

def pending
  raise(Shindo::Pending.new)
end

#raises(error, description = "raises #{error.inspect}", &block) ⇒ Object



107
108
109
# File 'lib/shindo.rb', line 107

def raises(error, description = "raises #{error.inspect}", &block)
  assert(:raises, error, description, &block)
end

#returns(expectation, description = "returns #{expectation.inspect}", &block) ⇒ Object



111
112
113
# File 'lib/shindo.rb', line 111

def returns(expectation, description = "returns #{expectation.inspect}", &block)
  assert(:returns, expectation, description, &block)
end

#test(description = 'returns true', &block) ⇒ Object



115
116
117
# File 'lib/shindo.rb', line 115

def test(description = 'returns true', &block)
  assert(:returns, true, description, &block)
end

#tests(description, tags = [], &block) ⇒ Object



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
# File 'lib/shindo.rb', line 53

def tests(description, tags = [], &block)
  return self if Thread.main[:exit] || Thread.current[:reload]

  tags = [*tags].collect { |tag| tag.to_s }
  @tag_stack.push(tags)
  @befores.push([])
  @afters.push([])

  @description = nil
  @inline = false
  description ||= 'Shindo.tests'
  description = "[bold]#{description}[normal]"
  unless tags.empty?
    description << " (#{tags.join(', ')})"
  end
  @description_stack.push(description)

  # if the test includes +tags and discludes -tags, evaluate it
  if (@if_tagged.empty? || !(@if_tagged & @tag_stack.flatten).empty?) &&
      (@unless_tagged.empty? || (@unless_tagged & @tag_stack.flatten).empty?)
    if block_given?
      begin
        display_description(description)
        # HACK: increase indent
        indent = Thread.current[:formatador].instance_variable_get(:@indent)
        Thread.current[:formatador].instance_variable_set(:@indent, indent + 1)
        instance_eval(&block)
      rescue Shindo::Pending
        display_pending(description)
      rescue => error
        display_error(error)
        abort "An error occurred outside of a test"
      ensure
        # HACK: decrease indent
        indent = Thread.current[:formatador].instance_variable_get(:@indent)
        Thread.current[:formatador].instance_variable_set(:@indent, indent - 1)
      end
    else
      @inline = true
      display_description(description)
    end
  else
    display_description("[light_black]#{description}[/]")
  end

  @description_stack.pop
  @afters.pop
  @befores.pop
  @tag_stack.pop

  Thread.exit if Thread.main[:exit] || Thread.current[:reload]
  self
end