Files
wazero/api/features_test.go
Crypt Keeper 329ccca6b1 Switches from gofmt to gofumpt (#848)
This switches to gofumpt and applies changes, as I've noticed working
in dapr (who uses this) that it finds some things that are annoying,
such as inconsistent block formatting in test tables.

Signed-off-by: Adrian Cole <adrian@tetrate.io>
2022-11-09 05:48:24 +01:00

106 lines
3.0 KiB
Go

package api
import (
"testing"
"github.com/tetratelabs/wazero/internal/testing/require"
)
// TestCoreFeatures_ZeroIsInvalid reminds maintainers that a bitset cannot use zero as a flag!
// This is why we start iota with 1.
func TestCoreFeatures_ZeroIsInvalid(t *testing.T) {
f := CoreFeatures(0)
f = f.SetEnabled(0, true)
require.False(t, f.IsEnabled(0))
}
// TestCoreFeatures tests the bitset works as expected
func TestCoreFeatures(t *testing.T) {
tests := []struct {
name string
feature CoreFeatures
}{
{
name: "one is the smallest flag",
feature: 1,
},
{
name: "63 is the largest feature flag", // because uint64
feature: 1 << 63,
},
}
for _, tt := range tests {
tc := tt
t.Run(tc.name, func(t *testing.T) {
f := CoreFeatures(0)
// Defaults to false
require.False(t, f.IsEnabled(tc.feature))
// Set true makes it true
f = f.SetEnabled(tc.feature, true)
require.True(t, f.IsEnabled(tc.feature))
// Set false makes it false again
f = f.SetEnabled(tc.feature, false)
require.False(t, f.IsEnabled(tc.feature))
})
}
}
func TestCoreFeatures_String(t *testing.T) {
tests := []struct {
name string
feature CoreFeatures
expected string
}{
{name: "none", feature: 0, expected: ""},
{name: "mutable-global", feature: CoreFeatureMutableGlobal, expected: "mutable-global"},
{name: "sign-extension-ops", feature: CoreFeatureSignExtensionOps, expected: "sign-extension-ops"},
{name: "multi-value", feature: CoreFeatureMultiValue, expected: "multi-value"},
{name: "simd", feature: CoreFeatureSIMD, expected: "simd"},
{name: "features", feature: CoreFeatureMutableGlobal | CoreFeatureMultiValue, expected: "multi-value|mutable-global"},
{name: "undefined", feature: 1 << 63, expected: ""},
{
name: "2.0", feature: CoreFeaturesV2,
expected: "bulk-memory-operations|multi-value|mutable-global|" +
"nontrapping-float-to-int-conversion|reference-types|sign-extension-ops|simd",
},
}
for _, tt := range tests {
tc := tt
t.Run(tc.name, func(t *testing.T) {
require.Equal(t, tc.expected, tc.feature.String())
})
}
}
func TestCoreFeatures_Require(t *testing.T) {
tests := []struct {
name string
feature CoreFeatures
expectedErr string
}{
{name: "none", feature: 0, expectedErr: "feature \"mutable-global\" is disabled"},
{name: "mutable-global", feature: CoreFeatureMutableGlobal},
{name: "sign-extension-ops", feature: CoreFeatureSignExtensionOps, expectedErr: "feature \"mutable-global\" is disabled"},
{name: "multi-value", feature: CoreFeatureMultiValue, expectedErr: "feature \"mutable-global\" is disabled"},
{name: "undefined", feature: 1 << 63, expectedErr: "feature \"mutable-global\" is disabled"},
}
for _, tt := range tests {
tc := tt
t.Run(tc.name, func(t *testing.T) {
err := tc.feature.RequireEnabled(CoreFeatureMutableGlobal)
if tc.expectedErr != "" {
require.EqualError(t, err, tc.expectedErr)
} else {
require.NoError(t, err)
}
})
}
}