mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-01 14:47:38 +00:00
5d439cc6f2
Time series with only zeros or ones frequently occur in monitoring, so it is worth optimizing their handling.
192 lines
4.9 KiB
Go
192 lines
4.9 KiB
Go
package fastnum
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
)
|
|
|
|
func TestIsInt64Zeros(t *testing.T) {
|
|
for _, n := range []int{0, 1, 10, 100, 1000, 1e4, 1e5, 8*1024 + 1} {
|
|
t.Run(fmt.Sprintf("%d_items", n), func(t *testing.T) {
|
|
a := make([]int64, n)
|
|
if !IsInt64Zeros(a) {
|
|
t.Fatalf("IsInt64Zeros must return true")
|
|
}
|
|
if len(a) > 0 {
|
|
a[len(a)-1] = 1
|
|
if IsInt64Zeros(a) {
|
|
t.Fatalf("IsInt64Zeros must return false")
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestIsInt64Ones(t *testing.T) {
|
|
for _, n := range []int{0, 1, 10, 100, 1000, 1e4, 1e5, 8*1024 + 1} {
|
|
t.Run(fmt.Sprintf("%d_items", n), func(t *testing.T) {
|
|
a := make([]int64, n)
|
|
for i := 0; i < n; i++ {
|
|
a[i] = 1
|
|
}
|
|
if !IsInt64Ones(a) {
|
|
t.Fatalf("IsInt64Ones must return true")
|
|
}
|
|
if len(a) > 0 {
|
|
a[len(a)-1] = 0
|
|
if IsInt64Ones(a) {
|
|
t.Fatalf("IsInt64Ones must return false")
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestIsFloat64Zeros(t *testing.T) {
|
|
for _, n := range []int{0, 1, 10, 100, 1000, 1e4, 1e5, 8*1024 + 1} {
|
|
t.Run(fmt.Sprintf("%d_items", n), func(t *testing.T) {
|
|
a := make([]float64, n)
|
|
if !IsFloat64Zeros(a) {
|
|
t.Fatalf("IsInt64Zeros must return true")
|
|
}
|
|
if len(a) > 0 {
|
|
a[len(a)-1] = 1
|
|
if IsFloat64Zeros(a) {
|
|
t.Fatalf("IsInt64Zeros must return false")
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestIsFloat64Ones(t *testing.T) {
|
|
for _, n := range []int{0, 1, 10, 100, 1000, 1e4, 1e5, 8*1024 + 1} {
|
|
t.Run(fmt.Sprintf("%d_items", n), func(t *testing.T) {
|
|
a := make([]float64, n)
|
|
for i := 0; i < n; i++ {
|
|
a[i] = 1
|
|
}
|
|
if !IsFloat64Ones(a) {
|
|
t.Fatalf("IsInt64Ones must return true")
|
|
}
|
|
if len(a) > 0 {
|
|
a[len(a)-1] = 0
|
|
if IsFloat64Ones(a) {
|
|
t.Fatalf("IsInt64Ones must return false")
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestAppendInt64Zeros(t *testing.T) {
|
|
for _, n := range []int{0, 1, 10, 100, 1000, 1e4, 1e5, 8*1024 + 1} {
|
|
t.Run(fmt.Sprintf("%d_items", n), func(t *testing.T) {
|
|
a := AppendInt64Zeros(nil, n)
|
|
if len(a) != n {
|
|
t.Fatalf("unexpected len(a); got %d; want %d", len(a), n)
|
|
}
|
|
if !IsInt64Zeros(a) {
|
|
t.Fatalf("IsInt64Zeros must return true")
|
|
}
|
|
|
|
prefix := []int64{1, 2, 3}
|
|
a = AppendInt64Zeros(prefix, n)
|
|
if len(a) != len(prefix)+n {
|
|
t.Fatalf("unexpected len(a) with prefix; got %d; want %d", len(a), len(prefix)+n)
|
|
}
|
|
for i := 0; i < len(prefix); i++ {
|
|
if a[i] != prefix[i] {
|
|
t.Fatalf("unexpected prefix[%d]; got %d; want %d", i, a[i], prefix[i])
|
|
}
|
|
}
|
|
if !IsInt64Zeros(a[len(prefix):]) {
|
|
t.Fatalf("IsInt64Zeros for prefixed a must return true")
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestAppendInt64Ones(t *testing.T) {
|
|
for _, n := range []int{0, 1, 10, 100, 1000, 1e4, 1e5, 8*1024 + 1} {
|
|
t.Run(fmt.Sprintf("%d_items", n), func(t *testing.T) {
|
|
a := AppendInt64Ones(nil, n)
|
|
if len(a) != n {
|
|
t.Fatalf("unexpected len(a); got %d; want %d", len(a), n)
|
|
}
|
|
if !IsInt64Ones(a) {
|
|
t.Fatalf("IsInt64Ones must return true")
|
|
}
|
|
|
|
prefix := []int64{1, 2, 3}
|
|
a = AppendInt64Ones(prefix, n)
|
|
if len(a) != len(prefix)+n {
|
|
t.Fatalf("unexpected len(a) with prefix; got %d; want %d", len(a), len(prefix)+n)
|
|
}
|
|
for i := 0; i < len(prefix); i++ {
|
|
if a[i] != prefix[i] {
|
|
t.Fatalf("unexpected prefix[%d]; got %d; want %d", i, a[i], prefix[i])
|
|
}
|
|
}
|
|
if !IsInt64Ones(a[len(prefix):]) {
|
|
t.Fatalf("IsInt64Ones for prefixed a must return true")
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestAppendFloat64Zeros(t *testing.T) {
|
|
for _, n := range []int{0, 1, 10, 100, 1000, 1e4, 1e5, 8*1024 + 1} {
|
|
t.Run(fmt.Sprintf("%d_items", n), func(t *testing.T) {
|
|
a := AppendFloat64Zeros(nil, n)
|
|
if len(a) != n {
|
|
t.Fatalf("unexpected len(a); got %d; want %d", len(a), n)
|
|
}
|
|
if !IsFloat64Zeros(a) {
|
|
t.Fatalf("IsFloat64Zeros must return true")
|
|
}
|
|
|
|
prefix := []float64{1, 2, 3}
|
|
a = AppendFloat64Zeros(prefix, n)
|
|
if len(a) != len(prefix)+n {
|
|
t.Fatalf("unexpected len(a) with prefix; got %d; want %d", len(a), len(prefix)+n)
|
|
}
|
|
for i := 0; i < len(prefix); i++ {
|
|
if a[i] != prefix[i] {
|
|
t.Fatalf("unexpected prefix[%d]; got %f; want %f", i, a[i], prefix[i])
|
|
}
|
|
}
|
|
if !IsFloat64Zeros(a[len(prefix):]) {
|
|
t.Fatalf("IsFloat64Zeros for prefixed a must return true")
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestAppendFloat64Ones(t *testing.T) {
|
|
for _, n := range []int{0, 1, 10, 100, 1000, 1e4, 1e5, 8*1024 + 1} {
|
|
t.Run(fmt.Sprintf("%d_items", n), func(t *testing.T) {
|
|
a := AppendFloat64Ones(nil, n)
|
|
if len(a) != n {
|
|
t.Fatalf("unexpected len(a); got %d; want %d", len(a), n)
|
|
}
|
|
if !IsFloat64Ones(a) {
|
|
t.Fatalf("IsFloat64Ones must return true")
|
|
}
|
|
|
|
prefix := []float64{1, 2, 3}
|
|
a = AppendFloat64Ones(prefix, n)
|
|
if len(a) != len(prefix)+n {
|
|
t.Fatalf("unexpected len(a) with prefix; got %d; want %d", len(a), len(prefix)+n)
|
|
}
|
|
for i := 0; i < len(prefix); i++ {
|
|
if a[i] != prefix[i] {
|
|
t.Fatalf("unexpected prefix[%d]; got %f; want %f", i, a[i], prefix[i])
|
|
}
|
|
}
|
|
if !IsFloat64Ones(a[len(prefix):]) {
|
|
t.Fatalf("IsFloat64Ones for prefixed a must return true")
|
|
}
|
|
})
|
|
}
|
|
}
|