Methods
#
C
D
E
F
T
R
S
Constants
D = self
 

Allows before and after hooks to be specified via the D() method syntax when this module is mixed-in:

  D .<  { puts "before each nested test" }
  D .>  { puts "after  each nested test" }
  D .<< { puts "before all nested tests" }
  D .>> { puts "after  all nested tests" }
Attributes
[R] report

Hash of test results, assembled by run.

:execution
Hierarchical trace of all tests executed, where each test is represented by its description, is mapped to an Array of nested tests, and may contain zero or more assertion failures.

Assertion failures are represented as a Hash:

“fail“
Description of the assertion failure.
“code“
Source code surrounding the point of failure.
“vars“
Local variables visible at the point of failure.
“call“
Stack trace leading to the point of failure.
:statistics
Hash of counts of major events in test execution:
:passed_assertions
Number of assertions that held true.
:failed_assertions
Number of assertions that did not hold true.
:uncaught_exceptions
Number of exceptions that were not rescued.
[RW] options

Hash of choices that affect how Dfect operates.

:debug
Launch an interactive debugger during assertion failures so the user can investigate them.

The default value is $DEBUG.

:quiet
Do not print the report after executing all tests.

The default value is false.

Class Public methods
<(&block)

Registers the given block to be executed before each nested test inside this test.

Examples

  D .< { puts "before each nested test" }

  D .< do
    puts "before each nested test"
  end
# File lib/dfect.rb, line 138
    def <(*args, &block)
      if args.empty?
        raise ArgumentError, 'block must be given' unless block
        @curr_suite.before_each << block
      else
        # the < method is being used as a check for inheritance
        super
      end
    end
<<(&block)

Registers the given block to be executed before all nested tests inside this test.

Examples

  D .<< { puts "before all nested tests" }

  D .<< do
    puts "before all nested tests"
  end
# File lib/dfect.rb, line 177
    def << &block
      raise ArgumentError, 'block must be given' unless block
      @curr_suite.before_all << block
    end
>(&block)

Registers the given block to be executed after each nested test inside this test.

Examples

  D .> { puts "after each nested test" }

  D .> do
    puts "after each nested test"
  end
# File lib/dfect.rb, line 160
    def > &block
      raise ArgumentError, 'block must be given' unless block
      @curr_suite.after_each << block
    end
>>(&block)

Registers the given block to be executed after all nested tests inside this test.

Examples

  D .>> { puts "after all nested tests" }

  D .>> do
    puts "after all nested tests"
  end
# File lib/dfect.rb, line 194
    def >> &block
      raise ArgumentError, 'block must be given' unless block
      @curr_suite.after_all << block
    end
C(message = nil, symbol = nil, &block)

Asserts that the given symbol is thrown when the given block is executed.

If a value is thrown along with the expected symbol, then that value is returned.

Otherwise, nil is returned.

Parameters

message
Optional message to show in the report if this assertion fails.
symbol
Symbol that must be thrown by the given block.

Examples

  # no message specified:

  C(:foo) { throw :foo, 123 } # passes, => 123
  C(:foo) { throw :bar, 456 } # fails,  => 456
  C(:foo) { }                 # fails,  => nil

  # message specified:

  C( ":foo must be thrown", :foo ) { throw :bar, 789 } # fails, => nil
# File lib/dfect.rb, line 456
    def C message = nil, symbol = nil, &block
      assert_catch :assert, message, symbol, &block
    end
C!(message = nil, symbol = nil, &block)

Asserts that the given symbol is not thrown when the given block is executed.

Returns nil, always.

Parameters

message
Optional message to show in the report if this assertion fails.
symbol
Symbol that must not be thrown by the given block.

Examples

  # no message specified:

  C!(:foo) { throw :foo, 123 } # fails,  => nil
  C!(:foo) { throw :bar, 456 } # passes, => nil
  C!(:foo) { }                 # passes, => nil

  # message specified:

  C!( ":foo must be thrown", :foo ) { throw :bar, 789 } # passes, => nil
# File lib/dfect.rb, line 487
    def C! message = nil, symbol = nil, &block
      assert_catch :negate, message, symbol, &block
    end
C?(message = nil, symbol = nil, &block)

Returns true if the given symbol is thrown when the given block is executed. Otherwise, returns false.

Parameters

message
This parameter is optional and completely ignored.
symbol
Symbol that must be thrown by the given block.

Examples

  # no message specified:

  C?(:foo) { throw :foo, 123 } # => true
  C?(:foo) { throw :bar, 456 } # => false
  C?(:foo) { }                 # => false

  # message specified:

  C?( ":foo must be thrown", :foo ) { throw :bar, 789 } # => false
# File lib/dfect.rb, line 515
    def C? message = nil, symbol = nil, &block
      assert_catch :sample, message, symbol, &block
    end
D(description = caller.first, &block)

Defines a new test, composed of the given description and the given block to execute.

A test may contain nested tests.

Parameters

description
A short summary of the test being defined.

Examples

  D "a new array" do
    D .< { @array = [] }

    D "must be empty" do
      T { @array.empty? }
    end

    D "when populated" do
      D .< { @array.push 55 }

      D "must not be empty" do
        F { @array.empty? }
      end
    end
  end
# File lib/dfect.rb, line 119
    def D description = caller.first, &block
      raise ArgumentError, 'block must be given' unless block
      @curr_suite.tests << Suite::Test.new(description.to_s, block)
    end
E(message = nil, *kinds, &block)

Asserts that one of the given kinds of exceptions is raised when the given block is executed.

If the block raises an exception, then that exception is returned.

Otherwise, nil is returned.

Parameters

message
Optional message to show in the report if this assertion fails.
kinds
Exception classes that must be raised by the given block.

If none are given, then StandardError is assumed (similar to how a plain ‘rescue’ statement without any arguments catches StandardError).

Examples

  # no exceptions specified:

  E { }       # fails
  E { raise } # passes

  # single exception specified:

  E( ArgumentError ) { raise ArgumentError }
  E( "argument must be invalid", ArgumentError ) { raise ArgumentError }

  # multiple exceptions specified:

  E( SyntaxError, NameError ) { eval "..." }
  E( "string must compile", SyntaxError, NameError ) { eval "..." }
# File lib/dfect.rb, line 344
    def E message = nil, *kinds, &block
      assert_raise :assert, message, *kinds, &block
    end
E!(message = nil, *kinds, &block)

Asserts that one of the given kinds of exceptions is not raised when the given block is executed.

If the block raises an exception, then that exception is returned.

Otherwise, nil is returned.

Parameters

message
Optional message to show in the report if this assertion fails.
kinds
Exception classes that must not be raised by the given block.

If none are given, then StandardError is assumed (similar to how a plain ‘rescue’ statement without any arguments catches StandardError).

Examples

  # no exceptions specified:

  E! { }       # passes
  E! { raise } # fails

  # single exception specified:

  E!( ArgumentError ) { raise ArgumentError } # fails
  E!( "argument must be invalid", ArgumentError ) { raise ArgumentError }

  # multiple exceptions specified:

  E!( SyntaxError, NameError ) { eval "..." }
  E!( "string must compile", SyntaxError, NameError ) { eval "..." }
# File lib/dfect.rb, line 386
    def E! message = nil, *kinds, &block
      assert_raise :negate, message, *kinds, &block
    end
E?(message = nil, *kinds, &block)

Returns true if one of the given kinds of exceptions is raised when the given block is executed. Otherwise, returns false.

Parameters

message
This parameter is optional and completely ignored.
kinds
Exception classes that must be raised by the given block.

If none are given, then StandardError is assumed (similar to how a plain ‘rescue’ statement without any arguments catches StandardError).

Examples

  # no exceptions specified:

  E? { }       # => false
  E? { raise } # => true

  # single exception specified:

  E?( ArgumentError ) { raise ArgumentError } # => true

  # multiple exceptions specified:

  E?( SyntaxError, NameError ) { eval "..." } # => true
# File lib/dfect.rb, line 421
    def E? message = nil, *kinds, &block
      assert_raise :sample, message, *kinds, &block
    end
F?(message = nil, &block)

Returns true if the result of the given block is either nil or false. Otherwise, returns false.

Parameters

message
This parameter is optional and completely ignored.

Examples

  # no message specified:

  F? { true }  # => false
  F? { false } # => true
  F? { nil }   # => true

  # message specified:

  F?( "computers do not doublethink" ) { 2 + 2 == 5 } # => true
# File lib/dfect.rb, line 301
    def F? message = nil, &block
      not T? message, &block
    end
T(message = nil, &block)

Asserts that the result of the given block is neither nil nor false and returns that result.

Parameters

message
Optional message to show in the report if this assertion fails.

Examples

  # no message specified:

  T { true }  # passes
  T { false } # fails
  T { nil }   # fails

  # message specified:

  T( "computers do not doublethink" ) { 2 + 2 != 5 } # passes
# File lib/dfect.rb, line 221
    def T message = nil, &block
      assert_block :assert, message, &block
    end
T!(message = nil, &block)

Asserts that the result of the given block is either nil or false and returns that result.

Parameters

message
Optional message to show in the report if this assertion fails.

Examples

  # no message specified:

  T! { true }  # fails
  T! { false } # passes
  T! { nil }   # passes

  # message specified:

  T!( "computers do not doublethink" ) { 2 + 2 == 5 } # passes
# File lib/dfect.rb, line 247
    def T! message = nil, &block
      assert_block :negate, message, &block
    end
T?(message = nil, &block)

Returns true if the result of the given block is neither nil nor false. Otherwise, returns false.

Parameters

message
This parameter is optional and completely ignored.

Examples

  # no message specified:

  T? { true }  # => true
  T? { false } # => false
  T? { nil }   # => false

  # message specified:

  T?( "computers do not doublethink" ) { 2 + 2 != 5 } # => true
# File lib/dfect.rb, line 272
    def T? message = nil, &block
      assert_block :sample, message, &block
    end
run()

Executes all tests defined thus far and stores the results in report.

# File lib/dfect.rb, line 522
    def run
      # clear previous results
      @exec_stats.clear
      @exec_trace.clear
      @test_stack.clear

      # make new results
      catch :stop_dfect_execution do
        execute
      end

      # print new results
      puts @report.to_yaml unless @options[:quiet]
    end
stop()

Stops the execution of the run method or raises an exception if that method is not currently executing.

# File lib/dfect.rb, line 541
    def stop
      throw :stop_dfect_execution
    end