public void VirtualProperty() { var soft = Session as SoftDebuggerSession; if (soft != null && soft.ProtocolVersion < new Version(2, 31)) { Assert.Ignore("A newer version of the Mono runtime is required."); } var ops = EvaluationOptions.DefaultOptions.Clone(); ops.FlattenHierarchy = false; ObjectValue val = Frame.GetExpressionValue("c", ops); Assert.IsNotNull(val); val = val.Sync(); Assert.IsFalse(val.IsError); Assert.IsFalse(val.IsUnknown); // The C class does not have a Prop property ObjectValue prop = val.GetChildSync("Prop", ops); Assert.IsNull(prop); prop = val.GetChildSync("PropNoVirt1", ops); Assert.IsNull(prop); prop = val.GetChildSync("PropNoVirt2", ops); Assert.IsNull(prop); val = val.GetChildSync("base", ops); Assert.IsNotNull(val); val.WaitHandle.WaitOne(); Assert.IsFalse(val.IsError); Assert.IsFalse(val.IsUnknown); // The B class has a Prop property, value is 2 prop = val.GetChildSync("Prop", ops); Assert.IsNotNull(prop); Assert.AreEqual("2", prop.Value); prop = val.GetChildSync("PropNoVirt1", ops); Assert.IsNotNull(prop); Assert.AreEqual("2", prop.Value); prop = val.GetChildSync("PropNoVirt2", ops); Assert.IsNotNull(prop); Assert.AreEqual("2", prop.Value); val = val.GetChildSync("base", ops); Assert.IsNotNull(val); val.WaitHandle.WaitOne(); Assert.IsFalse(val.IsError); Assert.IsFalse(val.IsUnknown); // The A class has a Prop property, value is 1, but must return 2 becasue it is overriden prop = val.GetChildSync("Prop", ops); Assert.IsNotNull(prop); Assert.AreEqual("2", prop.Value); prop = val.GetChildSync("PropNoVirt1", ops); Assert.IsNotNull(prop); Assert.AreEqual("1", prop.Value); prop = val.GetChildSync("PropNoVirt2", ops); Assert.IsNotNull(prop); Assert.AreEqual("1", prop.Value); }