// Copyright (c) The M1CPU Authors
// SPDX-License-Identifier: MPL-2.0

//go:build !darwin || !arm64 || !cgo

package m1cpu

import (
	"testing"

	"github.com/shoenig/test/must"
)

const (
	message = "m1cpu: not a darwin/arm64 system"
)

func panics(f func()) (message string) {
	defer func() {
		if r := recover(); r != nil {
			message = r.(string)
		}
	}()
	f()
	return
}

func Test_IsAppleSilicon(t *testing.T) {
	result := IsAppleSilicon()
	must.False(t, result)
}

func check(t *testing.T, f func()) {
	t.Helper()
	result := panics(f)
	must.Eq(t, result, message)
}

func Test_PCoreHz(t *testing.T) {
	check(t, func() { _ = PCoreHz() })
}

func Test_ECoreHz(t *testing.T) {
	check(t, func() { _ = ECoreHz() })
}

func Test_PCoreGHz(t *testing.T) {
	check(t, func() { _ = PCoreGHz() })
}

func Test_ECoreGHz(t *testing.T) {
	check(t, func() { _ = ECoreGHz() })
}

func Test_PCoreCount(t *testing.T) {
	check(t, func() { _ = PCoreCount() })
}

func Test_ECoreCount(t *testing.T) {
	check(t, func() { _ = ECoreCount() })
}

func Test_PCoreCache(t *testing.T) {
	check(t, func() { _, _, _ = PCoreCache() })
}

func Test_ECoreCache(t *testing.T) {
	check(t, func() { _, _, _ = ECoreCache() })
}

func Test_ModelName(t *testing.T) {
	check(t, func() { _ = ModelName() })
}
