using System;
using System.Collections.Generic;
using multiple_inheritance_interfacesNamespace;

public class multiple_inheritance_interfaces_runme {

  static string SortArrayToString(string[] types) {
    Array.Sort<string>(types);
    return string.Join(" ", types);
  }

  static string SortArrayToString(Type[] types) {
    List<string> stypes = new List<string>();
    foreach (Type t in types)
      stypes.Add(t.Name);
    return SortArrayToString(stypes.ToArray());
  }


  private static void checkBaseAndInterfaces(Type cls, bool interfaceExpected, string baseClass, string[] interfaces) {
    string[] expectedInterfaces = new string[interfaces.Length + (interfaceExpected ? 0 : 1)];
    for (int i=0; i<interfaces.Length; ++i)
      expectedInterfaces[i] = interfaces[i];
    if (!interfaceExpected)
      expectedInterfaces[interfaces.Length] = "IDisposable";
    Type[] actualInterfaces = cls.GetInterfaces();
    string expectedInterfacesString = SortArrayToString(expectedInterfaces);
    string actualInterfacesString = SortArrayToString(actualInterfaces);
    if (expectedInterfacesString != actualInterfacesString)
      throw new Exception("Expected interfaces for " + cls.Name + ": \n" + expectedInterfacesString + "\n" + "Actual interfaces: \n" + actualInterfacesString);

    string expectedBaseString = null;
    if (interfaceExpected) {
      // expecting an interface
      if (!cls.IsInterface)
        throw new Exception(cls.Name + " should be an interface but is not");
      expectedBaseString = string.IsNullOrEmpty(baseClass) ? "" : "multiple_inheritance_interfacesNamespace." + baseClass;
    } else {
      // expecting a class
      if (cls.IsInterface)
        throw new Exception(cls.Name + " is an interface but it should not be");
      expectedBaseString = string.IsNullOrEmpty(baseClass) ? "Object" : baseClass;
    }

    string actualBaseString = cls.BaseType == null ? "" : cls.BaseType.Name;
    if (expectedBaseString != actualBaseString)
      throw new Exception("Expected base for " + cls.Name + ": [" + expectedBaseString + "]" + " Actual base: [" + actualBaseString + "]");
  }

  public static void Main() {
    // Note that we can't get just the immediate interface
    // Type.GetInterfaces() returns all interfaces up the inheritance hierarchy
    checkBaseAndInterfaces(typeof(IA), true, "", new string[] {});
    checkBaseAndInterfaces(typeof(IB), true, "", new string[] {});
    checkBaseAndInterfaces(typeof(IC), true, "", new string[] {"IA", "IB"});
    checkBaseAndInterfaces(typeof(A), false, "", new string[] {"IA"});
    checkBaseAndInterfaces(typeof(B), false, "", new string[] {"IB"});
    checkBaseAndInterfaces(typeof(C), false, "", new string[] {"IA", "IB", "IC"});
    checkBaseAndInterfaces(typeof(D), false, "", new string[] {"IA", "IB", "IC"});
    checkBaseAndInterfaces(typeof(E), false, "D", new string[] {"IA", "IB", "IC"});

    checkBaseAndInterfaces(typeof(IJ), true, "", new string[] {});
    checkBaseAndInterfaces(typeof(IK), true, "", new string[] {"IJ"});
    checkBaseAndInterfaces(typeof(IL), true, "", new string[] {"IJ", "IK"});
    checkBaseAndInterfaces(typeof(J), false, "", new string[] {"IJ"});
    checkBaseAndInterfaces(typeof(K), false, "", new string[] {"IJ", "IK"});
    checkBaseAndInterfaces(typeof(L), false, "", new string[] {"IJ", "IK", "IL"});
    checkBaseAndInterfaces(typeof(M), false, "", new string[] {"IJ", "IK", "IL"});

    checkBaseAndInterfaces(typeof(P), false, "", new string[] {});
    checkBaseAndInterfaces(typeof(IQ), true, "", new string[] {});
    checkBaseAndInterfaces(typeof(Q), false, "", new string[] {"IQ"});
    checkBaseAndInterfaces(typeof(R), false, "P", new string[] {"IQ"});
    checkBaseAndInterfaces(typeof(S), false, "P", new string[] {"IQ"});
    checkBaseAndInterfaces(typeof(T), false, "", new string[] {"IQ"});
    checkBaseAndInterfaces(typeof(U), false, "R", new string[] {"IQ"});
    checkBaseAndInterfaces(typeof(V), false, "S", new string[] {"IQ"});
    checkBaseAndInterfaces(typeof(W), false, "T", new string[] {"IQ"});

    // overloaded methods check
    D d = new D();
    d.ia();
    d.ia(10);
    d.ia("bye");
    d.ia("bye", false);

    UndesirablesSwigImpl.UndesiredStaticMethod(UndesirablesSwigImpl.UndesiredEnum.UndesiredEnum1);
  }
}
