123456789_123456789_123456789_123456789_123456789_

Class: Test::Unit::Fixture::HookPoint

Relationships & Source Files
Inherits: Object
Defined in: lib/test/unit/fixture.rb

Class Method Summary

Instance Method Summary

Constructor Details

.new(test_case, type, default_options) ⇒ HookPoint

[ GitHub ]

  
# File 'lib/test/unit/fixture.rb', line 102

def initialize(test_case, type, default_options)
  @test_case = test_case
  @type = type
  @default_options = default_options
  @callbacks = {}
  @before_prepend_callbacks = []
  @before_append_callbacks = []
  @after_prepend_callbacks = []
  @after_append_callbacks = []
  @unregistered_callbacks = []
end

Instance Method Details

#add_callback(method_name_or_callback, before_how, after_how) (private)

[ GitHub ]

  
# File 'lib/test/unit/fixture.rb', line 186

def add_callback(method_name_or_callback, before_how, after_how)
  case before_how
  when :prepend
    @before_prepend_callbacks =
      [method_name_or_callback] | @before_prepend_callbacks
  when :append
    @before_append_callbacks |= [method_name_or_callback]
  else
    case after_how
    when :prepend
      @after_prepend_callbacks =
        [method_name_or_callback] | @after_prepend_callbacks
    when :append
      @after_append_callbacks |= [method_name_or_callback]
    end
  end
end

#after_append_callbacks

[ GitHub ]

  
# File 'lib/test/unit/fixture.rb', line 168

def after_append_callbacks
  @after_append_callbacks - @unregistered_callbacks
end

#after_prepend_callbacks

[ GitHub ]

  
# File 'lib/test/unit/fixture.rb', line 164

def after_prepend_callbacks
  @after_prepend_callbacks - @unregistered_callbacks
end

#before_append_callbacks

[ GitHub ]

  
# File 'lib/test/unit/fixture.rb', line 160

def before_append_callbacks
  @before_append_callbacks - @unregistered_callbacks
end

#before_prepend_callbacks

[ GitHub ]

  
# File 'lib/test/unit/fixture.rb', line 156

def before_prepend_callbacks
  @before_prepend_callbacks - @unregistered_callbacks
end

#callback_method_name(callback) (private)

[ GitHub ]

  
# File 'lib/test/unit/fixture.rb', line 182

def callback_method_name(callback)
  "#{@type}_#{callback.object_id}"
end

#register(method_name_or_callback, options = nil)

[ GitHub ]

  
# File 'lib/test/unit/fixture.rb', line 114

def register(method_name_or_callback, options=nil)
  options ||= {}
  unless valid_register_options?(options)
    message = "must be {:before => :prepend}, " +
      "{:before => :append}, {:after => :prepend} or " +
      "{:after => :append}: #{options.inspect}"
    raise ArgumentError, message
  end

  if options.empty?
    options = @default_options
  end
  before_how = options[:before]
  after_how = options[:after]
  if method_name_or_callback.respond_to?(:call)
    callback = method_name_or_callback
    method_name = callback_method_name(callback)
    @test_case.attribute(:source_location,
                         callback.source_location,
                         method_name)
    # For Ruby 2.6 or earlier. callback may be GC-ed. If
    # callback is GC-ed, callback_method_name may be
    # duplicated because callback_method_name uses callback.object_id.
    # See also: https://github.com/test-unit/test-unit/issues/179
    @callbacks[callback] = true
    @test_case.__send__(:define_method, method_name, &callback)
  else
    method_name = method_name_or_callback
  end
  add_callback(method_name, before_how, after_how)
end

#unregister(method_name_or_callback)

[ GitHub ]

  
# File 'lib/test/unit/fixture.rb', line 146

def unregister(method_name_or_callback)
  if method_name_or_callback.respond_to?(:call)
    callback = method_name_or_callback
    method_name = callback_method_name(callback)
  else
    method_name = method_name_or_callback
  end
  @unregistered_callbacks << method_name
end

#valid_register_options?(options) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/test/unit/fixture.rb', line 173

def valid_register_options?(options)
  return true if options.empty?
  return false if options.size > 1

  key = options.keys.first
  [:before, :after].include?(key) and
    [:prepend, :append].include?(options[key])
end