private void AddConstructors(TestableClassInfo testableClassInfo,
                                     ICollection <KeyValuePair <string, string> > mockTypesByVarName)
        {
            foreach (var(key, value) in testableClassInfo.Constructors[0]
                     .ParamTypeNamesByParamName)
            {
                var varName = StringUtil.GetPrivateVarName(key);
                if (value[0] == 'I')
                {
                    AppendFormat("private Mock<{0}> {1};\n", value, varName);
                    mockTypesByVarName.Add(new KeyValuePair <string, string>(varName, value));
                }
                else
                {
                    var fullTypeName = StringUtil.GetFullTypeName(value);
                    var type         = Type.GetType(fullTypeName);
                    var defaultValue = TypeUtil.GetDefault(type);

                    AppendFormat("private {0} {1} = {2};\n",
                                 value,
                                 StringUtil.GetPrivateVarName(key),
                                 defaultValue ?? "null");
                }
            }
        }
        private void AddSetUpArrange(TestableClassInfo classInfo,
                                     IEnumerable <KeyValuePair <string, string> > mockTypesByVarName)
        {
            if (!classInfo.Constructors.Any())
            {
                return;
            }

            foreach (var(key, value) in mockTypesByVarName)
            {
                AppendFormat("{0} = new Mock<{1}>();\n", key, value);
            }

            AppendFormat("{0} = new {1}(", _testObjectVarName, classInfo.Name);

            var paramPairs = classInfo
                             .Constructors[0]
                             .ParamTypeNamesByParamName;

            for (var i = 0; i < paramPairs.Count - 1; i++)
            {
                AppendNoIndent(StringUtil.GetPrivateVarName(paramPairs[i].Key) + ".Object, ");
            }

            if (paramPairs.Count > 0)
            {
                AppendNoIndent(StringUtil.GetPrivateVarName(paramPairs[paramPairs.Count - 1].Key));
            }

            AppendNoIndent(");\n");
        }
        private void AddSetUp(TestableClassInfo testableClassInfo)
        {
            var mockTypesByVarName = new List <KeyValuePair <string, string> >();

            _testObjectVarName = StringUtil.GetPrivateVarName(testableClassInfo.Name);

            AppendFormat("private {0} {1};\n", testableClassInfo.Name, _testObjectVarName);

            if (testableClassInfo.Constructors.Any())
            {
                AddConstructors(testableClassInfo, mockTypesByVarName);
            }

            AppendLine();

            AppendLine("[SetUp]");
            AppendLine("public void SetUp()");
            AppendLine("{");

            AddSetUpArrange(testableClassInfo, mockTypesByVarName);

            AppendLine("}");

            AppendLine();
        }
        private void AddTestClass(TestableClassInfo testableClassInfo)
        {
            AppendFormat("public class {0}Tests\n", testableClassInfo.Name);
            AppendLine("{");
            AddSetUp(testableClassInfo);

            foreach (var methodInfo in testableClassInfo.Methods)
            {
                AddMethodTest(methodInfo);
            }

            AppendLine("}");
        }