Class: Rcov::DifferentialAnalyzer

Inherits:
Object
  • Object
show all
Defined in:
lib/rcov.rb

Direct Known Subclasses

CallSiteAnalyzer, CodeCoverageAnalyzer

Constant Summary collapse

@@mutex =
Mutex.new

Instance Method Summary collapse

Constructor Details

#initialize(install_hook_meth, remove_hook_meth, reset_meth) ⇒ DifferentialAnalyzer

Returns a new instance of DifferentialAnalyzer.



385
386
387
388
389
390
391
392
393
# File 'lib/rcov.rb', line 385

def initialize(install_hook_meth, remove_hook_meth, reset_meth)
  @cache_state = :wait
  @start_raw_data = data_default
  @end_raw_data = data_default
  @aggregated_data = data_default
  @install_hook_meth = install_hook_meth
  @remove_hook_meth= remove_hook_meth
  @reset_meth= reset_meth
end

Instance Method Details

#install_hookObject

Start monitoring execution to gather information. Such data will be collected until #remove_hook is called.

Use #run_hooked instead if possible.



408
409
410
411
412
413
# File 'lib/rcov.rb', line 408

def install_hook
  @start_raw_data = raw_data_absolute
  Rcov::RCOV__.send(@install_hook_meth)
  @cache_state = :hooked
  @@mutex.synchronize{ self.class.hook_level += 1 }
end

#remove_hookObject

Stop collecting information. #remove_hook will also stop collecting info if it is run inside a #run_hooked block.



418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
# File 'lib/rcov.rb', line 418

def remove_hook
  @@mutex.synchronize do 
    self.class.hook_level -= 1
    Rcov::RCOV__.send(@remove_hook_meth) if self.class.hook_level == 0
  end
  @end_raw_data = raw_data_absolute
  @cache_state = :done
  # force computation of the stats for the traced code in this run;
  # we cannot simply let it be if self.class.hook_level == 0 because 
  # some other analyzer could install a hook, causing the raw_data_absolute
  # to change again.
  # TODO: lazy computation of raw_data_relative, only when the hook gets
  # activated again.
  raw_data_relative
end

#resetObject

Remove the data collected so far. Further collection will start from scratch.



436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
# File 'lib/rcov.rb', line 436

def reset
  @@mutex.synchronize do
    if self.class.hook_level == 0
      # Unfortunately there's no way to report this as covered with rcov:
      # if we run the tests under rcov self.class.hook_level will be >= 1 !
      # It is however executed when we run the tests normally.
      Rcov::RCOV__.send(@reset_meth)
      @start_raw_data = data_default
      @end_raw_data = data_default
    else
      @start_raw_data = @end_raw_data = raw_data_absolute
    end
    @raw_data_relative = data_default
    @aggregated_data = data_default
  end
end

#run_hookedObject

Execute the code in the given block, monitoring it in order to gather information about which code was executed.



397
398
399
400
401
402
# File 'lib/rcov.rb', line 397

def run_hooked
  install_hook
  yield
ensure
  remove_hook
end