(t *testing.T)
| 387 | } |
| 388 | |
| 389 | func TestFunctionMerge(t *testing.T) { |
| 390 | sizeFunc, err := NewFunction("size", |
| 391 | FunctionDocs(`compute the number of entries in a list or map`), |
| 392 | MemberOverload("list_size", |
| 393 | []*types.Type{types.NewListType(types.NewTypeParamType("T"))}, types.IntType), |
| 394 | MemberOverload("map_size", |
| 395 | []*types.Type{types.NewMapType(types.NewTypeParamType("K"), types.NewTypeParamType("V"))}, types.IntType), |
| 396 | ) |
| 397 | if err != nil { |
| 398 | t.Fatalf("NewFunction() failed: %v", err) |
| 399 | } |
| 400 | out, err := sizeFunc.Merge(sizeFunc) |
| 401 | if err != nil { |
| 402 | t.Errorf("sizeFunc.Merge(sizeFunc) failed: %v", err) |
| 403 | } |
| 404 | if out != sizeFunc { |
| 405 | t.Errorf("sizeFunc.Merge(sizeFunc) != sizeFunc: %v", out) |
| 406 | } |
| 407 | sizeVecFunc, err := NewFunction("size", |
| 408 | MemberOverload("vector_size", |
| 409 | []*types.Type{types.NewOpaqueType("vector", types.NewTypeParamType("T"))}, types.IntType), |
| 410 | SingletonUnaryBinding(func(sizer ref.Val) ref.Val { |
| 411 | return sizer.(traits.Sizer).Size() |
| 412 | }, traits.SizerType), |
| 413 | ) |
| 414 | if err != nil { |
| 415 | t.Fatalf("NewFunction() failed: %v", err) |
| 416 | } |
| 417 | sizeMerged, err := sizeFunc.Merge(sizeVecFunc) |
| 418 | if err != nil { |
| 419 | t.Fatalf("Merge() failed: %v", err) |
| 420 | } |
| 421 | if sizeMerged.Name() != "size" { |
| 422 | t.Errorf("Merge() produced a function with name %v, wanted 'size'", sizeMerged.Name()) |
| 423 | } |
| 424 | if len(sizeMerged.overloads) != 3 { |
| 425 | t.Errorf("Merge() produced %d overloads, wanted 3", len(sizeFunc.overloads)) |
| 426 | } |
| 427 | if sizeMerged.Description() != "compute the number of entries in a list or map" { |
| 428 | t.Errorf("Description() got %s, wanted %s", sizeMerged.Description(), |
| 429 | "compute the number of entries in a list or map") |
| 430 | } |
| 431 | overloads := map[string]bool{ |
| 432 | "list_size": true, |
| 433 | "map_size": true, |
| 434 | "vector_size": true, |
| 435 | } |
| 436 | for _, o := range sizeMerged.overloads { |
| 437 | delete(overloads, o.ID()) |
| 438 | } |
| 439 | if len(overloads) != 0 { |
| 440 | t.Errorf("Merge() did not include overloads: %v", overloads) |
| 441 | } |
| 442 | } |
| 443 | |
| 444 | func TestFunctionMergeWrongName(t *testing.T) { |
| 445 | sizeFunc, err := NewFunction("size", |
nothing calls this directly
no test coverage detected