@@ -333,4 +333,91 @@ module PersistentHashMapTests =
333333 ! x
334334 |> PersistentHashMap.containsKey(( r.Next n). ToString())
335335 |> Expect.isTrue " Next"
336+ }
337+
338+ test " tryFind returns Some for existing key" {
339+ let m = PersistentHashMap.ofSeq [ ( " a" , 1 ); ( " b" , 2 ) ]
340+ Expect.equal " tryFind existing" ( Some 1 ) ( PersistentHashMap.tryFind " a" m)
341+ }
342+
343+ test " tryFind returns None for missing key" {
344+ let m = PersistentHashMap.ofSeq [ ( " a" , 1 ) ]
345+ Expect.equal " tryFind missing" None ( PersistentHashMap.tryFind " z" m)
346+ }
347+
348+ test " filter keeps only matching entries" {
349+ let m = PersistentHashMap.ofSeq [ ( 1 , " a" ); ( 2 , " b" ); ( 3 , " c" ) ]
350+ let result = PersistentHashMap.filter ( fun k _ -> k > 1 ) m
351+ Expect.equal " filter count" 2 ( PersistentHashMap.count result)
352+ Expect.isFalse " filter excludes 1" ( PersistentHashMap.containsKey 1 result)
353+ Expect.isTrue " filter keeps 2" ( PersistentHashMap.containsKey 2 result)
354+ }
355+
356+ test " iter visits all entries" {
357+ let m = PersistentHashMap.ofSeq [ ( 1 , 10 ); ( 2 , 20 ); ( 3 , 30 ) ]
358+ let seen = System.Collections.Generic.HashSet< int>()
359+ PersistentHashMap.iter ( fun k _ -> seen.Add( k) |> ignore) m
360+ Expect.equal " iter visits all" 3 seen.Count
361+ }
362+
363+ test " fold sums all values" {
364+ let m = PersistentHashMap.ofSeq [ ( " a" , 1 ); ( " b" , 2 ); ( " c" , 3 ) ]
365+ let total = PersistentHashMap.fold ( fun acc _ v -> acc + v) 0 m
366+ Expect.equal " fold sum" 6 total
367+ }
368+
369+ test " exists returns true when predicate matches" {
370+ let m = PersistentHashMap.ofSeq [ ( 1 , " x" ); ( 2 , " y" ) ]
371+ Expect.isTrue " exists" ( PersistentHashMap.exists ( fun k _ -> k = 2 ) m)
372+ }
373+
374+ test " exists returns false when no match" {
375+ let m = PersistentHashMap.ofSeq [ ( 1 , " x" ); ( 2 , " y" ) ]
376+ Expect.isFalse " exists false" ( PersistentHashMap.exists ( fun k _ -> k = 99 ) m)
377+ }
378+
379+ test " forall returns true when all entries match" {
380+ let m = PersistentHashMap.ofSeq [ ( 1 , 10 ); ( 2 , 20 ) ]
381+ Expect.isTrue " forall" ( PersistentHashMap.forall ( fun _ v -> v > 0 ) m)
382+ }
383+
384+ test " forall returns false when some entry does not match" {
385+ let m = PersistentHashMap.ofSeq [ ( 1 , 10 ); ( 2 , - 1 ) ]
386+ Expect.isFalse " forall false" ( PersistentHashMap.forall ( fun _ v -> v > 0 ) m)
387+ }
388+
389+ test " choose keeps and transforms matching entries" {
390+ let m = PersistentHashMap.ofSeq [ ( 1 , 10 ); ( 2 , 20 ); ( 3 , 30 ) ]
391+
392+ let result =
393+ PersistentHashMap.choose ( fun _ v -> if v > 15 then Some( v * 2 ) else None) m
394+
395+ Expect.equal " choose count" 2 ( PersistentHashMap.count result)
396+ Expect.equal " choose value" 40 ( PersistentHashMap.find 2 result)
397+ }
398+
399+ test " toList round-trips via ofList" {
400+ let pairs = [ ( 1 , " one" ); ( 2 , " two" ); ( 3 , " three" ) ]
401+ let m = PersistentHashMap.ofList pairs
402+ let result = PersistentHashMap.toList m |> List.sortBy fst
403+ Expect.equal " toList/ofList round-trip" ( pairs |> List.sortBy fst) result
404+ }
405+
406+ test " toArray round-trips via ofArray" {
407+ let pairs = [| ( 1 , " one" ); ( 2 , " two" ) |]
408+ let m = PersistentHashMap.ofArray pairs
409+ let result = PersistentHashMap.toArray m |> Array.sortBy fst
410+ Expect.equal " toArray/ofArray round-trip" ( pairs |> Array.sortBy fst) result
411+ }
412+
413+ test " keys returns all keys" {
414+ let m = PersistentHashMap.ofSeq [ ( 1 , " a" ); ( 2 , " b" ); ( 3 , " c" ) ]
415+ let ks = PersistentHashMap.keys m |> Seq.sort |> Seq.toList
416+ Expect.equal " keys" [ 1 ; 2 ; 3 ] ks
417+ }
418+
419+ test " values returns all values" {
420+ let m = PersistentHashMap.ofSeq [ ( " a" , 1 ); ( " b" , 2 ); ( " c" , 3 ) ]
421+ let vs = PersistentHashMap.values m |> Seq.sort |> Seq.toList
422+ Expect.equal " values" [ 1 ; 2 ; 3 ] vs
336423 } ]
0 commit comments