private static MandatoryGroupInfo ProcessGroupedMandatories(Dictionary <int, MandatoryGroupInfo> groupedMandatories, ArgumentInfo argumentInfo)
        {
            MandatoryGroupInfo groupInfo = null;
            int groupId = argumentInfo.GroupedMandatoryArgument.GroupId;

            if (!groupedMandatories.ContainsKey(groupId))
            {
                groupInfo = new MandatoryGroupInfo(argumentInfo);
                groupedMandatories.Add(groupId, groupInfo);
            }
            else
            {
                groupInfo = groupedMandatories[groupId];
                groupInfo.Add(argumentInfo);
            }
            return(groupInfo);
        }
        private void ValidateMandatoryArguments(ArgumentInfoCollection argumentsInfo)
        {
            Dictionary <int, MandatoryGroupInfo> groupedMandatories = new Dictionary <int, MandatoryGroupInfo>();

            foreach (ArgumentInfo argumentInfo in argumentsInfo)
            {
                if (argumentInfo.Found == false)
                {
                    ArgumentInfo parentArgInfo = argumentInfo.ParentArgumentInfo;
                    if (parentArgInfo != null)
                    {
                        // If the parent has been found,
                        if (parentArgInfo.Found && argumentInfo.MandatoryArgument != null)
                        {
                            ProcessMandatoryMissing(argumentInfo);
                        }
                        // If the parent has been found,
                        if (parentArgInfo.Found && argumentInfo.GroupedMandatoryArgument != null)
                        {
                            ProcessGroupedMandatories(groupedMandatories, argumentInfo);
                        }
                    }
                    else // The current argument is not a child argument
                    {
                        if (argumentInfo.MandatoryArgument != null)
                        {
                            ProcessMandatoryMissing(argumentInfo);
                        }
                        if (argumentInfo.GroupedMandatoryArgument != null)
                        {
                            ProcessGroupedMandatories(groupedMandatories, argumentInfo);
                        }
                    }
                }
                else
                {
                    if (argumentInfo.GroupedMandatoryArgument != null)
                    {
                        if (groupedMandatories.ContainsKey(argumentInfo.GroupedMandatoryArgument.GroupId))
                        {
                            groupedMandatories[argumentInfo.GroupedMandatoryArgument.GroupId].Found = true;
                        }
                        else
                        {
                            MandatoryGroupInfo groupInfo = ProcessGroupedMandatories(groupedMandatories, argumentInfo);
                            groupInfo.Found = true;
                        }
                    }
                }
                ValidateMandatoryArguments(argumentInfo.Children);
            }

            if (groupedMandatories.Count > 0)
            {
                foreach (MandatoryGroupInfo mgInfo in groupedMandatories.Values)
                {
                    if (mgInfo.Found == false)
                    {
                        ProcessGroupedMandatoryMissing(mgInfo.ArgumentInfos);
                    }
                }
            }
        }