2025-11-11 16:36:12 +01:00
|
|
|
// 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 readeroption
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
A "github.com/IBM/fp-go/v2/array"
|
|
|
|
|
F "github.com/IBM/fp-go/v2/function"
|
|
|
|
|
O "github.com/IBM/fp-go/v2/option"
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestSequenceArray(t *testing.T) {
|
|
|
|
|
|
|
|
|
|
n := 10
|
|
|
|
|
|
|
|
|
|
readers := A.MakeBy(n, Of[context.Context, int])
|
|
|
|
|
exp := O.Of(A.MakeBy(n, F.Identity[int]))
|
|
|
|
|
|
|
|
|
|
g := F.Pipe1(
|
|
|
|
|
readers,
|
|
|
|
|
SequenceArray[context.Context, int],
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
assert.Equal(t, exp, g(context.Background()))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestTraverseArray(t *testing.T) {
|
|
|
|
|
// Function that doubles a number if it's positive
|
|
|
|
|
doubleIfPositive := func(x int) ReaderOption[context.Context, int] {
|
|
|
|
|
if x > 0 {
|
|
|
|
|
return Of[context.Context](x * 2)
|
|
|
|
|
}
|
|
|
|
|
return None[context.Context, int]()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Test with all positive numbers
|
|
|
|
|
input1 := []int{1, 2, 3}
|
|
|
|
|
g1 := F.Pipe1(
|
|
|
|
|
Of[context.Context](input1),
|
2025-11-12 10:35:53 +01:00
|
|
|
Chain(TraverseArray(doubleIfPositive)),
|
2025-11-11 16:36:12 +01:00
|
|
|
)
|
|
|
|
|
assert.Equal(t, O.Of([]int{2, 4, 6}), g1(context.Background()))
|
|
|
|
|
|
|
|
|
|
// Test with a negative number (should return None)
|
|
|
|
|
input2 := []int{1, -2, 3}
|
|
|
|
|
g2 := F.Pipe1(
|
|
|
|
|
Of[context.Context](input2),
|
2025-11-12 10:35:53 +01:00
|
|
|
Chain(TraverseArray(doubleIfPositive)),
|
2025-11-11 16:36:12 +01:00
|
|
|
)
|
|
|
|
|
assert.Equal(t, O.None[[]int](), g2(context.Background()))
|
|
|
|
|
|
|
|
|
|
// Test with empty array
|
|
|
|
|
input3 := []int{}
|
|
|
|
|
g3 := F.Pipe1(
|
|
|
|
|
Of[context.Context](input3),
|
2025-11-12 10:35:53 +01:00
|
|
|
Chain(TraverseArray(doubleIfPositive)),
|
2025-11-11 16:36:12 +01:00
|
|
|
)
|
|
|
|
|
assert.Equal(t, O.Of([]int{}), g3(context.Background()))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestTraverseArrayWithIndex(t *testing.T) {
|
|
|
|
|
// Function that multiplies value by its index if index is even
|
|
|
|
|
multiplyByIndexIfEven := func(idx int, x int) ReaderOption[context.Context, int] {
|
|
|
|
|
if idx%2 == 0 {
|
|
|
|
|
return Of[context.Context](x * idx)
|
|
|
|
|
}
|
|
|
|
|
return Of[context.Context](x)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
input := []int{10, 20, 30, 40}
|
2025-11-12 10:35:53 +01:00
|
|
|
g := TraverseArrayWithIndex(multiplyByIndexIfEven)(input)
|
2025-11-11 16:36:12 +01:00
|
|
|
|
|
|
|
|
// Expected: [10*0, 20, 30*2, 40] = [0, 20, 60, 40]
|
|
|
|
|
assert.Equal(t, O.Of([]int{0, 20, 60, 40}), g(context.Background()))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestTraverseArrayWithIndexNone(t *testing.T) {
|
|
|
|
|
// Function that returns None for odd indices
|
|
|
|
|
noneForOdd := func(idx int, x int) ReaderOption[context.Context, int] {
|
|
|
|
|
if idx%2 == 0 {
|
|
|
|
|
return Of[context.Context](x)
|
|
|
|
|
}
|
|
|
|
|
return None[context.Context, int]()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
input := []int{10, 20, 30}
|
2025-11-12 10:35:53 +01:00
|
|
|
g := TraverseArrayWithIndex(noneForOdd)(input)
|
2025-11-11 16:36:12 +01:00
|
|
|
|
|
|
|
|
// Should return None because index 1 returns None
|
|
|
|
|
assert.Equal(t, O.None[[]int](), g(context.Background()))
|
|
|
|
|
}
|