diff --git a/tests/ScriptTests.cs b/tests/ScriptTests.cs
index e64325083..6ea00bfb1 100644
--- a/tests/ScriptTests.cs
+++ b/tests/ScriptTests.cs
@@ -22,6 +22,11 @@ public void TestTypeSystem() {
RunTest("/TypeSystem.htm");
}
+ [TestMethod]
+ public void TestBases() {
+ RunTest("/Bases.htm");
+ }
+
#region Loader Tests
[TestMethod]
public void TestLoader() {
diff --git a/tests/TestSite/Bases.htm b/tests/TestSite/Bases.htm
new file mode 100644
index 000000000..a90ed09b5
--- /dev/null
+++ b/tests/TestSite/Bases.htm
@@ -0,0 +1,45 @@
+
+
+
+ Bases
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/TestSite/Code/OOP.cs b/tests/TestSite/Code/OOP.cs
index 1b5d7b415..7891e84ef 100644
--- a/tests/TestSite/Code/OOP.cs
+++ b/tests/TestSite/Code/OOP.cs
@@ -121,3 +121,140 @@ public interface IObject {
public class Zoo {
}
}
+
+
+namespace Test.Bases {
+
+ // A series of classes with different combinations of overrides at different
+ // levels in the class hierarchy. Tests issues #379, #384 as applied to properties,
+ // methods, and index operators.
+
+ public class C1 {
+ private string _valueA = "A";
+
+ public virtual string PropertyA {
+ get {
+ return _valueA + "-PC1";
+ }
+ set {
+ _valueA = value + "+PC1";
+ }
+ }
+
+ public virtual string MethodA() {
+ return _valueA + "-MC1";
+ }
+
+ public virtual string this[int key] {
+ get {
+ return _valueA + "-" + key.ToString() + "IC1";
+ }
+ set {
+ _valueA = value + "+" + key.ToString() + "IC1";
+ }
+ }
+ }
+
+ public class C2 : C1 {
+ public override string PropertyA {
+ get {
+ return base.PropertyA + "-PC2";
+ }
+ set {
+ base.PropertyA = value + "+PC2";
+ }
+ }
+
+ public override string MethodA() {
+ return base.MethodA() + "-MC2";
+ }
+
+ public override string this[int key] {
+ get {
+ return base[key] + "-" + key.ToString() + "IC2";
+ }
+ set {
+ base[key] = value + "+" + key.ToString() + "IC2";
+ }
+ }
+ }
+
+ public class C3 : C2 {
+ public override string PropertyA {
+ get {
+ return base.PropertyA + "-PC3";
+ }
+ set {
+ base.PropertyA = value + "+PC3";
+ }
+ }
+
+ public override string MethodA() {
+ return base.MethodA() + "-MC3";
+ }
+
+ public override string this[int key] {
+ get {
+ return base[key] + "-" + key.ToString() + "IC3";
+ }
+ set {
+ base[key] = value + "+" + key.ToString() + "IC3";
+ }
+ }
+ }
+
+ public class C4 : C3 {
+ // intentionally skip this generation of overrides
+ }
+
+ public class C5 : C4 {
+ public override string PropertyA {
+ get {
+ return base.PropertyA + "-PC5";
+ }
+ set {
+ base.PropertyA = value + "+PC5";
+ }
+ }
+
+ public override string MethodA() {
+ return base.MethodA() + "-MC5";
+ }
+
+ public override string this[int key] {
+ get {
+ return base[key] + "-" + key.ToString() + "IC5";
+ }
+ set {
+ base[key] = value + "+" + key.ToString() + "IC5";
+ }
+ }
+ }
+
+ public class TestCase {
+
+ public static string RunTest(C1 x) {
+ string output = "";
+ string delim = ",";
+
+ // Test getter, method, and index (should accumulate outward through bases)
+ output = x.PropertyA
+ + delim + x.MethodA()
+ + delim + x[99];
+
+ // Test property setter (should accumulate inward and outward through bases)
+
+ x.PropertyA = "X";
+ output += delim + x.PropertyA;
+
+ // Test index setter (should accumulate inward and outward through bases)
+
+ x[88] = "Y";
+ output += delim + x[99];
+
+ return output;
+ }
+
+ }
+
+}