1
1
use ckb_testtool:: {
2
+ ckb_hash:: blake2b_256,
2
3
ckb_types:: { bytes:: Bytes , core:: TransactionBuilder , packed:: * , prelude:: * } ,
3
4
context:: Context ,
4
5
} ;
5
6
6
7
use crate :: { prelude:: * , utilities, Loader } ;
7
8
8
- fn run_test ( inputs_capacity : & [ u64 ] , outputs_capacity : & [ u64 ] ) {
9
+ struct Case {
10
+ inputs_capacity : Vec < u64 > ,
11
+ outputs_capacity : Vec < u64 > ,
12
+ unlocked : bool ,
13
+ should_pass : bool ,
14
+ }
15
+
16
+ fn run_test ( case : & Case ) {
9
17
utilities:: setup ( ) ;
10
18
11
19
let loader = Loader :: default ( ) ;
12
20
let mut context = Context :: default ( ) ;
13
21
22
+ const PASSWORD : & [ u8 ] = & [ 0x12 , 0x34 , 0x56 , 0x78 ] ;
23
+
14
24
// Deploy the lock script.
15
25
let lock_script = {
16
26
let lock_bin = loader. load_binary ( "can-update-without-ownership-lock" ) ;
17
27
let lock_out_point = context. deploy_cell ( lock_bin) ;
28
+ let args = blake2b_256 ( PASSWORD ) ;
18
29
context
19
30
. build_script ( & lock_out_point, Default :: default ( ) )
20
31
. expect ( "script" )
21
32
. as_builder ( )
22
- . args ( [ 0u8 , 1 , 2 , 3 ] . pack ( ) )
33
+ . args ( ( args [ .. ] ) . pack ( ) )
23
34
. build ( )
24
35
} ;
25
36
26
- let inputs = inputs_capacity
37
+ let inputs = case
38
+ . inputs_capacity
27
39
. iter ( )
28
40
. map ( |cap| {
29
41
let output = CellOutput :: new_builder ( )
@@ -35,7 +47,8 @@ fn run_test(inputs_capacity: &[u64], outputs_capacity: &[u64]) {
35
47
} )
36
48
. collect :: < Vec < _ > > ( ) ;
37
49
38
- let outputs = outputs_capacity
50
+ let outputs = case
51
+ . outputs_capacity
39
52
. iter ( )
40
53
. map ( |cap| {
41
54
CellOutput :: new_builder ( )
@@ -46,67 +59,164 @@ fn run_test(inputs_capacity: &[u64], outputs_capacity: &[u64]) {
46
59
. collect :: < Vec < _ > > ( ) ;
47
60
let outputs_data = vec ! [ Bytes :: new( ) ; outputs. len( ) ] ;
48
61
49
- let tx = TransactionBuilder :: default ( )
62
+ let tx_builder = TransactionBuilder :: default ( )
50
63
. inputs ( inputs)
51
64
. outputs ( outputs)
52
- . outputs_data ( outputs_data. pack ( ) )
53
- . build ( ) ;
65
+ . outputs_data ( outputs_data. pack ( ) ) ;
66
+ let tx = if case. unlocked {
67
+ let witness = {
68
+ let type_args = BytesOpt :: new_builder ( )
69
+ . set ( Some ( Pack :: pack ( PASSWORD ) ) )
70
+ . build ( ) ;
71
+ let witness_args = WitnessArgs :: new_builder ( ) . lock ( type_args) . build ( ) ;
72
+ witness_args. as_bytes ( )
73
+ } ;
74
+ tx_builder. witness ( witness. pack ( ) )
75
+ } else {
76
+ tx_builder
77
+ }
78
+ . build ( ) ;
54
79
let tx = context. complete_tx ( tx) ;
55
80
56
- let inputs_total: u64 = inputs_capacity. iter ( ) . copied ( ) . sum ( ) ;
57
- let outputs_total: u64 = outputs_capacity. iter ( ) . copied ( ) . sum ( ) ;
58
- if inputs_total > outputs_total {
59
- let _ = context . should_be_failed ( & tx , MAX_CYCLES ) ;
60
- } else {
81
+ let inputs_total: u64 = case . inputs_capacity . iter ( ) . copied ( ) . sum ( ) ;
82
+ let outputs_total: u64 = case . outputs_capacity . iter ( ) . copied ( ) . sum ( ) ;
83
+ let expected_result = case . unlocked || inputs_total <= outputs_total;
84
+ assert_eq ! ( case . should_pass , expected_result ) ;
85
+ if case . should_pass {
61
86
let _ = context. should_be_passed ( & tx, MAX_CYCLES ) ;
87
+ } else {
88
+ let _ = context. should_be_failed ( & tx, MAX_CYCLES ) ;
62
89
}
63
90
}
64
91
65
92
#[ test]
66
- fn lost_capacity_case_1 ( ) {
67
- let inputs_capacity = vec ! [ 1000 ] ;
68
- let outputs_capacity = vec ! [ 1000 ] ;
69
- run_test ( & inputs_capacity, & outputs_capacity) ;
93
+ fn unchanged_case_1 ( ) {
94
+ let case = Case {
95
+ inputs_capacity : vec ! [ 1000 ] ,
96
+ outputs_capacity : vec ! [ 1000 ] ,
97
+ unlocked : false ,
98
+ should_pass : true ,
99
+ } ;
100
+ run_test ( & case) ;
70
101
}
71
102
72
103
#[ test]
73
- fn lost_capacity_case_2 ( ) {
74
- let inputs_capacity = vec ! [ 999 ] ;
75
- let outputs_capacity = vec ! [ 1000 ] ;
76
- run_test ( & inputs_capacity, & outputs_capacity) ;
104
+ fn unchanged_case_2 ( ) {
105
+ let case = Case {
106
+ inputs_capacity : vec ! [ 499 , 501 ] ,
107
+ outputs_capacity : vec ! [ 1000 ] ,
108
+ unlocked : false ,
109
+ should_pass : true ,
110
+ } ;
111
+ run_test ( & case) ;
77
112
}
78
113
79
114
#[ test]
80
- fn lost_capacity_case_3 ( ) {
81
- let inputs_capacity = vec ! [ 1000 ] ;
82
- let outputs_capacity = vec ! [ 999 ] ;
83
- run_test ( & inputs_capacity, & outputs_capacity) ;
115
+ fn unchanged_case_3 ( ) {
116
+ let case = Case {
117
+ inputs_capacity : vec ! [ 1000 ] ,
118
+ outputs_capacity : vec ! [ 499 , 501 ] ,
119
+ unlocked : false ,
120
+ should_pass : true ,
121
+ } ;
122
+ run_test ( & case) ;
84
123
}
85
124
86
125
#[ test]
87
- fn lost_capacity_case_4 ( ) {
88
- let inputs_capacity = vec ! [ 500 , 500 ] ;
89
- let outputs_capacity = vec ! [ 999 ] ;
90
- run_test ( & inputs_capacity, & outputs_capacity) ;
126
+ fn increase_case_1 ( ) {
127
+ let case = Case {
128
+ inputs_capacity : vec ! [ 1000 ] ,
129
+ outputs_capacity : vec ! [ 1001 ] ,
130
+ unlocked : false ,
131
+ should_pass : true ,
132
+ } ;
133
+ run_test ( & case) ;
91
134
}
92
135
93
136
#[ test]
94
- fn lost_capacity_case_5 ( ) {
95
- let inputs_capacity = vec ! [ 500 , 500 ] ;
96
- let outputs_capacity = vec ! [ 1001 ] ;
97
- run_test ( & inputs_capacity, & outputs_capacity) ;
137
+ fn increase_case_2 ( ) {
138
+ let case = Case {
139
+ inputs_capacity : vec ! [ 499 , 501 ] ,
140
+ outputs_capacity : vec ! [ 1001 ] ,
141
+ unlocked : false ,
142
+ should_pass : true ,
143
+ } ;
144
+ run_test ( & case) ;
98
145
}
99
146
100
147
#[ test]
101
- fn lost_capacity_case_6 ( ) {
102
- let inputs_capacity = vec ! [ 250 , 250 , 250 , 250 ] ;
103
- let outputs_capacity = vec ! [ 500 , 501 ] ;
104
- run_test ( & inputs_capacity, & outputs_capacity) ;
148
+ fn increase_case_3 ( ) {
149
+ let case = Case {
150
+ inputs_capacity : vec ! [ 1000 ] ,
151
+ outputs_capacity : vec ! [ 500 , 501 ] ,
152
+ unlocked : false ,
153
+ should_pass : true ,
154
+ } ;
155
+ run_test ( & case) ;
105
156
}
106
157
107
158
#[ test]
108
- fn lost_capacity_case_7 ( ) {
109
- let inputs_capacity = vec ! [ 250 , 250 , 250 , 250 ] ;
110
- let outputs_capacity = vec ! [ 500 , 499 ] ;
111
- run_test ( & inputs_capacity, & outputs_capacity) ;
159
+ fn decrease_case_1a ( ) {
160
+ let case = Case {
161
+ inputs_capacity : vec ! [ 1000 ] ,
162
+ outputs_capacity : vec ! [ 999 ] ,
163
+ unlocked : false ,
164
+ should_pass : false ,
165
+ } ;
166
+ run_test ( & case) ;
167
+ }
168
+
169
+ #[ test]
170
+ fn decrease_case_1b ( ) {
171
+ let case = Case {
172
+ inputs_capacity : vec ! [ 1000 ] ,
173
+ outputs_capacity : vec ! [ 999 ] ,
174
+ unlocked : true ,
175
+ should_pass : true ,
176
+ } ;
177
+ run_test ( & case) ;
178
+ }
179
+
180
+ #[ test]
181
+ fn decrease_case_2a ( ) {
182
+ let case = Case {
183
+ inputs_capacity : vec ! [ 499 , 501 ] ,
184
+ outputs_capacity : vec ! [ 999 ] ,
185
+ unlocked : false ,
186
+ should_pass : false ,
187
+ } ;
188
+ run_test ( & case) ;
189
+ }
190
+
191
+ #[ test]
192
+ fn decrease_case_2b ( ) {
193
+ let case = Case {
194
+ inputs_capacity : vec ! [ 499 , 501 ] ,
195
+ outputs_capacity : vec ! [ 999 ] ,
196
+ unlocked : true ,
197
+ should_pass : true ,
198
+ } ;
199
+ run_test ( & case) ;
200
+ }
201
+
202
+ #[ test]
203
+ fn decrease_case_3a ( ) {
204
+ let case = Case {
205
+ inputs_capacity : vec ! [ 1000 ] ,
206
+ outputs_capacity : vec ! [ 499 , 500 ] ,
207
+ unlocked : false ,
208
+ should_pass : false ,
209
+ } ;
210
+ run_test ( & case) ;
211
+ }
212
+
213
+ #[ test]
214
+ fn decrease_case_3b ( ) {
215
+ let case = Case {
216
+ inputs_capacity : vec ! [ 1000 ] ,
217
+ outputs_capacity : vec ! [ 499 , 500 ] ,
218
+ unlocked : true ,
219
+ should_pass : true ,
220
+ } ;
221
+ run_test ( & case) ;
112
222
}
0 commit comments