string ListPropertyDeclarationOfMock(MatchedProperty <GivenClassComplexListProperty> matchedProperty)
        {
            var listClassName    = $"SpecificationSpecific{matchedProperty.ExcelProperty.ClassName}";
            var listPropertyName = ListPropertyName(matchedProperty.ExcelProperty);

            return($"        readonly List<{listClassName}> {listPropertyName} = new List<{listClassName}>();");
        }
        string ListPropertyMockSetup(MatchedProperty <GivenClassComplexListProperty> matchedProperty)
        {
            var interfacePropertyName          = matchedProperty.ExcelProperty.Name;
            var listPropertyName               = ListPropertyName(matchedProperty.ExcelProperty);
            var interfaceUnderTestPropertyName = matchedProperty.ExcelProperty.ClassName;

            return($"            {MockVariableName}.Setup(m => m.{interfacePropertyName}).Returns({listPropertyName}.Select(l => l.{interfaceUnderTestPropertyName}));");
        }
        string ComplexPropertySetterOnMock(MatchedProperty <GivenClassComplexProperty> matchedProperty)
        {
            var functionName            = $"{matchedProperty.ExcelProperty.Name}_of";
            var parameterName           = CamelCase(matchedProperty.ExcelProperty.Name);
            var interfacePropertyName   = matchedProperty.ExcelProperty.Name;
            var propertyClassName       = $"SpecificationSpecific{matchedProperty.ExcelProperty.ClassName}";
            var propertyNameOfSutObject = (matchedProperty.ExcelProperty as GivenClassComplexProperty).ClassName;

            return
                ($@"        internal {SpecificationSpecificClassName} {functionName}({propertyClassName} {parameterName})
        {{
            AddClassProperty(new ReportSpecificationSetupClass(GetCurrentMethod(), {parameterName}));

            {MockVariableName}.Setup(m => m.{interfacePropertyName}).Returns({parameterName}?.{propertyNameOfSutObject});

            return this;
        }}{NewLine}");
        }
        string SimplePropertySetterOnMock(MatchedProperty <GivenClassSimpleProperty> matchedProperty)
        {
            var functionName          = $"{matchedProperty.ExcelProperty.Name}_of";
            var parameterName         = CamelCase(matchedProperty.ExcelProperty.Name);
            var interfacePropertyName = matchedProperty.ExcelProperty.Name;
            var parameterType         =
                (Nullable.GetUnderlyingType(matchedProperty.CsharpProperty.PropertyType) == null)
                ? matchedProperty.CsharpProperty.PropertyType.Name
                : Nullable.GetUnderlyingType(matchedProperty.CsharpProperty.PropertyType).Name + "?";

            return
                ($@"        internal {SpecificationSpecificClassName} {functionName}({parameterType} {parameterName})
        {{
            AddValueProperty(GetCurrentMethod(), {parameterName});

            {MockVariableName}.Setup(m => m.{interfacePropertyName}).Returns({parameterName});

            return this;
        }}{NewLine}");
        }
        string ListPropertySetterOnMock(MatchedProperty <GivenClassComplexListProperty> matchedProperty)
        {
            var parameterName     = CamelCase(matchedProperty.ExcelProperty.Name);
            var listParameterName = ListPropertyName(matchedProperty.ExcelProperty);
            var listPropertyName  = ListPropertyName(matchedProperty.ExcelProperty);
            var listClassName     = $"SpecificationSpecific{matchedProperty.ExcelProperty.ClassName}";

            return
                ($@"        internal {SpecificationSpecificClassName} {matchedProperty.ExcelProperty.Name}_of({listClassName} {parameterName})
        {{
            AddClassProperty(new ReportSpecificationSetupClass(GetCurrentMethod(), {parameterName}));

            this.{listPropertyName}.Add({parameterName});

            return this;
        }}

        internal {SpecificationSpecificClassName} {matchedProperty.ExcelProperty.Name}_list_of(string listType, List<{listClassName}> {listParameterName})
        {{
            AddListProperty(new ReportSpecificationSetupList(GetCurrentMethod().Name, listType, {listParameterName}));

            this.{listPropertyName}.AddRange({listParameterName});

            return this;
        }}

        internal {SpecificationSpecificClassName} {matchedProperty.ExcelProperty.Name}_table_of(ReportSpecificationSetupClassUsingTable<{listClassName}> {listParameterName})
        {{
            {listParameterName}.PropertyName = GetCurrentMethod().Name;

            AddClassTableProperty({listParameterName});

            foreach (var row in {listParameterName}.Rows)
                this.{listPropertyName}.Add(row.Properties);

            return this;
        }}");
        }