blob: 2abe30ad364d0f1dd7719ab4d4b286e8786a69b9 [file]
// Copyright 2026 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build goexperiment.simd && (amd64 || arm64 || wasm)
package simd
import (
"fmt"
"strings"
"testing"
)
func TestConfigurePlainPlus(t *testing.T) {
for _, test := range []struct {
name string
actualMax int
allFeatureSize int
wantHWClmul bool
}{
{"missing feature", 256, 128, false},
{"all features", 256, 256, true},
} {
t.Run(test.name, func(t *testing.T) {
max, emulated, hwClmul := configure(test.actualMax, test.allFeatureSize, "+")
if max != test.actualMax || emulated || hwClmul != test.wantHWClmul {
t.Errorf("configure(%d, %d, +) = (%d, %t, %t), want (%d, false, %t)",
test.actualMax, test.allFeatureSize, max, emulated, hwClmul,
test.actualMax, test.wantHWClmul)
}
maxWithSize, emulatedWithSize, hwClmulWithSize := configure(test.actualMax, test.allFeatureSize, "+256")
if max != maxWithSize || emulated != emulatedWithSize || hwClmul != hwClmulWithSize {
t.Errorf("plain + result (%d, %t, %t) differs from +256 result (%d, %t, %t)",
max, emulated, hwClmul, maxWithSize, emulatedWithSize, hwClmulWithSize)
}
})
}
}
func TestConfigureDefault(t *testing.T) {
max, emulated, hwClmul := configure(256, 256, "")
if max != 256 || emulated || !hwClmul {
t.Errorf("configure(256, 256, empty) = (%d, %t, %t), want (256, false, true)",
max, emulated, hwClmul)
}
}
func TestConfigureOne(t *testing.T) {
for _, test := range []struct {
actualMax int
allFeatureSize int
}{
{128, 0},
{128, 128},
{256, 128},
{256, 256},
{512, 256},
{512, 512},
} {
gotMax, gotEmulated, gotHWClmul := configure(test.actualMax, test.allFeatureSize, "1")
wantMax, wantEmulated, wantHWClmul := configure(test.actualMax, test.allFeatureSize, "+")
if gotMax != wantMax || gotEmulated != wantEmulated || gotHWClmul != wantHWClmul {
t.Errorf("configure(%d, %d, 1) = (%d, %t, %t), want plain + result (%d, %t, %t)",
test.actualMax, test.allFeatureSize, gotMax, gotEmulated, gotHWClmul,
wantMax, wantEmulated, wantHWClmul)
}
}
}
func TestConfigureInvalidSize(t *testing.T) {
for _, test := range []struct {
value string
want string
}{
{"17", "not a supported vector size"},
{"64", "not a supported vector size"},
{"127", "not a supported vector size"},
{"129", "not a supported vector size"},
{"200", "not a supported vector size"},
{"+17", "not a supported vector size"},
{"-1", "is negative"},
{"abc", "could not parse"},
} {
t.Run(test.value, func(t *testing.T) {
defer func() {
got := recover()
if got == nil {
t.Fatalf("configure(512, 512, %q) did not panic", test.value)
}
if message := fmt.Sprint(got); !strings.Contains(message, test.want) {
t.Fatalf("configure(512, 512, %q) panicked with %q, want substring %q", test.value, message, test.want)
}
}()
configure(512, 512, test.value)
})
}
}