Module: Maxitest::Testrbl

Defined in:
lib/maxitest/vendor/testrbl.rb

Constant Summary collapse

PATTERNS =
[
  /^(\s+)(should|test|it)\s+['"](.*)['"]\s+do\s*(?:#.*)?$/,
  /^(\s+)(context|describe)\s+['"]?(.*?)['"]?\s+do\s*(?:#.*)?$/,
  /^(\s+)def\s+(test_)([a-z_\d]+)\s*(?:#.*)?$/
]
OPTION_WITH_ARGUMENT =
["-I", "-r", "-n", "--name", "-e", "--exclude", "-s", "--seed"]
INTERPOLATION =
/\\\#\\\{.*?\\\}/

Class Method Summary collapse

Class Method Details

.filter_duplicate_final(patterns) ⇒ Object

only keep 1 pattern that stops matching via $



68
69
70
71
# File 'lib/maxitest/vendor/testrbl.rb', line 68

def filter_duplicate_final(patterns)
  found_final = 0
  patterns.reject { |p| p.end_with?("$") and (found_final += 1) > 1 }
end

.line_pattern_option(file, line) ⇒ Object

overwritten by maxitest to just return line



46
47
48
# File 'lib/maxitest/vendor/testrbl.rb', line 46

def line_pattern_option(file, line)
  [file, "-n", "/#{pattern_from_file(File.readlines(file), line)}/"]
end

.pattern_from_file(lines, line) ⇒ Object

usable via external tools like zeus



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/maxitest/vendor/testrbl.rb', line 51

def pattern_from_file(lines, line)
  possible_lines = lines[0..(line.to_i-1)].reverse

  found = possible_lines.map { |line| test_pattern_from_line(line) || block_start_from_line(line) }.compact

  # pattern and the groups it is nested under (like describe - describe - it)
  last_spaces = " " * 100
  patterns = found.select do |spaces, name|
    last_spaces = spaces if spaces.size < last_spaces.size
  end.map(&:last).compact

  return filter_duplicate_final(patterns).reverse.join(".*") if found.size > 0

  raise "no test found before line #{line}"
end

.run_from_cli(argv) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/maxitest/vendor/testrbl.rb', line 17

def run_from_cli(argv)
  files, options = partition_argv(argv)
  files.concat(changed_files) if options.delete("--changed")
  files = files.map { |f| localize(f) }
  load_options, options = partition_options(options)

  if files.size == 1 and files.first =~ /^(\S+):(\d+)$/
    file = $1
    line = $2
    run(ruby + load_options + line_pattern_option(file, line) + options)
  else
    if files.size == 1 and File.file?(files.first)
      run(ruby + load_options + files + options)
    elsif options.none? { |arg| arg =~ /^-n/ }
      seed = if seed = options.index("--seed")
        ["--"] + options.slice!(seed, 2)
      else
        []
      end
      files = files.map { |f| File.directory?(f) ? all_test_files_in(f) : f }.flatten
      run(ruby + load_options + files.map { |f| "-r#{f}" } + options + ["-e", ""] + seed)
    else # pass though
      # no bundle exec: projects with mini and unit-test do not run well via bundle exec testrb
      run ["testrb"] + argv
    end
  end
end