public async Task CanInspectInstanceOpenVirtualDelegate() { using (var scope = await HeapAnalysisScope.Create()) { var delegateObj = scope.Subject.GetFieldValue(nameof(HeapAnalysisTarget.Program.InstanceOpenVirtualDelegate)).CastAs <IClrCompositeObject>(); var details = new DelegateInspector().Inspect(delegateObj); Assert.That(details.Kind.HasFlag(DelegateKind.InstanceOpenVirtual3)); Assert.That(details.TargetOrFirstArg, Is.Null); Assert.That(details.Method, Is.EqualTo(scope.FindClrType <HeapAnalysisTarget.Program.InstanceDelegateContainer>().FindMethodByName("VirtualMethod")).Using(new ClrMethodEqualityComparer())); } }
public async Task IClrObjectWrapperTypeIsNotEqualToAnother(string fieldA, string fieldB) { if (fieldA == fieldB) { return; // Handled by the other test. } using (var scope = await HeapAnalysisScope.Create()) { var wrapperA = scope.Subject.GetFieldValue <IClrObject>(fieldA); var wrapperB = scope.Subject.GetFieldValue <IClrObject>(fieldB); Assert.That(wrapperA, Is.Not.EqualTo(wrapperB)); } }
public async Task CanReadStructType() { using (var scope = await HeapAnalysisScope.Create()) { // Field type is Object, but the value is a boxed struct. We will get a ClrStructObject even // though, statically, the field should yield a ClrReferenceObject. var value = scope.Subject.GetFieldValue <IClrObject>("StructTypeAsObjectField"); Assert.That(value.Type.CanBeAssignedTo <HeapAnalysisTarget.Program.StructType>()); var actual = value.CastAs <ClrStructObject>(); Assert.That(actual.GetFieldValue <string>("StringField"), Is.EqualTo("StructTypeAsObjectField.StringField")); Assert.That(actual.GetFieldValue <int>("IntegerField"), Is.EqualTo(42)); } }
public async Task CanInspectInstanceClosedDelegate() { using (var scope = await HeapAnalysisScope.Create()) { var delegateObj = scope.Subject.GetFieldValue(nameof(HeapAnalysisTarget.Program.InstanceClosedDelegate)).CastAs <IClrCompositeObject>(); var details = new DelegateInspector().Inspect(delegateObj); Assert.That(details.Kind.HasFlag(DelegateKind.InstanceClosed1)); var targetInstance = details.TargetOrFirstArg.CastAs <ClrClassObject>(); Assert.That(targetInstance.Type.CanBeAssignedTo <HeapAnalysisTarget.Program.InstanceDelegateContainer>()); Assert.That(targetInstance.GetFieldValue <string>("instanceId"), Is.EqualTo("Instance1")); Assert.That(details.Method, Is.EqualTo(targetInstance.Type.FindMethodByName("Method")).Using(new ClrMethodEqualityComparer())); } }
public async Task CanReadStructArray() { using (var scope = await HeapAnalysisScope.Create()) { var array = scope.Subject.GetFieldValue <ClrArrayObject>("StructArray"); Assert.That(array.Length, Is.EqualTo(2)); var elements = array.AsEnumerable <ClrStructObject>().Select(Composite.ReadFrom); Assert.That(elements, Is.EqualTo(new [] { new Composite { StringField = "StructArray.One", IntegerField = 10 }, new Composite { StringField = "StructArray.Two", IntegerField = 20 } })); } }