private void should_implement_ISimpleMethodsWithRefParameters()
            {
                Execute(() =>
                {
                    var @object    = new ImplementSimpleMethodsClass();
                    var @interface = @object as ISimpleMethodsWithRefParameters;

                    var p1 = 1;
                    var p2 = "a";
                    var p3 = new SimpleStruct(1);
                    var p4 = new SimpleClass(1);
                    var p5 = new[] { 1 };
                    var p6 = new[] { "a" };
                    var p7 = new[] { new SimpleStruct(1) };
                    var p8 = new[] { new SimpleClass(1) };
                    var p9 = new List <int> {
                        1
                    };
                    var p10 = new List <string> {
                        "a"
                    };
                    var p11 = new List <SimpleStruct> {
                        new SimpleStruct(1)
                    };
                    var p12 = new List <SimpleClass> {
                        new SimpleClass(1)
                    };
                    var expected = Helper.AsString(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12);

                    var result = @interface.ReturnRefParametersAsString(ref p1, ref p2, ref p3, ref p4, ref p5, ref p6, ref p7, ref p8, ref p9, ref p10, ref p11, ref p12);

                    Assert.Equal(expected, result);
                });
            }
            private void should_implement_ISimpleListMethods()
            {
                Execute(() =>
                {
                    var @object    = new ImplementSimpleMethodsClass();
                    var @interface = @object as ISimpleListMethods;

                    var valueTypeList         = @interface.ReturnValueTypeList();
                    var refTypeList           = @interface.ReturnRefTypeList();
                    var externalValueTypeList = @interface.ReturnExternalValueTypeList();
                    var externalRefTypeList   = @interface.ReturnExternalRefTypeList();
                    var yieldIntList          = @interface.YieldIntList(4, 5, 6).ToArray();

                    Assert.Equal(1, valueTypeList[0]);
                    Assert.Equal(2, valueTypeList[1]);
                    Assert.Equal("a", refTypeList[0]);
                    Assert.Equal("b", refTypeList[1]);
                    Assert.Equal(1, externalValueTypeList[0].Value);
                    Assert.Equal(2, externalValueTypeList[1].Value);
                    Assert.Equal(1, externalRefTypeList[0].Value);
                    Assert.Equal(2, externalRefTypeList[1].Value);
                    Assert.Equal(4, yieldIntList[0]);
                    Assert.Equal(5, yieldIntList[1]);
                    Assert.Equal(6, yieldIntList[2]);
                });
            }
            private void should_implement_ISimpleMethodsWithOutParameters()
            {
                Execute(() =>
                {
                    var @object    = new ImplementSimpleMethodsClass();
                    var @interface = @object as ISimpleMethodsWithOutParameters;

                    var p1 = 1;
                    var p2 = "a";
                    var p3 = new SimpleStruct(1);
                    var p4 = new SimpleClass(1);
                    var p5 = new[] { 1 };
                    var p6 = new[] { "a" };
                    var p7 = new[] { new SimpleStruct(1) };
                    var p8 = new[] { new SimpleClass(1) };
                    var p9 = new List <int> {
                        1
                    };
                    var p10 = new List <string> {
                        "a"
                    };
                    var p11 = new List <SimpleStruct> {
                        new SimpleStruct(1)
                    };
                    var p12 = new List <SimpleClass> {
                        new SimpleClass(1)
                    };

                    int out1;
                    string out2;
                    SimpleStruct out3;
                    SimpleClass out4;
                    int[] out5;
                    string[] out6;
                    SimpleStruct[] out7;
                    SimpleClass[] out8;
                    List <int> out9;
                    List <string> out10;
                    List <SimpleStruct> out11;
                    List <SimpleClass> out12;

                    @interface.ReturnOutParameters(out out1, out out2, out out3, out out4, out out5, out out6, out out7, out out8, out out9, out out10, out out11, out out12);

                    Assert.Equal(p1, out1);
                    Assert.Equal(p2, out2);
                    Assert.Equal(p3.Value, out3.Value);
                    Assert.Equal(p4.Value, out4.Value);
                    Assert.Equal(p5[0], out5[0]);
                    Assert.Equal(p6[0], out6[0]);
                    Assert.Equal(p7[0].Value, out7[0].Value);
                    Assert.Equal(p8[0].Value, out8[0].Value);
                    Assert.Equal(p9[0], out9[0]);
                    Assert.Equal(p10[0], out10[0]);
                    Assert.Equal(p11[0].Value, out11[0].Value);
                    Assert.Equal(p12[0].Value, out12[0].Value);
                });
            }
            private void should_implement_ISimpleProperties()
            {
                Execute(() =>
                {
                    var @object    = new ImplementSimpleMethodsClass();
                    var @interface = @object as ISimpleProperties;

                    @interface.ValueType = 2;
                    var valueType        = @interface.ValueType;

                    @interface.RefTypeArray = new[] { "a", "b" };
                    var refTypeArray        = @interface.RefTypeArray;

                    @interface.ExternalRefTypeList = new List <SimpleClass> {
                        new SimpleClass(1), new SimpleClass(2)
                    };
                    var externalValueTypeList = @interface.ExternalRefTypeList;

                    @interface._readOnlyPropBackingField = 3;
                    var readOnly = @interface.ReadOnly;

                    @interface.WriteOnly = 4;
                    var writeOnly        = @interface._writeOnlyPropBackingField;

                    @interface[1] = 2;
                    var indexer1  = @interface._indexer1PropBackingField;

                    @interface[1, 2] = 3;
                    var indexer2     = @interface._indexer2PropBackingField;

                    Assert.Equal(2, valueType);
                    Assert.Equal("a", refTypeArray[0]);
                    Assert.Equal("b", refTypeArray[1]);
                    Assert.Equal(1, externalValueTypeList[0].Value);
                    Assert.Equal(2, externalValueTypeList[1].Value);
                    Assert.Equal(3, readOnly);
                    Assert.Equal(4, writeOnly);
                    Assert.Equal(1, indexer1.Item1);
                    Assert.Equal(2, indexer1.Item2);
                    Assert.Equal(1, indexer2.Item1);
                    Assert.Equal(2, indexer2.Item2);
                    Assert.Equal(3, indexer2.Item3);
                });
            }
            private void should_implement_ISimpleMethods()
            {
                Execute(async() =>
                {
                    var @object    = new ImplementSimpleMethodsClass();
                    var @interface = @object as ISimpleMethods;

                    var valueType         = @interface.ReturnValueType();
                    var refType           = @interface.ReturnRefType();
                    var externalValueType = @interface.ReturnExternalValueType();
                    var externalRefType   = @interface.ReturnExternalRefType();
                    var asyncInt          = await @interface.ReturnAsyncInt(2);

                    Assert.Equal(1, valueType);
                    Assert.Equal("a", refType);
                    Assert.Equal(1, externalValueType.Value);
                    Assert.Equal(1, externalRefType.Value);
                    Assert.Equal(2, asyncInt);
                });
            }
            private void should_implement_ISimpleArrayMethods()
            {
                Execute(() =>
                {
                    var @object    = new ImplementSimpleMethodsClass();
                    var @interface = @object as ISimpleArrayMethods;

                    var valueTypeArray         = @interface.ReturnValueTypeArray();
                    var refTypeArray           = @interface.ReturnRefTypeArray();
                    var externalValueTypeArray = @interface.ReturnExternalValueTypeArray();
                    var externalRefTypeArray   = @interface.ReturnExternalRefTypeArray();

                    Assert.Equal(1, valueTypeArray[0]);
                    Assert.Equal(2, valueTypeArray[1]);
                    Assert.Equal("a", refTypeArray[0]);
                    Assert.Equal("b", refTypeArray[1]);
                    Assert.Equal(1, externalValueTypeArray[0].Value);
                    Assert.Equal(2, externalValueTypeArray[1].Value);
                    Assert.Equal(1, externalRefTypeArray[0].Value);
                    Assert.Equal(2, externalRefTypeArray[1].Value);
                });
            }