private void should_implement_IMethodsFromGenericInterface_with_generic_params_SimpleStruct_and_SimpleClass()
            {
                Execute(() =>
                {
                    var @object    = new ImplementGenericMethodsClass();
                    var @interface = @object as IMethodsFromGenericInterface <SimpleStruct, SimpleClass>;

                    var value = @interface.ReturnValueFromFirstParameter(new SimpleStruct(1), new SimpleClass(2));

                    var ref1        = new SimpleStruct(1);
                    var ref2        = new SimpleClass(1);
                    var refAsString = @interface.ReturnRefParametersAsString(ref ref1, ref ref2);

                    SimpleStruct out1;
                    SimpleClass out2;
                    SimpleStruct[] out3;
                    SimpleClass[] out4;
                    List <SimpleStruct> out5;
                    List <SimpleClass> out6;
                    @interface.ReturnOutParameters(out out1, out out2, out out3, out out4, out out5, out out6);

                    Assert.Equal(1, value.Value);
                    Assert.Equal(Helper.AsString(ref1, ref2), refAsString);
                    Assert.Equal(new SimpleStruct(), out1);
                    Assert.Null(out2);
                    Assert.Equal(new SimpleStruct(), out3[0]);
                    Assert.Null(out4[0]);
                    Assert.Equal(new SimpleStruct(), out5[0]);
                    Assert.Null(out6[0]);
                });
            }
            private void should_implement_IGenericProperties_with_generic_params_SimpleStruct_and_SimpleClass()
            {
                Execute(() =>
                {
                    var @object    = new ImplementGenericMethodsClass();
                    var @interface = @object as IGenericProperties <SimpleStruct, SimpleClass>;

                    @interface.T1Value = new SimpleStruct(1);
                    var t1Value        = @interface.T1Value;

                    @interface.T1List = new List <SimpleStruct> {
                        new SimpleStruct(1), new SimpleStruct(2)
                    };
                    var t1List = @interface.T1List;

                    @interface.T1T2TupleList = new List <Tuple <SimpleStruct, SimpleClass> > {
                        new Tuple <SimpleStruct, SimpleClass>(new SimpleStruct(1), new SimpleClass(2)), new Tuple <SimpleStruct, SimpleClass>(new SimpleStruct(1), new SimpleClass(2))
                    };
                    var t1t2TupleList = @interface.T1T2TupleList;

                    Assert.Equal(1, t1Value.Value);
                    Assert.Equal(1, t1List[0].Value);
                    Assert.Equal(2, t1List[1].Value);
                    Assert.Equal(1, t1t2TupleList[0].Item1.Value);
                    Assert.Equal(2, t1t2TupleList[0].Item2.Value);
                    Assert.Equal(1, t1t2TupleList[1].Item1.Value);
                    Assert.Equal(2, t1t2TupleList[1].Item2.Value);
                });
            }
            private void should_implement_IGenericProperties_with_generic_params_int_and_string()
            {
                Execute(() =>
                {
                    var @object    = new ImplementGenericMethodsClass();
                    var @interface = @object as IGenericProperties <int, string>;

                    @interface.T1Value = 2;
                    var t1Value        = @interface.T1Value;

                    @interface.T1List = new List <int> {
                        3, 4
                    };
                    var t1List = @interface.T1List;

                    @interface.T1T2TupleList = new List <Tuple <int, string> > {
                        new Tuple <int, string>(5, "a"), new Tuple <int, string>(6, "b")
                    };
                    var t1t2TupleList = @interface.T1T2TupleList;

                    Assert.Equal(2, t1Value);
                    Assert.Equal(3, t1List[0]);
                    Assert.Equal(4, t1List[1]);
                    Assert.Equal(5, t1t2TupleList[0].Item1);
                    Assert.Equal("a", t1t2TupleList[0].Item2);
                    Assert.Equal(6, t1t2TupleList[1].Item1);
                    Assert.Equal("b", t1t2TupleList[1].Item2);
                });
            }
            private void should_implement_IMethodsFromGenericInterface_with_generic_params_int_and_string()
            {
                Execute(() =>
                {
                    var @object    = new ImplementGenericMethodsClass();
                    var @interface = @object as IMethodsFromGenericInterface <int, string>;

                    var value = @interface.ReturnValueFromFirstParameter(1, "a");

                    int ref1        = 2;
                    string ref2     = "b";
                    var refAsString = @interface.ReturnRefParametersAsString(ref ref1, ref ref2);

                    int out1;
                    string out2;
                    int[] out3;
                    string[] out4;
                    List <int> out5;
                    List <string> out6;
                    @interface.ReturnOutParameters(out out1, out out2, out out3, out out4, out out5, out out6);

                    Assert.Equal(1, value);
                    Assert.Equal(Helper.AsString(ref1, ref2), refAsString);
                    Assert.Equal(0, out1);
                    Assert.Null(out2);
                    Assert.Equal(0, out3[0]);
                    Assert.Null(out4[0]);
                    Assert.Equal(0, out5[0]);
                    Assert.Null(out6[0]);
                });
            }
            private void should_implement_IGenericConstraints_with_generic_params_SimpleStruct_and_SimpleClass()
            {
                Execute(() =>
                {
                    var @object    = new ImplementGenericMethodsClass();
                    var @interface = @object as IGenericConstraints <SimpleStruct, SimpleClass>;

                    var value1 = @interface.GenericConstraintMethod(new SimpleStruct(1), new SimpleClass(1));
                    var value2 = @interface.GenericConstraintMethodWithRepeatedGenericParameter(new SimpleStruct(2), 1);

                    Assert.Equal(1, value1.Value);
                    Assert.Equal(2, value2.Value);
                });
            }
            private void should_implement_IGenericConstraints_with_generic_params_int_and_string()
            {
                Execute(() =>
                {
                    var @object    = new ImplementGenericMethodsClass();
                    var @interface = @object as IGenericConstraints <int, string>;

                    var value1 = @interface.GenericConstraintMethod(1, "a");
                    var value2 = @interface.GenericConstraintMethodWithRepeatedGenericParameter(2, new SimpleStruct(3));

                    Assert.Equal(1, value1);
                    Assert.Equal(2, value2);
                });
            }
            private void should_implement_IGenericMethodsFromGenericInterface_with_generic_params_SimpleStruct_and_SimpleClass()
            {
                Execute(() =>
                {
                    var @object    = new ImplementGenericMethodsClass();
                    var @interface = @object as IGenericMethodsFromGenericInterface <SimpleStruct, SimpleClass>;

                    var value = @interface.GenericReturnValueFromFirstParameter(new SimpleStruct(1), new SimpleClass(2), "b", "c");

                    SimpleStruct ref1 = new SimpleStruct(1);
                    SimpleClass ref2  = new SimpleClass(1);
                    string ref3       = "bb";
                    string ref4       = "bbb";
                    var refAsString   = @interface.GenericReturnRefParametersAsString(ref ref1, ref ref2, ref ref3, ref ref4);

                    SimpleStruct out1;
                    SimpleClass out2;
                    string out3;
                    string out4;
                    SimpleStruct[] out5;
                    SimpleClass[] out6;
                    string[] out7;
                    string[] out8;
                    List <SimpleStruct> out9;
                    List <SimpleClass> out10;
                    List <string> out11;
                    List <string> out12;
                    @interface.GenericReturnOutParameters(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(1, value.Value);
                    Assert.Equal(Helper.AsString(ref1, ref2, ref3, ref4), refAsString);
                    Assert.Equal(new SimpleStruct(), out1);
                    Assert.Null(out2);
                    Assert.Null(out3);
                    Assert.Null(out4);
                    Assert.Equal(new SimpleStruct(), out5[0]);
                    Assert.Null(out6[0]);
                    Assert.Null(out7[0]);
                    Assert.Null(out8[0]);
                    Assert.Equal(new SimpleStruct(), out9[0]);
                    Assert.Null(out10[0]);
                    Assert.Null(out11[0]);
                    Assert.Null(out12[0]);
                });
            }
            private void should_implement_IGenericMethodsFromGenericInterfaceWithRepeatedGenericParameter_with_generic_params_SimpleStruct_and_SimpleClass()
            {
                Execute(() =>
                {
                    var @object    = new ImplementGenericMethodsClass();
                    var @interface = @object as IGenericMethodsFromGenericInterfaceWithRepeatedGenericParameter <SimpleStruct, SimpleClass>;

                    var value = @interface.GenericWithRepeatedGenericParameterReturnValueFromFirstParameter(new SimpleStruct(1), "a", "b");

                    SimpleStruct ref1 = new SimpleStruct(1);
                    string ref2       = "b";
                    string ref3       = "bb";
                    var refAsString   = @interface.GenericWithRepeatedGenericParameterReturnRefParametersAsString(ref ref1, ref ref2, ref ref3);

                    SimpleStruct out1;
                    string out2;
                    string out3;
                    SimpleStruct[] out4;
                    string[] out5;
                    string[] out6;
                    List <SimpleStruct> out7;
                    List <string> out8;
                    List <string> out9;
                    @interface.GenericWithRepeatedGenericParameterReturnOutParameters(out out1, out out2, out out3, out out4, out out5, out out6, out out7, out out8, out out9);

                    Assert.Equal(1, value.Value);
                    Assert.Equal(Helper.AsString(ref1, ref2, ref3), refAsString);
                    Assert.Equal(new SimpleStruct(), out1);
                    Assert.Null(out2);
                    Assert.Null(out3);
                    Assert.Equal(new SimpleStruct(), out4[0]);
                    Assert.Null(out5[0]);
                    Assert.Null(out6[0]);
                    Assert.Equal(new SimpleStruct(), out7[0]);
                    Assert.Null(out8[0]);
                    Assert.Null(out9[0]);
                });
            }