github.com/MetalBlockchain/metalgo@v1.11.9/snow/consensus/snowball/binary_snowflake_test.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package snowball 5 6 import ( 7 "testing" 8 9 "github.com/stretchr/testify/require" 10 ) 11 12 func TestBinarySnowflake(t *testing.T) { 13 require := require.New(t) 14 15 blue := 0 16 red := 1 17 18 alphaPreference, alphaConfidence := 1, 2 19 beta := 2 20 terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) 21 22 sf := newBinarySnowflake(alphaPreference, terminationConditions, red) 23 24 require.Equal(red, sf.Preference()) 25 require.False(sf.Finalized()) 26 27 sf.RecordPoll(alphaConfidence, blue) 28 29 require.Equal(blue, sf.Preference()) 30 require.False(sf.Finalized()) 31 32 sf.RecordPoll(alphaConfidence, red) 33 34 require.Equal(red, sf.Preference()) 35 require.False(sf.Finalized()) 36 37 sf.RecordPoll(alphaConfidence, blue) 38 39 require.Equal(blue, sf.Preference()) 40 require.False(sf.Finalized()) 41 42 sf.RecordPoll(alphaPreference, red) 43 require.Equal(red, sf.Preference()) 44 require.False(sf.Finalized()) 45 46 sf.RecordPoll(alphaConfidence, blue) 47 require.Equal(blue, sf.Preference()) 48 require.False(sf.Finalized()) 49 50 sf.RecordPoll(alphaConfidence, blue) 51 require.Equal(blue, sf.Preference()) 52 require.True(sf.Finalized()) 53 } 54 55 type binarySnowflakeTest struct { 56 require *require.Assertions 57 58 binarySnowflake 59 } 60 61 func newBinarySnowflakeTest(t *testing.T, alphaPreference int, terminationConditions []terminationCondition) snowflakeTest[int] { 62 require := require.New(t) 63 64 return &binarySnowflakeTest{ 65 require: require, 66 binarySnowflake: newBinarySnowflake(alphaPreference, terminationConditions, 0), 67 } 68 } 69 70 func (sf *binarySnowflakeTest) RecordPoll(count int, choice int) { 71 sf.binarySnowflake.RecordPoll(count, choice) 72 } 73 74 func (sf *binarySnowflakeTest) AssertEqual(expectedConfidences []int, expectedFinalized bool, expectedPreference int) { 75 sf.require.Equal(expectedPreference, sf.Preference()) 76 sf.require.Equal(expectedConfidences, sf.binarySnowflake.confidence) 77 sf.require.Equal(expectedFinalized, sf.Finalized()) 78 } 79 80 func TestBinarySnowflakeErrorDrivenSingleChoice(t *testing.T) { 81 for _, test := range getErrorDrivenSnowflakeSingleChoiceSuite[int]() { 82 t.Run(test.name, func(t *testing.T) { 83 test.f(t, newBinarySnowflakeTest, 0) 84 }) 85 } 86 } 87 88 func TestBinarySnowflakeErrorDrivenMultiChoice(t *testing.T) { 89 for _, test := range getErrorDrivenSnowflakeMultiChoiceSuite[int]() { 90 t.Run(test.name, func(t *testing.T) { 91 test.f(t, newBinarySnowflakeTest, 0, 1) 92 }) 93 } 94 }