1
+ const assert = require ( 'assert' ) ;
2
+ const util = require ( './../util/util.js' ) ;
3
+ const Coverage = require ( './../../lib/coverage' ) ;
4
+ const Api = require ( './../../lib/api' )
5
+
6
+ describe . only ( 'try / catch branches' , ( ) => {
7
+ let coverage ;
8
+ let api ;
9
+
10
+ before ( async ( ) => api = new Api ( { silent : true } ) ) ;
11
+ beforeEach ( ( ) => coverage = new Coverage ( ) ) ;
12
+ after ( async ( ) => await api . finish ( ) ) ;
13
+
14
+ it ( 'should cover a try/catch statement with empty blocks (success branch only)' , async function ( ) {
15
+ const contract = await util . bootstrapCoverage ( 'try/try-catch-empty-blocks' , api , this . provider , ) ;
16
+ coverage . addContract ( contract . instrumented , util . filePath ) ;
17
+ await contract . instance . a ( true , contract . gas ) ;
18
+ const mapping = coverage . generate ( contract . data , util . pathPrefix ) ;
19
+
20
+ assert . deepEqual ( mapping [ util . filePath ] . l , {
21
+ 5 :1 , 9 :1
22
+ } ) ;
23
+ assert . deepEqual ( mapping [ util . filePath ] . b , {
24
+ 1 :[ 1 , 0 ]
25
+ } ) ;
26
+ assert . deepEqual ( mapping [ util . filePath ] . s , {
27
+ 1 :1 , 2 :1
28
+ } ) ;
29
+ assert . deepEqual ( mapping [ util . filePath ] . f , {
30
+ 1 :1 , 2 :1
31
+ } ) ;
32
+ } ) ;
33
+
34
+ it ( 'should cover a try/catch statement with empty blocks (both branches)' , async function ( ) {
35
+ const contract = await util . bootstrapCoverage ( 'try/try-catch-empty-blocks' , api , this . provider , ) ;
36
+ coverage . addContract ( contract . instrumented , util . filePath ) ;
37
+ await contract . instance . a ( true , contract . gas ) ;
38
+
39
+ try { await contract . instance . a ( false , contract . gas ) } catch ( err ) { /* ignore */ }
40
+
41
+ const mapping = coverage . generate ( contract . data , util . pathPrefix ) ;
42
+
43
+ assert . deepEqual ( mapping [ util . filePath ] . l , {
44
+ 5 :2 , 9 :2
45
+ } ) ;
46
+ assert . deepEqual ( mapping [ util . filePath ] . b , {
47
+ 1 :[ 1 , 1 ]
48
+ } ) ;
49
+ assert . deepEqual ( mapping [ util . filePath ] . s , {
50
+ 1 :2 , 2 :2
51
+ } ) ;
52
+ assert . deepEqual ( mapping [ util . filePath ] . f , {
53
+ 1 :2 , 2 :2
54
+ } ) ;
55
+ } ) ;
56
+
57
+ it ( 'should cover a try/catch statement with an Error block (success branch only)' , async function ( ) {
58
+ const contract = await util . bootstrapCoverage ( 'try/try-error-block' , api , this . provider , ) ;
59
+ coverage . addContract ( contract . instrumented , util . filePath ) ;
60
+ await contract . instance . a ( true , contract . gas ) ;
61
+
62
+ const mapping = coverage . generate ( contract . data , util . pathPrefix ) ;
63
+
64
+ assert . deepEqual ( mapping [ util . filePath ] . l , {
65
+ 5 :1 , 6 :1 , 10 :1 , 11 :1 , 13 :0
66
+ } ) ;
67
+ assert . deepEqual ( mapping [ util . filePath ] . b , {
68
+ 1 :[ 1 , 0 ]
69
+ } ) ;
70
+ assert . deepEqual ( mapping [ util . filePath ] . s , {
71
+ 1 :1 , 2 :1 , 3 :1 , 4 :1 , 5 :0
72
+ } ) ;
73
+ assert . deepEqual ( mapping [ util . filePath ] . f , {
74
+ 1 :1 , 2 :1
75
+ } ) ;
76
+ } ) ;
77
+
78
+ it ( 'should cover a try/catch statement with an Error block (both branches)' , async function ( ) {
79
+ const contract = await util . bootstrapCoverage ( 'try/try-error-block' , api , this . provider , ) ;
80
+ coverage . addContract ( contract . instrumented , util . filePath ) ;
81
+
82
+ await contract . instance . a ( true , contract . gas ) ;
83
+ try { await contract . instance . a ( false , contract . gas ) } catch ( err ) { /* ignore */ }
84
+
85
+ const mapping = coverage . generate ( contract . data , util . pathPrefix ) ;
86
+
87
+ assert . deepEqual ( mapping [ util . filePath ] . l , {
88
+ 5 :2 , 6 :1 , 10 :2 , 11 :1 , 13 :1
89
+ } ) ;
90
+ assert . deepEqual ( mapping [ util . filePath ] . b , {
91
+ 1 :[ 1 , 1 ]
92
+ } ) ;
93
+ assert . deepEqual ( mapping [ util . filePath ] . s , {
94
+ 1 :2 , 2 :1 , 3 :2 , 4 :1 , 5 :1
95
+ } ) ;
96
+ assert . deepEqual ( mapping [ util . filePath ] . f , {
97
+ 1 :2 , 2 :2
98
+ } ) ;
99
+ } ) ;
100
+
101
+ it ( 'should cover a try/catch statement with multi-block catch clauses (middle-block)' , async function ( ) {
102
+ const contract = await util . bootstrapCoverage ( 'try/try-multi-block' , api , this . provider , ) ;
103
+ coverage . addContract ( contract . instrumented , util . filePath ) ;
104
+
105
+ await contract . instance . a ( 0 , contract . gas ) ;
106
+ try { await contract . instance . a ( 2 , contract . gas ) } catch ( err ) { /* ignore */ }
107
+
108
+ const mapping = coverage . generate ( contract . data , util . pathPrefix ) ;
109
+
110
+ assert . deepEqual ( mapping [ util . filePath ] . l , {
111
+ 5 :2 , 6 :2 , 8 :2 , 9 :1 , 10 :1 , 11 :0 , 12 :1 , 13 :1 , 14 :0 , 15 :0 , 19 :2 , 20 :1 , 22 :0 , 24 :1 , 26 :0
112
+ } ) ;
113
+ assert . deepEqual ( mapping [ util . filePath ] . b , {
114
+ 1 :[ 1 , 1 ] , 2 :[ 0 , 1 ] , 3 :[ 0 , 0 ] , 4 :[ 1 , 0 ] , 5 :[ 0 , 0 ]
115
+ } ) ;
116
+ assert . deepEqual ( mapping [ util . filePath ] . s , {
117
+ 1 :2 , 2 :2 , 3 :2 , 4 :1 , 5 :1 , 6 :0 , 7 :1 , 8 :1 , 9 :0 , 10 :0 , 11 :2 , 12 :1 , 13 :0 , 14 :1 , 15 :0
118
+ } ) ;
119
+ assert . deepEqual ( mapping [ util . filePath ] . f , {
120
+ 1 :2 , 2 :2
121
+ } ) ;
122
+ } ) ;
123
+ } ) ;
0 commit comments