public void CountSimple()
        {
            project.LoadXml(ProjectContentWithThreeBuildItemGroups);
            BuildItemGroupCollection groups = project.ItemGroups;

            Assertion.AssertEquals(3, groups.Count);
        }
        public void IsSynchronizedDefault()
        {
            project.LoadXml(ProjectContentWithThreeBuildItemGroups);
            BuildItemGroupCollection groups = project.ItemGroups;

            Assertion.AssertEquals(false, groups.IsSynchronized);
        }
        public void CopyToArrayThatsNotLargeEnough()
        {
            project.LoadXml(ProjectContentWithThreeBuildItemGroups);
            BuildItemGroupCollection groups = project.ItemGroups;

            object[] array = new object[groups.Count - 1];
            groups.CopyTo(array, 0);
        }
        public void CountParentAndImported()
        {
            Project p = GetProjectThatImportsAnotherProject(null, null);

            BuildItemGroupCollection groups = p.ItemGroups;

            Assertion.AssertEquals(5, groups.Count);
        }
        public void CountAfterRemovingAllGroups()
        {
            project.LoadXml(ProjectContentWithThreeBuildItemGroups);
            BuildItemGroupCollection groups = project.ItemGroups;

            project.RemoveAllItemGroups();

            Assertion.AssertEquals(0, groups.Count);
        }
        public void CountAfterAddingNewGroup()
        {
            project.LoadXml(ProjectContentWithThreeBuildItemGroups);
            BuildItemGroupCollection groups = project.ItemGroups;

            project.AddNewItemGroup();

            Assertion.AssertEquals(4, groups.Count);
        }
        public void CountZero()
        {
            string projectContents = @"
                    <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
                    </Project>
                    ";

            project.LoadXml(projectContents);
            BuildItemGroupCollection groups = project.ItemGroups;

            Assertion.AssertEquals(0, groups.Count);
        }
        public void CountImportedOnly()
        {
            string parentProjectContents = @" 
                    <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
                        <Import Project='import.proj' />
                    </Project>
                ";

            Project p = GetProjectThatImportsAnotherProject(null, parentProjectContents);

            BuildItemGroupCollection groups = p.ItemGroups;

            Assertion.AssertEquals(2, groups.Count);
        }
        public void CopyToSimple()
        {
            project.LoadXml(ProjectContentWithThreeBuildItemGroups);
            BuildItemGroupCollection groups = project.ItemGroups;

            object[] array = new object[groups.Count];
            groups.CopyTo(array, 0);

            int count = 0;

            foreach (BuildItemGroup group in groups)
            {
                Assertion.AssertEquals(array[count].ToString(), group.ToString());
                count++;
            }
        }
        static Int32 Main(string[] args)
        {
            CopyProjectOptions options = new CopyProjectOptions();
            List<String> nonOptionArgs = options.Parse(args);

            if (nonOptionArgs.Count != 2)
            {
                return options.ErrorAndUsage("Expected 2 non-option arguments but got {0}", nonOptionArgs.Count);
            }

            //
            // Setup source and dest proj names/paths
            //
            String sourceProj = nonOptionArgs[0];
            if (!File.Exists(sourceProj))
            {
                Console.WriteLine("Source csproj file '{0}' does not exist", sourceProj);
                return 1;
            }
            String sourceProjPath = Path.GetDirectoryName(sourceProj);
            String sourceProjName = Path.GetFileName(sourceProj);

            String destProjOrPath = nonOptionArgs[1];
            String destProj, destProjPath;

            if(destProjOrPath.EndsWith(".csproj"))
            {
                destProj = destProjOrPath;
                destProjPath = Path.GetDirectoryName(destProjOrPath);
            }
            else
            {
                destProj = Path.Combine(destProjOrPath, sourceProjName);
                destProjPath = destProjOrPath;
            }

            if (!Directory.Exists(destProjPath))
            {
                Console.WriteLine("Destination Directory '{0}' doesn't exist", destProjPath);
                return 1;
            }

            //
            // Print Settings
            //
            Console.WriteLine();
            Console.WriteLine("-----------------------------------------------------------------------------");
            Console.WriteLine("Settings");
            Console.WriteLine("-----------------------------------------------------------------------------");
            Console.WriteLine("Source Proj File : {0}", sourceProj);
            Console.WriteLine("Dest Proj File   : {0}", destProj);

            //
            //
            //
            Console.WriteLine();
            Console.WriteLine("-----------------------------------------------------------------------------");
            Console.WriteLine("Processing source csproj file...");
            Console.WriteLine("-----------------------------------------------------------------------------");

            HashSet<FileResource> compileFiles = new HashSet<FileResource>();

            /*
            BuildProperty DefaultMSBuildBinPath = null;
            if (sourceProjName.EndsWith(".CE.csproj"))
            {
                if (DefaultMSBuildBinPath == null)
                {
                    DefaultMSBuildBinPath = Engine.GlobalEngine.GlobalProperties["MSBuildBinPath"];
                    //Engine.GlobalEngine.GlobalProperties["MSBuildBinPath"] = new BuildProperty("MSBuildBinPath", @"C:\Windows\Microsoft.NET\Framework\v3.5");
                }
            }
            else
            {
                if (DefaultMSBuildBinPath != null)
                {
                    //Engine.GlobalEngine.GlobalProperties["MSBuildBinPath"] = DefaultMSBuildBinPath;
                    DefaultMSBuildBinPath = null;
                }
            }
            */
            Project sourceProject = new Project();
            sourceProject.Load(sourceProj);

            BuildItemGroupCollection itemGroups = sourceProject.ItemGroups;

            foreach (BuildItemGroup itemGroup in itemGroups)
            {
                //Console.WriteLine("ItemGroup Count='{0}' Condition='{1}'", itemGroup.Count, itemGroup.Condition);

                foreach (BuildItem item in itemGroup)
                {
                    if (item.Name.Equals("Compile"))
                    {
                        String include = item.Include;
                        String exclude = item.Exclude;

                        if(!String.IsNullOrEmpty(include))
                        {
                            FileResource resource = new FileResource(include, sourceProjPath, destProjPath);
                            if (!File.Exists(resource.sourceRelativeToCWDNameAndPath))
                            {
                                Console.WriteLine("Error: ItemGroup 'Compile' Include '{0}' does not exist (name relative to current working directory is '{1}')",
                                    resource.sourceRelativeToCWDNameAndPath, resource.sourceRelativeToCWDNameAndPath);
                                return 1;
                            }

                            Console.WriteLine("Compile Include '{0}'", resource.relativeToProjNameAndPath);
                            compileFiles.Add(resource);
                        }
                        if(!String.IsNullOrEmpty(exclude))
                        {
                            throw new NotImplementedException();
                        }
                    }
                    else
                    {
                        //Console.WriteLine("Ignoring '{0}'", item.Include);
                    }
                }
            }

            //
            // Load template file if applicable
            //
            Project destProject;
            if (!options.templateFile.set)
            {
                destProject = sourceProject;
            }
            else
            {
                Console.WriteLine();
                Console.WriteLine("-----------------------------------------------------------------------------");
                Console.WriteLine("Loading csproj template file...");
                Console.WriteLine("-----------------------------------------------------------------------------");
                String templateFile = options.templateFile.ArgValue;
                if(templateFile.StartsWith("src:"))
                {
                    templateFile = Path.Combine(sourceProjPath, templateFile.Substring("src:".Length));
                }
                else if(templateFile.StartsWith("dst:"))
                {
                    templateFile = Path.Combine(destProjPath, templateFile.Substring("dst:".Length));
                }

                if (!File.Exists(templateFile))
                {
                    Console.WriteLine("Error: Template file '{0}' does not exist ('{1}')", options.templateFile.ArgValue,
                        templateFile);
                    return 1;
                }

                destProject = new Project();
                destProject.Load(templateFile);

                //
                // Add compile files to template
                //
                BuildItemGroup compileItemGroup = destProject.AddNewItemGroup();
                foreach (FileResource resource in compileFiles)
                {
                    compileItemGroup.AddNewItem("Compile", resource.relativeToProjNameAndPath);
                }
            }

            //
            //
            //
            List<PropertyChange> propertyChanges = new List<PropertyChange>();

            if (options.assemblyName.set)
            {
                propertyChanges.Add(new PropertyChange("AssemblyName", options.assemblyName.ArgValue));
            }

            if (options.propChanges.set)
            {
                String[] changes = options.propChanges.ArgValue.Split(new Char[] {';'}, StringSplitOptions.RemoveEmptyEntries);
                for (int i = 0; i < changes.Length; i++)
                {
                    String change = changes[i];

                    Int32 colonIndex = change.IndexOf(':');
                    if (colonIndex < 0)
                    {
                        Console.WriteLine("Invalid -p or --props value '{0}', each semi-colon separated change must be a <name>:<value> pair", options.propChanges.ArgValue);
                        return 1;
                    }
                    propertyChanges.Add(new PropertyChange(change.Remove(colonIndex), change.Substring(colonIndex + 1)));
                }
            }

            if (propertyChanges.Count > 0)
            {
                Console.WriteLine();
                Console.WriteLine("-----------------------------------------------------------------------------");
                Console.WriteLine("Modifying source csproj file...");
                Console.WriteLine("-----------------------------------------------------------------------------");

                // Print changes
                for (int i = 0; i < propertyChanges.Count; i++)
                {
                    PropertyChange change = propertyChanges[i];
                    Console.WriteLine("Property '{0}', new value '{1}'", change.name, change.value);
                }

                foreach (BuildPropertyGroup propertyGroup in destProject.PropertyGroups)
                {
                    foreach (BuildProperty property in propertyGroup)
                    {
                        for (int i = 0; i < propertyChanges.Count; i++)
                        {
                            PropertyChange change = propertyChanges[i];

                            if (property.Name.Equals(change.name))
                            {
                                if (property.IsImported)
                                {
                                    Console.WriteLine("WARNING: Property <{0}>{1}</{0}> is imported and cannot be changed", property.Name, property.Value);
                                }
                                else
                                {
                                    Console.WriteLine("Change: Property '{0}' from '{1}' to '{2}'", change.name, property.Value, change.value);
                                    property.Value = change.value;
                                    change.changeCount++;
                                }
                            }
                        }
                    }
                }

                // Check changes
                for (int i = 0; i < propertyChanges.Count; i++)
                {
                    PropertyChange change = propertyChanges[i];
                    if (change.changeCount <= 0)
                    {
                        Console.WriteLine("Error: Did not find any non-imported <{0}> properties to change", change.name);
                        return 1;
                    }

                    Console.WriteLine("Changed {0} <{1}> properties", change.changeCount, change.name);
                }
            }

            Console.WriteLine();
            Console.WriteLine("-----------------------------------------------------------------------------");
            Console.WriteLine("Saving new csproj file...");
            Console.WriteLine("-----------------------------------------------------------------------------");
            destProject.Save(destProj);

            Console.WriteLine();
            Console.WriteLine("-----------------------------------------------------------------------------");
            Console.WriteLine("Copying Files...");
            Console.WriteLine("-----------------------------------------------------------------------------");

            //
            // Setup copy variables
            //
            String oldDottedNamespace, newDottedNamespace;
            String oldNamespace, newNamespace;

            if(options.namespaceChange.set)
            {
                String namespaceChangeString = options.namespaceChange.ArgValue;
                Int32 colonIndex = namespaceChangeString.IndexOf(':');
                if(colonIndex < 0)
                {
                    Console.WriteLine("Namespace change option should contain a colon to seperate the namespaces.");
                    return 1;
                }
                oldNamespace = namespaceChangeString.Remove(colonIndex);
                newNamespace = namespaceChangeString.Substring(colonIndex + 1);

                oldDottedNamespace = oldNamespace + ".";
                newDottedNamespace = newNamespace + ".";
            }
            else
            {
                oldDottedNamespace = null;
                newDottedNamespace = null;
                oldNamespace = null;
                newNamespace = null;
            }

            //
            // Copy the project file
            //
            foreach (FileResource compileFile in compileFiles)
            {
                //
                // Make any destination directories
                //
                String directory = Path.GetDirectoryName(compileFile.relativeToProjNameAndPath);
                if (!String.IsNullOrEmpty(directory))
                {
                    String destinationRelativeToCWDDirectory = Path.Combine(destProjPath, directory);
                    if (!Directory.Exists(destinationRelativeToCWDDirectory))
                    {
                        Console.WriteLine("Creating destination directory '{0}'", directory);
                        Directory.CreateDirectory(destinationRelativeToCWDDirectory);
                    }
                }

                if (!options.namespaceChange.set)
                {
                    File.Copy(compileFile.sourceRelativeToCWDNameAndPath, compileFile.destRelativeToCWDNameAndPath, true);
                }
                else
                {
                    String fileContents = FileExtensions.ReadFileToString(compileFile.sourceRelativeToCWDNameAndPath);

                    //
                    // Make Replacements
                    //
                    fileContents = fileContents.Replace("namespace " + oldDottedNamespace, "namespace " + newDottedNamespace);
                    fileContents = fileContents.Replace("namespace " + oldNamespace, "namespace " + newNamespace);

                    fileContents = fileContents.Replace("using " + oldDottedNamespace, "using " + newDottedNamespace);
                    fileContents = fileContents.Replace("using " + oldNamespace, "using " + newNamespace);

                    fileContents = fileContents.Replace(oldNamespace + ".", newNamespace + ".");

                    FileExtensions.SaveStringToFile(compileFile.destRelativeToCWDNameAndPath, FileMode.Create, fileContents);
                }
            }

            return 0;
        }