public void DiscoverAreaControllerActions_SingleControllerArea()
        {
            var compilation = CreateCompilation(@"
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace TestCode
{
    [Area(""Admin"")]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}");

            var allTypes = compilation.SyntaxTrees.SelectMany(tree => tree.GetRoot().DescendantNodes()).OfType <TypeDeclarationSyntax>().ToList();
            var areas    = MvcDiscoverer.DiscoverAreaControllerActions(compilation, allTypes).ToList();

            Assert.Single(areas);
            Assert.Equal("Admin", areas[0].Name);
            Assert.Single(areas[0].Controllers);
            Assert.Equal("Home", areas[0].Controllers[0].Name);
            Assert.Single(areas[0].Controllers[0].Actions);
            Assert.Equal("Index", areas[0].Controllers[0].Actions.Single().Name);
            Assert.Empty(areas[0].Controllers[0].Actions.Single().Parameters);
        }
        public void DiscoverAreaControllerActions_SingleControllerActionArrayParameter()
        {
            var compilation = CreateCompilation(@"
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace TestCode
{
    public class HomeController : Controller
    {
        public IActionResult Index(string[] strings)
        {
            return View();
        }
    }
}");

            var allTypes = compilation.SyntaxTrees.SelectMany(tree => tree.GetRoot().DescendantNodes()).OfType <TypeDeclarationSyntax>().ToList();
            var areas    = MvcDiscoverer.DiscoverAreaControllerActions(compilation, allTypes).ToList();

            Assert.Single(areas);
            Assert.Equal("", areas[0].Name);
            Assert.Single(areas[0].Controllers);
            Assert.Equal("Home", areas[0].Controllers[0].Name);
            Assert.Single(areas[0].Controllers[0].Actions);
            Assert.Equal("Index", areas[0].Controllers[0].Actions.Single().Name);
            Assert.Single(areas[0].Controllers[0].Actions.Single().Parameters);

            Assert.Equal("strings", areas[0].Controllers[0].Actions.Single().Parameters[0].Name);
            Assert.Equal("string[]", areas[0].Controllers[0].Actions.Single().Parameters[0].Type);
            Assert.False(areas[0].Controllers[0].Actions.Single().Parameters[0].HasDefaultValue);
            Assert.Null(areas[0].Controllers[0].Actions.Single().Parameters[0].DefaultValue);
        }
        public void DiscoverAreaControllerActions_SingleControllerNoArea()
        {
            var compilation = CreateCompilation(@"
using Microsoft.AspNetCore.Mvc;

namespace TestCode
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}");

            var areas = MvcDiscoverer.DiscoverAreaControllerActions(compilation).ToList();

            Assert.Single(areas);
            Assert.Equal("", areas[0].Name);
            Assert.Single(areas[0].Controllers);
            Assert.Equal("Home", areas[0].Controllers[0].Name);
            Assert.Single(areas[0].Controllers[0].Actions);
            Assert.Equal("Index", areas[0].Controllers[0].Actions[0].Name);
            Assert.Empty(areas[0].Controllers[0].Actions[0].Parameters);
        }
        public void DiscoverAreaControllerActions_SingleControllerActionArrayParameter()
        {
            var compilation = CreateCompilation(@"
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace TestCode
{
    public class HomeController : Controller
    {
        public IActionResult Index(string[] strings)
        {
            return View();
        }
    }
}");

            var areas = MvcDiscoverer.DiscoverAreaControllerActions(compilation).ToList();

            Assert.Single(areas);
            Assert.Equal("", areas[0].Name);
            Assert.Single(areas[0].Controllers);
            Assert.Equal("Home", areas[0].Controllers[0].Name);
            Assert.Single(areas[0].Controllers[0].Actions);
            Assert.Equal("Index", areas[0].Controllers[0].Actions[0].Name);
            Assert.Equal(1, areas[0].Controllers[0].Actions[0].Parameters.Count);

            Assert.Equal("strings", areas[0].Controllers[0].Actions[0].Parameters[0].Name);
            Assert.Equal("string[]", areas[0].Controllers[0].Actions[0].Parameters[0].Type);
            Assert.False(areas[0].Controllers[0].Actions[0].Parameters[0].HasDefaultValue);
            Assert.Null(areas[0].Controllers[0].Actions[0].Parameters[0].DefaultValue);
        }
        public void DiscoverAreaControllerActions_NoControllerNoArea()
        {
            var compilation = CreateCompilation(@"
using Microsoft.AspNetCore.Mvc;

namespace TestCode
{
    public class HomeController
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}");

            var areas = MvcDiscoverer.DiscoverAreaControllerActions(compilation).ToList();

            Assert.Empty(areas);
        }
        public void DiscoverAreaControllerActions_AbstractControllerNoArea()
        {
            var compilation = CreateCompilation(@"
using Microsoft.AspNetCore.Mvc;

namespace TestCode
{
    public abstract class HomeController
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}");

            var allTypes = compilation.SyntaxTrees.SelectMany(tree => tree.GetRoot().DescendantNodes()).OfType <TypeDeclarationSyntax>().ToList();
            var areas    = MvcDiscoverer.DiscoverAreaControllerActions(compilation, allTypes).ToList();

            Assert.Empty(areas);
        }
        public void DiscoverAreaControllerActions_SingleControllerNonAction()
        {
            var compilation = CreateCompilation(@"
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace TestCode
{
    public class HomeController : Controller
    {
        [NonAction]
        public IActionResult Index(string[] strings)
        {
            return View();
        }
    }
}");

            var areas = MvcDiscoverer.DiscoverAreaControllerActions(compilation).ToList();

            Assert.Empty(areas);
        }
        public void DiscoverAreaControllerActions_SingleControllerActionParametersDefaultValue()
        {
            var compilation = CreateCompilation(@"
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace TestCode
{
    public class HomeController : Controller
    {
        public IActionResult Index(string search = """", int page = 1)
        {
            return View();
        }
    }
}");

            var areas = MvcDiscoverer.DiscoverAreaControllerActions(compilation).ToList();

            Assert.Single(areas);
            Assert.Equal("", areas[0].Name);
            Assert.Single(areas[0].Controllers);
            Assert.Equal("Home", areas[0].Controllers[0].Name);
            Assert.Single(areas[0].Controllers[0].Actions);
            Assert.Equal("Index", areas[0].Controllers[0].Actions[0].Name);
            Assert.Equal(2, areas[0].Controllers[0].Actions[0].Parameters.Count);

            Assert.Equal("search", areas[0].Controllers[0].Actions[0].Parameters[0].Name);
            Assert.Equal("string", areas[0].Controllers[0].Actions[0].Parameters[0].Type);
            Assert.True(areas[0].Controllers[0].Actions[0].Parameters[0].HasDefaultValue);
            Assert.Equal("", areas[0].Controllers[0].Actions[0].Parameters[0].DefaultValue);

            Assert.Equal("page", areas[0].Controllers[0].Actions[0].Parameters[1].Name);
            Assert.Equal("int", areas[0].Controllers[0].Actions[0].Parameters[1].Type);
            Assert.True(areas[0].Controllers[0].Actions[0].Parameters[1].HasDefaultValue);
            Assert.Equal(1, areas[0].Controllers[0].Actions[0].Parameters[1].DefaultValue);
        }
        public void DiscoverAreaControllerActions_SingleControllerNonAction()
        {
            var compilation = CreateCompilation(@"
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace TestCode
{
    public class HomeController : Controller
    {
        [NonAction]
        public IActionResult Index(string[] strings)
        {
            return View();
        }
    }
}");

            var allTypes = compilation.SyntaxTrees.SelectMany(tree => tree.GetRoot().DescendantNodes()).OfType <TypeDeclarationSyntax>().ToList();
            var areas    = MvcDiscoverer.DiscoverAreaControllerActions(compilation, allTypes).ToList();

            Assert.Empty(areas);
        }