File: slices_test.go

package info (click to toggle)
golang-bugst-f 0.4.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 108 kB
  • sloc: makefile: 2
file content (102 lines) | stat: -rw-r--r-- 2,956 bytes parent folder | download
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")))
}