public void CreateConstructor()
        {
            var actual = RestartableAddInGenerator.CreateCompileUnit();

            CreateClassWithConstructor(actual);

            const string expected = @"//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.34209
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Solink.Sample
{
    
    
    public sealed class RestartableThing : Solink.AddIn.Helpers.RestartableAddIn<Solink.HostViews.IThing>, Solink.HostViews.IThing
    {
        
        public RestartableThing(Solink.AddIn.Helpers.AddInFacade facade, System.AddIn.Hosting.AddInToken token, System.AddIn.Hosting.Platform platform) : 
                base(facade, token, platform)
        {
        }
    }
}
";

            AssertGeneratedCode(expected, actual);
        }
        public void CreateClass()
        {
            var actual = RestartableAddInGenerator.CreateCompileUnit();

            var ns = RestartableAddInGenerator.CreateNamespace(actual, NamespaceName);

            RestartableAddInGenerator.CreateClass(ns, ClassName, HostViewFullName);

            const string expected = @"//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.34209
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Solink.Sample
{
    
    
    public sealed class RestartableThing : Solink.AddIn.Helpers.RestartableAddIn<Solink.HostViews.IThing>, Solink.HostViews.IThing
    {
    }
}
";

            AssertGeneratedCode(expected, actual);
        }
        public void Generate()
        {
            var pathToOurAssembly = Assembly.GetExecutingAssembly().Location;
            var sourceAssembly    = new FileInfo(pathToOurAssembly);

            var randomFileName    = Path.GetRandomFileName();
            var tempPath          = Path.Combine(Path.GetTempPath(), randomFileName);
            var tempDirectoryInfo = new DirectoryInfo(tempPath);

            tempDirectoryInfo.Create();

            try
            {
                var cut = new RestartableAddInGenerator(NamespaceName, sourceAssembly, tempDirectoryInfo);

                cut.Generate();

                var generatedFile     = Path.Combine(tempDirectoryInfo.FullName, "RestartableThing.cs");
                var generatedFileInfo = new FileInfo(generatedFile);
                Assert.IsTrue(generatedFileInfo.Exists);

                var actual = File.ReadAllText(generatedFileInfo.FullName);
                AssertGeneratedLinesEqual(ExpectedRestartableThing, actual);
            }
            finally
            {
                try
                {
                    tempDirectoryInfo.Delete(true);
                }
                catch (IOException) { /* ignore */ }
            }
        }
        private static CodeTypeDeclaration CreateClassWithConstructor(CodeCompileUnit actual)
        {
            var ns     = RestartableAddInGenerator.CreateNamespace(actual, NamespaceName);
            var @class = RestartableAddInGenerator.CreateClass(ns, ClassName, HostViewFullName);

            RestartableAddInGenerator.CreateConstructor(@class);
            return(@class);
        }
        public void CreateCompileUnit()
        {
            var actual = RestartableAddInGenerator.CreateCompileUnit();

            const string expected = @"//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.34209
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

";

            AssertGeneratedCode(expected, actual);
        }
        public void CreateProperty()
        {
            var actual = RestartableAddInGenerator.CreateCompileUnit();
            var ns     = RestartableAddInGenerator.CreateNamespace(actual, NamespaceName);
            var @class = RestartableAddInGenerator.CreateClass(ns, ClassName, HostViewFullName);

            RestartableAddInGenerator.CreateProperty(@class, "Id", typeof(int), true);

            const string expected = @"//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.34209
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Solink.Sample
{
    
    
    public sealed class RestartableThing : Solink.AddIn.Helpers.RestartableAddIn<Solink.HostViews.IThing>, Solink.HostViews.IThing
    {
        
        public int Id
        {
            get
            {
                return base.Func(_ => _.Id);
            }
            set
            {
                base.Action(_ => _.Id = value);
            }
        }
    }
}
";

            AssertGeneratedCode(expected, actual);
        }
        public void CreateFuncMethodForVoid()
        {
            var actual = RestartableAddInGenerator.CreateCompileUnit();
            var ns     = RestartableAddInGenerator.CreateNamespace(actual, NamespaceName);
            var @class = RestartableAddInGenerator.CreateClass(ns, ClassName, HostViewFullName);

            var methodParameters = new[]
            {
                Tuple.Create(typeof(IList <string>), "strings"),
            };

            RestartableAddInGenerator.CreateFuncMethod(@class, "AddToList", methodParameters, typeof(void));

            const string expected = @"//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.34209
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Solink.Sample
{
    
    
    public sealed class RestartableThing : Solink.AddIn.Helpers.RestartableAddIn<Solink.HostViews.IThing>, Solink.HostViews.IThing
    {
        
        public void AddToList(System.Collections.Generic.IList<string> strings)
        {
            base.Action(_ => _.AddToList(strings));
        }
    }
}
";

            AssertGeneratedCode(expected, actual);
        }
        public void CreateFuncMethod()
        {
            var actual = RestartableAddInGenerator.CreateCompileUnit();
            var ns     = RestartableAddInGenerator.CreateNamespace(actual, NamespaceName);
            var @class = RestartableAddInGenerator.CreateClass(ns, ClassName, HostViewFullName);

            var methodParameters = new Tuple <Type, string>[]
            {
            };

            RestartableAddInGenerator.CreateFuncMethod(@class, "ComputeAnswerToLifeAndUniverseEverything", methodParameters, typeof(int));

            const string expected = @"//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.34209
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Solink.Sample
{
    
    
    public sealed class RestartableThing : Solink.AddIn.Helpers.RestartableAddIn<Solink.HostViews.IThing>, Solink.HostViews.IThing
    {
        
        public int ComputeAnswerToLifeAndUniverseEverything()
        {
            return base.Func(_ => _.ComputeAnswerToLifeAndUniverseEverything());
        }
    }
}
";

            AssertGeneratedCode(expected, actual);
        }
 public void GenerateClassNameThing()
 {
     RestartableAddInGenerator.GenerateClassName("Thing");
 }
        public void GenerateClassNameIThing()
        {
            var actual = RestartableAddInGenerator.GenerateClassName("IThing");

            Assert.AreEqual("RestartableThing", actual);
        }
        public void GenerateFromTypeIThing()
        {
            var actual = RestartableAddInGenerator.GenerateFromType(NamespaceName, typeof(IThing));

            AssertGeneratedCode(ExpectedRestartableThing, actual);
        }