public void VisitRouteNode_NoParameters_CreatesMethod()
		{
			RouteTreeNode node = new StaticRouteTreeNode("Index", "index");
			ActionTreeNode actionTreeNode = new ActionTreeNode("action");
			actionTreeNode.AddChild(node);
			controller.AddChild(actionTreeNode);

			mocks.ReplayAll();
			generator.Visit(controller);
			mocks.VerifyAll();

			CodeDomAssert.AssertHasField(source.Ccu.Namespaces[0].Types[0], "_services");
			CodeDomAssert.AssertHasMethod(source.Ccu.Namespaces[0].Types[2], "Index");
		}
		public override object VisitMethodDeclaration(MethodDeclaration methodDeclaration, object data)
		{
			if ((methodDeclaration.Modifier & Modifiers.Public) != Modifiers.Public)
			{
				return null;
			}

			ControllerTreeNode controllerNode = (ControllerTreeNode) _treeService.Peek;

			if (controllerNode is WizardControllerTreeNode)
			{
				Type wizardControllerInterface = typeof (IWizardController);

				MethodInfo[] methodInfos = wizardControllerInterface.GetMethods(BindingFlags.Public | BindingFlags.Instance);

				if ((methodDeclaration.Name == "GetSteps") && (methodDeclaration.Body.Children.Count > 0))
				{
					(controllerNode as WizardControllerTreeNode).WizardStepPages = GetWizardStepPages(methodDeclaration.Body);

					return null;
				}
				else if (
					Array.Exists(methodInfos, delegate(MethodInfo methodInfo) { return methodInfo.Name == methodDeclaration.Name; }))
					return null;
			}

			ActionTreeNode action = new ActionTreeNode(methodDeclaration.Name);

			foreach (ParameterDeclarationExpression parameter in methodDeclaration.Parameters)
			{
				Type type = TypeResolver.Resolve(parameter.TypeReference, true);
				action.AddChild(new ParameterTreeNode(parameter.ParameterName, type));
			}

			foreach (AttributeSection attributeSection in methodDeclaration.Attributes)
			{
				List<Attribute> attributes = attributeSection.Attributes.FindAll(
					delegate(Attribute attribute) { return attribute.Name == "StaticRoute"; });

				foreach (Attribute attribute in attributes)
				{
					PrimitiveExpression name = (PrimitiveExpression) attribute.PositionalArguments[0];
					PrimitiveExpression pattern = (PrimitiveExpression) attribute.PositionalArguments[1];

					StaticRouteTreeNode routeTreeNode = new StaticRouteTreeNode((string) name.Value, (string) pattern.Value);
					action.AddChild(routeTreeNode);
				}

				attributes = attributeSection.Attributes.FindAll(
					delegate(Attribute attribute) { return attribute.Name == "PatternRoute"; });

				foreach (Attribute attribute in attributes)
				{
					PrimitiveExpression name = (PrimitiveExpression)attribute.PositionalArguments[0];
					PrimitiveExpression pattern = (PrimitiveExpression)attribute.PositionalArguments[1];
					string[] defaults = new string[attribute.PositionalArguments.Count - 2];

					for(int i = 0; i < defaults.Length; i++)
						defaults[i] = (string) ((PrimitiveExpression) attribute.PositionalArguments[2 + i]).Value;

					PatternRouteTreeNode routeTreeNode = new PatternRouteTreeNode((string)name.Value, (string)pattern.Value, defaults);
					action.AddChild(routeTreeNode);
				}
			}

			controllerNode.AddChild(action, true);

			return base.VisitMethodDeclaration(methodDeclaration, data);
		}
    public void VisitActionNode_OneParameters_CreatesMethod()
    {
      ActionTreeNode node = new ActionTreeNode("Index");
      _controller.AddChild(node);
      node.AddChild(new ParameterTreeNode("id", typeof(Int32)));

      using (_mocks.Unordered())
      {
      }

      _mocks.ReplayAll();
      _generator.Visit(_controller);
      _mocks.VerifyAll();

      CodeDomAssert.AssertHasField(_source.Ccu.Namespaces[0].Types[0], "_services");
      CodeDomAssert.AssertHasMethod(_source.Ccu.Namespaces[0].Types[0], "Index");
    }
		public void VisitRouteNode_OneParameters_CreatesMethod()
		{
			RouteTreeNode node = new StaticRouteTreeNode("AuthenticateLogIn", "login/authenticate/<userName:string>/<password:string>");
			ActionTreeNode actionTreeNode = new ActionTreeNode("action");
			actionTreeNode.AddChild(node);
			controller.AddChild(actionTreeNode);
			node.AddChild(new ParameterTreeNode("userName", typeof(string)));

			using (mocks.Unordered())
			{
			}

			mocks.ReplayAll();
			generator.Visit(controller);
			mocks.VerifyAll();

			CodeDomAssert.AssertHasField(source.Ccu.Namespaces[0].Types[0], "_services");
			CodeDomAssert.AssertHasMethod(source.Ccu.Namespaces[0].Types[2], "AuthenticateLogIn");
		}