public void ReversingUrls() { ViewUrl url1 = new ViewUrl(@"^product/(?<category>\w+)/(\d+)/$", View1, "url1"); ViewUrl url2 = new ViewUrl(@"^product/(?<category>(?:[\w\s]+))/\((\d+)\)/(\w+)/$", View1, "url2"); ViewUrl url3 = new ViewUrl(@"^product/(?<category>\w+)/\d+/$", View1, "url3"); string revUrl1 = url1.Reverse("category=green", "1=7"); string revUrl2 = url2.Reverse("category=green and yellow", "1=7", "2=page"); Assert.Equal("/product/green/7/", revUrl1); Assert.Equal("/product/green%20and%20yellow/(7)/page/", revUrl2); Assert.Throws(typeof(Exception), () => { // positional argument 1 = "page" is not permitted because it must be numeric url2.Reverse("category=green", "1=page", "2=7"); }); Assert.Throws(typeof(Exception), () => { // url3 is not reversible because \d+ at the end was not enclosed in a group and can not be resolved url3.Reverse("category=green", "1=7"); }); }