github.com/ipld/go-ipld-prime@v0.21.0/datamodel/copy_test.go (about)

     1  package datamodel_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/ipld/go-ipld-prime/datamodel"
     7  	"github.com/ipld/go-ipld-prime/fluent/qp"
     8  	basic "github.com/ipld/go-ipld-prime/node/basicnode"
     9  )
    10  
    11  var copyTests = []struct {
    12  	name string
    13  	na   datamodel.NodeBuilder
    14  	n    datamodel.Node
    15  	err  string
    16  }{
    17  	{name: "Null / Any", na: basic.Prototype.Any.NewBuilder(), n: datamodel.Null},
    18  	{name: "Int / Any", na: basic.Prototype.Any.NewBuilder(), n: basic.NewInt(100)},
    19  	{name: "Int / Int", na: basic.Prototype.Int.NewBuilder(), n: basic.NewInt(1000)},
    20  	{name: "Bool / Any", na: basic.Prototype.Any.NewBuilder(), n: basic.NewBool(true)},
    21  	{name: "Bool / Bool", na: basic.Prototype.Bool.NewBuilder(), n: basic.NewBool(false)},
    22  	{name: "Float / Any", na: basic.Prototype.Any.NewBuilder(), n: basic.NewFloat(1.1)},
    23  	{name: "Float / Float", na: basic.Prototype.Float.NewBuilder(), n: basic.NewFloat(1.2)},
    24  	{name: "String / Any", na: basic.Prototype.Any.NewBuilder(), n: basic.NewString("mary had")},
    25  	{name: "String / String", na: basic.Prototype.String.NewBuilder(), n: basic.NewString("a little lamb")},
    26  	{name: "Bytes / Any", na: basic.Prototype.Any.NewBuilder(), n: basic.NewBytes([]byte("mary had"))},
    27  	{name: "Bytes / Bytes", na: basic.Prototype.Bytes.NewBuilder(), n: basic.NewBytes([]byte("a little lamb"))},
    28  	{name: "Link / Any", na: basic.Prototype.Any.NewBuilder(), n: basic.NewLink(globalLink)},
    29  	{name: "Link / Link", na: basic.Prototype.Link.NewBuilder(), n: basic.NewLink(globalLink2)},
    30  	{
    31  		name: "List / Any",
    32  		na:   basic.Prototype.Any.NewBuilder(),
    33  		n: qpMust(qp.BuildList(basic.Prototype.Any, -1, func(am datamodel.ListAssembler) {
    34  			qp.ListEntry(am, qp.Int(7))
    35  			qp.ListEntry(am, qp.Int(8))
    36  		})),
    37  	},
    38  	{
    39  		name: "List / List",
    40  		na:   basic.Prototype.List.NewBuilder(),
    41  		n: qpMust(qp.BuildList(basic.Prototype.List, -1, func(am datamodel.ListAssembler) {
    42  			qp.ListEntry(am, qp.String("yep"))
    43  			qp.ListEntry(am, qp.Int(8))
    44  			qp.ListEntry(am, qp.String("nope"))
    45  		})),
    46  	},
    47  	{
    48  		name: "Map / Any",
    49  		na:   basic.Prototype.Any.NewBuilder(),
    50  		n: qpMust(qp.BuildMap(basic.Prototype.Any, -1, func(am datamodel.MapAssembler) {
    51  			qp.MapEntry(am, "foo", qp.Int(7))
    52  			qp.MapEntry(am, "bar", qp.Int(8))
    53  		})),
    54  	},
    55  	{
    56  		name: "Map / Map",
    57  		na:   basic.Prototype.Map.NewBuilder(),
    58  		n: qpMust(qp.BuildMap(basic.Prototype.Map, -1, func(am datamodel.MapAssembler) {
    59  			qp.MapEntry(am, "foo", qp.Int(7))
    60  			qp.MapEntry(am, "bar", qp.Int(8))
    61  			qp.MapEntry(am, "bang", qp.Link(globalLink))
    62  		})),
    63  	},
    64  	{name: "nil", na: basic.Prototype.Any.NewBuilder(), n: nil, err: "cannot copy a nil node"},
    65  	{name: "absent", na: basic.Prototype.Any.NewBuilder(), n: datamodel.Absent, err: "copying an absent node makes no sense"},
    66  }
    67  
    68  func TestCopy(t *testing.T) {
    69  	for _, tt := range copyTests {
    70  		tt := tt
    71  		t.Run(tt.name, func(t *testing.T) {
    72  			t.Parallel()
    73  			err := datamodel.Copy(tt.n, tt.na)
    74  			if err != nil {
    75  				if tt.err != "" {
    76  					if err.Error() != tt.err {
    77  						t.Fatalf("expected error %q, got %q", tt.err, err.Error())
    78  					}
    79  				} else {
    80  					t.Fatal(err)
    81  				}
    82  				return
    83  			} else if tt.err != "" {
    84  				t.Fatalf("expected error %q, got nil", tt.err)
    85  				return
    86  			}
    87  			out := tt.na.Build()
    88  			if !datamodel.DeepEqual(tt.n, out) {
    89  				t.Fatalf("deep equal failed")
    90  			}
    91  		})
    92  	}
    93  }