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  }