github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/examples/gno.land/p/demo/merkle/merkle_test.gno (about)

     1  package merkle
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  	"time"
     7  )
     8  
     9  type testData struct {
    10  	content string
    11  }
    12  
    13  func (d testData) Bytes() []byte {
    14  	return []byte(d.content)
    15  }
    16  
    17  func TestMerkleTree(t *testing.T) {
    18  	tests := []struct {
    19  		size     int
    20  		expected string
    21  	}{
    22  		{
    23  			size:     1,
    24  			expected: "cf9f824bce7f5bc63d557b23591f58577f53fe29f974a615bdddbd0140f912f4",
    25  		},
    26  		{
    27  			size:     3,
    28  			expected: "1a4a5f0fa267244bf9f74a63fdf2a87eed5e97e4bd104a9e94728c8fb5442177",
    29  		},
    30  		{
    31  			size:     10,
    32  			expected: "cd8a40502b0b92bf58e7432a5abb2d8b60121cf2b7966d6ebaf103f907a1bc21",
    33  		},
    34  		{
    35  			size:     1000,
    36  			expected: "fa533d2efdf12be26bc410dfa42936ac63361324e35e9b1ff54d422a1dd2388b",
    37  		},
    38  	}
    39  
    40  	for _, test := range tests {
    41  		var leaves []Hashable
    42  		for i := 0; i < test.size; i++ {
    43  			leaves = append(leaves, testData{fmt.Sprintf("node_%d", i)})
    44  		}
    45  
    46  		tree := NewTree(leaves)
    47  
    48  		if tree == nil {
    49  			t.Error("Merkle tree creation failed")
    50  		}
    51  
    52  		root := tree.Root()
    53  
    54  		if root != test.expected {
    55  			t.Fatalf("merkle.Tree.Root(), expected: %s; got: %s", test.expected, root)
    56  		}
    57  
    58  		for _, leaf := range leaves {
    59  			proofs, err := tree.Proof(leaf)
    60  			if err != nil {
    61  				t.Fatal("failed to proof leaf: %v, on tree: %v", leaf, test)
    62  			}
    63  
    64  			ok := Verify(root, leaf, proofs)
    65  			if !ok {
    66  				t.Fatal("failed to verify leaf: %v, on tree: %v", leaf, tree)
    67  			}
    68  		}
    69  	}
    70  }