@@ -565,6 +565,40 @@ type SeqModule2() =
565565 if e.MoveNext() then Assert.Fail()
566566 Assert.AreEqual( 0 ,! i)
567567
568+ [<Test>]
569+ member this.Mapi2WithSideEffects () =
570+ let i = ref 0
571+ let f _ x y = i := ! i + 1 ; x* x
572+ let e = ( Seq.mapi2 f [ 1 ; 2 ] [ 1 ; 2 ]) .GetEnumerator()
573+
574+ CheckThrowsInvalidOperationExn ( fun _ -> e.Current|> ignore)
575+ Assert.AreEqual( 0 , ! i)
576+ if not ( e.MoveNext()) then Assert.Fail()
577+ Assert.AreEqual( 1 , ! i)
578+ let _ = e.Current
579+ Assert.AreEqual( 1 , ! i)
580+ let _ = e.Current
581+ Assert.AreEqual( 1 , ! i)
582+
583+ if not ( e.MoveNext()) then Assert.Fail()
584+ Assert.AreEqual( 2 , ! i)
585+ let _ = e.Current
586+ Assert.AreEqual( 2 , ! i)
587+ let _ = e.Current
588+ Assert.AreEqual( 2 , ! i)
589+
590+ if e.MoveNext() then Assert.Fail()
591+ Assert.AreEqual( 2 ,! i)
592+ CheckThrowsInvalidOperationExn ( fun _ -> e.Current|> ignore)
593+ Assert.AreEqual( 2 , ! i)
594+
595+ i := 0
596+ let e = ( Seq.mapi2 f [] []) .GetEnumerator()
597+ if e.MoveNext() then Assert.Fail()
598+ Assert.AreEqual( 0 ,! i)
599+ if e.MoveNext() then Assert.Fail()
600+ Assert.AreEqual( 0 ,! i)
601+
568602 [<Test>]
569603 member this.Collect () =
570604 // integer Seq
@@ -627,6 +661,44 @@ type SeqModule2() =
627661
628662 ()
629663
664+ [<Test>]
665+ member this.Mapi2 () =
666+ // integer Seq
667+ let funcInt x y z = x+ y+ z
668+ let resultInt = Seq.mapi2 funcInt { 1 .. 10 } { 2 .. 2 .. 20 }
669+ let expectedint = seq [ 3 ; 7 ; 11 ; 15 ; 19 ; 23 ; 27 ; 31 ; 35 ; 39 ]
670+
671+ VerifySeqsEqual expectedint resultInt
672+
673+ // string Seq
674+ let funcStr ( x : int ) ( y : int ) ( z : string ) = x+ y+ z.Length
675+ let resultStr = Seq.mapi2 funcStr ( seq[ 3 ; 6 ; 9 ; 11 ]) ( seq [ " Lists" ; " Are" ; " Commonly" ; " List" ])
676+ let expectedSeq = seq [ 8 ; 10 ; 19 ; 18 ]
677+
678+ VerifySeqsEqual expectedSeq resultStr
679+
680+ // empty Seq
681+ let resultEpt = Seq.mapi2 funcInt Seq.empty Seq.empty
682+ VerifySeqsEqual Seq.empty resultEpt
683+
684+ // null Seq
685+ let nullSeq : seq < 'a > = null
686+ let validSeq = seq [ 1 ]
687+ CheckThrowsArgumentNullException ( fun () -> Seq.mapi2 funcInt nullSeq validSeq |> ignore)
688+
689+ // len1 <> len2
690+ let shorterSeq = seq { 1 .. 10 }
691+ let longerSeq = seq { 2 .. 20 }
692+
693+ let testSeqLengths seq1 seq2 =
694+ let f x y z = x + y + z
695+ Seq.mapi2 f seq1 seq2
696+
697+ VerifySeqsEqual ( seq [ 3 ; 6 ; 9 ; 12 ; 15 ; 18 ; 21 ; 24 ; 27 ; 30 ]) ( testSeqLengths shorterSeq longerSeq)
698+ VerifySeqsEqual ( seq [ 3 ; 6 ; 9 ; 12 ; 15 ; 18 ; 21 ; 24 ; 27 ; 30 ]) ( testSeqLengths longerSeq shorterSeq)
699+
700+ ()
701+
630702 [<Test>]
631703 member this.Max () =
632704 // integer Seq
0 commit comments