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