class Swiftrail::Swift::Parser

Constants

RegexMatch

Attributes

test_patterns[R]

Public Class Methods

new(test_patterns) click to toggle source
# File lib/swiftrail/swift/parser.rb, line 6
def initialize(test_patterns)
  @test_patterns = test_patterns
end

Public Instance Methods

parse() click to toggle source
# File lib/swiftrail/swift/parser.rb, line 10
def parse
  all_files.map do |file_name|
    collect_test_cases(file_name, IO.read(file_name))
  end.flatten
end

Private Instance Methods

all_files() click to toggle source
# File lib/swiftrail/swift/parser.rb, line 21
def all_files
  test_patterns.map do |test_pattern|
    Dir[test_pattern]
  end.flatten.uniq
end
cases_regex() click to toggle source
# File lib/swiftrail/swift/parser.rb, line 44
def cases_regex
  %r{(//\s*TESTRAIL\s*([(C(0-9)*)|\s|,]*)$\s*)*^[\w ]*(func |class )\s*(\w*)\s*(\(\)|:\s*XCTestCase)}im
end
collect_test_cases(file_name, content) click to toggle source

@return [Test]

# File lib/swiftrail/swift/parser.rb, line 28
def collect_test_cases(file_name, content)
  class_cases = []
  class_name = ''
  content.scan(cases_regex).map { |match|
    RegexMatch.new(sanitize(match[1]), match[2] == 'class ', match[3])
  }.reduce([]) { |result, match|
    if match.class_type?
      class_cases = match.case_ids
      class_name = match.name
    else
      result << Test.new(file_name, class_name, match.name, (match.case_ids + class_cases).uniq)
    end
    result
  }
end
sanitize(case_ids) click to toggle source
# File lib/swiftrail/swift/parser.rb, line 48
def sanitize(case_ids)
  return [] if case_ids.nil? || case_ids.empty?

  case_ids.delete(' ')
          .split(',')
          .select { |case_id| case_id.downcase.start_with?('c') }
          .map { |case_id| case_id[1..-1] }
end