@@ -203,3 +203,87 @@ mod test {
203203 run_hash_chain_test ( [ 0u8 ; 32 ] , 100 , 55 ) ;
204204 }
205205}
206+
207+ #[ cfg( test) ]
208+ mod hash_chain_state_test {
209+ use {
210+ crate :: state:: { HashChainState , PebbleHashChain } ,
211+ anyhow:: Result ,
212+ } ;
213+
214+ #[ test]
215+ fn test_from_chain_at_offset ( ) {
216+ let chain = PebbleHashChain :: new ( [ 0u8 ; 32 ] , 10 , 1 ) ;
217+ let hash_chain_state = HashChainState :: from_chain_at_offset ( 5 , chain) ;
218+
219+ assert_eq ! ( hash_chain_state. offsets. len( ) , 1 ) ;
220+ assert_eq ! ( hash_chain_state. hash_chains. len( ) , 1 ) ;
221+ assert_eq ! ( hash_chain_state. offsets[ 0 ] , 5 ) ;
222+ }
223+
224+ #[ test]
225+ fn test_reveal_valid_sequence ( ) -> Result < ( ) > {
226+ let chain = PebbleHashChain :: new ( [ 0u8 ; 32 ] , 10 , 1 ) ;
227+ let expected_hash = chain. reveal_ith ( 3 ) ?;
228+
229+ let hash_chain_state = HashChainState :: from_chain_at_offset ( 5 , chain) ;
230+ let result = hash_chain_state. reveal ( 8 ) ?;
231+
232+ assert_eq ! ( result, expected_hash) ;
233+ Ok ( ( ) )
234+ }
235+
236+ #[ test]
237+ fn test_reveal_sequence_too_small ( ) {
238+ let chain = PebbleHashChain :: new ( [ 0u8 ; 32 ] , 10 , 1 ) ;
239+ let hash_chain_state = HashChainState :: from_chain_at_offset ( 5 , chain) ;
240+
241+ let result = hash_chain_state. reveal ( 4 ) ;
242+ assert ! ( result. is_err( ) ) ;
243+ }
244+
245+ #[ test]
246+ fn test_reveal_sequence_too_large ( ) {
247+ let chain = PebbleHashChain :: new ( [ 0u8 ; 32 ] , 10 , 1 ) ;
248+ let hash_chain_state = HashChainState :: from_chain_at_offset ( 5 , chain) ;
249+
250+ let result = hash_chain_state. reveal ( 15 ) ;
251+ assert ! ( result. is_err( ) ) ;
252+ }
253+
254+ #[ test]
255+ fn test_multiple_hash_chains ( ) -> Result < ( ) > {
256+ let chain1 = PebbleHashChain :: new ( [ 0u8 ; 32 ] , 10 , 1 ) ;
257+ let expected_hash1 = chain1. reveal_ith ( 3 ) ?;
258+
259+ let chain2 = PebbleHashChain :: new ( [ 1u8 ; 32 ] , 10 , 1 ) ;
260+ let expected_hash2 = chain2. reveal_ith ( 3 ) ?;
261+
262+ let mut hash_chain_state = HashChainState :: from_chain_at_offset ( 5 , chain1) ;
263+ hash_chain_state. offsets . push ( 20 ) ;
264+ hash_chain_state. hash_chains . push ( chain2) ;
265+
266+ let result1 = hash_chain_state. reveal ( 8 ) ?;
267+ assert_eq ! ( result1, expected_hash1) ;
268+
269+ let result2 = hash_chain_state. reveal ( 23 ) ?;
270+ assert_eq ! ( result2, expected_hash2) ;
271+
272+ let result3 = hash_chain_state. reveal ( 15 ) ;
273+ assert ! ( result3. is_err( ) ) ;
274+
275+ Ok ( ( ) )
276+ }
277+
278+ #[ test]
279+ fn test_reveal_at_offset ( ) -> Result < ( ) > {
280+ let chain = PebbleHashChain :: new ( [ 0u8 ; 32 ] , 10 , 1 ) ;
281+ let expected_hash = chain. reveal_ith ( 0 ) ?;
282+
283+ let hash_chain_state = HashChainState :: from_chain_at_offset ( 5 , chain) ;
284+ let result = hash_chain_state. reveal ( 5 ) ?;
285+
286+ assert_eq ! ( result, expected_hash) ;
287+ Ok ( ( ) )
288+ }
289+ }
0 commit comments