| // Copyright IBM Corp. 2014, 2026 | |
| // SPDX-License-Identifier: BUSL-1.1 | |
| package addrs | |
| import ( | |
| "fmt" | |
| "testing" | |
| ) | |
| func TestResourceEqual_true(t *testing.T) { | |
| resources := []Resource{ | |
| { | |
| Mode: ManagedResourceMode, | |
| Type: "a", | |
| Name: "b", | |
| }, | |
| { | |
| Mode: DataResourceMode, | |
| Type: "a", | |
| Name: "b", | |
| }, | |
| } | |
| for _, r := range resources { | |
| t.Run(r.String(), func(t *testing.T) { | |
| if !r.Equal(r) { | |
| t.Fatalf("expected %#v to be equal to itself", r) | |
| } | |
| }) | |
| } | |
| } | |
| func TestResourceEqual_false(t *testing.T) { | |
| testCases := []struct { | |
| left Resource | |
| right Resource | |
| }{ | |
| { | |
| Resource{Mode: DataResourceMode, Type: "a", Name: "b"}, | |
| Resource{Mode: ManagedResourceMode, Type: "a", Name: "b"}, | |
| }, | |
| { | |
| Resource{Mode: ManagedResourceMode, Type: "a", Name: "b"}, | |
| Resource{Mode: ManagedResourceMode, Type: "b", Name: "b"}, | |
| }, | |
| { | |
| Resource{Mode: ManagedResourceMode, Type: "a", Name: "b"}, | |
| Resource{Mode: ManagedResourceMode, Type: "a", Name: "c"}, | |
| }, | |
| } | |
| for _, tc := range testCases { | |
| t.Run(fmt.Sprintf("%s = %s", tc.left, tc.right), func(t *testing.T) { | |
| if tc.left.Equal(tc.right) { | |
| t.Fatalf("expected %#v not to be equal to %#v", tc.left, tc.right) | |
| } | |
| if tc.right.Equal(tc.left) { | |
| t.Fatalf("expected %#v not to be equal to %#v", tc.right, tc.left) | |
| } | |
| }) | |
| } | |
| } | |
| func TestResourceInstanceEqual_true(t *testing.T) { | |
| resources := []ResourceInstance{ | |
| { | |
| Resource: Resource{ | |
| Mode: ManagedResourceMode, | |
| Type: "a", | |
| Name: "b", | |
| }, | |
| Key: IntKey(0), | |
| }, | |
| { | |
| Resource: Resource{ | |
| Mode: DataResourceMode, | |
| Type: "a", | |
| Name: "b", | |
| }, | |
| Key: StringKey("x"), | |
| }, | |
| } | |
| for _, r := range resources { | |
| t.Run(r.String(), func(t *testing.T) { | |
| if !r.Equal(r) { | |
| t.Fatalf("expected %#v to be equal to itself", r) | |
| } | |
| }) | |
| } | |
| } | |
| func TestResourceInstanceEqual_false(t *testing.T) { | |
| testCases := []struct { | |
| left ResourceInstance | |
| right ResourceInstance | |
| }{ | |
| { | |
| ResourceInstance{ | |
| Resource: Resource{Mode: DataResourceMode, Type: "a", Name: "b"}, | |
| Key: IntKey(0), | |
| }, | |
| ResourceInstance{ | |
| Resource: Resource{Mode: ManagedResourceMode, Type: "a", Name: "b"}, | |
| Key: IntKey(0), | |
| }, | |
| }, | |
| { | |
| ResourceInstance{ | |
| Resource: Resource{Mode: ManagedResourceMode, Type: "a", Name: "b"}, | |
| Key: IntKey(0), | |
| }, | |
| ResourceInstance{ | |
| Resource: Resource{Mode: ManagedResourceMode, Type: "b", Name: "b"}, | |
| Key: IntKey(0), | |
| }, | |
| }, | |
| { | |
| ResourceInstance{ | |
| Resource: Resource{Mode: ManagedResourceMode, Type: "a", Name: "b"}, | |
| Key: IntKey(0), | |
| }, | |
| ResourceInstance{ | |
| Resource: Resource{Mode: ManagedResourceMode, Type: "a", Name: "c"}, | |
| Key: IntKey(0), | |
| }, | |
| }, | |
| { | |
| ResourceInstance{ | |
| Resource: Resource{Mode: DataResourceMode, Type: "a", Name: "b"}, | |
| Key: IntKey(0), | |
| }, | |
| ResourceInstance{ | |
| Resource: Resource{Mode: DataResourceMode, Type: "a", Name: "b"}, | |
| Key: StringKey("0"), | |
| }, | |
| }, | |
| } | |
| for _, tc := range testCases { | |
| t.Run(fmt.Sprintf("%s = %s", tc.left, tc.right), func(t *testing.T) { | |
| if tc.left.Equal(tc.right) { | |
| t.Fatalf("expected %#v not to be equal to %#v", tc.left, tc.right) | |
| } | |
| if tc.right.Equal(tc.left) { | |
| t.Fatalf("expected %#v not to be equal to %#v", tc.right, tc.left) | |
| } | |
| }) | |
| } | |
| } | |
| func TestAbsResourceInstanceEqual_true(t *testing.T) { | |
| managed := Resource{Mode: ManagedResourceMode, Type: "a", Name: "b"} | |
| data := Resource{Mode: DataResourceMode, Type: "a", Name: "b"} | |
| foo, diags := ParseModuleInstanceStr("module.foo") | |
| if len(diags) > 0 { | |
| t.Fatalf("unexpected diags: %s", diags.Err()) | |
| } | |
| foobar, diags := ParseModuleInstanceStr("module.foo[1].module.bar") | |
| if len(diags) > 0 { | |
| t.Fatalf("unexpected diags: %s", diags.Err()) | |
| } | |
| instances := []AbsResourceInstance{ | |
| managed.Instance(IntKey(0)).Absolute(foo), | |
| data.Instance(IntKey(0)).Absolute(foo), | |
| managed.Instance(StringKey("a")).Absolute(foobar), | |
| } | |
| for _, r := range instances { | |
| t.Run(r.String(), func(t *testing.T) { | |
| if !r.Equal(r) { | |
| t.Fatalf("expected %#v to be equal to itself", r) | |
| } | |
| }) | |
| } | |
| } | |
| func TestAbsResourceInstanceEqual_false(t *testing.T) { | |
| managed := Resource{Mode: ManagedResourceMode, Type: "a", Name: "b"} | |
| data := Resource{Mode: DataResourceMode, Type: "a", Name: "b"} | |
| foo, diags := ParseModuleInstanceStr("module.foo") | |
| if len(diags) > 0 { | |
| t.Fatalf("unexpected diags: %s", diags.Err()) | |
| } | |
| foobar, diags := ParseModuleInstanceStr("module.foo[1].module.bar") | |
| if len(diags) > 0 { | |
| t.Fatalf("unexpected diags: %s", diags.Err()) | |
| } | |
| testCases := []struct { | |
| left AbsResourceInstance | |
| right AbsResourceInstance | |
| }{ | |
| { | |
| managed.Instance(IntKey(0)).Absolute(foo), | |
| data.Instance(IntKey(0)).Absolute(foo), | |
| }, | |
| { | |
| managed.Instance(IntKey(0)).Absolute(foo), | |
| managed.Instance(IntKey(0)).Absolute(foobar), | |
| }, | |
| { | |
| managed.Instance(IntKey(0)).Absolute(foo), | |
| managed.Instance(StringKey("0")).Absolute(foo), | |
| }, | |
| } | |
| for _, tc := range testCases { | |
| t.Run(fmt.Sprintf("%s = %s", tc.left, tc.right), func(t *testing.T) { | |
| if tc.left.Equal(tc.right) { | |
| t.Fatalf("expected %#v not to be equal to %#v", tc.left, tc.right) | |
| } | |
| if tc.right.Equal(tc.left) { | |
| t.Fatalf("expected %#v not to be equal to %#v", tc.right, tc.left) | |
| } | |
| }) | |
| } | |
| } | |
| func TestAbsResourceUniqueKey(t *testing.T) { | |
| resourceAddr1 := Resource{ | |
| Mode: ManagedResourceMode, | |
| Type: "a", | |
| Name: "b1", | |
| }.Absolute(RootModuleInstance) | |
| resourceAddr2 := Resource{ | |
| Mode: ManagedResourceMode, | |
| Type: "a", | |
| Name: "b2", | |
| }.Absolute(RootModuleInstance) | |
| resourceAddr3 := Resource{ | |
| Mode: ManagedResourceMode, | |
| Type: "a", | |
| Name: "in_module", | |
| }.Absolute(RootModuleInstance.Child("boop", NoKey)) | |
| tests := []struct { | |
| Reciever AbsResource | |
| Other UniqueKeyer | |
| WantEqual bool | |
| }{ | |
| { | |
| resourceAddr1, | |
| resourceAddr1, | |
| true, | |
| }, | |
| { | |
| resourceAddr1, | |
| resourceAddr2, | |
| false, | |
| }, | |
| { | |
| resourceAddr1, | |
| resourceAddr3, | |
| false, | |
| }, | |
| { | |
| resourceAddr3, | |
| resourceAddr3, | |
| true, | |
| }, | |
| { | |
| resourceAddr1, | |
| resourceAddr1.Instance(NoKey), | |
| false, // no-key instance key is distinct from its resource even though they have the same String result | |
| }, | |
| { | |
| resourceAddr1, | |
| resourceAddr1.Instance(IntKey(1)), | |
| false, | |
| }, | |
| } | |
| for _, test := range tests { | |
| t.Run(fmt.Sprintf("%s matches %T %s?", test.Reciever, test.Other, test.Other), func(t *testing.T) { | |
| rKey := test.Reciever.UniqueKey() | |
| oKey := test.Other.UniqueKey() | |
| gotEqual := rKey == oKey | |
| if gotEqual != test.WantEqual { | |
| t.Errorf( | |
| "wrong result\nreceiver: %s\nother: %s (%T)\ngot: %t\nwant: %t", | |
| test.Reciever, test.Other, test.Other, | |
| gotEqual, test.WantEqual, | |
| ) | |
| } | |
| }) | |
| } | |
| } | |
| func TestConfigResourceEqual_true(t *testing.T) { | |
| resources := []ConfigResource{ | |
| { | |
| Resource: Resource{Mode: ManagedResourceMode, Type: "a", Name: "b"}, | |
| Module: RootModule, | |
| }, | |
| { | |
| Resource: Resource{Mode: DataResourceMode, Type: "a", Name: "b"}, | |
| Module: RootModule, | |
| }, | |
| { | |
| Resource: Resource{Mode: ManagedResourceMode, Type: "a", Name: "b"}, | |
| Module: Module{"foo"}, | |
| }, | |
| { | |
| Resource: Resource{Mode: DataResourceMode, Type: "a", Name: "b"}, | |
| Module: Module{"foo"}, | |
| }, | |
| } | |
| for _, r := range resources { | |
| t.Run(r.String(), func(t *testing.T) { | |
| if !r.Equal(r) { | |
| t.Fatalf("expected %#v to be equal to itself", r) | |
| } | |
| }) | |
| } | |
| } | |
| func TestConfigResourceEqual_false(t *testing.T) { | |
| managed := Resource{Mode: ManagedResourceMode, Type: "a", Name: "b"} | |
| data := Resource{Mode: DataResourceMode, Type: "a", Name: "b"} | |
| foo := Module{"foo"} | |
| foobar := Module{"foobar"} | |
| testCases := []struct { | |
| left ConfigResource | |
| right ConfigResource | |
| }{ | |
| { | |
| ConfigResource{Resource: managed, Module: foo}, | |
| ConfigResource{Resource: data, Module: foo}, | |
| }, | |
| { | |
| ConfigResource{Resource: managed, Module: foo}, | |
| ConfigResource{Resource: managed, Module: foobar}, | |
| }, | |
| } | |
| for _, tc := range testCases { | |
| t.Run(fmt.Sprintf("%s = %s", tc.left, tc.right), func(t *testing.T) { | |
| if tc.left.Equal(tc.right) { | |
| t.Fatalf("expected %#v not to be equal to %#v", tc.left, tc.right) | |
| } | |
| if tc.right.Equal(tc.left) { | |
| t.Fatalf("expected %#v not to be equal to %#v", tc.right, tc.left) | |
| } | |
| }) | |
| } | |
| } |