1
0
mirror of https://github.com/IBM/fp-go.git synced 2025-11-23 22:14:53 +02:00
Files
fp-go/v2/io/coverage_test.go
Dr. Carsten Leue ed108812d6 fix: modernize codebase
Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com>
2025-11-15 17:00:22 +01:00

1518 lines
37 KiB
Go

// Copyright (c) 2023 - 2025 IBM Corp.
// All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package io
import (
"context"
"sync"
"testing"
"time"
F "github.com/IBM/fp-go/v2/function"
M "github.com/IBM/fp-go/v2/monoid"
N "github.com/IBM/fp-go/v2/number"
S "github.com/IBM/fp-go/v2/semigroup"
T "github.com/IBM/fp-go/v2/tuple"
"github.com/stretchr/testify/assert"
)
// Test FromIO
func TestFromIO(t *testing.T) {
io := Of(42)
result := FromIO(io)
assert.Equal(t, 42, result())
}
// Test MonadOf
func TestMonadOf(t *testing.T) {
result := MonadOf(42)
assert.Equal(t, 42, result())
}
// Test MonadMapTo
func TestMonadMapTo(t *testing.T) {
result := MonadMapTo(Of(1), "hello")
assert.Equal(t, "hello", result())
}
// Test MapTo
func TestMapTo(t *testing.T) {
result := F.Pipe1(Of(1), MapTo[int]("hello"))
assert.Equal(t, "hello", result())
}
// Test MonadApSeq
func TestMonadApSeq(t *testing.T) {
f := Of(N.Mul(2))
result := MonadApSeq(f, Of(21))
assert.Equal(t, 42, result())
}
// Test ApPar
func TestApPar(t *testing.T) {
f := Of(N.Mul(2))
result := F.Pipe1(f, ApPar[int](Of(21)))
assert.Equal(t, 42, result())
}
// Test MonadChainFirst
func TestMonadChainFirst(t *testing.T) {
sideEffect := 0
result := MonadChainFirst(Of(42), func(x int) IO[string] {
sideEffect = x
return Of("ignored")
})
assert.Equal(t, 42, result())
assert.Equal(t, 42, sideEffect)
}
// Test ChainFirst
func TestChainFirst(t *testing.T) {
sideEffect := 0
result := F.Pipe1(Of(42), ChainFirst(func(x int) IO[string] {
sideEffect = x
return Of("ignored")
}))
assert.Equal(t, 42, result())
assert.Equal(t, 42, sideEffect)
}
// Test MonadApFirst
func TestMonadApFirst(t *testing.T) {
result := MonadApFirst(Of(42), Of("ignored"))
assert.Equal(t, 42, result())
}
// Test MonadApSecond
func TestMonadApSecond(t *testing.T) {
result := MonadApSecond(Of("ignored"), Of(42))
assert.Equal(t, 42, result())
}
// Test MonadChainTo
func TestMonadChainTo(t *testing.T) {
result := MonadChainTo(Of(1), Of(42))
assert.Equal(t, 42, result())
}
// Test ChainTo
func TestChainTo(t *testing.T) {
result := F.Pipe1(Of(1), ChainTo[int](Of(42)))
assert.Equal(t, 42, result())
}
// Test Defer
func TestDefer(t *testing.T) {
counter := 0
deferred := Defer(func() IO[int] {
counter++
return Of(counter)
})
assert.Equal(t, 1, deferred())
assert.Equal(t, 2, deferred())
assert.Equal(t, 3, deferred())
}
// Test MonadFlap
func TestMonadFlap(t *testing.T) {
f := Of(N.Mul(2))
result := MonadFlap(f, 21)
assert.Equal(t, 42, result())
}
// Test Flap
func TestFlap(t *testing.T) {
f := Of(N.Mul(2))
result := F.Pipe1(f, Flap[int](21))
assert.Equal(t, 42, result())
}
// Test After
func TestAfter(t *testing.T) {
future := time.Now().Add(50 * time.Millisecond)
start := time.Now()
result := F.Pipe1(Of(42), After[int](future))
value := result()
elapsed := time.Since(start)
assert.Equal(t, 42, value)
assert.True(t, elapsed >= 50*time.Millisecond)
}
// Test WithTime
func TestWithTime(t *testing.T) {
result := WithTime(Of(42))
tuple := result()
assert.Equal(t, 42, tuple.F1)
assert.True(t, tuple.F2.Before(tuple.F3) || tuple.F2.Equal(tuple.F3))
}
// Test WithDuration
func TestWithDuration(t *testing.T) {
result := WithDuration(func() int {
time.Sleep(10 * time.Millisecond)
return 42
})
tuple := result()
assert.Equal(t, 42, tuple.F1)
assert.True(t, tuple.F2 >= 10*time.Millisecond)
}
// Test Let
func TestLet(t *testing.T) {
type State struct {
value int
}
result := F.Pipe2(
Of(State{value: 10}),
Let(func(doubled int) func(s State) State {
return func(s State) State {
s.value = doubled
return s
}
}, func(s State) int {
return s.value * 2
}),
Map(func(s State) int { return s.value }),
)
assert.Equal(t, 20, result())
}
// Test LetTo
func TestLetTo(t *testing.T) {
type State struct {
value int
}
result := F.Pipe2(
Of(State{value: 10}),
LetTo(func(newVal int) func(s State) State {
return func(s State) State {
s.value = newVal
return s
}
}, 42),
Map(func(s State) int { return s.value }),
)
assert.Equal(t, 42, result())
}
// Test BindTo
func TestBindTo(t *testing.T) {
type State struct {
value int
}
result := F.Pipe2(
Of(42),
BindTo(func(v int) State {
return State{value: v}
}),
Map(func(s State) int { return s.value }),
)
assert.Equal(t, 42, result())
}
// Test Bracket
func TestBracket(t *testing.T) {
acquired := false
released := false
acquire := func() int {
acquired = true
return 42
}
use := func(x int) IO[int] {
return Of(x * 2)
}
release := func(x int, result int) IO[any] {
return FromImpure(func() {
released = true
})
}
result := Bracket(Of(acquire()), use, release)
value := result()
assert.Equal(t, 84, value)
assert.True(t, acquired)
assert.True(t, released)
}
// Test WithResource
func TestWithResource(t *testing.T) {
acquired := false
released := false
onCreate := func() int {
acquired = true
return 42
}
onRelease := func(x int) IO[any] {
return FromImpure(func() {
released = true
})
}
withRes := WithResource[int, int](Of(onCreate()), onRelease)
result := withRes(func(x int) IO[int] {
return Of(x * 2)
})
value := result()
assert.Equal(t, 84, value)
assert.True(t, acquired)
assert.True(t, released)
}
// Test WithLock - simplified test
func TestWithLock(t *testing.T) {
var mu sync.Mutex
counter := 0
// Create a lock IO that acquires the lock and returns a release function
lock := func() func() {
mu.Lock()
return func() { mu.Unlock() }
}
// Create operation that increments counter
operation := func() int {
counter++
return counter
}
// Apply lock to operation - cast to context.CancelFunc
var lockIO IO[context.CancelFunc] = func() context.CancelFunc {
return lock()
}
safeOp := WithLock[int](lockIO)(operation)
// Run the operation
result := safeOp()
assert.Equal(t, 1, result)
assert.Equal(t, 1, counter)
}
// Test Printf
func TestPrintf(t *testing.T) {
result := F.Pipe1(Of(42), ChainFirst(Printf[int]("Value: %d\n")))
assert.Equal(t, 42, result())
}
// Test ApplySemigroup
func TestApplySemigroup(t *testing.T) {
intAdd := S.MakeSemigroup(func(a, b int) int { return a + b })
ioSemigroup := ApplySemigroup(intAdd)
result := ioSemigroup.Concat(Of(10), Of(32))
assert.Equal(t, 42, result())
}
// Test ApplicativeMonoid
func TestApplicativeMonoid(t *testing.T) {
intAdd := M.MakeMonoid(func(a, b int) int { return a + b }, 0)
ioMonoid := ApplicativeMonoid(intAdd)
result := ioMonoid.Concat(Of(10), Of(32))
assert.Equal(t, 42, result())
empty := ioMonoid.Empty()
assert.Equal(t, 0, empty())
}
// Test Applicative type class
func TestApplicativeTypeClass(t *testing.T) {
app := Applicative[int, int]()
// Test Of
io1 := app.Of(21)
assert.Equal(t, 21, io1())
// Test Map
io2 := app.Map(N.Mul(2))(io1)
assert.Equal(t, 42, io2())
}
// Test Monad type class
func TestMonadTypeClass(t *testing.T) {
m := Monad[int, int]()
result := F.Pipe2(
m.Of(21),
m.Chain(func(x int) IO[int] {
return m.Of(x * 2)
}),
m.Map(func(x int) int { return x + 1 }),
)
assert.Equal(t, 43, result())
}
// Test TraverseArrayWithIndex
func TestTraverseArrayWithIndex(t *testing.T) {
src := []string{"a", "b", "c"}
result := F.Pipe1(
src,
TraverseArrayWithIndex(func(i int, s string) IO[string] {
return Of(F.Pipe1(i, func(idx int) string {
return s + string(rune('0'+idx))
}))
}),
)
assert.Equal(t, []string{"a0", "b1", "c2"}, result())
}
// Test TraverseRecord
func TestTraverseRecord(t *testing.T) {
src := map[string]int{"a": 1, "b": 2}
result := F.Pipe1(
src,
TraverseRecord[string](func(x int) IO[int] {
return Of(x * 2)
}),
)
values := result()
assert.Equal(t, 2, values["a"])
assert.Equal(t, 4, values["b"])
}
// Test TraverseRecordWithIndex
func TestTraverseRecordWithIndex(t *testing.T) {
src := map[string]int{"a": 1, "b": 2}
result := F.Pipe1(
src,
TraverseRecordWithIndex(func(k string, x int) IO[string] {
return Of(k)
}),
)
values := result()
assert.Equal(t, "a", values["a"])
assert.Equal(t, "b", values["b"])
}
// Test SequenceRecord
func TestSequenceRecord(t *testing.T) {
src := map[string]IO[int]{
"a": Of(1),
"b": Of(2),
}
result := SequenceRecord(src)
values := result()
assert.Equal(t, 1, values["a"])
assert.Equal(t, 2, values["b"])
}
// Test MonadTraverseRecord
func TestMonadTraverseRecord(t *testing.T) {
src := map[string]int{"a": 1, "b": 2}
result := MonadTraverseRecord(src, func(x int) IO[int] {
return Of(x * 2)
})
values := result()
assert.Equal(t, 2, values["a"])
assert.Equal(t, 4, values["b"])
}
// Test TraverseArrayWithIndexSeq
func TestTraverseArrayWithIndexSeq(t *testing.T) {
var order []int
src := []int{1, 2, 3}
result := F.Pipe1(
src,
TraverseArrayWithIndexSeq(func(i int, x int) IO[int] {
return func() int {
order = append(order, i)
return x * 2
}
}),
)
values := result()
assert.Equal(t, []int{2, 4, 6}, values)
assert.Equal(t, []int{0, 1, 2}, order) // Sequential order
}
// Test SequenceArraySeq
func TestSequenceArraySeq(t *testing.T) {
var order []int
src := []IO[int]{
func() int { order = append(order, 0); return 1 },
func() int { order = append(order, 1); return 2 },
func() int { order = append(order, 2); return 3 },
}
result := SequenceArraySeq(src)
values := result()
assert.Equal(t, []int{1, 2, 3}, values)
assert.Equal(t, []int{0, 1, 2}, order) // Sequential order
}
// Test MonadTraverseArraySeq
func TestMonadTraverseArraySeq(t *testing.T) {
var order []int
src := []int{1, 2, 3}
result := MonadTraverseArraySeq(src, func(x int) IO[int] {
return func() int {
order = append(order, x)
return x * 2
}
})
values := result()
assert.Equal(t, []int{2, 4, 6}, values)
assert.Equal(t, []int{1, 2, 3}, order) // Sequential order
}
// Test TraverseRecordSeq
func TestTraverseRecordSeq(t *testing.T) {
src := map[string]int{"a": 1, "b": 2}
result := F.Pipe1(
src,
TraverseRecordSeq[string](func(x int) IO[int] {
return Of(x * 2)
}),
)
values := result()
assert.Equal(t, 2, values["a"])
assert.Equal(t, 4, values["b"])
}
// Test TraverseRecordWithIndeSeq (note the typo in the function name)
func TestTraverseRecordWithIndeSeq(t *testing.T) {
src := map[string]int{"a": 1, "b": 2}
result := F.Pipe1(
src,
TraverseRecordWithIndeSeq(func(k string, x int) IO[string] {
return Of(k)
}),
)
values := result()
assert.Equal(t, "a", values["a"])
assert.Equal(t, "b", values["b"])
}
// Test SequenceRecordSeq
func TestSequenceRecordSeq(t *testing.T) {
src := map[string]IO[int]{
"a": Of(1),
"b": Of(2),
}
result := SequenceRecordSeq(src)
values := result()
assert.Equal(t, 1, values["a"])
assert.Equal(t, 2, values["b"])
}
// Test MonadTraverseRecordSeq
func TestMonadTraverseRecordSeq(t *testing.T) {
src := map[string]int{"a": 1, "b": 2}
result := MonadTraverseRecordSeq(src, func(x int) IO[int] {
return Of(x * 2)
})
values := result()
assert.Equal(t, 2, values["a"])
assert.Equal(t, 4, values["b"])
}
// Test SequenceTuple2
func TestSequenceTuple2(t *testing.T) {
io1 := Of(10)
io2 := Of(32)
tup := T.MakeTuple2(io1, io2)
result := SequenceTuple2(tup)
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 32, tuple.F2)
}
// Test SequenceT2
func TestSequenceT2(t *testing.T) {
result := SequenceT2(Of(10), Of(32))
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 32, tuple.F2)
}
// Test SequenceTuple3
func TestSequenceTuple3(t *testing.T) {
io1 := Of(10)
io2 := Of(20)
io3 := Of(30)
tup := T.MakeTuple3(io1, io2, io3)
result := SequenceTuple3(tup)
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 20, tuple.F2)
assert.Equal(t, 30, tuple.F3)
}
// Test SequenceSeqTuple2
func TestSequenceSeqTuple2(t *testing.T) {
var order []int
io1 := func() int { order = append(order, 1); return 10 }
io2 := func() int { order = append(order, 2); return 20 }
tup := T.MakeTuple2(io1, io2)
result := SequenceSeqTuple2(tup)
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 20, tuple.F2)
assert.Equal(t, []int{1, 2}, order) // Sequential execution
}
// Test SequenceParTuple2
func TestSequenceParTuple2(t *testing.T) {
io1 := Of(10)
io2 := Of(20)
tup := T.MakeTuple2(io1, io2)
result := SequenceParTuple2(tup)
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 20, tuple.F2)
}
// Test SequenceT3
func TestSequenceT3(t *testing.T) {
result := SequenceT3(Of(10), Of(20), Of(30))
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 20, tuple.F2)
assert.Equal(t, 30, tuple.F3)
}
// Test SequenceSeqT2
func TestSequenceSeqT2(t *testing.T) {
var order []int
io1 := func() int { order = append(order, 1); return 10 }
io2 := func() int { order = append(order, 2); return 20 }
result := SequenceSeqT2(io1, io2)
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 20, tuple.F2)
assert.Equal(t, []int{1, 2}, order)
}
// Test SequenceParT2
func TestSequenceParT2(t *testing.T) {
result := SequenceParT2(Of(10), Of(20))
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 20, tuple.F2)
}
// Test SequenceT4
func TestSequenceT4(t *testing.T) {
result := SequenceT4(Of(1), Of(2), Of(3), Of(4))
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
}
// Test SequenceTuple4
func TestSequenceTuple4(t *testing.T) {
tup := T.MakeTuple4(Of(1), Of(2), Of(3), Of(4))
result := SequenceTuple4(tup)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
}
// Test SequenceT5
func TestSequenceT5(t *testing.T) {
result := SequenceT5(Of(1), Of(2), Of(3), Of(4), Of(5))
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
}
// Test TraverseTuple2
func TestTraverseTuple2(t *testing.T) {
inputTuple := T.MakeTuple2(10, 20)
result := TraverseTuple2(
func(x int) IO[int] { return Of(x * 2) },
func(x int) IO[int] { return Of(x + 1) },
)(inputTuple)
tuple := result()
assert.Equal(t, 20, tuple.F1)
assert.Equal(t, 21, tuple.F2)
}
// Test TraverseTuple3
func TestTraverseTuple3(t *testing.T) {
inputTuple := T.MakeTuple3(10, 20, 30)
result := TraverseTuple3(
func(x int) IO[int] { return Of(x * 2) },
func(x int) IO[int] { return Of(x + 1) },
func(x int) IO[int] { return Of(x - 1) },
)(inputTuple)
tuple := result()
assert.Equal(t, 20, tuple.F1)
assert.Equal(t, 21, tuple.F2)
assert.Equal(t, 29, tuple.F3)
}
// Test SequenceTuple1
func TestSequenceTuple1(t *testing.T) {
tup := T.MakeTuple1(Of(42))
result := SequenceTuple1(tup)
tuple := result()
assert.Equal(t, 42, tuple.F1)
}
// Test SequenceT1
func TestSequenceT1(t *testing.T) {
result := SequenceT1(Of(42))
tuple := result()
assert.Equal(t, 42, tuple.F1)
}
// Test SequenceSeqT3
func TestSequenceSeqT3(t *testing.T) {
var order []int
io1 := func() int { order = append(order, 1); return 10 }
io2 := func() int { order = append(order, 2); return 20 }
io3 := func() int { order = append(order, 3); return 30 }
result := SequenceSeqT3(io1, io2, io3)
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 20, tuple.F2)
assert.Equal(t, 30, tuple.F3)
assert.Equal(t, []int{1, 2, 3}, order)
}
// Test SequenceParT3
func TestSequenceParT3(t *testing.T) {
result := SequenceParT3(Of(10), Of(20), Of(30))
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 20, tuple.F2)
assert.Equal(t, 30, tuple.F3)
}
// Test TraverseSeqTuple3
func TestTraverseSeqTuple3(t *testing.T) {
var order []int
inputTuple := T.MakeTuple3(10, 20, 30)
result := TraverseSeqTuple3(
func(x int) IO[int] { return func() int { order = append(order, 1); return x * 2 } },
func(x int) IO[int] { return func() int { order = append(order, 2); return x + 1 } },
func(x int) IO[int] { return func() int { order = append(order, 3); return x - 1 } },
)(inputTuple)
tuple := result()
assert.Equal(t, 20, tuple.F1)
assert.Equal(t, 21, tuple.F2)
assert.Equal(t, 29, tuple.F3)
assert.Equal(t, []int{1, 2, 3}, order)
}
// Test TraverseParTuple3
func TestTraverseParTuple3(t *testing.T) {
inputTuple := T.MakeTuple3(10, 20, 30)
result := TraverseParTuple3(
func(x int) IO[int] { return Of(x * 2) },
func(x int) IO[int] { return Of(x + 1) },
func(x int) IO[int] { return Of(x - 1) },
)(inputTuple)
tuple := result()
assert.Equal(t, 20, tuple.F1)
assert.Equal(t, 21, tuple.F2)
assert.Equal(t, 29, tuple.F3)
}
// Test SequenceSeqTuple3
func TestSequenceSeqTuple3(t *testing.T) {
var order []int
io1 := func() int { order = append(order, 1); return 10 }
io2 := func() int { order = append(order, 2); return 20 }
io3 := func() int { order = append(order, 3); return 30 }
tup := T.MakeTuple3(io1, io2, io3)
result := SequenceSeqTuple3(tup)
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 20, tuple.F2)
assert.Equal(t, 30, tuple.F3)
assert.Equal(t, []int{1, 2, 3}, order)
}
// Test SequenceParTuple3
func TestSequenceParTuple3(t *testing.T) {
tup := T.MakeTuple3(Of(10), Of(20), Of(30))
result := SequenceParTuple3(tup)
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 20, tuple.F2)
assert.Equal(t, 30, tuple.F3)
}
// Test SequenceSeqT4
func TestSequenceSeqT4(t *testing.T) {
var order []int
io1 := func() int { order = append(order, 1); return 1 }
io2 := func() int { order = append(order, 2); return 2 }
io3 := func() int { order = append(order, 3); return 3 }
io4 := func() int { order = append(order, 4); return 4 }
result := SequenceSeqT4(io1, io2, io3, io4)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, []int{1, 2, 3, 4}, order)
}
// Test SequenceParT4
func TestSequenceParT4(t *testing.T) {
result := SequenceParT4(Of(1), Of(2), Of(3), Of(4))
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
}
// Test SequenceSeqTuple4
func TestSequenceSeqTuple4(t *testing.T) {
var order []int
io1 := func() int { order = append(order, 1); return 1 }
io2 := func() int { order = append(order, 2); return 2 }
io3 := func() int { order = append(order, 3); return 3 }
io4 := func() int { order = append(order, 4); return 4 }
tup := T.MakeTuple4(io1, io2, io3, io4)
result := SequenceSeqTuple4(tup)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, []int{1, 2, 3, 4}, order)
}
// Test SequenceParTuple4
func TestSequenceParTuple4(t *testing.T) {
tup := T.MakeTuple4(Of(1), Of(2), Of(3), Of(4))
result := SequenceParTuple4(tup)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
}
// Test TraverseTuple4
func TestTraverseTuple4(t *testing.T) {
inputTuple := T.MakeTuple4(1, 2, 3, 4)
result := TraverseTuple4(
func(x int) IO[int] { return Of(x * 10) },
func(x int) IO[int] { return Of(x * 20) },
func(x int) IO[int] { return Of(x * 30) },
func(x int) IO[int] { return Of(x * 40) },
)(inputTuple)
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 40, tuple.F2)
assert.Equal(t, 90, tuple.F3)
assert.Equal(t, 160, tuple.F4)
}
// Test SequenceSeqT5
func TestSequenceSeqT5(t *testing.T) {
var order []int
io1 := func() int { order = append(order, 1); return 1 }
io2 := func() int { order = append(order, 2); return 2 }
io3 := func() int { order = append(order, 3); return 3 }
io4 := func() int { order = append(order, 4); return 4 }
io5 := func() int { order = append(order, 5); return 5 }
result := SequenceSeqT5(io1, io2, io3, io4, io5)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, []int{1, 2, 3, 4, 5}, order)
}
// Test SequenceParT5
func TestSequenceParT5(t *testing.T) {
result := SequenceParT5(Of(1), Of(2), Of(3), Of(4), Of(5))
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
}
// Test SequenceSeqTuple1
func TestSequenceSeqTuple1(t *testing.T) {
var executed bool
io1 := func() int { executed = true; return 42 }
tup := T.MakeTuple1(io1)
result := SequenceSeqTuple1(tup)
tuple := result()
assert.Equal(t, 42, tuple.F1)
assert.True(t, executed)
}
// Test SequenceParTuple1
func TestSequenceParTuple1(t *testing.T) {
tup := T.MakeTuple1(Of(42))
result := SequenceParTuple1(tup)
tuple := result()
assert.Equal(t, 42, tuple.F1)
}
// Test TraverseTuple1
func TestTraverseTuple1(t *testing.T) {
inputTuple := T.MakeTuple1(21)
result := TraverseTuple1(
func(x int) IO[int] { return Of(x * 2) },
)(inputTuple)
tuple := result()
assert.Equal(t, 42, tuple.F1)
}
// Test TraverseSeqTuple1
func TestTraverseSeqTuple1(t *testing.T) {
var executed bool
inputTuple := T.MakeTuple1(21)
result := TraverseSeqTuple1(
func(x int) IO[int] { return func() int { executed = true; return x * 2 } },
)(inputTuple)
tuple := result()
assert.Equal(t, 42, tuple.F1)
assert.True(t, executed)
}
// Test TraverseParTuple1
func TestTraverseParTuple1(t *testing.T) {
inputTuple := T.MakeTuple1(21)
result := TraverseParTuple1(
func(x int) IO[int] { return Of(x * 2) },
)(inputTuple)
tuple := result()
assert.Equal(t, 42, tuple.F1)
}
// Test SequenceTuple5
func TestSequenceTuple5(t *testing.T) {
tup := T.MakeTuple5(Of(1), Of(2), Of(3), Of(4), Of(5))
result := SequenceTuple5(tup)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
}
// Test SequenceSeqTuple5
func TestSequenceSeqTuple5(t *testing.T) {
var order []int
io1 := func() int { order = append(order, 1); return 1 }
io2 := func() int { order = append(order, 2); return 2 }
io3 := func() int { order = append(order, 3); return 3 }
io4 := func() int { order = append(order, 4); return 4 }
io5 := func() int { order = append(order, 5); return 5 }
tup := T.MakeTuple5(io1, io2, io3, io4, io5)
result := SequenceSeqTuple5(tup)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, []int{1, 2, 3, 4, 5}, order)
}
// Test SequenceParTuple5
func TestSequenceParTuple5(t *testing.T) {
tup := T.MakeTuple5(Of(1), Of(2), Of(3), Of(4), Of(5))
result := SequenceParTuple5(tup)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
}
// Test TraverseTuple5
func TestTraverseTuple5(t *testing.T) {
inputTuple := T.MakeTuple5(1, 2, 3, 4, 5)
result := TraverseTuple5(
func(x int) IO[int] { return Of(x * 10) },
func(x int) IO[int] { return Of(x * 20) },
func(x int) IO[int] { return Of(x * 30) },
func(x int) IO[int] { return Of(x * 40) },
func(x int) IO[int] { return Of(x * 50) },
)(inputTuple)
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 40, tuple.F2)
assert.Equal(t, 90, tuple.F3)
assert.Equal(t, 160, tuple.F4)
assert.Equal(t, 250, tuple.F5)
}
// Test TraverseSeqTuple5
func TestTraverseSeqTuple5(t *testing.T) {
var order []int
inputTuple := T.MakeTuple5(1, 2, 3, 4, 5)
result := TraverseSeqTuple5(
func(x int) IO[int] { return func() int { order = append(order, 1); return x * 10 } },
func(x int) IO[int] { return func() int { order = append(order, 2); return x * 20 } },
func(x int) IO[int] { return func() int { order = append(order, 3); return x * 30 } },
func(x int) IO[int] { return func() int { order = append(order, 4); return x * 40 } },
func(x int) IO[int] { return func() int { order = append(order, 5); return x * 50 } },
)(inputTuple)
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 40, tuple.F2)
assert.Equal(t, 90, tuple.F3)
assert.Equal(t, 160, tuple.F4)
assert.Equal(t, 250, tuple.F5)
assert.Equal(t, []int{1, 2, 3, 4, 5}, order)
}
// Test TraverseParTuple5
func TestTraverseParTuple5(t *testing.T) {
inputTuple := T.MakeTuple5(1, 2, 3, 4, 5)
result := TraverseParTuple5(
func(x int) IO[int] { return Of(x * 10) },
func(x int) IO[int] { return Of(x * 20) },
func(x int) IO[int] { return Of(x * 30) },
func(x int) IO[int] { return Of(x * 40) },
func(x int) IO[int] { return Of(x * 50) },
)(inputTuple)
tuple := result()
assert.Equal(t, 10, tuple.F1)
assert.Equal(t, 40, tuple.F2)
assert.Equal(t, 90, tuple.F3)
assert.Equal(t, 160, tuple.F4)
assert.Equal(t, 250, tuple.F5)
}
// Test SequenceT6
func TestSequenceT6(t *testing.T) {
result := SequenceT6(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6))
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
}
// Test SequenceSeqT6
func TestSequenceSeqT6(t *testing.T) {
var order []int
io1 := func() int { order = append(order, 1); return 1 }
io2 := func() int { order = append(order, 2); return 2 }
io3 := func() int { order = append(order, 3); return 3 }
io4 := func() int { order = append(order, 4); return 4 }
io5 := func() int { order = append(order, 5); return 5 }
io6 := func() int { order = append(order, 6); return 6 }
result := SequenceSeqT6(io1, io2, io3, io4, io5, io6)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, []int{1, 2, 3, 4, 5, 6}, order)
}
// Test SequenceParT6
func TestSequenceParT6(t *testing.T) {
result := SequenceParT6(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6))
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
}
// Test SequenceT7
func TestSequenceT7(t *testing.T) {
result := SequenceT7(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6), Of(7))
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
}
// Test SequenceT8
func TestSequenceT8(t *testing.T) {
result := SequenceT8(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6), Of(7), Of(8))
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
assert.Equal(t, 8, tuple.F8)
}
// Test SequenceT9
func TestSequenceT9(t *testing.T) {
result := SequenceT9(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6), Of(7), Of(8), Of(9))
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
assert.Equal(t, 8, tuple.F8)
assert.Equal(t, 9, tuple.F9)
}
// Test SequenceT10
func TestSequenceT10(t *testing.T) {
result := SequenceT10(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6), Of(7), Of(8), Of(9), Of(10))
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
assert.Equal(t, 8, tuple.F8)
assert.Equal(t, 9, tuple.F9)
assert.Equal(t, 10, tuple.F10)
}
// Test SequenceTuple6
func TestSequenceTuple6(t *testing.T) {
tup := T.MakeTuple6(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6))
result := SequenceTuple6(tup)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
}
// Test SequenceSeqTuple6
func TestSequenceSeqTuple6(t *testing.T) {
var order []int
io1 := func() int { order = append(order, 1); return 1 }
io2 := func() int { order = append(order, 2); return 2 }
io3 := func() int { order = append(order, 3); return 3 }
io4 := func() int { order = append(order, 4); return 4 }
io5 := func() int { order = append(order, 5); return 5 }
io6 := func() int { order = append(order, 6); return 6 }
tup := T.MakeTuple6(io1, io2, io3, io4, io5, io6)
result := SequenceSeqTuple6(tup)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, []int{1, 2, 3, 4, 5, 6}, order)
}
// Test SequenceParTuple6
func TestSequenceParTuple6(t *testing.T) {
tup := T.MakeTuple6(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6))
result := SequenceParTuple6(tup)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
}
// Test TraverseTuple6
func TestTraverseTuple6(t *testing.T) {
inputTuple := T.MakeTuple6(1, 2, 3, 4, 5, 6)
result := TraverseTuple6(
func(x int) IO[int] { return Of(x * 1) },
func(x int) IO[int] { return Of(x * 2) },
func(x int) IO[int] { return Of(x * 3) },
func(x int) IO[int] { return Of(x * 4) },
func(x int) IO[int] { return Of(x * 5) },
func(x int) IO[int] { return Of(x * 6) },
)(inputTuple)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 4, tuple.F2)
assert.Equal(t, 9, tuple.F3)
assert.Equal(t, 16, tuple.F4)
assert.Equal(t, 25, tuple.F5)
assert.Equal(t, 36, tuple.F6)
}
// Test SequenceTuple7
func TestSequenceTuple7(t *testing.T) {
tup := T.MakeTuple7(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6), Of(7))
result := SequenceTuple7(tup)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
}
// Test SequenceSeqT7
func TestSequenceSeqT7(t *testing.T) {
var order []int
io1 := func() int { order = append(order, 1); return 1 }
io2 := func() int { order = append(order, 2); return 2 }
io3 := func() int { order = append(order, 3); return 3 }
io4 := func() int { order = append(order, 4); return 4 }
io5 := func() int { order = append(order, 5); return 5 }
io6 := func() int { order = append(order, 6); return 6 }
io7 := func() int { order = append(order, 7); return 7 }
result := SequenceSeqT7(io1, io2, io3, io4, io5, io6, io7)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
assert.Equal(t, []int{1, 2, 3, 4, 5, 6, 7}, order)
}
// Test SequenceParT7
func TestSequenceParT7(t *testing.T) {
result := SequenceParT7(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6), Of(7))
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
}
// Test SequenceTuple8
func TestSequenceTuple8(t *testing.T) {
tup := T.MakeTuple8(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6), Of(7), Of(8))
result := SequenceTuple8(tup)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
assert.Equal(t, 8, tuple.F8)
}
// Test SequenceSeqT8
func TestSequenceSeqT8(t *testing.T) {
var order []int
io1 := func() int { order = append(order, 1); return 1 }
io2 := func() int { order = append(order, 2); return 2 }
io3 := func() int { order = append(order, 3); return 3 }
io4 := func() int { order = append(order, 4); return 4 }
io5 := func() int { order = append(order, 5); return 5 }
io6 := func() int { order = append(order, 6); return 6 }
io7 := func() int { order = append(order, 7); return 7 }
io8 := func() int { order = append(order, 8); return 8 }
result := SequenceSeqT8(io1, io2, io3, io4, io5, io6, io7, io8)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
assert.Equal(t, 8, tuple.F8)
assert.Equal(t, []int{1, 2, 3, 4, 5, 6, 7, 8}, order)
}
// Test SequenceParT8
func TestSequenceParT8(t *testing.T) {
result := SequenceParT8(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6), Of(7), Of(8))
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
assert.Equal(t, 8, tuple.F8)
}
// Test SequenceTuple9
func TestSequenceTuple9(t *testing.T) {
tup := T.MakeTuple9(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6), Of(7), Of(8), Of(9))
result := SequenceTuple9(tup)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
assert.Equal(t, 8, tuple.F8)
assert.Equal(t, 9, tuple.F9)
}
// Test SequenceSeqT9
func TestSequenceSeqT9(t *testing.T) {
var order []int
io1 := func() int { order = append(order, 1); return 1 }
io2 := func() int { order = append(order, 2); return 2 }
io3 := func() int { order = append(order, 3); return 3 }
io4 := func() int { order = append(order, 4); return 4 }
io5 := func() int { order = append(order, 5); return 5 }
io6 := func() int { order = append(order, 6); return 6 }
io7 := func() int { order = append(order, 7); return 7 }
io8 := func() int { order = append(order, 8); return 8 }
io9 := func() int { order = append(order, 9); return 9 }
result := SequenceSeqT9(io1, io2, io3, io4, io5, io6, io7, io8, io9)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
assert.Equal(t, 8, tuple.F8)
assert.Equal(t, 9, tuple.F9)
assert.Equal(t, []int{1, 2, 3, 4, 5, 6, 7, 8, 9}, order)
}
// Test SequenceParT9
func TestSequenceParT9(t *testing.T) {
result := SequenceParT9(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6), Of(7), Of(8), Of(9))
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
assert.Equal(t, 8, tuple.F8)
assert.Equal(t, 9, tuple.F9)
}
// Test SequenceTuple10
func TestSequenceTuple10(t *testing.T) {
tup := T.MakeTuple10(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6), Of(7), Of(8), Of(9), Of(10))
result := SequenceTuple10(tup)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
assert.Equal(t, 8, tuple.F8)
assert.Equal(t, 9, tuple.F9)
assert.Equal(t, 10, tuple.F10)
}
// Test SequenceSeqT10
func TestSequenceSeqT10(t *testing.T) {
var order []int
io1 := func() int { order = append(order, 1); return 1 }
io2 := func() int { order = append(order, 2); return 2 }
io3 := func() int { order = append(order, 3); return 3 }
io4 := func() int { order = append(order, 4); return 4 }
io5 := func() int { order = append(order, 5); return 5 }
io6 := func() int { order = append(order, 6); return 6 }
io7 := func() int { order = append(order, 7); return 7 }
io8 := func() int { order = append(order, 8); return 8 }
io9 := func() int { order = append(order, 9); return 9 }
io10 := func() int { order = append(order, 10); return 10 }
result := SequenceSeqT10(io1, io2, io3, io4, io5, io6, io7, io8, io9, io10)
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
assert.Equal(t, 8, tuple.F8)
assert.Equal(t, 9, tuple.F9)
assert.Equal(t, 10, tuple.F10)
assert.Equal(t, []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, order)
}
// Test SequenceParT10
func TestSequenceParT10(t *testing.T) {
result := SequenceParT10(Of(1), Of(2), Of(3), Of(4), Of(5), Of(6), Of(7), Of(8), Of(9), Of(10))
tuple := result()
assert.Equal(t, 1, tuple.F1)
assert.Equal(t, 2, tuple.F2)
assert.Equal(t, 3, tuple.F3)
assert.Equal(t, 4, tuple.F4)
assert.Equal(t, 5, tuple.F5)
assert.Equal(t, 6, tuple.F6)
assert.Equal(t, 7, tuple.F7)
assert.Equal(t, 8, tuple.F8)
assert.Equal(t, 9, tuple.F9)
assert.Equal(t, 10, tuple.F10)
}