1// Copyright 2023 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package rand_test
6
7import (
8	. "math/rand/v2"
9	"testing"
10)
11
12func BenchmarkPCG_DXSM(b *testing.B) {
13	var p PCG
14	var t uint64
15	for n := b.N; n > 0; n-- {
16		t += p.Uint64()
17	}
18	Sink = t
19}
20
21func TestPCGMarshal(t *testing.T) {
22	var p PCG
23	const (
24		seed1 = 0x123456789abcdef0
25		seed2 = 0xfedcba9876543210
26		want  = "pcg:\x12\x34\x56\x78\x9a\xbc\xde\xf0\xfe\xdc\xba\x98\x76\x54\x32\x10"
27	)
28	p.Seed(seed1, seed2)
29	data, err := p.MarshalBinary()
30	if string(data) != want || err != nil {
31		t.Errorf("MarshalBinary() = %q, %v, want %q, nil", data, err, want)
32	}
33
34	q := PCG{}
35	if err := q.UnmarshalBinary([]byte(want)); err != nil {
36		t.Fatalf("UnmarshalBinary(): %v", err)
37	}
38	if q != p {
39		t.Fatalf("after round trip, q = %#x, but p = %#x", q, p)
40	}
41
42	qu := q.Uint64()
43	pu := p.Uint64()
44	if qu != pu {
45		t.Errorf("after round trip, q.Uint64() = %#x, but p.Uint64() = %#x", qu, pu)
46	}
47}
48
49func TestPCG(t *testing.T) {
50	p := NewPCG(1, 2)
51	want := []uint64{
52		0xc4f5a58656eef510,
53		0x9dcec3ad077dec6c,
54		0xc8d04605312f8088,
55		0xcbedc0dcb63ac19a,
56		0x3bf98798cae97950,
57		0xa8c6d7f8d485abc,
58		0x7ffa3780429cd279,
59		0x730ad2626b1c2f8e,
60		0x21ff2330f4a0ad99,
61		0x2f0901a1947094b0,
62		0xa9735a3cfbe36cef,
63		0x71ddb0a01a12c84a,
64		0xf0e53e77a78453bb,
65		0x1f173e9663be1e9d,
66		0x657651da3ac4115e,
67		0xc8987376b65a157b,
68		0xbb17008f5fca28e7,
69		0x8232bd645f29ed22,
70		0x12be8f07ad14c539,
71		0x54908a48e8e4736e,
72	}
73
74	for i, x := range want {
75		if u := p.Uint64(); u != x {
76			t.Errorf("PCG #%d = %#x, want %#x", i, u, x)
77		}
78	}
79}
80