Class: Megatest::Registry

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

Instance Method Summary collapse

Constructor Details

#initializeRegistry

Returns a new instance of Registry.



419
420
421
422
423
# File 'lib/megatest/state.rb', line 419

def initialize
  @test_suites = {}
  @shared_suites = {}
  @test_cases_by_location = {}
end

Instance Method Details

#ancestors(klass) ⇒ Object



433
434
435
436
437
438
439
440
441
442
# File 'lib/megatest/state.rb', line 433

def ancestors(klass)
  suites = []
  klass.ancestors.each do |mod|
    suite = @shared_suites[mod] || @test_suites[mod]
    suites << suite if suite

    break if mod == ::Megatest::Test
  end
  suites
end

#each_subclass_of(klass, &block) ⇒ Object



449
450
451
# File 'lib/megatest/state.rb', line 449

def each_subclass_of(klass, &block)
  klass.subclasses.each(&block)
end

#register_suite(test_suite, location) ⇒ Object



445
446
447
# File 'lib/megatest/state.rb', line 445

def register_suite(test_suite, location)
  @test_suites[test_suite] ||= State::TestSuite.new(self, test_suite, location)
end

#register_test_case(test_case) ⇒ Object



468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
# File 'lib/megatest/state.rb', line 468

def register_test_case(test_case)
  path_index = @test_cases_by_location[test_case.source_file] ||= {}
  line_tests = path_index[test_case.source_line] ||= []

  unless line_tests.empty?
    test_case.index = line_tests.size
    if line_tests.size == 1
      line_tests.first.index = 0
    end
  end

  line_tests << test_case

  each_subclass_of(test_case.klass) do |subclass|
    suite(subclass).inherit_test_case(test_case)
  end
end

#remove_test_case(test_case) ⇒ Object



486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
# File 'lib/megatest/state.rb', line 486

def remove_test_case(test_case)
  path_index = @test_cases_by_location[test_case.source_file]
  line_tests = path_index[test_case.source_line]
  remove_index = line_tests.index(test_case)
  line_tests.delete_at(remove_index)
  case line_tests.size
  when 0
    # noop
  when 1
    line_tests[0].index = nil
  else
    remove_index.upto(line_tests.size - 1) do |index|
      line_tests[index].index -= 1
    end
  end
  test_cases
end

#shared_suite(test_suite) ⇒ Object



425
426
427
# File 'lib/megatest/state.rb', line 425

def shared_suite(test_suite)
  @shared_suites[test_suite] ||= State::SharedSuite.new(self, test_suite)
end

#suite(klass) ⇒ Object



429
430
431
# File 'lib/megatest/state.rb', line 429

def suite(klass)
  @shared_suites[klass] || @test_suites.fetch(klass)
end

#test_casesObject



508
509
510
511
512
# File 'lib/megatest/state.rb', line 508

def test_cases
  @test_suites.flat_map do |_klass, suite|
    suite.test_cases
  end
end

#test_cases_by_path(path = nil) ⇒ Object



514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
# File 'lib/megatest/state.rb', line 514

def test_cases_by_path(path = nil)
  if path
    if index = @test_cases_by_location[path]
      index.values.flatten
    else
      []
    end
  else
    @test_cases_by_location.transform_values do |line_index|
      line_index.flat_map do |_line, test_cases|
        test_cases
      end
    end
  end
end

#test_suitesObject



504
505
506
# File 'lib/megatest/state.rb', line 504

def test_suites
  @test_suites.values
end