slather 2.4.8 → 2.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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>