set_test.go 1.34 KB
Newer Older
Hector Sanjuan's avatar
Hector Sanjuan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
package cid

import (
	"crypto/rand"
	"errors"
	"testing"

	mh "github.com/multiformats/go-multihash"
)

func makeRandomCid(t *testing.T) *Cid {
	p := make([]byte, 256)
	_, err := rand.Read(p)
	if err != nil {
		t.Fatal(err)
	}

	h, err := mh.Sum(p, mh.SHA3, 4)
	if err != nil {
		t.Fatal(err)
	}

	cid := &Cid{
		codec:   7,
		version: 1,
		hash:    h,
	}

	return cid
}

func TestSet(t *testing.T) {
	cid := makeRandomCid(t)
	cid2 := makeRandomCid(t)
	s := NewSet()

	s.Add(cid)

	if !s.Has(cid) {
		t.Error("should have the CID")
	}

	if s.Len() != 1 {
		t.Error("should report 1 element")
	}

	keys := s.Keys()

	if len(keys) != 1 || !keys[0].Equals(cid) {
		t.Error("key should correspond to Cid")
	}

	if s.Visit(cid) {
		t.Error("visit should return false")
	}

	foreach := []*Cid{}
	foreachF := func(c *Cid) error {
		foreach = append(foreach, c)
		return nil
	}

	if err := s.ForEach(foreachF); err != nil {
		t.Error(err)
	}

	if len(foreach) != 1 {
		t.Error("ForEach should have visited 1 element")
	}

	foreachErr := func(c *Cid) error {
		return errors.New("test")
	}

	if err := s.ForEach(foreachErr); err == nil {
		t.Error("Should have returned an error")
	}

	if !s.Visit(cid2) {
		t.Error("should have visited a new Cid")
	}

	if s.Len() != 2 {
		t.Error("len should be 2 now")
	}

	s.Remove(cid2)

	if s.Len() != 1 {
		t.Error("len should be 1 now")
	}
}