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.



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

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

Instance Method Details

#ancestors(klass) ⇒ Object



438
439
440
441
442
443
444
445
446
447
# File 'lib/megatest/state.rb', line 438

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



454
455
456
# File 'lib/megatest/state.rb', line 454

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

#register_suite(test_suite, location) ⇒ Object



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

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

#register_test_case(test_case) ⇒ Object



473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
# File 'lib/megatest/state.rb', line 473

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



491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
# File 'lib/megatest/state.rb', line 491

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



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

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

#suite(klass) ⇒ Object



434
435
436
# File 'lib/megatest/state.rb', line 434

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

#test_casesObject



513
514
515
516
517
# File 'lib/megatest/state.rb', line 513

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

#test_cases_by_path(path = nil) ⇒ Object



519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
# File 'lib/megatest/state.rb', line 519

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



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

def test_suites
  @test_suites.values
end