Class: RCheck::Suite

Inherits:
Object
  • Object
show all
Includes:
Assertions::SuiteMethods, Debugging::SuiteMethods
Defined in:
lib/rcheck/suite.rb

Constant Summary collapse

SYNONYMS =
{
  all:          [:error, :fail, :pending, :pass],
  problematic:  [:error, :fail, :pending],
  critical:     [:error, :fail,]
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Debugging::SuiteMethods

#debug

Methods included from Assertions::SuiteMethods

#assert, #assert_raises, #assert_safe, #pending, #refute

Constructor Details

#initialize(parent, name) ⇒ Suite

Returns a new instance of Suite.



12
13
14
15
16
17
18
19
20
# File 'lib/rcheck/suite.rb', line 12

def initialize(parent, name)
  @parent     = parent
  @name       = name
  @scope      = DSL::Scope.new self
  @suites     = {}
  @assertions = []
  @result     = Result.new(
    progress: false, status: :pass, location: [full_name])
end

Instance Attribute Details

#assertionsObject (readonly)

Returns the value of attribute assertions.



22
23
24
# File 'lib/rcheck/suite.rb', line 22

def assertions
  @assertions
end

#lockedObject (readonly)

Returns the value of attribute locked.



123
124
125
# File 'lib/rcheck/suite.rb', line 123

def locked
  @locked
end

#nameObject (readonly)

Returns the value of attribute name.



22
23
24
# File 'lib/rcheck/suite.rb', line 22

def name
  @name
end

#parentObject (readonly)

Returns the value of attribute parent.



22
23
24
# File 'lib/rcheck/suite.rb', line 22

def parent
  @parent
end

#resultObject (readonly)

Returns the value of attribute result.



22
23
24
# File 'lib/rcheck/suite.rb', line 22

def result
  @result
end

#scopeObject (readonly)

Returns the value of attribute scope.



22
23
24
# File 'lib/rcheck/suite.rb', line 22

def scope
  @scope
end

Instance Method Details

#[](*names) ⇒ Object



39
40
41
42
43
44
# File 'lib/rcheck/suite.rb', line 39

def [](*names)
  names = groom_name_chain(names)
  return self if names.empty?
  name  = names.shift.to_s
  @suites[name][*names] if @suites[name]
end

#counts(scope) ⇒ Object



102
103
104
105
106
# File 'lib/rcheck/suite.rb', line 102

def counts(scope)
  Hash[[:error, :fail, :pending, :pass].map do |sym|
    [sym, send(scope, sym).count]
  end]
end

#done!Object



125
126
127
# File 'lib/rcheck/suite.rb', line 125

def done!
  @locked ||= (suites.each(&:done!); true)
end

#find_or_create(*names) ⇒ Object



46
47
48
49
50
51
52
# File 'lib/rcheck/suite.rb', line 46

def find_or_create(*names)
  names = groom_name_chain(names)
  return self if names.empty?
  name  = names.shift.to_s
  @suites[name] ||= Suite.new(self, name)
  @suites[name].find_or_create(*names)
end

#full_nameObject



119
120
121
# File 'lib/rcheck/suite.rb', line 119

def full_name
  name_chain.join('/')
end

#inspectObject



24
25
26
# File 'lib/rcheck/suite.rb', line 24

def inspect
  "#<#{self.class}: #{full_name.inspect}>"
end

#local(*statuses) ⇒ Object



82
83
84
85
86
87
88
# File 'lib/rcheck/suite.rb', line 82

def local(*statuses)
  if (statuses.length == 1) && SYNONYMS[statuses.first]
    statuses = SYNONYMS[statuses.first]
  end
  assertions.select { |a| statuses.include? a.result.status } +
    (statuses.include?(:error) && @exception ? [self] : [])
end

#name_chainObject



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

def name_chain
  @parent.nil? ? [] : @parent.name_chain.push(name)
end

#report!(*printers) ⇒ Object



73
74
75
76
77
78
79
80
# File 'lib/rcheck/suite.rb', line 73

def report!(*printers)
  done!
  printers = Conf[:report] unless printers.any?
  printers.each do |p|
    p.report self
    puts
  end
end

#severity(scope) ⇒ Object



108
109
110
111
112
113
# File 'lib/rcheck/suite.rb', line 108

def severity(scope)
  [:error, :fail, :pending].each do |severity|
    return severity if send(scope, severity).any?
  end
  :pass
end

#subtree(*statuses) ⇒ Object



98
99
100
# File 'lib/rcheck/suite.rb', line 98

def subtree(*statuses)
  total(statuses) - local(statuses)
end

#suite(*names, &blk) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/rcheck/suite.rb', line 54

def suite(*names, &blk)
  verify_not_done!
  if names.any?
    find_or_create(*names).suite(&blk)
  else
    begin
      @scope.instance_eval(&blk) if blk
    rescue Exception => e
      @exception = e
      @result = Result.new(
        status:         :error,
        introspection:  @exception.inspect,
        backtrace:      @exception.backtrace,
        location:       @exception.backtrace)
    end
    self
  end
end

#suitesObject Also known as: children



28
29
30
31
32
33
34
35
# File 'lib/rcheck/suite.rb', line 28

def suites
  case Conf[:print_order]
  when 'name' then @suites.values.sort_by(&:name)
  when 'run'  then @suites.values
  else raise Errors::ConfigName,
    "unknown suite ordering: #{Conf[:print_order]}"
  end
end

#total(*statuses) ⇒ Object



90
91
92
93
94
95
96
# File 'lib/rcheck/suite.rb', line 90

def total(*statuses)
  @subtree_cache ||= {}
  @subtree_cache[statuses] ||= local(*statuses) +
    suites.map do |child_suite|
      child_suite.total(*statuses)
    end.inject([], :+)
end

#verify_not_done!Object



129
130
131
132
133
134
# File 'lib/rcheck/suite.rb', line 129

def verify_not_done!
  if @locked
    raise Errors::SuiteRedefinition, "#{self} cannot be modified"\
      "because it has been marked as done"
  end
end