public void RouteTableGroup_NestedGroups()
        {
            var table = new DotvvmRouteTable(configuration);

            table.AddGroup("Group1", "UrlPrefix1", null, opt1 => {
                opt1.AddGroup("Group2", "UrlPrefix2", null, opt2 => {
                    opt2.AddGroup("Group3", "UrlPrefix3", null, opt3 => {
                        opt3.Add("Route3", "Article3", null, null, null);
                    });
                    opt2.Add("Route2", "Article2", null, null, null);
                });
                opt1.Add("Route1", "Article1", null, null, null);
            });

            var group        = table.GetGroup("Group1");
            var nestedGroup  = table.GetGroup("Group1").GetGroup("Group2");
            var nestedGroup2 = table.GetGroup("Group1").GetGroup("Group2").GetGroup("Group3");
            var route3       = "Group1_Group2_Group3_Route3";
            var route2       = "Group1_Group2_Route2";
            var route1       = "Group1_Route1";

            Assert.IsTrue(group.Contains(route3));
            Assert.IsTrue(nestedGroup.Contains(route3));
            Assert.IsTrue(nestedGroup2.Contains(route3));
            Assert.IsTrue(group.Contains(route2));
            Assert.IsTrue(nestedGroup.Contains(route2));
            Assert.IsFalse(nestedGroup2.Contains(route2));
            Assert.IsTrue(group.Contains(route1));
            Assert.IsFalse(nestedGroup.Contains(route1));
            Assert.IsFalse(nestedGroup2.Contains(route1));


            Assert.IsTrue(group[route3].IsMatch("UrlPrefix1/UrlPrefix2/UrlPrefix3/Article3", out _));
            Assert.IsTrue(group[route2].IsMatch("UrlPrefix1/UrlPrefix2/Article2", out _));
            Assert.IsTrue(group[route1].IsMatch("UrlPrefix1/Article1", out _));
        }
        public void RouteTableGroup_MultipleRoutes()
        {
            var table = new DotvvmRouteTable(configuration);

            table.AddGroup("Group", "UrlPrefix/{Id}", null, opt => {
                opt.Add("Route0", "Article0/{Title}", null, null, null);
                opt.Add("Route1", "Article1/{Title}", null, null, null);
            });

            var group = table.GetGroup("Group");

            Assert.IsTrue(group.Contains("Group_Route0"));
            Assert.IsTrue(group.Contains("Group_Route1"));
            Assert.IsTrue(group["Group_Route0"].IsMatch("UrlPrefix/0/Article0/test0", out _));
            Assert.IsTrue(group["Group_Route1"].IsMatch("UrlPrefix/1/Article1/test1", out _));
        }
        public void RouteTableGroup_EmptyRouteName()
        {
            var table = new DotvvmRouteTable(configuration);

            table.AddGroup("Group", "UrlPrefix/{Id}", null, opt => {
                opt.Add("Default", "", null, null, null);
            });

            var group = table.GetGroup("Group");
            var route = group.First();

            Assert.AreEqual(route.RouteName, "Group_Default");
            Assert.IsTrue(route.IsMatch("UrlPrefix/5", out var parameters));

            Assert.AreEqual("5", parameters["Id"]);
        }
        public void RouteTableGroup_DefaultValues()
        {
            var table = new DotvvmRouteTable(configuration);

            table.AddGroup("Group", "UrlPrefix/{Id}", null, opt => {
                opt.Add("Route", "Article/{Title}", null, new { Title = "test" }, null);
            });

            var group = table.GetGroup("Group");
            var route = group.First();

            Assert.AreEqual(route.RouteName, "Group_Route");
            Assert.IsTrue(route.IsMatch("UrlPrefix/5/Article", out var parameters));

            Assert.AreEqual("5", parameters["Id"]);
            Assert.AreEqual("test", parameters["Title"]);
        }
        public void RouteTableGroup_MultipleRoutesWithParameters()
        {
            var table = new DotvvmRouteTable(configuration);

            table.AddGroup("Group", "UrlPrefix/{Id}", null, opt => {
                opt.Add("Route0", "Article0/{Title}", null, null, null);
                opt.Add("Route1", "Article1/{Title}", null, null, null);
            });

            var group = table.GetGroup("Group");

            Assert.IsTrue(group["Group_Route0"].IsMatch("UrlPrefix/0/Article0/test0", out var parameters));
            Assert.AreEqual("0", parameters["Id"]);
            Assert.AreEqual("test0", parameters["Title"]);
            Assert.IsTrue(group["Group_Route1"].IsMatch("UrlPrefix/1/Article1/test1", out parameters));
            Assert.AreEqual("1", parameters["Id"]);
            Assert.AreEqual("test1", parameters["Title"]);
        }
        public void RouteTableGroup_UrlWithParameters()
        {
            var table = new DotvvmRouteTable(configuration);

            table.AddGroup("Group", "UrlPrefix/{Id}", "PathPrefix", opt => {
                opt.Add("Route", "Article/{Title}", "route.dothtml", null, null);
            });

            var group = table.GetGroup("Group");
            var route = group.First();

            Assert.AreEqual(route.RouteName, "Group_Route");
            Assert.AreEqual(route.VirtualPath, "PathPrefix/route.dothtml");
            Assert.IsTrue(route.IsMatch("UrlPrefix/5/Article/test", out var parameters));

            Assert.AreEqual("5", parameters["Id"]);
            Assert.AreEqual("test", parameters["Title"]);
        }