class Oktest::AssertionObject

Constants

NOT_YET

Attributes

actual[R]
bool[R]
location[R]

Public Class Methods

new(actual, bool, location) click to toggle source
# File lib/oktest.rb, line 45
def initialize(actual, bool, location)
  @actual   = actual
  @bool     = bool
  @location = location
end
report_not_yet() click to toggle source
# File lib/oktest.rb, line 58
def self.report_not_yet()
  #; [!3nksf] reports if 'ok{}' called but assertion not performed.
  return if NOT_YET.empty?
  NOT_YET.each_value do |ass|
    s = ass.location ? " (at #{ass.location})" : nil
    $stderr.write "** warning: ok() is called but not tested yet#{s}.\n"
  end
  #; [!f92q4] clears remained objects.
  NOT_YET.clear()
end

Public Instance Methods

!=(expected) click to toggle source
# File lib/oktest.rb, line 102
def !=(expected)    # Ruby >= 1.9
  __done()
  #; [!90tfb] raises assertion error when failed.
  #; [!l6afg] is avaialbe with NOT.
  __assert(@bool == (@actual != expected)) {
    op = @bool ? '!=' : '=='
    "$<actual> #{op} $<expected>: failed.\n"\
    "    $<actual>:   #{@actual.inspect}\n"\
    "    $<expected>: #{expected.inspect}"
  }
  #; [!iakbb] returns self when passed.
  self
end
!~(expected) click to toggle source
# File lib/oktest.rb, line 200
def !~(expected)    # Ruby >= 1.9
  __done()
  #; [!58udu] raises assertion error when failed.
  #; [!iuf5j] is avaialbe with NOT.
  __assert_match(@actual !~ expected, '!~', '=~', expected)
  #; [!xywdr] returns self when passed.
  self
end
<(expected) click to toggle source
# File lib/oktest.rb, line 160
def <(expected)
  __done()
  #; [!ukqa0] raises assertion error when failed.
  #; [!gwvdl] is avaialbe with NOT.
  __assert_op(@actual < expected, '<', '>=', expected)
  #; [!vkwcc] returns self when passed.
  self
end
<=(expected) click to toggle source
# File lib/oktest.rb, line 169
def <=(expected)
  __done()
  #; [!ordwe] raises assertion error when failed.
  #; [!mcb9w] is avaialbe with NOT.
  __assert_op(@actual <= expected, '<=', '>', expected)
  #; [!yk7t2] returns self when passed.
  self
end
==(expected) click to toggle source
# File lib/oktest.rb, line 80
def ==(expected)
  __done()
  #; [!1iun4] raises assertion error when failed.
  #; [!eyslp] is avaialbe with NOT.
  __assert(@bool == (@actual == expected)) {
    if @bool && ! (@actual == expected) \
        && @actual.is_a?(String) && expected.is_a?(String) \
        && (@actual =~ /\n/ || expected =~ /\n/)
      #; [!3xnqv] shows context diff when both actual and expected are text.
      diff = Util.unified_diff(expected, @actual, "--- $<expected>\n+++ $<actual>\n")
      "$<actual> == $<expected>: failed.\n#{diff}"
    else
      op = @bool ? '==' : '!='
      "$<actual> #{op} $<expected>: failed.\n"\
      "    $<actual>:   #{@actual.inspect}\n"\
      "    $<expected>: #{expected.inspect}"
    end
  }
  #; [!c6p0e] returns self when passed.
  self
end
===(expected) click to toggle source
# File lib/oktest.rb, line 116
def ===(expected)
  __done()
  #; [!mjh4d] raises error when combination of 'not_ok()' and matcher object.
  if @bool == false && @actual.is_a?(Matcher)
    raise OktestError, "negative `===` is not available with matcher object."
  end
  #; [!42f6a] raises assertion error when failed.
  #; [!vhvyu] is avaialbe with NOT.
  __assert(@bool == (@actual === expected)) {
    s = "$<actual> === $<expected>"
    s = "!(#{s})" unless @bool
    "#{s}: failed.\n"\
    "    $<actual>:   #{@actual.inspect}\n"\
    "    $<expected>: #{expected.inspect}"
  }
  #; [!uh8bm] returns self when passed.
  self
end
=~(expected) click to toggle source
# File lib/oktest.rb, line 191
def =~(expected)
  __done()
  #; [!xkldu] raises assertion error when failed.
  #; [!2aa6f] is avaialbe with NOT.
  __assert_match(@actual =~ expected, '=~', '!~', expected)
  #; [!acypf] returns self when passed.
  self
end
>(expected) click to toggle source
# File lib/oktest.rb, line 142
def >(expected)
  __done()
  #; [!vjjuq] raises assertion error when failed.
  #; [!73a0t] is avaialbe with NOT.
  __assert_op(@actual > expected, '>', '<=', expected)
  #; [!3j7ty] returns self when passed.
  self
end
>=(expected) click to toggle source
# File lib/oktest.rb, line 151
def >=(expected)
  __done()
  #; [!isdfc] raises assertion error when failed.
  #; [!3dgmh] is avaialbe with NOT.
  __assert_op(@actual >= expected, '>=', '<', expected)
  #; [!75iqw] returns self when passed.
  self
end
NOT() click to toggle source
# File lib/oktest.rb, line 73
def NOT()
  #; [!63dde] toggles internal boolean.
  @bool = ! @bool
  #; [!g775v] returns self.
  self
end
__assert(result) { || ... } click to toggle source
# File lib/oktest.rb, line 69
def __assert(result)
  raise FAIL_EXCEPTION, yield unless result
end
attr(name, expected) click to toggle source
# File lib/oktest.rb, line 416
def attr(name, expected)
  __done()
  #; [!79tgn] raises assertion error when failed.
  #; [!cqnu3] is available with NOT.
  val = @actual.__send__(name)
  __assert(@bool == (expected == val)) {
    op = @bool ? '==' : '!='
    "$<actual>.#{name} #{op} $<expected>: failed.\n"\
    "    $<actual>.#{name}: #{val.inspect}\n"\
    "    $<expected>: #{expected.inspect}"\
  }
  #; [!lz3lb] returns self when passed.
  self
end
attrs(**keyvals) click to toggle source
# File lib/oktest.rb, line 431
def attrs(**keyvals)
  __done()
  #; [!7ta0s] raises assertion error when failed.
  #; [!s0pnk] is available with NOT.
  keyvals.each {|name, expected| attr(name, expected) }
  #; [!rtq9f] returns self when passed.
  self
end
dir_exist?() click to toggle source
# File lib/oktest.rb, line 523
def dir_exist?
  __done()
  #; [!vfh7a] raises assertion error when failed.
  #; [!qtllp] is available with NOT.
  __assert_fs(File.directory?(@actual), "File.directory?($<actual>)")
  #; [!8qe7u] returns self when passed.
  self
end
falsy?() click to toggle source
# File lib/oktest.rb, line 493
def falsy?
  __done()
  #; [!7o48g] raises assertion error when failed.
  #; [!i44q6] is available with NOT.
  __assert(@bool == (!!@actual == false)) {
    op = @bool ? '==' : '!='
    "!!$<actual> #{op} false: failed.\n"\
    "    $<actual>:   #{@actual.inspect}"
  }
  #; [!w1vm6] returns self when passed.
  self
end
file_exist?() click to toggle source
# File lib/oktest.rb, line 514
def file_exist?
  __done()
  #; [!69bs0] raises assertion error when failed.
  #; [!r1mze] is available with NOT.
  __assert_fs(File.file?(@actual) , "File.file?($<actual>)")
  #; [!6bcpp] returns self when passed.
  self
end
in?(expected) click to toggle source
# File lib/oktest.rb, line 402
def in?(expected)
  __done()
  #; [!9rm8g] raises assertion error when failed.
  #; [!singl] is available with NOT.
  __assert(@bool == !! expected.include?(@actual)) {
    eq = @bool ? '' : ' == false'
    "$<expected>.include?($<actual>)#{eq}: failed.\n"\
    "    $<actual>:   #{@actual.inspect}\n"\
    "    $<expected>: #{expected.inspect}"
  }
  #; [!jzoxg] returns self when passed.
  self
end
in_delta?(expected, delta) click to toggle source
# File lib/oktest.rb, line 209
def in_delta?(expected, delta)
  __done()
  #; [!f3zui] raises assertion error when failed.
  #; [!t7liw] is avaialbe with NOT.
  __assert(@bool == !!((@actual - expected).abs < delta)) {
    eq = @bool ? '' : ' == false'
    "($<actual> - $<expected>).abs < #{delta}#{eq}: failed.\n"\
    "    $<actual>:   #{@actual.inspect}\n"\
    "    $<expected>: #{expected.inspect}\n"\
    "    ($<actual> - $<expected>).abs: #{(@actual - expected).abs.inspect}"
  }
  #; [!m0791] returns self when passed.
  self
end
item(key, expected)
Alias for: keyval
items(keyvals={})
Alias for: keyvals
keyval(key, expected) click to toggle source
# File lib/oktest.rb, line 440
def keyval(key, expected)
  __done()
  #; [!vtrlz] raises assertion error when failed.
  #; [!mmpwz] is available with NOT.
  val = @actual[key]
  __assert(@bool == (expected == val)) {
    op = @bool ? '==' : '!='
    "$<actual>[#{key.inspect}] #{op} $<expected>: failed.\n"\
    "    $<actual>[#{key.inspect}]: #{val.inspect}\n"\
    "    $<expected>: #{expected.inspect}"\
  }
  #; [!byebv] returns self when passed.
  self
end
Also aliased as: item
keyvals(keyvals={}) click to toggle source
# File lib/oktest.rb, line 456
def keyvals(keyvals={})  # never use keyword args!
  __done()
  #; [!fyvmn] raises assertion error when failed.
  #; [!js2j2] is available with NOT.
  keyvals.each {|name, expected| keyval(name, expected) }
  #; [!vtw22] returns self when passed.
  self
end
Also aliased as: items
length(n) click to toggle source
# File lib/oktest.rb, line 466
def length(n)
  __done()
  #; [!1y787] raises assertion error when failed.
  #; [!kryx2] is available with NOT.
  __assert(@bool == (@actual.length == n)) {
    op = @bool ? '==' : '!='
    "$<actual>.length #{op} #{n}: failed.\n"\
    "    $<actual>.length: #{@actual.length}\n"\
    "    $<actual>:   #{actual.inspect}"
  }
  #; [!l9vnv] returns self when passed.
  self
end
method_missing(method_name, *args) click to toggle source
Calls superclass method
# File lib/oktest.rb, line 238
def method_missing(method_name, *args)
  __done()
  #; [!yjnxb] enables to handle boolean methods.
  #; [!ttow6] raises NoMethodError when not a boolean method.
  method_name.to_s =~ /\?\z/  or
    super
  begin
    ret = @actual.__send__(method_name, *args)
  rescue NoMethodError, TypeError => exc
    #; [!f0ekh] skip top of backtrace when NoMethodError raised.
    while !exc.backtrace.empty? && exc.backtrace[0].start_with?(__FILE__)
      exc.backtrace.shift()
    end
    raise
  end
  #; [!cun59] fails when boolean method failed returned false.
  #; [!4objh] is available with NOT.
  if ret == true || ret == false
    __assert(@bool == ret) {
      args = args.empty? ? '' : "(#{args.collect {|x| x.inspect }.join(', ')})"
      eq = @bool ? '' : ' == false'
      "$<actual>.#{method_name}#{args}#{eq}: failed.\n"\
      "    $<actual>:   #{@actual.inspect}"
    }
  #; [!sljta] raises TypeError when boolean method returned non-boolean value.
  else
    raise TypeError, "ok(): #{@actual.class}##{method_name}() expected to return true or false, but got #{ret.inspect}."
  end
  #; [!7bbrv] returns self when passed.
  self
end
not_exist?() click to toggle source
# File lib/oktest.rb, line 541
def not_exist?
  __done()
  #; [!ja84s] raises assertion error when failed.
  #; [!to5z3] is available with NOT.
  __assert(@bool == ! File.exist?(@actual)) {
    "File.exist?($<actual>)#{@bool ? ' == false' : ''}: failed.\n"\
    "    $<actual>:   #{@actual.inspect}"
  }
  #; [!1ujag] returns self when passed.
  self
end
raise!(errcls=nil, errmsg=nil, &b) click to toggle source
# File lib/oktest.rb, line 270
def raise!(errcls=nil, errmsg=nil, &b)
  #; [!8k6ee] compares error class by '.is_a?' instead of '=='.
  return raise?(errcls, errmsg, _subclass: true, &b)
end
raise?(errcls=nil, errmsg=nil, _subclass: false) { |exc| ... } click to toggle source
# File lib/oktest.rb, line 275
def raise?(errcls=nil, errmsg=nil, _subclass: false, &b)
  __done()
  #; [!2rnni] 1st argument can be error message string or rexp.
  if errmsg.nil? && ! errcls.nil? && ! (errcls.is_a?(Class) && errcls <= Exception)
    errmsg = errcls
    errcls = RuntimeError
  end
  #
  proc_obj = @actual
  exc = nil
  #; [!dpv5g] when `ok{}` called...
  if @bool
    begin
      proc_obj.call
    rescue Exception => exc
      #; [!4c6x3] not check exception class when nil specified as errcls.
      if errcls.nil?
        nil
      #; [!yps62] assertion passes when expected exception raised.
      #; [!lq6jv] compares error class with '==' operator, not '.is_a?'.
      elsif exc.class == errcls    # not `exc.is_a?(errcls)`
        nil
      #; [!hwg0z] compares error class with '.is_a?' if '_subclass: true' specified.
      elsif _subclass && exc.class < errcls
        nil
      #; [!4n3ed] reraises if exception is not matched to specified error class.
      else
        #__assert(false) { "Expected #{errcls} to be raised but got #{exc.class}." }
        raise
      end
    else
      #; [!wbwdo] raises assertion error when nothing raised.
      __assert(false) { "Expected #{errcls} to be raised but nothing raised." }
    end
    #; [!tpxlv] accepts string or regexp as error message.
    if errmsg
      __assert(errmsg === exc.message) {
        op = errmsg.is_a?(Regexp) ? '=~' : '=='
        "$<error_message> #{op} #{errmsg.inspect}: failed.\n"\
        "    $<error_message>: #{exc.message.inspect}"
      }
    end
    #; [!dq97o] if block given, call it with exception object.
    yield exc if block_given?()
  #; [!qkr3h] when `ok{}.NOT` called...
  else
    #; [!cownv] not support error message.
    ! errmsg  or
      raise ArgumentError, "#{errmsg.inspect}: NOT.raise?() can't take errmsg."
    #; [!spzy2] is available with NOT.
    begin
      proc_obj.call
    rescue Exception => exc
      #; [!36032] re-raises exception when errcls is nil.
      if errcls.nil?
        #__assert(false) { "Nothing should be raised but got #{exc.inspect}." }
        raise
      #; [!61vtv] assertion fails when specified exception raised.
      #; [!smprc] compares error class with '==' operator, not '.is_a?'.
      elsif exc.class == errcls    # not `exc.is_a?(errcls)`
        __assert(false) { "#{errcls.inspect} should not be raised but got #{exc.inspect}." }
      #; [!34nd8] compares error class with '.is_a?' if '_subclass: true' specified.
      elsif _subclass && exc.class < errcls
        __assert(false) { "#{errcls.inspect} should not be raised but got #{exc.inspect}." }
      #; [!shxne] reraises exception if different from specified error class.
      else
        raise
      end
    else
      #; [!a1a40] assertion passes when nothing raised.
      nil
    end
  end
  #; [!vnc6b] sets exception object into '#exc' attribute.
  (class << proc_obj; self; end).class_eval { attr_accessor :exc }
  proc_obj.exc = exc
  #; [!y1b28] returns self when passed.
  self
end
same?(expected) click to toggle source
# File lib/oktest.rb, line 224
def same?(expected)
  __done()
  #; [!ozbf4] raises assertion error when failed.
  #; [!dwtig] is avaialbe with NOT.
  __assert(@bool == !! @actual.equal?(expected)) {
    eq = @bool ? '' : ' == false'
    "$<actual>.equal?($<expected>)#{eq}: failed.\n"\
    "    $<actual>:   #{@actual.inspect}\n"\
    "    $<expected>: #{expected.inspect}\n"
  }
  #; [!yk7zo] returns self when passed.
  self
end
throw?(expected) click to toggle source
# File lib/oktest.rb, line 355
def throw?(expected)
  __done()
  proc_obj = @actual
  if @bool
    #; [!w7935] raises ArgumentError when arg of 'thrown?()' is nil.
    expected != nil  or
      raise ArgumentError, "throw?(#{expected.inspect}): expected tag required."
    #
    begin
      proc_obj.call
    rescue UncaughtThrowError => exc
      #; [!lglzr] assertion passes when expected symbol thrown.
      if exc.tag.equal?(expected)
        nil
      #; [!gf9nx] assertion fails when thrown tag is equal to but not same as expected.
      elsif exc.tag == expected
        __assert(false) {
          "Thrown tag #{exc.tag.inspect} is equal to but not same as expected.\n"\
          "    (`#{exc.tag.inspect}.equal?(#{expected.inspect})` should be true but not.)"
        }
      #; [!flgwy] assertion fails when thrown tag is different from expectd.
      else
        __assert(false) {
          "#{expected.inspect} should be thrown but actually #{exc.tag.inspect} thrown."
        }
      end
    else
      #; [!9ik3x] assertion fails when nothing thrown.
      __assert(false) { "#{expected.inspect} should be thrown but nothing thrown." }
    end
  else
    #; [!m03vq] raises ArgumentError when non-nil arg passed to 'NOT.thrown?()'.
    expected == nil  or
      raise ArgumentError, "NOT.throw?(#{expected.inspect}): argument should be nil."
    #; [!kxizg] assertion fails when something thrown in 'NOT.throw?()'.
    begin
      proc_obj.call
    rescue UncaughtThrowError => exc
      __assert(false) {
        "Nothing should be thrown but #{exc.tag.inspect} thrown."
      }
    end
  end
  #; [!zq9h6] returns self when passed.
  self
end
truthy?() click to toggle source
# File lib/oktest.rb, line 480
def truthy?
  __done()
  #; [!3d94h] raises assertion error when failed.
  #; [!8rmgp] is available with NOT.
  __assert(@bool == (!!@actual == true)) {
    op = @bool ? '==' : '!='
    "!!$<actual> #{op} true: failed.\n"\
    "    $<actual>:   #{@actual.inspect}"
  }
  #; [!nhmuk] returns self when passed.
  self
end

Private Instance Methods

__assert_fs(bool, s) click to toggle source
# File lib/oktest.rb, line 506
def __assert_fs(bool, s)
  __assert(@bool == bool) {
    "#{s}#{@bool ? '' : ' == false'}: failed.\n"\
    "    $<actual>:   #{@actual.inspect}"
  }
end
__assert_match(result, op1, op2, expected) click to toggle source
# File lib/oktest.rb, line 178
def __assert_match(result, op1, op2, expected)
  __assert(@bool == !!result) {
    msg = "$<actual> #{@bool ? op1 : op2} $<expected>: failed.\n"\
          "    $<expected>: #{expected.inspect}\n"
    if @actual =~ /\n\z/
      msg + "    $<actual>:   <<'END'\n#{@actual}END\n"
    else
      msg + "    $<actual>:   #{@actual.inspect}\n"
    end
  }
end
__assert_op(bool, op1, op2, expected) click to toggle source
# File lib/oktest.rb, line 135
def __assert_op(bool, op1, op2, expected)
  __assert(@bool == bool) {
    "#{@actual.inspect} #{@bool ? op1 : op2} #{expected.inspect}: failed."
  }
end
__done() click to toggle source
# File lib/oktest.rb, line 53
def __done()
  NOT_YET.delete(self.__id__)
end