xcperfect 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +30 -0
- data/.rubocop.yml +58 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/LICENSE.md +22 -0
- data/README.md +56 -0
- data/Rakefile +5 -0
- data/assets/banner.png +0 -0
- data/assets/banner.sketch +0 -0
- data/assets/coverage.json +1 -0
- data/assets/simple_formatter.png +0 -0
- data/bin/xcperfect +80 -0
- data/lib/xcperfect/ansi.rb +72 -0
- data/lib/xcperfect/formatters/all.rb +39 -0
- data/lib/xcperfect/formatters/formatter.rb +65 -0
- data/lib/xcperfect/formatters/simple.rb +26 -0
- data/lib/xcperfect/parser.rb +53 -0
- data/lib/xcperfect/printer.rb +20 -0
- data/lib/xcperfect/syntax.rb +51 -0
- data/lib/xcperfect/version.rb +5 -0
- data/lib/xcperfect.rb +15 -0
- data/xcperfect.gemspec +30 -0
- metadata +124 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 856d2292fad7dc61c02839684c243049a2cf0f2f
|
4
|
+
data.tar.gz: 16f7d81e204f20d4d41a1aceb2579e48f063ae1e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c81423d09bdeb9efe680980b4ace5ed652a564beeba4350d86e0a4103f031f654c8e7c27868ad4b3cdfa0d7fe102aa70a10cf0913bd0a3c33bc19c5f04a3faaa
|
7
|
+
data.tar.gz: b4f2343bf2b639e49a333c55727076bec0b5fda734244981ef68a6ae5eb37f06379b16b6d7571c1119f286f1dabcef455a1c977abf6f4370cc3d33947d04c0d7
|
data/.gitignore
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# Visual Studio Code
|
2
|
+
.settings/
|
3
|
+
.vscode/
|
4
|
+
tsconfig.json
|
5
|
+
jsconfig.json
|
6
|
+
|
7
|
+
### macOS ###
|
8
|
+
*.DS_Store
|
9
|
+
.AppleDouble
|
10
|
+
.LSOverride
|
11
|
+
|
12
|
+
### Ruby ###
|
13
|
+
Gemfile.lock
|
14
|
+
*.gem
|
15
|
+
*.rbc
|
16
|
+
/.config
|
17
|
+
/coverage/
|
18
|
+
/InstalledFiles
|
19
|
+
/pkg/
|
20
|
+
/spec/reports/
|
21
|
+
/spec/examples.txt
|
22
|
+
/test/tmp/
|
23
|
+
/test/version_tmp/
|
24
|
+
/tmp/
|
25
|
+
|
26
|
+
## Environment normalization:
|
27
|
+
/.bundle/
|
28
|
+
/vendor/bundle
|
29
|
+
/lib/bundler/man/
|
30
|
+
.rvmrc
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
Layout/SpaceAroundEqualsInParameterDefault:
|
2
|
+
Enabled: false
|
3
|
+
|
4
|
+
Metrics/AbcSize:
|
5
|
+
Enabled: false
|
6
|
+
|
7
|
+
Metrics/BlockLength:
|
8
|
+
ExcludedMethods: ['new']
|
9
|
+
|
10
|
+
Metrics/LineLength:
|
11
|
+
Max: 80
|
12
|
+
Exclude:
|
13
|
+
- 'bin/xcperfect'
|
14
|
+
- 'lib/xcperfect/**/*.rb'
|
15
|
+
|
16
|
+
Metrics/MethodLength:
|
17
|
+
Enabled: false
|
18
|
+
|
19
|
+
Performance/Count:
|
20
|
+
Enabled: true
|
21
|
+
|
22
|
+
Performance/Size:
|
23
|
+
Enabled: true
|
24
|
+
|
25
|
+
Performance/StringReplacement:
|
26
|
+
Enabled: true
|
27
|
+
|
28
|
+
Style/BarePercentLiterals:
|
29
|
+
Enabled: false
|
30
|
+
|
31
|
+
# Configuration parameters: IndentWhenRelativeTo, SupportedStyles, IndentOneStep.
|
32
|
+
Style/DoubleNegation:
|
33
|
+
Exclude:
|
34
|
+
- 'lib/xcperfect/ansi.rb'
|
35
|
+
|
36
|
+
Style/PercentQLiterals:
|
37
|
+
Enabled: false
|
38
|
+
|
39
|
+
Style/PercentLiteralDelimiters:
|
40
|
+
Enabled: true
|
41
|
+
Exclude:
|
42
|
+
- 'xcperfect.gemspec'
|
43
|
+
|
44
|
+
Style/PerlBackrefs:
|
45
|
+
Enabled: false
|
46
|
+
|
47
|
+
Style/RegexpLiteral:
|
48
|
+
Enabled: false
|
49
|
+
|
50
|
+
Style/SignalException:
|
51
|
+
Enabled: false
|
52
|
+
|
53
|
+
Style/SpecialGlobalVars:
|
54
|
+
Enabled: false
|
55
|
+
|
56
|
+
Style/UnneededPercentQ:
|
57
|
+
Exclude:
|
58
|
+
- 'xcperfect.gemspec'
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2018 Mike JS. Choi
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
|
data/README.md
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
<p align="center">
|
2
|
+
<img src="./assets/banner.png">
|
3
|
+
<br>
|
4
|
+
<p align="center">
|
5
|
+
<a href="https://travis-ci.org/mkchoi212/xcperfect">
|
6
|
+
<img src="https://travis-ci.org/mkchoi212/xcperfect.svg?branch=master">
|
7
|
+
</a>
|
8
|
+
</p>
|
9
|
+
</p>
|
10
|
+
<br>
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
```bash
|
15
|
+
$ gem install xcperfect
|
16
|
+
```
|
17
|
+
|
18
|
+
## Usage
|
19
|
+
|
20
|
+
```bash
|
21
|
+
$ xcrun xccov --json [options] | xcperfect
|
22
|
+
```
|
23
|
+
|
24
|
+
or
|
25
|
+
|
26
|
+
```bash
|
27
|
+
$ xcrun xccov --json [options] > report.json
|
28
|
+
$ xcperfect report.json
|
29
|
+
```
|
30
|
+
|
31
|
+
or
|
32
|
+
|
33
|
+
```bash
|
34
|
+
$ xcperfect [--file | -f] report.json [options]
|
35
|
+
```
|
36
|
+
|
37
|
+
## Formats
|
38
|
+
|
39
|
+
- `--all`, `-a` **Default**
|
40
|
+
|
41
|
+
- `--simple`, `-s`
|
42
|
+
|
43
|
+

|
44
|
+
|
45
|
+
## ✋ Contributing
|
46
|
+
|
47
|
+
This is an open source project so feel free to contribute by
|
48
|
+
|
49
|
+
- Opening an [issue](https://github.com/mkchoi212/xcperfect/issues/new)
|
50
|
+
- Sending me feedback via [email](mailto://mkchoi212@icloud.com)
|
51
|
+
- Or [tweet](https://twitter.com/Bananamlkshake2) at your boi!
|
52
|
+
|
53
|
+
## LICENSE
|
54
|
+
|
55
|
+
Please look at [LICENSE.md](./LICENSE.md)
|
56
|
+
|
data/Rakefile
ADDED
data/assets/banner.png
ADDED
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
{"coveredLines":28,"lineCoverage":0.0071702944942381563,"targets":[{"coveredLines":15,"lineCoverage":1,"files":[{"coveredLines":15,"lineCoverage":1,"path":"\/Users\/mikechoi\/src\/vlckit\/Tests\/Sources\/VLCTimeTest.swift","functions":[{"coveredLines":15,"lineCoverage":1,"lineNumber":28,"executionCount":1,"name":"VLCKitTests.VLCMediaTest.testCodecNameForFourCC() -> ()","executableLines":15}],"name":"VLCTimeTest.swift","executableLines":15}],"name":"VLCKitTests.xctest","executableLines":15,"buildProductPath":"\/Users\/mikechoi\/src\/vlckit\/DerivedData\/VLCKitTests\/Build\/Products\/Debug\/VLCKitTests.xctest\/Contents\/MacOS\/VLCKitTests"},{"coveredLines":13,"lineCoverage":0.0033419023136246786,"files":[{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCAudio.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":50,"executionCount":0,"name":"-[VLCAudio instance]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":55,"executionCount":0,"name":"-[VLCAudio init]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":60,"executionCount":0,"name":"-[VLCAudio initWithMediaPlayer:]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":70,"executionCount":0,"name":"-[VLCAudio dealloc]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":75,"executionCount":0,"name":"-[VLCAudio setMuted:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":80,"executionCount":0,"name":"-[VLCAudio setMute:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":85,"executionCount":0,"name":"-[VLCAudio isMuted]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":90,"executionCount":0,"name":"-[VLCAudio setPassthrough:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":99,"executionCount":0,"name":"-[VLCAudio passthrough]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":112,"executionCount":0,"name":"-[VLCAudio setVolume:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":121,"executionCount":0,"name":"-[VLCAudio volumeUp]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":131,"executionCount":0,"name":"-[VLCAudio volumeDown]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":141,"executionCount":0,"name":"-[VLCAudio volume]","executableLines":3}],"name":"VLCAudio.m","executableLines":70},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCCustomDialogProvider.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":46,"executionCount":0,"name":"displayErrorCallback","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":62,"executionCount":0,"name":"displayLoginCallback","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":83,"executionCount":0,"name":"displayQuestionCallback","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":105,"executionCount":0,"name":"displayProgressCallback","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":121,"executionCount":0,"name":"cancelCallback","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":134,"executionCount":0,"name":"updateProgressCallback","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":148,"executionCount":0,"name":"-[VLCCustomDialogProvider dealloc]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":155,"executionCount":0,"name":"-[VLCCustomDialogProvider initWithLibrary:]","executableLines":27},{"coveredLines":0,"lineCoverage":0,"lineNumber":184,"executionCount":0,"name":"-[VLCCustomDialogProvider displayError:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":195,"executionCount":0,"name":"-[VLCCustomDialogProvider displayLoginDialog:]","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":210,"executionCount":0,"name":"-[VLCCustomDialogProvider postUsername:andPassword:forDialogReference:store:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":223,"executionCount":0,"name":"-[VLCCustomDialogProvider displayQuestion:]","executableLines":15},{"coveredLines":0,"lineCoverage":0,"lineNumber":240,"executionCount":0,"name":"-[VLCCustomDialogProvider postAction:forDialogReference:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":246,"executionCount":0,"name":"-[VLCCustomDialogProvider displayProgressDialog:]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":262,"executionCount":0,"name":"-[VLCCustomDialogProvider updateDisplayedProgressDialog:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":275,"executionCount":0,"name":"-[VLCCustomDialogProvider cancelDialog:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":286,"executionCount":0,"name":"-[VLCCustomDialogProvider dismissDialogWithReference:]","executableLines":3}],"name":"VLCCustomDialogProvider.m","executableLines":187},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCDialogProvider.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":37,"executionCount":0,"name":"-[VLCDialogProvider initWithLibrary:customUI:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":62,"executionCount":0,"name":"-[VLCDialogProvider postAction:forDialogReference:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":67,"executionCount":0,"name":"-[VLCDialogProvider postUsername:andPassword:forDialogReference:store:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":72,"executionCount":0,"name":"-[VLCDialogProvider dismissDialogWithReference:]","executableLines":3}],"name":"VLCDialogProvider.m","executableLines":18},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCEventManager.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":54,"executionCount":0,"name":"-[message_t isEqual:]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":91,"executionCount":0,"name":"EventDispatcherMainLoop","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":102,"executionCount":0,"name":"+[VLCEventManager sharedManager]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":105,"executionCount":0,"name":"__32+[VLCEventManager sharedManager]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":113,"executionCount":0,"name":"-[VLCEventManager dummy]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":118,"executionCount":0,"name":"-[VLCEventManager init]","executableLines":17},{"coveredLines":0,"lineCoverage":0,"lineNumber":137,"executionCount":0,"name":"-[VLCEventManager dealloc]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":144,"executionCount":0,"name":"-[VLCEventManager startEventLoop]","executableLines":83},{"coveredLines":0,"lineCoverage":0,"lineNumber":213,"executionCount":0,"name":"__33-[VLCEventManager startEventLoop]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":217,"executionCount":0,"name":"__33-[VLCEventManager startEventLoop]_block_invoke.99","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":229,"executionCount":0,"name":"-[VLCEventManager callOnMainThreadDelegateOfObject:withDelegateMethod:withNotificationName:]","executableLines":15},{"coveredLines":0,"lineCoverage":0,"lineNumber":246,"executionCount":0,"name":"-[VLCEventManager callOnMainThreadObject:withMethod:withArgumentAsObject:]","executableLines":15},{"coveredLines":0,"lineCoverage":0,"lineNumber":263,"executionCount":0,"name":"-[VLCEventManager cancelCallToObject:]","executableLines":42},{"coveredLines":0,"lineCoverage":0,"lineNumber":307,"executionCount":0,"name":"-[VLCEventManager addMessageToHandleOnMainThread:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":315,"executionCount":0,"name":"-[VLCEventManager markMessageHandledOnMainThreadIfExists:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":327,"executionCount":0,"name":"-[VLCEventManager callDelegateOfObjectAndSendNotificationWithArgs:]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":345,"executionCount":0,"name":"-[VLCEventManager callObjectMethodWithArgs:]","executableLines":8}],"name":"VLCEventManager.m","executableLines":258},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCHelperCode.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":26,"executionCount":0,"name":"toNSStr","executableLines":3}],"name":"VLCHelperCode.m","executableLines":3},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCLibrary.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":53,"executionCount":0,"name":"+[VLCLibrary sharedLibrary]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":55,"executionCount":0,"name":"__27+[VLCLibrary sharedLibrary]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":62,"executionCount":0,"name":"+[VLCLibrary sharedInstance]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":67,"executionCount":0,"name":"-[VLCLibrary init]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":75,"executionCount":0,"name":"-[VLCLibrary initWithOptions:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":83,"executionCount":0,"name":"-[VLCLibrary prepareInstanceWithOptions:]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":99,"executionCount":0,"name":"-[VLCLibrary _defaultOptions]","executableLines":23},{"coveredLines":0,"lineCoverage":0,"lineNumber":142,"executionCount":0,"name":"-[VLCLibrary setDebugLogging:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":154,"executionCount":0,"name":"-[VLCLibrary version]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":159,"executionCount":0,"name":"-[VLCLibrary compiler]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":164,"executionCount":0,"name":"-[VLCLibrary changeset]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":169,"executionCount":0,"name":"-[VLCLibrary setHumanReadableName:withHTTPUserAgent:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":175,"executionCount":0,"name":"-[VLCLibrary setApplicationIdentifier:withVersion:andApplicationIconName:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":181,"executionCount":0,"name":"-[VLCLibrary dealloc]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":193,"executionCount":0,"name":"HandleMessage","executableLines":21}],"name":"VLCLibrary.m","executableLines":114},{"coveredLines":13,"lineCoverage":0.01790633608815427,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCMedia.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":120,"executionCount":0,"name":"LibVLCStateToMediaState","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":128,"executionCount":0,"name":"HandleMediaMetaChanged","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":137,"executionCount":0,"name":"HandleMediaDurationChanged","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":147,"executionCount":0,"name":"HandleMediaStateChanged","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":156,"executionCount":0,"name":"HandleMediaSubItemAdded","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":165,"executionCount":0,"name":"HandleMediaParsedChanged","executableLines":7},{"coveredLines":13,"lineCoverage":0.8125,"lineNumber":180,"executionCount":4,"name":"+[VLCMedia codecNameForFourCC:trackType:]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":198,"executionCount":0,"name":"+[VLCMedia mediaWithURL:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":203,"executionCount":0,"name":"+[VLCMedia mediaWithPath:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":208,"executionCount":0,"name":"+[VLCMedia mediaAsNodeWithName:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":213,"executionCount":0,"name":"-[VLCMedia initWithPath:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":218,"executionCount":0,"name":"-[VLCMedia initWithURL:]","executableLines":21},{"coveredLines":0,"lineCoverage":0,"lineNumber":241,"executionCount":0,"name":"-[VLCMedia initAsNodeWithName:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":253,"executionCount":0,"name":"-[VLCMedia dealloc]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":269,"executionCount":0,"name":"-[VLCMedia mediaType]","executableLines":19},{"coveredLines":0,"lineCoverage":0,"lineNumber":290,"executionCount":0,"name":"-[VLCMedia description]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":295,"executionCount":0,"name":"-[VLCMedia compare:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":304,"executionCount":0,"name":"-[VLCMedia length]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":316,"executionCount":0,"name":"-[VLCMedia lengthWaitUntilDate:]","executableLines":23},{"coveredLines":0,"lineCoverage":0,"lineNumber":341,"executionCount":0,"name":"-[VLCMedia isParsed]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":347,"executionCount":0,"name":"-[VLCMedia parsedStatus]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":355,"executionCount":0,"name":"-[VLCMedia parse]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":361,"executionCount":0,"name":"-[VLCMedia synchronousParse]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":367,"executionCount":0,"name":"-[VLCMedia parseWithOptions:timeout:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":378,"executionCount":0,"name":"-[VLCMedia parseWithOptions:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":389,"executionCount":0,"name":"-[VLCMedia addOptions:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":391,"executionCount":0,"name":"__23-[VLCMedia addOptions:]_block_invoke","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":403,"executionCount":0,"name":"-[VLCMedia storeCookie:forHost:path:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":418,"executionCount":0,"name":"-[VLCMedia clearStoredCookies]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":429,"executionCount":0,"name":"-[VLCMedia stats]","executableLines":25},{"coveredLines":0,"lineCoverage":0,"lineNumber":456,"executionCount":0,"name":"-[VLCMedia numberOfReadBytesOnInput]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":467,"executionCount":0,"name":"-[VLCMedia inputBitrate]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":478,"executionCount":0,"name":"-[VLCMedia numberOfReadBytesOnDemux]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":489,"executionCount":0,"name":"-[VLCMedia demuxBitrate]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":500,"executionCount":0,"name":"-[VLCMedia numberOfDecodedVideoBlocks]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":511,"executionCount":0,"name":"-[VLCMedia numberOfDecodedAudioBlocks]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":522,"executionCount":0,"name":"-[VLCMedia numberOfDisplayedPictures]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":533,"executionCount":0,"name":"-[VLCMedia numberOfLostPictures]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":544,"executionCount":0,"name":"-[VLCMedia numberOfPlayedAudioBuffers]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":555,"executionCount":0,"name":"-[VLCMedia numberOfLostAudioBuffers]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":566,"executionCount":0,"name":"-[VLCMedia numberOfSentPackets]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":577,"executionCount":0,"name":"-[VLCMedia numberOfSentBytes]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":588,"executionCount":0,"name":"-[VLCMedia streamOutputBitrate]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":599,"executionCount":0,"name":"-[VLCMedia numberOfCorruptedDataPackets]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":610,"executionCount":0,"name":"-[VLCMedia numberOfDiscontinuties]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":653,"executionCount":0,"name":"-[VLCMedia tracksInformation]","executableLines":58},{"coveredLines":0,"lineCoverage":0,"lineNumber":713,"executionCount":0,"name":"-[VLCMedia isMediaSizeSuitableForDevice]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":768,"executionCount":0,"name":"-[VLCMedia metadataForKey:]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":784,"executionCount":0,"name":"-[VLCMedia setMetadata:forKey:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":792,"executionCount":0,"name":"-[VLCMedia saveMetadata]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":804,"executionCount":0,"name":"+[VLCMedia stringToMetaType:]","executableLines":37},{"coveredLines":0,"lineCoverage":0,"lineNumber":843,"executionCount":0,"name":"+[VLCMedia metaTypeToString:]","executableLines":29},{"coveredLines":0,"lineCoverage":0,"lineNumber":874,"executionCount":0,"name":"-[VLCMedia initInternalMediaDescriptor]","executableLines":47},{"coveredLines":0,"lineCoverage":0,"lineNumber":923,"executionCount":0,"name":"-[VLCMedia fetchMetaInformationFromLibVLCWithType:]","executableLines":19},{"coveredLines":0,"lineCoverage":0,"lineNumber":945,"executionCount":0,"name":"-[VLCMedia fetchMetaInformationForArtWorkWithURL:]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":963,"executionCount":0,"name":"-[VLCMedia setArtwork:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":972,"executionCount":0,"name":"-[VLCMedia parseIfNeeded]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":979,"executionCount":0,"name":"-[VLCMedia metaChanged:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":987,"executionCount":0,"name":"-[VLCMedia subItemAdded]","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":1001,"executionCount":0,"name":"-[VLCMedia parsedChanged:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":1014,"executionCount":0,"name":"-[VLCMedia setStateAsNumber:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1046,"executionCount":0,"name":"-[VLCMedia metaDictionary]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1051,"executionCount":0,"name":"-[VLCMedia valueForKeyPath:]","executableLines":18},{"coveredLines":0,"lineCoverage":0,"lineNumber":1078,"executionCount":0,"name":"+[VLCMedia(LibVLCBridging) mediaWithLibVLCMediaDescriptor:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1083,"executionCount":0,"name":"+[VLCMedia(LibVLCBridging) mediaWithMedia:andLibVLCOptions:]","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":1097,"executionCount":0,"name":"-[VLCMedia(LibVLCBridging) initWithLibVLCMediaDescriptor:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":1110,"executionCount":0,"name":"-[VLCMedia(LibVLCBridging) libVLCMediaDescriptor]","executableLines":3}],"name":"VLCMedia.m","executableLines":726},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCMediaDiscoverer.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":55,"executionCount":0,"name":"+[VLCMediaDiscoverer availableMediaDiscoverer]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":60,"executionCount":0,"name":"+[VLCMediaDiscoverer availableMediaDiscovererForCategoryType:]","executableLines":25},{"coveredLines":0,"lineCoverage":0,"lineNumber":87,"executionCount":0,"name":"-[VLCMediaDiscoverer initWithName:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":92,"executionCount":0,"name":"-[VLCMediaDiscoverer initWithName:libraryInstance:]","executableLines":23},{"coveredLines":0,"lineCoverage":0,"lineNumber":117,"executionCount":0,"name":"-[VLCMediaDiscoverer dealloc]","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":132,"executionCount":0,"name":"-[VLCMediaDiscoverer startDiscoverer]","executableLines":15},{"coveredLines":0,"lineCoverage":0,"lineNumber":149,"executionCount":0,"name":"-[VLCMediaDiscoverer stopDiscoverer]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":154,"executionCount":0,"name":"__36-[VLCMediaDiscoverer stopDiscoverer]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":160,"executionCount":0,"name":"-[VLCMediaDiscoverer discoveredMedia]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":165,"executionCount":0,"name":"-[VLCMediaDiscoverer localizedName]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":181,"executionCount":0,"name":"-[VLCMediaDiscoverer isRunning]","executableLines":3}],"name":"VLCMediaDiscoverer.m","executableLines":114},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCMediaLibrary.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":46,"executionCount":0,"name":"+[VLCMediaLibrary sharedMediaLibrary]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":50,"executionCount":0,"name":"__37+[VLCMediaLibrary sharedMediaLibrary]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":58,"executionCount":0,"name":"-[VLCMediaLibrary init]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":67,"executionCount":0,"name":"-[VLCMediaLibrary dealloc]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":73,"executionCount":0,"name":"-[VLCMediaLibrary allMedia]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":74,"executionCount":0,"name":"__27-[VLCMediaLibrary allMedia]_block_invoke","executableLines":8}],"name":"VLCMediaLibrary.m","executableLines":43},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCMediaList.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":56,"executionCount":0,"name":"HandleMediaListItemAdded","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":67,"executionCount":0,"name":"HandleMediaListItemDeleted","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":88,"executionCount":0,"name":"-[VLCMediaList init]","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":103,"executionCount":0,"name":"-[VLCMediaList initWithArray:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":115,"executionCount":0,"name":"-[VLCMediaList dealloc]","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":130,"executionCount":0,"name":"-[VLCMediaList description]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":139,"executionCount":0,"name":"-[VLCMediaList lock]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":144,"executionCount":0,"name":"-[VLCMediaList unlock]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":149,"executionCount":0,"name":"-[VLCMediaList addMedia:]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":156,"executionCount":0,"name":"-[VLCMediaList insertMedia:atIndex:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":158,"executionCount":0,"name":"__36-[VLCMediaList insertMedia:atIndex:]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":167,"executionCount":0,"name":"-[VLCMediaList removeMediaAtIndex:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":168,"executionCount":0,"name":"__35-[VLCMediaList removeMediaAtIndex:]_block_invoke","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":180,"executionCount":0,"name":"-[VLCMediaList mediaAtIndex:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":182,"executionCount":0,"name":"__29-[VLCMediaList mediaAtIndex:]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":189,"executionCount":0,"name":"-[VLCMediaList indexOfMedia:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":196,"executionCount":0,"name":"-[VLCMediaList countOfMedia]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":201,"executionCount":0,"name":"-[VLCMediaList objectInMediaAtIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":206,"executionCount":0,"name":"-[VLCMediaList count]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":208,"executionCount":0,"name":"__21-[VLCMediaList count]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":215,"executionCount":0,"name":"-[VLCMediaList insertObject:inMediaAtIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":220,"executionCount":0,"name":"-[VLCMediaList removeObjectFromMediaAtIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":227,"executionCount":0,"name":"-[VLCMediaList isReadOnly]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":235,"executionCount":0,"name":"+[VLCMediaList(LibVLCBridging) mediaListWithLibVLCMediaList:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":240,"executionCount":0,"name":"-[VLCMediaList(LibVLCBridging) initWithLibVLCMediaList:]","executableLines":20},{"coveredLines":0,"lineCoverage":0,"lineNumber":250,"executionCount":0,"name":"__56-[VLCMediaList(LibVLCBridging) initWithLibVLCMediaList:]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":262,"executionCount":0,"name":"-[VLCMediaList(LibVLCBridging) libVLCMediaList]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":269,"executionCount":0,"name":"-[VLCMediaList(Private) initInternalMediaList]","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":277,"executionCount":0,"name":"__46-[VLCMediaList(Private) initInternalMediaList]_block_invoke","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":284,"executionCount":0,"name":"-[VLCMediaList(Private) mediaListItemAdded:]","executableLines":33},{"coveredLines":0,"lineCoverage":0,"lineNumber":296,"executionCount":0,"name":"__44-[VLCMediaList(Private) mediaListItemAdded:]_block_invoke","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":308,"executionCount":0,"name":"__44-[VLCMediaList(Private) mediaListItemAdded:]_block_invoke.146","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":319,"executionCount":0,"name":"-[VLCMediaList(Private) mediaListItemRemoved:]","executableLines":17},{"coveredLines":0,"lineCoverage":0,"lineNumber":321,"executionCount":0,"name":"__46-[VLCMediaList(Private) mediaListItemRemoved:]_block_invoke","executableLines":3}],"name":"VLCMediaList.m","executableLines":249},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCMediaListPlayer.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":47,"executionCount":0,"name":"-[VLCMediaListPlayer initWithOptions:andDrawable:]","executableLines":18},{"coveredLines":0,"lineCoverage":0,"lineNumber":67,"executionCount":0,"name":"-[VLCMediaListPlayer initWithOptions:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":72,"executionCount":0,"name":"-[VLCMediaListPlayer init]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":77,"executionCount":0,"name":"-[VLCMediaListPlayer initWithDrawable:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":82,"executionCount":0,"name":"-[VLCMediaListPlayer dealloc]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":88,"executionCount":0,"name":"-[VLCMediaListPlayer mediaPlayer]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":93,"executionCount":0,"name":"-[VLCMediaListPlayer setMediaList:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":105,"executionCount":0,"name":"-[VLCMediaListPlayer mediaList]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":110,"executionCount":0,"name":"-[VLCMediaListPlayer setRootMedia:]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":128,"executionCount":0,"name":"-[VLCMediaListPlayer rootMedia]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":133,"executionCount":0,"name":"-[VLCMediaListPlayer playMedia:]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":134,"executionCount":0,"name":"__32-[VLCMediaListPlayer playMedia:]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":140,"executionCount":0,"name":"-[VLCMediaListPlayer play]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":141,"executionCount":0,"name":"__26-[VLCMediaListPlayer play]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":147,"executionCount":0,"name":"-[VLCMediaListPlayer pause]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":148,"executionCount":0,"name":"__27-[VLCMediaListPlayer pause]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":154,"executionCount":0,"name":"-[VLCMediaListPlayer stop]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":155,"executionCount":0,"name":"__26-[VLCMediaListPlayer stop]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":161,"executionCount":0,"name":"-[VLCMediaListPlayer next]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":166,"executionCount":0,"name":"-[VLCMediaListPlayer previous]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":171,"executionCount":0,"name":"-[VLCMediaListPlayer playItemAtIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":176,"executionCount":0,"name":"-[VLCMediaListPlayer playItemAtNumber:]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":177,"executionCount":0,"name":"__39-[VLCMediaListPlayer playItemAtNumber:]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":183,"executionCount":0,"name":"-[VLCMediaListPlayer setRepeatMode:]","executableLines":20},{"coveredLines":0,"lineCoverage":0,"lineNumber":205,"executionCount":0,"name":"-[VLCMediaListPlayer repeatMode]","executableLines":3}],"name":"VLCMediaListPlayer.m","executableLines":138},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCMediaPlayer.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":69,"executionCount":0,"name":"VLCMediaPlayerStateToString","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":101,"executionCount":0,"name":"HandleMediaTimeChanged","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":114,"executionCount":0,"name":"HandleMediaPositionChanged","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":124,"executionCount":0,"name":"HandleMediaInstanceStateChanged","executableLines":36},{"coveredLines":0,"lineCoverage":0,"lineNumber":162,"executionCount":0,"name":"HandleMediaPlayerMediaChanged","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":173,"executionCount":0,"name":"HandleMediaTitleChanged","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":182,"executionCount":0,"name":"HandleMediaChapterChanged","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":191,"executionCount":0,"name":"HandleMediaPlayerSnapshot","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":229,"executionCount":0,"name":"+[VLCMediaPlayer keyPathsForValuesAffectingValueForKey:]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":248,"executionCount":0,"name":"-[VLCMediaPlayer init]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":253,"executionCount":0,"name":"-[VLCMediaPlayer initWithLibVLCInstance:andLibrary:]","executableLines":17},{"coveredLines":0,"lineCoverage":0,"lineNumber":273,"executionCount":0,"name":"-[VLCMediaPlayer initWithVideoView:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":278,"executionCount":0,"name":"-[VLCMediaPlayer initWithVideoLayer:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":283,"executionCount":0,"name":"-[VLCMediaPlayer initWithVideoView:options:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":288,"executionCount":0,"name":"-[VLCMediaPlayer initWithVideoLayer:options:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":294,"executionCount":0,"name":"-[VLCMediaPlayer initWithOptions:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":299,"executionCount":0,"name":"-[VLCMediaPlayer dealloc]","executableLines":30},{"coveredLines":0,"lineCoverage":0,"lineNumber":332,"executionCount":0,"name":"-[VLCMediaPlayer setVideoView:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":337,"executionCount":0,"name":"-[VLCMediaPlayer setVideoLayer:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":343,"executionCount":0,"name":"-[VLCMediaPlayer setDrawable:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":349,"executionCount":0,"name":"__30-[VLCMediaPlayer setDrawable:]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":355,"executionCount":0,"name":"-[VLCMediaPlayer drawable]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":360,"executionCount":0,"name":"-[VLCMediaPlayer audio]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":369,"executionCount":0,"name":"-[VLCMediaPlayer setCurrentVideoTrackIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":374,"executionCount":0,"name":"-[VLCMediaPlayer currentVideoTrackIndex]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":383,"executionCount":0,"name":"-[VLCMediaPlayer videoTrackNames]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":401,"executionCount":0,"name":"-[VLCMediaPlayer videoTrackIndexes]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":419,"executionCount":0,"name":"-[VLCMediaPlayer numberOfVideoTracks]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":427,"executionCount":0,"name":"-[VLCMediaPlayer setCurrentVideoSubTitleIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":432,"executionCount":0,"name":"-[VLCMediaPlayer currentVideoSubTitleIndex]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":442,"executionCount":0,"name":"-[VLCMediaPlayer videoSubTitlesNames]","executableLines":17},{"coveredLines":0,"lineCoverage":0,"lineNumber":461,"executionCount":0,"name":"-[VLCMediaPlayer videoSubTitlesIndexes]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":479,"executionCount":0,"name":"-[VLCMediaPlayer numberOfSubtitlesTracks]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":484,"executionCount":0,"name":"-[VLCMediaPlayer openVideoSubTitlesFromFile:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":489,"executionCount":0,"name":"-[VLCMediaPlayer addPlaybackSlave:type:enforce:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":500,"executionCount":0,"name":"-[VLCMediaPlayer setCurrentVideoSubTitleDelay:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":505,"executionCount":0,"name":"-[VLCMediaPlayer currentVideoSubTitleDelay]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":535,"executionCount":0,"name":"-[VLCMediaPlayer setVideoCropGeometry:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":540,"executionCount":0,"name":"-[VLCMediaPlayer videoCropGeometry]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":546,"executionCount":0,"name":"-[VLCMediaPlayer setVideoAspectRatio:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":551,"executionCount":0,"name":"-[VLCMediaPlayer videoAspectRatio]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":557,"executionCount":0,"name":"-[VLCMediaPlayer setScaleFactor:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":562,"executionCount":0,"name":"-[VLCMediaPlayer scaleFactor]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":567,"executionCount":0,"name":"-[VLCMediaPlayer saveVideoSnapshotAt:withWidth:andHeight:]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":574,"executionCount":0,"name":"-[VLCMediaPlayer setDeinterlaceFilter:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":582,"executionCount":0,"name":"-[VLCMediaPlayer setDeinterlace:withFilter:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":587,"executionCount":0,"name":"-[VLCMediaPlayer adjustFilterEnabled]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":591,"executionCount":0,"name":"-[VLCMediaPlayer setAdjustFilterEnabled:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":595,"executionCount":0,"name":"-[VLCMediaPlayer contrast]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":600,"executionCount":0,"name":"-[VLCMediaPlayer setContrast:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":607,"executionCount":0,"name":"-[VLCMediaPlayer brightness]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":612,"executionCount":0,"name":"-[VLCMediaPlayer setBrightness:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":620,"executionCount":0,"name":"-[VLCMediaPlayer hue]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":625,"executionCount":0,"name":"-[VLCMediaPlayer setHue:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":633,"executionCount":0,"name":"-[VLCMediaPlayer saturation]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":638,"executionCount":0,"name":"-[VLCMediaPlayer setSaturation:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":645,"executionCount":0,"name":"-[VLCMediaPlayer gamma]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":650,"executionCount":0,"name":"-[VLCMediaPlayer setGamma:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":658,"executionCount":0,"name":"-[VLCMediaPlayer setRate:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":663,"executionCount":0,"name":"-[VLCMediaPlayer rate]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":668,"executionCount":0,"name":"-[VLCMediaPlayer videoSize]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":677,"executionCount":0,"name":"-[VLCMediaPlayer hasVideoOut]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":682,"executionCount":0,"name":"-[VLCMediaPlayer framesPerSecond]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":687,"executionCount":0,"name":"-[VLCMediaPlayer setTime:]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":694,"executionCount":0,"name":"-[VLCMediaPlayer time]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":699,"executionCount":0,"name":"-[VLCMediaPlayer remainingTime]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":706,"executionCount":0,"name":"-[VLCMediaPlayer setCurrentChapterIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":711,"executionCount":0,"name":"-[VLCMediaPlayer currentChapterIndex]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":720,"executionCount":0,"name":"-[VLCMediaPlayer nextChapter]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":725,"executionCount":0,"name":"-[VLCMediaPlayer previousChapter]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":730,"executionCount":0,"name":"-[VLCMediaPlayer chaptersForTitleIndex:]","executableLines":19},{"coveredLines":0,"lineCoverage":0,"lineNumber":754,"executionCount":0,"name":"-[VLCMediaPlayer setCurrentTitleIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":759,"executionCount":0,"name":"-[VLCMediaPlayer currentTitleIndex]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":768,"executionCount":0,"name":"-[VLCMediaPlayer numberOfTitles]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":773,"executionCount":0,"name":"-[VLCMediaPlayer countOfTitles]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":779,"executionCount":0,"name":"-[VLCMediaPlayer titles]","executableLines":28},{"coveredLines":0,"lineCoverage":0,"lineNumber":809,"executionCount":0,"name":"-[VLCMediaPlayer titleDescriptions]","executableLines":29},{"coveredLines":0,"lineCoverage":0,"lineNumber":840,"executionCount":0,"name":"-[VLCMediaPlayer indexOfLongestTitle]","executableLines":18},{"coveredLines":0,"lineCoverage":0,"lineNumber":860,"executionCount":0,"name":"-[VLCMediaPlayer numberOfChaptersForTitle:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":865,"executionCount":0,"name":"-[VLCMediaPlayer chapterDescriptionsOfTitle:]","executableLines":32},{"coveredLines":0,"lineCoverage":0,"lineNumber":901,"executionCount":0,"name":"-[VLCMediaPlayer setCurrentAudioTrackIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":906,"executionCount":0,"name":"-[VLCMediaPlayer currentAudioTrackIndex]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":915,"executionCount":0,"name":"-[VLCMediaPlayer audioTrackNames]","executableLines":17},{"coveredLines":0,"lineCoverage":0,"lineNumber":934,"executionCount":0,"name":"-[VLCMediaPlayer audioTrackIndexes]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":952,"executionCount":0,"name":"-[VLCMediaPlayer numberOfAudioTracks]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":957,"executionCount":0,"name":"-[VLCMediaPlayer setAudioChannel:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":962,"executionCount":0,"name":"-[VLCMediaPlayer audioChannel]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":967,"executionCount":0,"name":"-[VLCMediaPlayer setCurrentAudioPlaybackDelay:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":972,"executionCount":0,"name":"-[VLCMediaPlayer currentAudioPlaybackDelay]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":980,"executionCount":0,"name":"-[VLCMediaPlayer setEqualizerEnabled:]","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":994,"executionCount":0,"name":"-[VLCMediaPlayer equalizerEnabled]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":999,"executionCount":0,"name":"-[VLCMediaPlayer equalizerProfiles]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":1009,"executionCount":0,"name":"-[VLCMediaPlayer resetEqualizerFromProfile:]","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":1023,"executionCount":0,"name":"-[VLCMediaPlayer preAmplification]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1031,"executionCount":0,"name":"-[VLCMediaPlayer setPreAmplification:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":1040,"executionCount":0,"name":"-[VLCMediaPlayer numberOfBands]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1045,"executionCount":0,"name":"-[VLCMediaPlayer frequencyOfBandAtIndex:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1050,"executionCount":0,"name":"-[VLCMediaPlayer setAmplification:forBand:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1058,"executionCount":0,"name":"-[VLCMediaPlayer amplificationOfBand:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1069,"executionCount":0,"name":"-[VLCMediaPlayer setMedia:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":1081,"executionCount":0,"name":"-[VLCMediaPlayer media]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1089,"executionCount":0,"name":"-[VLCMediaPlayer play]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":1090,"executionCount":0,"name":"__22-[VLCMediaPlayer play]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1096,"executionCount":0,"name":"-[VLCMediaPlayer pause]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1098,"executionCount":0,"name":"__23-[VLCMediaPlayer pause]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1104,"executionCount":0,"name":"-[VLCMediaPlayer stop]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":1105,"executionCount":0,"name":"__22-[VLCMediaPlayer stop]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1111,"executionCount":0,"name":"-[VLCMediaPlayer viewPoint]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1119,"executionCount":0,"name":"-[VLCMediaPlayer updateViewpoint:pitch:roll:fov:absolute:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":1132,"executionCount":0,"name":"-[VLCMediaPlayer yaw]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1140,"executionCount":0,"name":"-[VLCMediaPlayer pitch]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1148,"executionCount":0,"name":"-[VLCMediaPlayer roll]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1156,"executionCount":0,"name":"-[VLCMediaPlayer fov]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1164,"executionCount":0,"name":"-[VLCMediaPlayer gotoNextFrame]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1169,"executionCount":0,"name":"-[VLCMediaPlayer fastForward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1174,"executionCount":0,"name":"-[VLCMediaPlayer fastForwardAtRate:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1179,"executionCount":0,"name":"-[VLCMediaPlayer rewind]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1184,"executionCount":0,"name":"-[VLCMediaPlayer rewindAtRate:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1189,"executionCount":0,"name":"-[VLCMediaPlayer jumpBackward:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1197,"executionCount":0,"name":"-[VLCMediaPlayer jumpForward:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1205,"executionCount":0,"name":"-[VLCMediaPlayer extraShortJumpBackward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1210,"executionCount":0,"name":"-[VLCMediaPlayer extraShortJumpForward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1215,"executionCount":0,"name":"-[VLCMediaPlayer shortJumpBackward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1220,"executionCount":0,"name":"-[VLCMediaPlayer shortJumpForward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1225,"executionCount":0,"name":"-[VLCMediaPlayer mediumJumpBackward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1230,"executionCount":0,"name":"-[VLCMediaPlayer mediumJumpForward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1235,"executionCount":0,"name":"-[VLCMediaPlayer longJumpBackward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1240,"executionCount":0,"name":"-[VLCMediaPlayer longJumpForward]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1245,"executionCount":0,"name":"-[VLCMediaPlayer performNavigationAction:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1250,"executionCount":0,"name":"+[VLCMediaPlayer keyPathsForValuesAffectingIsPlaying]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1255,"executionCount":0,"name":"-[VLCMediaPlayer isPlaying]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1260,"executionCount":0,"name":"-[VLCMediaPlayer willPlay]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1265,"executionCount":0,"name":"-[VLCMediaPlayer state]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1270,"executionCount":0,"name":"-[VLCMediaPlayer position]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1275,"executionCount":0,"name":"-[VLCMediaPlayer setPosition:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1280,"executionCount":0,"name":"-[VLCMediaPlayer isSeekable]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1285,"executionCount":0,"name":"-[VLCMediaPlayer canPause]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1290,"executionCount":0,"name":"-[VLCMediaPlayer snapshots]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1308,"executionCount":0,"name":"-[VLCMediaPlayer lastSnapshot]","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":1323,"executionCount":0,"name":"-[VLCMediaPlayer libVLCMediaPlayer]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1331,"executionCount":0,"name":"-[VLCMediaPlayer setRendererItem:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1339,"executionCount":0,"name":"-[VLCMediaPlayer(Private) initWithDrawable:options:]","executableLines":27},{"coveredLines":0,"lineCoverage":0,"lineNumber":1368,"executionCount":0,"name":"-[VLCMediaPlayer(Private) registerObservers]","executableLines":28},{"coveredLines":0,"lineCoverage":0,"lineNumber":1376,"executionCount":0,"name":"__44-[VLCMediaPlayer(Private) registerObservers]_block_invoke","executableLines":19},{"coveredLines":0,"lineCoverage":0,"lineNumber":1398,"executionCount":0,"name":"-[VLCMediaPlayer(Private) unregisterObservers]","executableLines":23},{"coveredLines":0,"lineCoverage":0,"lineNumber":1423,"executionCount":0,"name":"-[VLCMediaPlayer(Private) libVLCBackgroundQueue]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":1431,"executionCount":0,"name":"-[VLCMediaPlayer(Private) mediaPlayerTimeChanged:]","executableLines":13},{"coveredLines":0,"lineCoverage":0,"lineNumber":1447,"executionCount":0,"name":"-[VLCMediaPlayer(Private) delaySleep]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":1453,"executionCount":0,"name":"-[VLCMediaPlayer(Private) mediaPlayerPositionChanged:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":1465,"executionCount":0,"name":"-[VLCMediaPlayer(Private) mediaPlayerStateChanged:]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":1478,"executionCount":0,"name":"-[VLCMediaPlayer(Private) mediaPlayerMediaChanged:]","executableLines":18},{"coveredLines":0,"lineCoverage":0,"lineNumber":1498,"executionCount":0,"name":"-[VLCMediaPlayer(Private) mediaPlayerTitleChanged:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":1504,"executionCount":0,"name":"-[VLCMediaPlayer(Private) mediaPlayerChapterChanged:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":1510,"executionCount":0,"name":"-[VLCMediaPlayer(Private) mediaPlayerSnapshot:]","executableLines":9}],"name":"VLCMediaPlayer.m","executableLines":1074},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCMediaThumbnailer.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":56,"executionCount":0,"name":"lock","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":70,"executionCount":0,"name":"unlock","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":76,"executionCount":0,"name":"display","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":99,"executionCount":0,"name":"+[VLCMediaThumbnailer thumbnailerWithMedia:andDelegate:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":108,"executionCount":0,"name":"+[VLCMediaThumbnailer thumbnailerWithMedia:delegate:andVLCLibrary:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":120,"executionCount":0,"name":"-[VLCMediaThumbnailer dealloc]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":132,"executionCount":0,"name":"-[VLCMediaThumbnailer setLibVLCinstance:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":138,"executionCount":0,"name":"-[VLCMediaThumbnailer libVLCinstance]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":143,"executionCount":0,"name":"-[VLCMediaThumbnailer fetchThumbnail]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":159,"executionCount":0,"name":"-[VLCMediaThumbnailer startFetchingThumbnail]","executableLines":83},{"coveredLines":0,"lineCoverage":0,"lineNumber":244,"executionCount":0,"name":"-[VLCMediaThumbnailer mediaParsingTimedOut]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":252,"executionCount":0,"name":"-[VLCMediaThumbnailer observeValueForKeyPath:ofObject:change:context:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":265,"executionCount":0,"name":"-[VLCMediaThumbnailer didFetchThumbnail]","executableLines":57},{"coveredLines":0,"lineCoverage":0,"lineNumber":324,"executionCount":0,"name":"-[VLCMediaThumbnailer stopAsync]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":340,"executionCount":0,"name":"-[VLCMediaThumbnailer endThumbnailing]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":350,"executionCount":0,"name":"-[VLCMediaThumbnailer notifyDelegate]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":358,"executionCount":0,"name":"-[VLCMediaThumbnailer mediaThumbnailingTimedOut]","executableLines":7}],"name":"VLCMediaThumbnailer.m","executableLines":262},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCRendererDiscoverer.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":39,"executionCount":0,"name":"HandleRendererDiscovererItemAdded","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":49,"executionCount":0,"name":"HandleRendererDiscovererItemDeleted","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":63,"executionCount":0,"name":"-[VLCRendererDiscovererDescription initWithName:longName:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":82,"executionCount":0,"name":"-[VLCRendererDiscoverer initWithName:]","executableLines":24},{"coveredLines":0,"lineCoverage":0,"lineNumber":108,"executionCount":0,"name":"-[VLCRendererDiscoverer start]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":113,"executionCount":0,"name":"-[VLCRendererDiscoverer stop]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":118,"executionCount":0,"name":"-[VLCRendererDiscoverer dealloc]","executableLines":14},{"coveredLines":0,"lineCoverage":0,"lineNumber":134,"executionCount":0,"name":"+[VLCRendererDiscoverer list]","executableLines":22},{"coveredLines":0,"lineCoverage":0,"lineNumber":158,"executionCount":0,"name":"-[VLCRendererDiscoverer discoveredItemsContainItem:]","executableLines":11},{"coveredLines":0,"lineCoverage":0,"lineNumber":171,"executionCount":0,"name":"-[VLCRendererDiscoverer renderers]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":178,"executionCount":0,"name":"-[VLCRendererDiscoverer itemAdded:]","executableLines":10},{"coveredLines":0,"lineCoverage":0,"lineNumber":190,"executionCount":0,"name":"-[VLCRendererDiscoverer itemDeleted:]","executableLines":9}],"name":"VLCRendererDiscoverer.m","executableLines":126},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCRendererItem.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":35,"executionCount":0,"name":"-[VLCRendererItem dealloc]","executableLines":5},{"coveredLines":0,"lineCoverage":0,"lineNumber":46,"executionCount":0,"name":"-[VLCRendererItem(VLCRendererItemBridging) initWithRendererItem:]","executableLines":23},{"coveredLines":0,"lineCoverage":0,"lineNumber":71,"executionCount":0,"name":"-[VLCRendererItem(VLCRendererItemBridging) libVLCRendererItem]","executableLines":3}],"name":"VLCRendererItem.m","executableLines":31},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCStreamOutput.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":39,"executionCount":0,"name":"-[VLCStreamOutput init]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":44,"executionCount":0,"name":"-[VLCStreamOutput initWithOptionDictionary:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":51,"executionCount":0,"name":"-[VLCStreamOutput description]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":55,"executionCount":0,"name":"+[VLCStreamOutput streamOutputWithOptionDictionary:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":59,"executionCount":0,"name":"+[VLCStreamOutput rtpBroadcastStreamOutputWithSAPAnnounce:]","executableLines":12},{"coveredLines":0,"lineCoverage":0,"lineNumber":73,"executionCount":0,"name":"+[VLCStreamOutput rtpBroadcastStreamOutput]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":78,"executionCount":0,"name":"+[VLCStreamOutput ipodStreamOutputWithFilePath:]","executableLines":19},{"coveredLines":0,"lineCoverage":0,"lineNumber":99,"executionCount":0,"name":"+[VLCStreamOutput mpeg4StreamOutputWithFilePath:]","executableLines":15},{"coveredLines":0,"lineCoverage":0,"lineNumber":116,"executionCount":0,"name":"+[VLCStreamOutput streamOutputWithFilePath:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":127,"executionCount":0,"name":"+[VLCStreamOutput mpeg2StreamOutputWithFilePath:]","executableLines":16},{"coveredLines":0,"lineCoverage":0,"lineNumber":147,"executionCount":0,"name":"-[VLCStreamOutput(LibVLCBridge) representedLibVLCOptions]","executableLines":79}],"name":"VLCStreamOutput.m","executableLines":168},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCStreamSession.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":38,"executionCount":0,"name":"-[VLCStreamSession init]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":47,"executionCount":0,"name":"-[VLCStreamSession dealloc]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":52,"executionCount":0,"name":"+[VLCStreamSession streamSession]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":58,"executionCount":0,"name":"-[VLCStreamSession startStreaming]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":64,"executionCount":0,"name":"-[VLCStreamSession stopStreaming]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":70,"executionCount":0,"name":"-[VLCStreamSession play]","executableLines":19},{"coveredLines":0,"lineCoverage":0,"lineNumber":91,"executionCount":0,"name":"+[VLCStreamSession keyPathsForValuesAffectingDescription]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":96,"executionCount":0,"name":"-[VLCStreamSession description]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":107,"executionCount":0,"name":"+[VLCStreamSession keyPathsForValuesAffectingEncounteredError]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":112,"executionCount":0,"name":"-[VLCStreamSession encounteredError]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":117,"executionCount":0,"name":"-[VLCStreamSession observeValueForKeyPath:ofObject:change:context:]","executableLines":24}],"name":"VLCStreamSession.m","executableLines":82},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCTime.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":31,"executionCount":0,"name":"+[VLCTime nullTime]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":34,"executionCount":0,"name":"__19+[VLCTime nullTime]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":41,"executionCount":0,"name":"+[VLCTime timeWithNumber:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":46,"executionCount":0,"name":"+[VLCTime timeWithInt:]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":52,"executionCount":0,"name":"-[VLCTime initWithNumber:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":60,"executionCount":0,"name":"-[VLCTime initWithInt:]","executableLines":7},{"coveredLines":0,"lineCoverage":0,"lineNumber":70,"executionCount":0,"name":"-[VLCTime description]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":75,"executionCount":0,"name":"-[VLCTime numberValue]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":80,"executionCount":0,"name":"-[VLCTime stringValue]","executableLines":25},{"coveredLines":0,"lineCoverage":0,"lineNumber":107,"executionCount":0,"name":"-[VLCTime verboseStringValue]","executableLines":20},{"coveredLines":0,"lineCoverage":0,"lineNumber":129,"executionCount":0,"name":"-[VLCTime minuteStringValue]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":139,"executionCount":0,"name":"-[VLCTime intValue]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":144,"executionCount":0,"name":"-[VLCTime compare:]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":154,"executionCount":0,"name":"-[VLCTime isEqual:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":162,"executionCount":0,"name":"-[VLCTime hash]","executableLines":3}],"name":"VLCTime.m","executableLines":109},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCVideoCommon.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":36,"executionCount":0,"name":"+[VLCVideoLayoutManager layoutManager]","executableLines":8},{"coveredLines":0,"lineCoverage":0,"lineNumber":39,"executionCount":0,"name":"__38+[VLCVideoLayoutManager layoutManager]_block_invoke","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":47,"executionCount":0,"name":"-[VLCVideoLayoutManager layoutSublayersOfLayer:]","executableLines":22}],"name":"VLCVideoCommon.m","executableLines":33},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCVideoLayer.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":59,"executionCount":0,"name":"-[VLCVideoLayer fillScreen]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":64,"executionCount":0,"name":"-[VLCVideoLayer setFillScreen:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":77,"executionCount":0,"name":"-[VLCVideoLayer addVoutLayer:]","executableLines":19},{"coveredLines":0,"lineCoverage":0,"lineNumber":98,"executionCount":0,"name":"-[VLCVideoLayer removeVoutLayer:]","executableLines":10}],"name":"VLCVideoLayer.m","executableLines":36},{"coveredLines":0,"lineCoverage":0,"path":"\/Users\/mikechoi\/src\/vlckit\/Sources\/VLCVideoView.m","functions":[{"coveredLines":0,"lineCoverage":0,"lineNumber":72,"executionCount":0,"name":"-[VLCVideoView initWithFrame:]","executableLines":9},{"coveredLines":0,"lineCoverage":0,"lineNumber":84,"executionCount":0,"name":"-[VLCVideoView drawRect:]","executableLines":6},{"coveredLines":0,"lineCoverage":0,"lineNumber":92,"executionCount":0,"name":"-[VLCVideoView isOpaque]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":97,"executionCount":0,"name":"-[VLCVideoView fillScreen]","executableLines":3},{"coveredLines":0,"lineCoverage":0,"lineNumber":102,"executionCount":0,"name":"-[VLCVideoView setFillScreen:]","executableLines":4},{"coveredLines":0,"lineCoverage":0,"lineNumber":115,"executionCount":0,"name":"-[VLCVideoView addVoutLayer:]","executableLines":17},{"coveredLines":0,"lineCoverage":0,"lineNumber":134,"executionCount":0,"name":"-[VLCVideoView removeVoutLayer:]","executableLines":7}],"name":"VLCVideoView.m","executableLines":49}],"name":"VLCKit.framework","executableLines":3890,"buildProductPath":"\/Users\/mikechoi\/src\/vlckit\/DerivedData\/VLCKitTests\/Build\/Products\/Debug\/VLCKit.framework\/Versions\/A\/VLCKit"}],"executableLines":3905}
|
Binary file
|
data/bin/xcperfect
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
if RUBY_VERSION < '2.0.0'
|
4
|
+
abort 'error: XCPerfect requires Ruby 2.0.0 or higher.'
|
5
|
+
end
|
6
|
+
|
7
|
+
if $PROGRAM_NAME == __FILE__
|
8
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'xcperfect'
|
12
|
+
require 'optparse'
|
13
|
+
require 'json'
|
14
|
+
|
15
|
+
coverage_file_name = ''
|
16
|
+
coverage_targets = []
|
17
|
+
|
18
|
+
printer_options = {
|
19
|
+
ascii: false,
|
20
|
+
colorize: STDOUT.tty?,
|
21
|
+
formatter: XCPerfect::All
|
22
|
+
}
|
23
|
+
|
24
|
+
OptionParser.new do |opts|
|
25
|
+
opts.banner = 'Usage: xcrun xccov --json [options] | xcperfect'
|
26
|
+
|
27
|
+
opts.on('-a', '--all', 'Show all code coverage information (Default)') do
|
28
|
+
printer_options[:formatter] = XCPerfect::All
|
29
|
+
end
|
30
|
+
|
31
|
+
opts.on('-s', '--simple', 'Simplify coverage output') do
|
32
|
+
printer_options[:formatter] = XCPerfect::Simple
|
33
|
+
end
|
34
|
+
|
35
|
+
opts.on('--[no-]color', 'Toggle colorized output. Default depends on your terminal') do |value|
|
36
|
+
printer_options[:colorize] = value
|
37
|
+
end
|
38
|
+
|
39
|
+
opts.on('--ascii', 'Use characters in output. Default is false') do |value|
|
40
|
+
printer_options[:ascii] = value
|
41
|
+
end
|
42
|
+
|
43
|
+
opts.on('-t', '--targets x,y', Array, 'Select targets to display code coverage data') do |targets|
|
44
|
+
coverage_targets = targets
|
45
|
+
end
|
46
|
+
|
47
|
+
opts.on('-f', '--file FILENAME', 'Path to xccov generated json file') do |fname|
|
48
|
+
coverage_file_name = fname
|
49
|
+
end
|
50
|
+
|
51
|
+
opts.on_tail('-h', '--help', 'Show this help message') do
|
52
|
+
puts opts
|
53
|
+
exit
|
54
|
+
end
|
55
|
+
|
56
|
+
opts.on_tail('-v', '--version', 'Show xcperfect version') do
|
57
|
+
puts XCPerfect::VERSION
|
58
|
+
exit
|
59
|
+
end
|
60
|
+
|
61
|
+
opts.parse!
|
62
|
+
end
|
63
|
+
|
64
|
+
json = nil
|
65
|
+
|
66
|
+
if coverage_file_name. == ''
|
67
|
+
json = JSON.parse(STDIN.gets)
|
68
|
+
else
|
69
|
+
lines = File.readlines(coverage_file_name)
|
70
|
+
if lines.length == 1
|
71
|
+
json = JSON.parse(lines[0])
|
72
|
+
else
|
73
|
+
exit
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
json['name'] = 'Total coverage'
|
78
|
+
|
79
|
+
printer = XCPerfect::Printer.new(printer_options, json)
|
80
|
+
printer.pretty_print(coverage_targets)
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module XCPerfect
|
2
|
+
# ANSI applies color & style to the output to make it
|
3
|
+
# look more appealing to the eye
|
4
|
+
module ANSI
|
5
|
+
attr_accessor :colorize
|
6
|
+
|
7
|
+
FORMATTED_MATCHER = %r{\e\[(\d+)[;]?(\d+)?m(.*)\e\[0m}
|
8
|
+
|
9
|
+
EFFECT = {
|
10
|
+
reset: '0',
|
11
|
+
bold: '1',
|
12
|
+
underline: '4'
|
13
|
+
}.freeze
|
14
|
+
|
15
|
+
COLORS = {
|
16
|
+
black: '30',
|
17
|
+
red: '31',
|
18
|
+
green: '32',
|
19
|
+
yellow: '33',
|
20
|
+
blue: '34',
|
21
|
+
cyan: '36',
|
22
|
+
white: '37',
|
23
|
+
plain: '39'
|
24
|
+
}.freeze
|
25
|
+
|
26
|
+
def colorize?
|
27
|
+
!!@colorize
|
28
|
+
end
|
29
|
+
|
30
|
+
def white(text)
|
31
|
+
ansi_parse(text, :plain, :bold)
|
32
|
+
end
|
33
|
+
|
34
|
+
def red(text)
|
35
|
+
ansi_parse(text, :red)
|
36
|
+
end
|
37
|
+
|
38
|
+
def green(text)
|
39
|
+
ansi_parse(text, :green, :bold)
|
40
|
+
end
|
41
|
+
|
42
|
+
def cyan(text)
|
43
|
+
ansi_parse(text, :cyan)
|
44
|
+
end
|
45
|
+
|
46
|
+
def yellow(text)
|
47
|
+
ansi_parse(text, :yellow)
|
48
|
+
end
|
49
|
+
|
50
|
+
def applied_effects(text)
|
51
|
+
effects = []
|
52
|
+
if text =~ FORMATTED_MATCHER
|
53
|
+
colors = COLORS.invert[$1]
|
54
|
+
effect = EFFECT.invert[$2]
|
55
|
+
effects << colors if colors
|
56
|
+
effects << effect if effect
|
57
|
+
end
|
58
|
+
effects
|
59
|
+
end
|
60
|
+
|
61
|
+
def strip(text)
|
62
|
+
text =~ FORMATTED_MATCHER ? $3 : text
|
63
|
+
end
|
64
|
+
|
65
|
+
def ansi_parse(text, color, effect=nil)
|
66
|
+
return text unless colorize?
|
67
|
+
colors_code = COLORS[color] || ''
|
68
|
+
effect_code = EFFECT[effect] ? ';' + EFFECT[effect] : ''
|
69
|
+
"\e[#{colors_code}#{effect_code}m#{text}\e[#{EFFECT[:reset]}m"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module XCPerfect
|
2
|
+
# All prints all code coverage information provided by xccov
|
3
|
+
class All < Formatter
|
4
|
+
DOWN = '▼'.freeze
|
5
|
+
DOWN_ASCII = '->'.freeze
|
6
|
+
|
7
|
+
def pretty_name(target)
|
8
|
+
symbol = yellow(@use_ascii ? DOWN_ASCII : DOWN)
|
9
|
+
[symbol, white(target['name'])].join(' ')
|
10
|
+
end
|
11
|
+
|
12
|
+
def pretty_functions(file)
|
13
|
+
file['functions'].map do |function|
|
14
|
+
filename = file['name']
|
15
|
+
signature, covered, total, percentage = pretty_coverage_info(function)
|
16
|
+
line_stat = [covered, total].join(' / ').ljust(10)
|
17
|
+
stats = [line_stat, percentage].join("\t\t")
|
18
|
+
highlighted = Syntax.highlight(filename, signature)
|
19
|
+
delta = highlighted.length - signature.length
|
20
|
+
fill_size = (@terminal_width / 1.5) + delta
|
21
|
+
"\t\t" + [highlighted.ljust(fill_size), stats].join(' ')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def pretty_files(target)
|
26
|
+
target['files'].map do |file|
|
27
|
+
name = "\t" + pretty_name(file)
|
28
|
+
function = pretty_functions(file)
|
29
|
+
[name, function]
|
30
|
+
end.join("\n")
|
31
|
+
end
|
32
|
+
|
33
|
+
def pretty_format(desirables)
|
34
|
+
@parser.extract_targets(desirables).map do |target|
|
35
|
+
[pretty_name(target), pretty_files(target)]
|
36
|
+
end.join("\n")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'xcperfect/ansi'
|
2
|
+
require 'xcperfect/parser'
|
3
|
+
|
4
|
+
module XCPerfect
|
5
|
+
# Formatter is the base adopted by `all.rb` and `simple.rb`
|
6
|
+
class Formatter
|
7
|
+
include ANSI
|
8
|
+
|
9
|
+
attr_reader :parser
|
10
|
+
|
11
|
+
def initialize(use_ascii, colorize, json)
|
12
|
+
@use_ascii = use_ascii
|
13
|
+
@colorize = colorize
|
14
|
+
@parser = Parser.new(json)
|
15
|
+
@terminal_width = Integer(`tput cols`)
|
16
|
+
end
|
17
|
+
|
18
|
+
def pretty_format(___)
|
19
|
+
puts @json
|
20
|
+
end
|
21
|
+
|
22
|
+
def color_percentage(percentage)
|
23
|
+
percent_str = percentage.to_s + ' %'
|
24
|
+
|
25
|
+
case percentage.round
|
26
|
+
when 0..33
|
27
|
+
red(percent_str)
|
28
|
+
when 33...66
|
29
|
+
orange(percent_str)
|
30
|
+
when 66..100
|
31
|
+
green(percent_str)
|
32
|
+
else
|
33
|
+
raise "Percentage of #{percentage} % is not possible :("
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def pretty_coverage_info(target)
|
38
|
+
name, covered, total, percentage = @parser.extract_coverage_info(target)
|
39
|
+
[name, covered.to_s, total.to_s, color_percentage(percentage)]
|
40
|
+
end
|
41
|
+
|
42
|
+
def align_formats(arrays)
|
43
|
+
column_sizes = arrays.map(&:length)
|
44
|
+
common_column_size = column_sizes[0]
|
45
|
+
if column_sizes.to_set.length != 1
|
46
|
+
puts column_sizes
|
47
|
+
raise 'All rows must have same number of columns to be aligned'
|
48
|
+
end
|
49
|
+
|
50
|
+
(0...common_column_size).map do |column|
|
51
|
+
width = arrays.map { |row| strip(row[column]).length }.max
|
52
|
+
(width * 1.5).round
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def align(arrays)
|
57
|
+
widths = align_formats(arrays)
|
58
|
+
arrays.map do |row|
|
59
|
+
row.each_with_index.map do |column, idx|
|
60
|
+
column.ljust(widths[idx])
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module XCPerfect
|
2
|
+
# Simple just prints the following information
|
3
|
+
# - Target Name
|
4
|
+
# - Number of lines hit
|
5
|
+
# - Total number of lines
|
6
|
+
# - Coverage percentage
|
7
|
+
class Simple < Formatter
|
8
|
+
def pretty_format(desirables)
|
9
|
+
output = [['Target', 'Covered', 'Out of', 'Percentage']]
|
10
|
+
|
11
|
+
@parser.extract_targets(desirables).each do |target|
|
12
|
+
output << pretty_coverage_info(target)
|
13
|
+
end
|
14
|
+
output << pretty_coverage_info(@parser.json)
|
15
|
+
|
16
|
+
rows = align(output)
|
17
|
+
sentences = rows.map { |row| row.join(' ') }
|
18
|
+
|
19
|
+
divider = '-' * sentences[0].length
|
20
|
+
sentences[0] = white(sentences[0])
|
21
|
+
|
22
|
+
sentences.insert(1, divider)
|
23
|
+
sentences.insert(sentences.length - 1, divider).join("\n")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module XCPerfect
|
2
|
+
# Parser is used by `Formatter`s to extract information from the
|
3
|
+
# JSON file generated by xccov
|
4
|
+
class Parser
|
5
|
+
KEY_TARGETS = 'targets'.freeze
|
6
|
+
KEY_EXECUTABLE_LINES = 'executableLines'.freeze
|
7
|
+
KEY_COVERED_LINES = 'coveredLines'.freeze
|
8
|
+
|
9
|
+
attr_accessor :json
|
10
|
+
|
11
|
+
def initialize(json)
|
12
|
+
@json = json
|
13
|
+
end
|
14
|
+
|
15
|
+
def all_targets
|
16
|
+
@json[KEY_TARGETS]
|
17
|
+
end
|
18
|
+
|
19
|
+
def extract_targets(desirables)
|
20
|
+
if desirables.length.zero?
|
21
|
+
all_targets
|
22
|
+
else
|
23
|
+
all_targets.select do |target_info|
|
24
|
+
pure_name = target_info['name'].split('.')
|
25
|
+
pure_name.pop(1)
|
26
|
+
pure_name = pure_name.join('.')
|
27
|
+
desirables.include?(pure_name)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def extract_coverage_info(target)
|
33
|
+
[
|
34
|
+
target['name'],
|
35
|
+
covered_line_num(target),
|
36
|
+
total_line_num(target),
|
37
|
+
coverage_percentage(target)
|
38
|
+
]
|
39
|
+
end
|
40
|
+
|
41
|
+
def coverage_percentage(target)
|
42
|
+
(target['lineCoverage'] * 100).round(2)
|
43
|
+
end
|
44
|
+
|
45
|
+
def covered_line_num(target)
|
46
|
+
target['coveredLines']
|
47
|
+
end
|
48
|
+
|
49
|
+
def total_line_num(target)
|
50
|
+
target['executableLines']
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'xcperfect/ansi'
|
2
|
+
|
3
|
+
module XCPerfect
|
4
|
+
# Printer handles the initialization of the output formatter
|
5
|
+
# and is directly called by the main `xcperfect` file during execution
|
6
|
+
class Printer
|
7
|
+
attr_reader :formatter
|
8
|
+
|
9
|
+
def initialize(params, json)
|
10
|
+
klass = params[:formatter]
|
11
|
+
@formatter = klass.new(params[:ascii], params[:colorize], json)
|
12
|
+
end
|
13
|
+
|
14
|
+
def pretty_print(targets)
|
15
|
+
formatted_text = formatter.pretty_format(targets)
|
16
|
+
STDOUT.print(formatted_text + "\n")
|
17
|
+
STDOUT.flush
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# Credit to xcpretty
|
2
|
+
# https://github.com/supermarin/xcpretty/blob/a770f152903f4eb672f5bae0a7fa6ecc4e35b397/lib/xcpretty/syntax.rb
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rouge'
|
6
|
+
rescue LoadError
|
7
|
+
# rubocop:disable Style/ConstantName
|
8
|
+
Rouge = nil
|
9
|
+
# rubocop:enable Style/ConstantName
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'xcpretty/snippet'
|
13
|
+
|
14
|
+
module XCPerfect
|
15
|
+
# Syntax highlights the function signatures displayed to the user
|
16
|
+
# while using the `all.rb` formatter
|
17
|
+
module Syntax
|
18
|
+
def self.highlight(filename, line)
|
19
|
+
return signature unless Rouge
|
20
|
+
highlight_with_formatter(filename, line, Rouge::Formatters::Terminal256.new)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.highlight_with_formatter(filename, line, formatter)
|
24
|
+
lexer = find_lexer(filename, line)
|
25
|
+
if lexer
|
26
|
+
formatter.format(lexer.lex(line)).rstrip
|
27
|
+
else
|
28
|
+
line
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# @param [String] filename The filename
|
33
|
+
# @param String line of code to be highlighted
|
34
|
+
# @return [Rouge::Lexer]
|
35
|
+
def self.find_lexer(filename, line)
|
36
|
+
case File.extname(filename)
|
37
|
+
when '.cpp', '.cc', '.c++', '.cxx', '.hpp', '.h++', '.hxx'
|
38
|
+
Rouge::Lexers::Cpp
|
39
|
+
when '.m', '.h' then Rouge::Lexers::ObjectiveC
|
40
|
+
when '.swift' then Rouge::Lexers::Swift
|
41
|
+
when '.ruby', '.rb' then Rouge::Lexers::Ruby
|
42
|
+
else
|
43
|
+
options = {
|
44
|
+
filename: File.basename(filename),
|
45
|
+
source: line
|
46
|
+
}
|
47
|
+
Rouge::Lexer.guesses(options).first
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/xcperfect.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'xcperfect/version'
|
2
|
+
require 'xcperfect/printer'
|
3
|
+
require 'xcperfect/parser'
|
4
|
+
require 'xcperfect/syntax'
|
5
|
+
require 'xcperfect/formatters/formatter'
|
6
|
+
require 'xcperfect/formatters/all'
|
7
|
+
require 'xcperfect/formatters/simple'
|
8
|
+
|
9
|
+
# XCPerfect contains class level functions
|
10
|
+
module XCPerfect
|
11
|
+
def self.exit_with_error(message)
|
12
|
+
$stderr.puts "[!] #{message}"
|
13
|
+
exit 1
|
14
|
+
end
|
15
|
+
end
|
data/xcperfect.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'xcperfect/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'xcperfect'
|
7
|
+
spec.version = XCPerfect::VERSION
|
8
|
+
spec.authors = ['Mike JS. Choi']
|
9
|
+
spec.email = ['mkchoi212@icloud.com']
|
10
|
+
spec.required_ruby_version = '>= 2.0.0'
|
11
|
+
spec.description =
|
12
|
+
%q{
|
13
|
+
Formatter for Apple's xccov json output because who doesn't
|
14
|
+
like pretty outputs? Am I rite?
|
15
|
+
}
|
16
|
+
spec.summary = %q(Make your xccov outputs prettier)
|
17
|
+
spec.homepage = 'https://github.com/mkchoi212/xcperfect'
|
18
|
+
spec.license = 'MIT'
|
19
|
+
|
20
|
+
spec.files = `git ls-files`.split($/)
|
21
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
22
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
23
|
+
spec.require_paths = ['lib']
|
24
|
+
|
25
|
+
spec.add_dependency 'rouge', '~> 2.0.7'
|
26
|
+
|
27
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
28
|
+
spec.add_development_dependency 'rake'
|
29
|
+
spec.add_development_dependency 'rubocop', '~> 0.49.0'
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: xcperfect
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mike JS. Choi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-06-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rouge
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.0.7
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.0.7
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubocop
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.49.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.49.0
|
69
|
+
description: "\n Formatter for Apple's xccov json output because who doesn't\n
|
70
|
+
\ like pretty outputs? Am I rite?\n "
|
71
|
+
email:
|
72
|
+
- mkchoi212@icloud.com
|
73
|
+
executables:
|
74
|
+
- xcperfect
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files: []
|
77
|
+
files:
|
78
|
+
- ".gitignore"
|
79
|
+
- ".rubocop.yml"
|
80
|
+
- ".travis.yml"
|
81
|
+
- Gemfile
|
82
|
+
- LICENSE.md
|
83
|
+
- README.md
|
84
|
+
- Rakefile
|
85
|
+
- assets/banner.png
|
86
|
+
- assets/banner.sketch
|
87
|
+
- assets/coverage.json
|
88
|
+
- assets/simple_formatter.png
|
89
|
+
- bin/xcperfect
|
90
|
+
- lib/xcperfect.rb
|
91
|
+
- lib/xcperfect/ansi.rb
|
92
|
+
- lib/xcperfect/formatters/all.rb
|
93
|
+
- lib/xcperfect/formatters/formatter.rb
|
94
|
+
- lib/xcperfect/formatters/simple.rb
|
95
|
+
- lib/xcperfect/parser.rb
|
96
|
+
- lib/xcperfect/printer.rb
|
97
|
+
- lib/xcperfect/syntax.rb
|
98
|
+
- lib/xcperfect/version.rb
|
99
|
+
- xcperfect.gemspec
|
100
|
+
homepage: https://github.com/mkchoi212/xcperfect
|
101
|
+
licenses:
|
102
|
+
- MIT
|
103
|
+
metadata: {}
|
104
|
+
post_install_message:
|
105
|
+
rdoc_options: []
|
106
|
+
require_paths:
|
107
|
+
- lib
|
108
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 2.0.0
|
113
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
requirements: []
|
119
|
+
rubyforge_project:
|
120
|
+
rubygems_version: 2.5.2
|
121
|
+
signing_key:
|
122
|
+
specification_version: 4
|
123
|
+
summary: Make your xccov outputs prettier
|
124
|
+
test_files: []
|