slather 2.4.8 → 2.7.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.travis.yml +4 -2
  4. data/CHANGELOG.md +100 -0
  5. data/README.md +26 -3
  6. data/assets/slather.css +2 -1
  7. data/lib/slather/command/coverage_command.rb +9 -1
  8. data/lib/slather/coverage_file.rb +14 -9
  9. data/lib/slather/coverage_service/coveralls.rb +129 -5
  10. data/lib/slather/coverage_service/html_output.rb +62 -6
  11. data/lib/slather/coverage_service/sonarqube_xml_output.rb +61 -0
  12. data/lib/slather/profdata_coverage_file.rb +42 -2
  13. data/lib/slather/project.rb +41 -7
  14. data/lib/slather/version.rb +1 -1
  15. data/lib/slather.rb +1 -0
  16. data/slather.gemspec +5 -5
  17. data/spec/fixtures/FixtureFramework/FixtureFramework.h +19 -0
  18. data/spec/fixtures/FixtureFramework/FlashExperiment.swift +7 -0
  19. data/spec/fixtures/FixtureFramework/Info.plist +24 -0
  20. data/spec/fixtures/FixtureFrameworkTests/FixtureFrameworkTests.swift +34 -0
  21. data/spec/fixtures/FixtureFrameworkTests/FlashExperimentTests.swift +9 -0
  22. data/spec/fixtures/FixtureFrameworkTests/Info.plist +22 -0
  23. data/spec/fixtures/cobertura.xml +157 -37
  24. data/spec/fixtures/fixtures.xcodeproj/project.pbxproj +222 -0
  25. data/spec/fixtures/fixtures.xcodeproj/xcshareddata/xcschemes/fixtures.xcscheme +21 -5
  26. data/spec/fixtures/fixtures.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  27. data/spec/fixtures/sonarqube-generic-coverage.xml +93 -0
  28. data/spec/slather/coverage_service/cobertura_xml_spec.rb +1 -1
  29. data/spec/slather/coverage_service/coveralls_spec.rb +20 -0
  30. data/spec/slather/coverage_service/html_output_spec.rb +2 -2
  31. data/spec/slather/coverage_service/json_spec.rb +1 -1
  32. data/spec/slather/coverage_service/llvm_cov_spec.rb +1 -1
  33. data/spec/slather/coverage_service/sonarqube_xml_spec.rb +46 -0
  34. data/spec/slather/profdata_coverage_spec.rb +16 -0
  35. data/spec/slather/project_spec.rb +12 -8
  36. data/spec/spec_helper.rb +1 -0
  37. metadata +38 -25
@@ -8,7 +8,7 @@ module Slather
8
8
  include CoverageInfo
9
9
  include CoverallsCoverage
10
10
 
11
- attr_accessor :project, :source, :line_numbers_first, :line_data
11
+ attr_accessor :project, :source, :segments, :line_numbers_first, :line_data
12
12
 
13
13
  def initialize(project, source, line_numbers_first)
14
14
  self.project = project
@@ -188,7 +188,47 @@ module Slather
188
188
 
189
189
  def branch_coverage_data
190
190
  @branch_coverage_data ||= begin
191
- Hash.new
191
+ branch_coverage_data = Hash.new
192
+
193
+ self.segments.each do |segment|
194
+ line, col, hits, has_count, *rest = segment
195
+ next if !has_count
196
+ if branch_coverage_data.key?(line)
197
+ branch_coverage_data[line] = branch_coverage_data[line] + [hits]
198
+ else
199
+ branch_coverage_data[line] = [hits]
200
+ end
201
+ end
202
+
203
+ branch_coverage_data
204
+ end
205
+ end
206
+
207
+ def branch_region_data
208
+ @branch_region_data ||= begin
209
+ branch_region_data = Hash.new
210
+ region_start = nil
211
+ current_line = 0
212
+ @segments ||= []
213
+ @segments.each do |segment|
214
+ line, col, hits, has_count, *rest = segment
215
+ # Make column 0 based index
216
+ col = col - 1
217
+ if hits == 0 && has_count
218
+ current_line = line
219
+ region_start = col
220
+ elsif region_start != nil && hits > 0 && has_count
221
+ # if the region wrapped to a new line before ending, put nil to indicate it didnt end on this line
222
+ region_end = line == current_line ? col - region_start : nil
223
+ if branch_region_data.key?(current_line)
224
+ branch_region_data[current_line] << [region_start, region_end]
225
+ else
226
+ branch_region_data[current_line] = [[region_start, region_end]]
227
+ end
228
+ region_start = nil
229
+ end
230
+ end
231
+ branch_region_data
192
232
  end
193
233
  end
194
234
 
@@ -44,7 +44,7 @@ module Slather
44
44
  class Project < Xcodeproj::Project
45
45
 
46
46
  attr_accessor :build_directory, :ignore_list, :ci_service, :coverage_service, :coverage_access_token, :source_directory,
47
- :output_directory, :xcodeproj, :show_html, :verbose_mode, :input_format, :scheme, :workspace, :binary_file, :binary_basename, :arch, :source_files,
47
+ :output_directory, :xcodeproj, :show_html, :cdn_assets, :verbose_mode, :input_format, :scheme, :workspace, :binary_file, :binary_basename, :arch, :source_files,
48
48
  :decimals, :llvm_version, :configuration
49
49
 
50
50
  alias_method :setup_for_coverage, :slather_setup_for_coverage
@@ -135,7 +135,12 @@ module Slather
135
135
  coverage_json = JSON.parse(coverage_json_string)
136
136
  coverage_json["data"].reduce([]) do |result, chunk|
137
137
  result.concat(chunk["files"].map do |file|
138
- Pathname(file["filename"]).realpath
138
+ filename = file["filename"]
139
+ path = Pathname(filename)
140
+ # Don't crash if the file doesn't exist on disk.
141
+ # This may happen for autogenerated files that have been deleted.
142
+ filename = path.exist? ? path.realpath : filename
143
+ {"filename" => filename, "segments" => file["segments"]}
139
144
  end)
140
145
  end
141
146
  end
@@ -162,13 +167,24 @@ module Slather
162
167
  end
163
168
  private :create_coverage_files_for_binary
164
169
 
165
- def create_coverage_files(binary_path, pathnames)
170
+ def create_coverage_files(binary_path, path_objects)
166
171
  line_numbers_first = Gem::Version.new(self.llvm_version) >= Gem::Version.new('8.1.0')
172
+ # get just file names from the path objects
173
+ pathnames = path_objects.map { |path_obj| path_obj["filename"] }.compact
174
+ # Map of path name => segment array
175
+ paths_to_segments = path_objects.reduce(Hash.new) do |hash, path_obj|
176
+ hash[path_obj["filename"]] = path_obj["segments"]
177
+ hash
178
+ end
167
179
  files = create_profdata(binary_path, pathnames)
168
180
  files.map do |source|
169
181
  coverage_file = coverage_file_class.new(self, source, line_numbers_first)
170
182
  # If a single source file is used, the resulting output does not contain the file name.
171
183
  coverage_file.source_file_pathname = pathnames.first if pathnames.count == 1
184
+ # if there is segment data for the given path, add it to the coverage_file
185
+ if paths_to_segments.key?(coverage_file.source_file_pathname)
186
+ coverage_file.segments = paths_to_segments[coverage_file.source_file_pathname]
187
+ end
172
188
  !coverage_file.ignored? ? coverage_file : nil
173
189
  end.compact
174
190
  end
@@ -192,7 +208,7 @@ module Slather
192
208
 
193
209
  def profdata_coverage_dir
194
210
  @profdata_coverage_dir ||= begin
195
- raise StandardError, "The specified build directory (#{self.build_directory}) does not exist" unless File.exists?(self.build_directory)
211
+ raise StandardError, "The specified build directory (#{self.build_directory}) does not exist" unless File.exist?(self.build_directory)
196
212
  dir = nil
197
213
  if self.scheme
198
214
  dir = Dir[File.join(build_directory,"/**/CodeCoverage/#{self.scheme}")].first
@@ -277,7 +293,10 @@ module Slather
277
293
  if self.arch
278
294
  llvm_cov_args << "--arch" << self.arch
279
295
  end
280
- `xcrun llvm-cov #{llvm_cov_args.shelljoin} #{source_files.shelljoin}`
296
+
297
+ # POSIX systems have an ARG_MAX for the maximum total length of the command line, so the command may fail with an error message of "Argument list too long".
298
+ # Using the xargs command we can break the list of source_files into sublists small enough to be acceptable.
299
+ `printf '%s\\0' #{source_files.shelljoin} | xargs -0 xcrun llvm-cov #{llvm_cov_args.shelljoin}`
281
300
  end
282
301
  private :unsafe_profdata_llvm_cov_output
283
302
 
@@ -356,7 +375,7 @@ module Slather
356
375
  end
357
376
 
358
377
  def configure_ci_service
359
- self.ci_service ||= (self.class.yml["ci_service"] || :travis_ci)
378
+ self.ci_service ||= (ENV["CI_SERVICE"] || self.class.yml["ci_service"] || :other)
360
379
  end
361
380
 
362
381
  def configure_input_format
@@ -424,6 +443,8 @@ module Slather
424
443
  extend(Slather::CoverageService::HtmlOutput)
425
444
  when :json
426
445
  extend(Slather::CoverageService::JsonOutput)
446
+ when :sonarqube_xml
447
+ extend(Slather::CoverageService::SonarqubeXmlOutput)
427
448
  else
428
449
  raise ArgumentError, "`#{coverage_service}` is not a valid coverage service. Try `terminal`, `coveralls`, `gutter_json`, `cobertura_xml` or `html`"
429
450
  end
@@ -482,7 +503,7 @@ module Slather
482
503
  end
483
504
  end
484
505
 
485
- raise StandardError, "No scheme named '#{self.scheme}' found in #{self.path}" unless File.exists? xcscheme_path
506
+ raise StandardError, "No scheme named '#{self.scheme}' found in #{self.path}" unless File.exist? xcscheme_path
486
507
 
487
508
  xcscheme = Xcodeproj::XCScheme.new(xcscheme_path)
488
509
 
@@ -566,6 +587,19 @@ module Slather
566
587
  def find_buildable_names(xcscheme)
567
588
  found_buildable_names = []
568
589
 
590
+ # enumerate code coverage targets
591
+ begin
592
+ code_coverage_targets = xcscheme.test_action.xml_element.elements['CodeCoverageTargets']
593
+ targets = code_coverage_targets.map do |node|
594
+ Xcodeproj::XCScheme::BuildableReference.new(node) if node.is_a?(REXML::Element)
595
+ end.compact
596
+ buildable_names = targets.each do |target|
597
+ found_buildable_names.push(target.buildable_name)
598
+ end
599
+ rescue
600
+ # just in case if there are no entries in the test action
601
+ end
602
+
569
603
  # enumerate build action entries
570
604
  begin
571
605
  xcscheme.build_action.entries.each do |entry|
@@ -1,3 +1,3 @@
1
1
  module Slather
2
- VERSION = '2.4.8' unless defined?(Slather::VERSION)
2
+ VERSION = '2.7.5' unless defined?(Slather::VERSION)
3
3
  end
data/lib/slather.rb CHANGED
@@ -12,6 +12,7 @@ require 'slather/coverage_service/simple_output'
12
12
  require 'slather/coverage_service/html_output'
13
13
  require 'slather/coverage_service/json_output'
14
14
  require 'slather/coverage_service/llvm_cov_output'
15
+ require 'slather/coverage_service/sonarqube_xml_output'
15
16
  require 'cfpropertylist'
16
17
 
17
18
  module Slather
data/slather.gemspec CHANGED
@@ -17,20 +17,20 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ['lib']
19
19
 
20
- spec.add_development_dependency 'bundler', '~> 1.17'
20
+ spec.add_development_dependency 'bundler', '~> 2.0'
21
21
  spec.add_development_dependency 'coveralls', '~> 0.8'
22
22
  spec.add_development_dependency 'simplecov', '~> 0'
23
23
  spec.add_development_dependency 'rake', '~> 12.3'
24
24
  spec.add_development_dependency 'rspec', '~> 3.8'
25
25
  spec.add_development_dependency 'pry', '~> 0.12'
26
- spec.add_development_dependency 'cocoapods', '~> 1.5'
26
+ spec.add_development_dependency 'cocoapods', '~> 1.10.beta.1'
27
27
  spec.add_development_dependency 'json_spec', '~> 1.1'
28
28
  spec.add_development_dependency 'equivalent-xml', '~> 0.6'
29
29
 
30
30
  spec.add_dependency 'clamp', '~> 1.3'
31
- spec.add_dependency 'xcodeproj', '~> 1.7'
32
- spec.add_dependency 'nokogiri', '~> 1.8'
31
+ spec.add_dependency 'xcodeproj', '~> 1.21'
32
+ spec.add_dependency 'nokogiri', '>= 1.14.3'
33
33
  spec.add_dependency 'CFPropertyList', '>= 2.2', '< 4'
34
34
 
35
- spec.add_runtime_dependency 'activesupport', '< 5', '>= 4.0.2'
35
+ spec.add_runtime_dependency 'activesupport'
36
36
  end
@@ -0,0 +1,19 @@
1
+ //
2
+ // FixtureFramework.h
3
+ // FixtureFramework
4
+ //
5
+ // Created by Stephen Williams on 11/03/21.
6
+ // Copyright © 2021 marklarr. All rights reserved.
7
+ //
8
+
9
+ #import <Foundation/Foundation.h>
10
+
11
+ //! Project version number for FixtureFramework.
12
+ FOUNDATION_EXPORT double FixtureFrameworkVersionNumber;
13
+
14
+ //! Project version string for FixtureFramework.
15
+ FOUNDATION_EXPORT const unsigned char FixtureFrameworkVersionString[];
16
+
17
+ // In this header, you should import all the public headers of your framework using statements like #import <FixtureFramework/PublicHeader.h>
18
+
19
+
@@ -0,0 +1,7 @@
1
+ import Foundation
2
+
3
+ public struct FlashExperiment {
4
+ public let isAwesome = true
5
+
6
+ public init() {}
7
+ }
@@ -0,0 +1,24 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>CFBundleDevelopmentRegion</key>
6
+ <string>$(DEVELOPMENT_LANGUAGE)</string>
7
+ <key>CFBundleExecutable</key>
8
+ <string>$(EXECUTABLE_NAME)</string>
9
+ <key>CFBundleIdentifier</key>
10
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11
+ <key>CFBundleInfoDictionaryVersion</key>
12
+ <string>6.0</string>
13
+ <key>CFBundleName</key>
14
+ <string>$(PRODUCT_NAME)</string>
15
+ <key>CFBundlePackageType</key>
16
+ <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
17
+ <key>CFBundleShortVersionString</key>
18
+ <string>1.0</string>
19
+ <key>CFBundleVersion</key>
20
+ <string>$(CURRENT_PROJECT_VERSION)</string>
21
+ <key>NSHumanReadableCopyright</key>
22
+ <string>Copyright © 2021 marklarr. All rights reserved.</string>
23
+ </dict>
24
+ </plist>
@@ -0,0 +1,34 @@
1
+ //
2
+ // FixtureFrameworkTests.swift
3
+ // FixtureFrameworkTests
4
+ //
5
+ // Created by Stephen Williams on 11/03/21.
6
+ // Copyright © 2021 marklarr. All rights reserved.
7
+ //
8
+
9
+ import XCTest
10
+ @testable import FixtureFramework
11
+
12
+ class FixtureFrameworkTests: XCTestCase {
13
+
14
+ override func setUpWithError() throws {
15
+ // Put setup code here. This method is called before the invocation of each test method in the class.
16
+ }
17
+
18
+ override func tearDownWithError() throws {
19
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
20
+ }
21
+
22
+ func testExample() throws {
23
+ // This is an example of a functional test case.
24
+ // Use XCTAssert and related functions to verify your tests produce the correct results.
25
+ }
26
+
27
+ func testPerformanceExample() throws {
28
+ // This is an example of a performance test case.
29
+ self.measure {
30
+ // Put the code you want to measure the time of here.
31
+ }
32
+ }
33
+
34
+ }
@@ -0,0 +1,9 @@
1
+ import XCTest
2
+ import FixtureFramework
3
+
4
+ class FlashExperimentTests: XCTestCase {
5
+ func testExample() throws {
6
+ let sut = FlashExperiment()
7
+ XCTAssertTrue(sut.isAwesome, "Your flash experiment isn't awesome!")
8
+ }
9
+ }
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>CFBundleDevelopmentRegion</key>
6
+ <string>$(DEVELOPMENT_LANGUAGE)</string>
7
+ <key>CFBundleExecutable</key>
8
+ <string>$(EXECUTABLE_NAME)</string>
9
+ <key>CFBundleIdentifier</key>
10
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11
+ <key>CFBundleInfoDictionaryVersion</key>
12
+ <string>6.0</string>
13
+ <key>CFBundleName</key>
14
+ <string>$(PRODUCT_NAME)</string>
15
+ <key>CFBundlePackageType</key>
16
+ <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
17
+ <key>CFBundleShortVersionString</key>
18
+ <string>1.0</string>
19
+ <key>CFBundleVersion</key>
20
+ <string>1</string>
21
+ </dict>
22
+ </plist>
@@ -1,58 +1,134 @@
1
1
  <?xml version="1.0"?>
2
2
  <!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">
3
- <coverage line-rate="0.7500000000000000" branch-rate="1.0000000000000000" lines-covered="60" lines-valid="80" branches-covered="0" branches-valid="0" complexity="0.0" timestamp="1460926354" version="Slather 2.1.0">
3
+ <coverage line-rate="0.7500000000000000" branch-rate="0.6410256410256411" lines-covered="60" lines-valid="80" branches-covered="25" branches-valid="39" complexity="0.0" timestamp="1614041230" version="Slather 2.6.1">
4
4
  <sources>
5
- <source>/Users/civetta/Works/Personal/slather/viteinfinite-slather</source>
5
+ <source>/Users/hborawski/sandbox/slather</source>
6
6
  </sources>
7
7
  <packages>
8
- <package name="spec.fixtures.fixtures" line-rate="0.5000000000000000" branch-rate="1.0000000000000000" complexity="0.0">
8
+ <package name="spec.fixtures.fixtures" line-rate="0.5000000000000000" branch-rate="0.5000000000000000" complexity="0.0">
9
9
  <classes>
10
- <class name="fixtures.m" filename="spec/fixtures/fixtures/fixtures.m" line-rate="0.5000000000000000" branch-rate="1.0000000000000000" complexity="0.0">
10
+ <class name="fixtures.m" filename="spec/fixtures/fixtures/fixtures.m" line-rate="0.5000000000000000" branch-rate="0.5000000000000000" complexity="0.0">
11
11
  <methods/>
12
12
  <lines>
13
- <line number="14" branch="false" hits="1"/>
13
+ <line number="14" branch="true" hits="1" condition-coverage="100% (1/1)">
14
+ <conditions>
15
+ <condition number="0" type="jump" coverage="100%"/>
16
+ </conditions>
17
+ </line>
14
18
  <line number="15" branch="false" hits="1"/>
15
19
  <line number="16" branch="false" hits="1"/>
16
- <line number="19" branch="false" hits="0"/>
20
+ <line number="19" branch="true" hits="0" condition-coverage="0% (0/1)">
21
+ <conditions>
22
+ <condition number="0" type="jump" coverage="0%"/>
23
+ </conditions>
24
+ </line>
17
25
  <line number="20" branch="false" hits="0"/>
18
26
  <line number="21" branch="false" hits="0"/>
19
27
  </lines>
20
28
  </class>
21
29
  </classes>
22
30
  </package>
23
- <package name="spec.fixtures.fixtures.more_files" line-rate="0.4333333333333333" branch-rate="1.0000000000000000" complexity="0.0">
31
+ <package name="spec.fixtures.fixtures.more_files" line-rate="0.4333333333333333" branch-rate="0.5000000000000000" complexity="0.0">
24
32
  <classes>
25
- <class name="Branches.m" filename="spec/fixtures/fixtures/more_files/Branches.m" line-rate="0.4333333333333333" branch-rate="1.0000000000000000" complexity="0.0">
33
+ <class name="Branches.m" filename="spec/fixtures/fixtures/more_files/Branches.m" line-rate="0.4333333333333333" branch-rate="0.5000000000000000" complexity="0.0">
26
34
  <methods/>
27
35
  <lines>
28
- <line number="14" branch="false" hits="2"/>
29
- <line number="15" branch="false" hits="2"/>
36
+ <line number="14" branch="true" hits="2" condition-coverage="100% (1/1)">
37
+ <conditions>
38
+ <condition number="0" type="jump" coverage="100%"/>
39
+ </conditions>
40
+ </line>
41
+ <line number="15" branch="true" hits="2" condition-coverage="100% (4/4)">
42
+ <conditions>
43
+ <condition number="0" type="jump" coverage="100%"/>
44
+ </conditions>
45
+ </line>
30
46
  <line number="16" branch="false" hits="1"/>
31
47
  <line number="17" branch="false" hits="1"/>
32
- <line number="18" branch="false" hits="1"/>
48
+ <line number="18" branch="true" hits="1" condition-coverage="50% (2/4)">
49
+ <conditions>
50
+ <condition number="0" type="jump" coverage="50%"/>
51
+ </conditions>
52
+ </line>
33
53
  <line number="19" branch="false" hits="0"/>
34
- <line number="20" branch="false" hits="0"/>
35
- <line number="21" branch="false" hits="1"/>
54
+ <line number="20" branch="true" hits="0" condition-coverage="100% (1/1)">
55
+ <conditions>
56
+ <condition number="0" type="jump" coverage="100%"/>
57
+ </conditions>
58
+ </line>
59
+ <line number="21" branch="true" hits="1" condition-coverage="100% (1/1)">
60
+ <conditions>
61
+ <condition number="0" type="jump" coverage="100%"/>
62
+ </conditions>
63
+ </line>
36
64
  <line number="22" branch="false" hits="1"/>
37
- <line number="23" branch="false" hits="1"/>
65
+ <line number="23" branch="true" hits="1" condition-coverage="100% (1/1)">
66
+ <conditions>
67
+ <condition number="0" type="jump" coverage="100%"/>
68
+ </conditions>
69
+ </line>
38
70
  <line number="24" branch="false" hits="2"/>
39
71
  <line number="25" branch="false" hits="2"/>
40
- <line number="26" branch="false" hits="2"/>
72
+ <line number="26" branch="true" hits="2" condition-coverage="100% (3/3)">
73
+ <conditions>
74
+ <condition number="0" type="jump" coverage="100%"/>
75
+ </conditions>
76
+ </line>
41
77
  <line number="27" branch="false" hits="2"/>
42
- <line number="28" branch="false" hits="2"/>
43
- <line number="29" branch="false" hits="0"/>
44
- <line number="30" branch="false" hits="0"/>
78
+ <line number="28" branch="true" hits="2" condition-coverage="0% (0/1)">
79
+ <conditions>
80
+ <condition number="0" type="jump" coverage="0%"/>
81
+ </conditions>
82
+ </line>
83
+ <line number="29" branch="true" hits="0" condition-coverage="0% (0/2)">
84
+ <conditions>
85
+ <condition number="0" type="jump" coverage="0%"/>
86
+ </conditions>
87
+ </line>
88
+ <line number="30" branch="true" hits="0" condition-coverage="0% (0/1)">
89
+ <conditions>
90
+ <condition number="0" type="jump" coverage="0%"/>
91
+ </conditions>
92
+ </line>
45
93
  <line number="31" branch="false" hits="0"/>
46
- <line number="32" branch="false" hits="0"/>
94
+ <line number="32" branch="true" hits="0" condition-coverage="0% (0/1)">
95
+ <conditions>
96
+ <condition number="0" type="jump" coverage="0%"/>
97
+ </conditions>
98
+ </line>
47
99
  <line number="33" branch="false" hits="0"/>
48
- <line number="34" branch="false" hits="0"/>
100
+ <line number="34" branch="true" hits="0" condition-coverage="0% (0/1)">
101
+ <conditions>
102
+ <condition number="0" type="jump" coverage="0%"/>
103
+ </conditions>
104
+ </line>
49
105
  <line number="35" branch="false" hits="0"/>
50
- <line number="36" branch="false" hits="0"/>
51
- <line number="37" branch="false" hits="0"/>
106
+ <line number="36" branch="true" hits="0" condition-coverage="0% (0/1)">
107
+ <conditions>
108
+ <condition number="0" type="jump" coverage="0%"/>
109
+ </conditions>
110
+ </line>
111
+ <line number="37" branch="true" hits="0" condition-coverage="0% (0/1)">
112
+ <conditions>
113
+ <condition number="0" type="jump" coverage="0%"/>
114
+ </conditions>
115
+ </line>
52
116
  <line number="38" branch="false" hits="0"/>
53
- <line number="39" branch="false" hits="0"/>
54
- <line number="40" branch="false" hits="0"/>
55
- <line number="41" branch="false" hits="0"/>
117
+ <line number="39" branch="true" hits="0" condition-coverage="0% (0/1)">
118
+ <conditions>
119
+ <condition number="0" type="jump" coverage="0%"/>
120
+ </conditions>
121
+ </line>
122
+ <line number="40" branch="true" hits="0" condition-coverage="0% (0/1)">
123
+ <conditions>
124
+ <condition number="0" type="jump" coverage="0%"/>
125
+ </conditions>
126
+ </line>
127
+ <line number="41" branch="true" hits="0" condition-coverage="0% (0/1)">
128
+ <conditions>
129
+ <condition number="0" type="jump" coverage="0%"/>
130
+ </conditions>
131
+ </line>
56
132
  <line number="42" branch="false" hits="0"/>
57
133
  <line number="43" branch="false" hits="0"/>
58
134
  </lines>
@@ -64,19 +140,35 @@
64
140
  <class name="BranchesTests.m" filename="spec/fixtures/fixturesTests/BranchesTests.m" line-rate="1.0000000000000000" branch-rate="1.0000000000000000" complexity="0.0">
65
141
  <methods/>
66
142
  <lines>
67
- <line number="18" branch="false" hits="2"/>
143
+ <line number="18" branch="true" hits="2" condition-coverage="100% (1/1)">
144
+ <conditions>
145
+ <condition number="0" type="jump" coverage="100%"/>
146
+ </conditions>
147
+ </line>
68
148
  <line number="19" branch="false" hits="2"/>
69
149
  <line number="20" branch="false" hits="2"/>
70
150
  <line number="21" branch="false" hits="2"/>
71
- <line number="23" branch="false" hits="2"/>
151
+ <line number="23" branch="true" hits="2" condition-coverage="100% (1/1)">
152
+ <conditions>
153
+ <condition number="0" type="jump" coverage="100%"/>
154
+ </conditions>
155
+ </line>
72
156
  <line number="24" branch="false" hits="2"/>
73
157
  <line number="25" branch="false" hits="2"/>
74
158
  <line number="26" branch="false" hits="2"/>
75
- <line number="28" branch="false" hits="1"/>
159
+ <line number="28" branch="true" hits="1" condition-coverage="100% (1/1)">
160
+ <conditions>
161
+ <condition number="0" type="jump" coverage="100%"/>
162
+ </conditions>
163
+ </line>
76
164
  <line number="29" branch="false" hits="1"/>
77
165
  <line number="30" branch="false" hits="1"/>
78
166
  <line number="31" branch="false" hits="1"/>
79
- <line number="33" branch="false" hits="1"/>
167
+ <line number="33" branch="true" hits="1" condition-coverage="100% (1/1)">
168
+ <conditions>
169
+ <condition number="0" type="jump" coverage="100%"/>
170
+ </conditions>
171
+ </line>
80
172
  <line number="34" branch="false" hits="1"/>
81
173
  <line number="35" branch="false" hits="1"/>
82
174
  <line number="36" branch="false" hits="1"/>
@@ -85,37 +177,65 @@
85
177
  <class name="fixturesTests.m" filename="spec/fixtures/fixturesTests/fixturesTests.m" line-rate="1.0000000000000000" branch-rate="1.0000000000000000" complexity="0.0">
86
178
  <methods/>
87
179
  <lines>
88
- <line number="20" branch="false" hits="2"/>
180
+ <line number="20" branch="true" hits="2" condition-coverage="100% (1/1)">
181
+ <conditions>
182
+ <condition number="0" type="jump" coverage="100%"/>
183
+ </conditions>
184
+ </line>
89
185
  <line number="21" branch="false" hits="2"/>
90
186
  <line number="22" branch="false" hits="2"/>
91
187
  <line number="23" branch="false" hits="2"/>
92
- <line number="26" branch="false" hits="2"/>
188
+ <line number="26" branch="true" hits="2" condition-coverage="100% (1/1)">
189
+ <conditions>
190
+ <condition number="0" type="jump" coverage="100%"/>
191
+ </conditions>
192
+ </line>
93
193
  <line number="27" branch="false" hits="2"/>
94
194
  <line number="28" branch="false" hits="2"/>
95
195
  <line number="29" branch="false" hits="2"/>
96
- <line number="32" branch="false" hits="1"/>
196
+ <line number="32" branch="true" hits="1" condition-coverage="100% (1/1)">
197
+ <conditions>
198
+ <condition number="0" type="jump" coverage="100%"/>
199
+ </conditions>
200
+ </line>
97
201
  <line number="33" branch="false" hits="1"/>
98
202
  <line number="34" branch="false" hits="1"/>
99
203
  <line number="35" branch="false" hits="1"/>
100
- <line number="38" branch="false" hits="1"/>
204
+ <line number="38" branch="true" hits="1" condition-coverage="100% (1/1)">
205
+ <conditions>
206
+ <condition number="0" type="jump" coverage="100%"/>
207
+ </conditions>
208
+ </line>
101
209
  <line number="39" branch="false" hits="1"/>
102
210
  <line number="40" branch="false" hits="1"/>
103
211
  <line number="41" branch="false" hits="1"/>
104
212
  <line number="42" branch="false" hits="1"/>
105
213
  </lines>
106
214
  </class>
107
- <class name="peekaviewTests💣.m" filename="spec/fixtures/fixturesTests/peekaviewTests💣.m" line-rate="1.0000000000000000" branch-rate="1.0000000000000000" complexity="0.0">
215
+ <class name="peekaviewTests&#x1F4A3;.m" filename="spec/fixtures/fixturesTests/peekaviewTests&#x1F4A3;.m" line-rate="1.0000000000000000" branch-rate="1.0000000000000000" complexity="0.0">
108
216
  <methods/>
109
217
  <lines>
110
- <line number="18" branch="false" hits="1"/>
218
+ <line number="18" branch="true" hits="1" condition-coverage="100% (1/1)">
219
+ <conditions>
220
+ <condition number="0" type="jump" coverage="100%"/>
221
+ </conditions>
222
+ </line>
111
223
  <line number="19" branch="false" hits="1"/>
112
224
  <line number="20" branch="false" hits="1"/>
113
225
  <line number="21" branch="false" hits="1"/>
114
- <line number="24" branch="false" hits="1"/>
226
+ <line number="24" branch="true" hits="1" condition-coverage="100% (1/1)">
227
+ <conditions>
228
+ <condition number="0" type="jump" coverage="100%"/>
229
+ </conditions>
230
+ </line>
115
231
  <line number="25" branch="false" hits="1"/>
116
232
  <line number="26" branch="false" hits="1"/>
117
233
  <line number="27" branch="false" hits="1"/>
118
- <line number="30" branch="false" hits="1"/>
234
+ <line number="30" branch="true" hits="1" condition-coverage="100% (1/1)">
235
+ <conditions>
236
+ <condition number="0" type="jump" coverage="100%"/>
237
+ </conditions>
238
+ </line>
119
239
  <line number="31" branch="false" hits="1"/>
120
240
  <line number="32" branch="false" hits="1"/>
121
241
  </lines>