-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathslices_test.go
102 lines (91 loc) · 2.89 KB
/
slices_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//
// This file is part of go-algorithms.
//
// Copyright 2024 Cristian Maglie. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//
package f_test
import (
"strings"
"testing"
"github.com/stretchr/testify/require"
f "go.bug.st/f"
)
func TestFilter(t *testing.T) {
a := []string{"aaa", "bbb", "ccc"}
require.Equal(t, []string{"bbb", "ccc"}, f.Filter(a, func(x string) bool { return x > "b" }))
b := []int{5, 9, 15, 2, 4, -2}
require.Equal(t, []int{5, 9, 15}, f.Filter(b, func(x int) bool { return x > 4 }))
}
func TestEqualsAndNotEquals(t *testing.T) {
require.True(t, f.Equals(int(0))(0))
require.False(t, f.Equals(int(1))(0))
require.True(t, f.Equals("")(""))
require.False(t, f.Equals("abc")(""))
require.False(t, f.NotEquals(int(0))(0))
require.True(t, f.NotEquals(int(1))(0))
require.False(t, f.NotEquals("")(""))
require.True(t, f.NotEquals("abc")(""))
}
func TestMap(t *testing.T) {
value := []string{"hello", " world ", " how are", "you? "}
{
parts := f.Map(value, strings.TrimSpace)
require.Equal(t, 4, len(parts))
require.Equal(t, "hello", parts[0])
require.Equal(t, "world", parts[1])
require.Equal(t, "how are", parts[2])
require.Equal(t, "you?", parts[3])
}
{
parts := f.ParallelMap(value, strings.TrimSpace)
require.Equal(t, 4, len(parts))
require.Equal(t, "hello", parts[0])
require.Equal(t, "world", parts[1])
require.Equal(t, "how are", parts[2])
require.Equal(t, "you?", parts[3])
}
}
func TestReduce(t *testing.T) {
and := func(in ...bool) bool {
return f.Reduce(in, func(a, b bool) bool { return a && b }, true)
}
require.True(t, and())
require.True(t, and(true))
require.False(t, and(false))
require.True(t, and(true, true))
require.False(t, and(true, false))
require.False(t, and(false, true))
require.False(t, and(false, false))
require.False(t, and(true, true, false))
require.False(t, and(false, true, false))
require.False(t, and(false, true, true))
require.True(t, and(true, true, true))
or := func(in ...bool) bool {
return f.Reduce(in, func(a, b bool) bool { return a || b }, false)
}
require.False(t, or())
require.True(t, or(true))
require.False(t, or(false))
require.True(t, or(true, true))
require.True(t, or(true, false))
require.True(t, or(false, true))
require.False(t, or(false, false))
require.True(t, or(true, true, false))
require.True(t, or(false, true, false))
require.False(t, or(false, false, false))
require.True(t, or(true, true, true))
add := func(in ...int) int {
return f.Reduce(in, func(a, b int) int { return a + b })
}
require.Equal(t, 0, add())
require.Equal(t, 10, add(10))
require.Equal(t, 15, add(10, 2, 3))
}
func TestCount(t *testing.T) {
a := []string{"aaa", "bbb", "ccc"}
require.Equal(t, 1, f.Count(a, f.Equals("bbb")))
require.Equal(t, 0, f.Count(a, f.Equals("ddd")))
require.Equal(t, 3, f.Count(a, f.NotEquals("ddd")))
}