Beispiel #1
0
        public void RemoveLastInstanceDeallocatesEntry()
        {
            ProjectStringCache cache = new ProjectStringCache();

            XmlDocument document = new XmlDocument();

            string stringToAdd = "Test1";
            string return1     = cache.Add(stringToAdd, document);

            cache.Clear(document);

            // Should be no instances left.
            Assert.Equal(0, cache.Count);

            // Build a new string guaranteed not to be optimized by the compiler into the same instance.
            StringBuilder builder = new StringBuilder();

            builder.Append("Test");
            builder.Append('1');
            XmlDocument document2 = new XmlDocument();

            string return2 = cache.Add(builder.ToString(), document2);

            // Returned references should NOT be the same
            Assert.NotSame(return1, return2);
        }
Beispiel #2
0
        public void DifferentStringsDifferentDocuments()
        {
            ProjectStringCache cache = new ProjectStringCache();

            XmlDocument document = new XmlDocument();

            string stringToAdd = "Test1";

            cache.Add(stringToAdd, document);
            Assert.Equal(1, cache.Count);

            stringToAdd = "Test2";
            XmlDocument document2 = new XmlDocument();
            string      return2   = cache.Add(stringToAdd, document2);

            // The second string gets its own instance.
            Assert.Equal(2, cache.Count);

            // Build a new string guaranteed not to be optimized by the compiler into the same instance.
            StringBuilder builder = new StringBuilder();

            builder.Append("Test");
            builder.Append('2');
            XmlDocument document3 = new XmlDocument();
            string      return3   = cache.Add(builder.ToString(), document3);

            // The new string should be the same as the other one already in the collection.
            Assert.Same(return2, return3);

            // No new instances for string with the same content.
            Assert.Equal(2, cache.Count);
        }
Beispiel #3
0
        public void AddReturnsSameInstanceForDifferentDocument()
        {
            ProjectStringCache cache = new ProjectStringCache();

            XmlDocument document = new XmlDocument();

            string stringToAdd = "Test1";
            string return1     = cache.Add(stringToAdd, document);

            // Content of string should be the same.
            Assert.Equal(stringToAdd, return1);

            // Build a new string guaranteed not to be optimized by the compiler into the same instance.
            StringBuilder builder = new StringBuilder();

            builder.Append("Test");
            builder.Append('1');
            XmlDocument document2 = new XmlDocument();

            string return2 = cache.Add(builder.ToString(), document2);

            // Content of string should be the same.
            Assert.Equal(builder.ToString(), return2);

            // Returned references should be the same
            Assert.Same(return1, return2);

            // Should not have added any new string instances to the cache.
            Assert.Equal(1, cache.Count);
        }
Beispiel #4
0
        public void ContentIsSameAcrossInstances()
        {
            string content = ObjectModelHelpers.CleanupFileContents(@"
                    <Project xmlns='msbuildnamespace' ToolsVersion='msbuilddefaulttoolsversion'>
                        <ItemGroup>
                           Item group content
                        </ItemGroup>
                    </Project>
                    ");

            string path = FileUtilities.GetTemporaryFile();

            try
            {
                File.WriteAllText(path, content);

                ProjectStringCache      cache     = new ProjectStringCache();
                XmlDocumentWithLocation document1 = new XmlDocumentWithLocation();
                document1.StringCache = cache;
                document1.Load(path);

                XmlDocumentWithLocation document2 = new XmlDocumentWithLocation();
                document2.StringCache = cache;
                document2.Load(path);

                XmlNodeList nodes1 = document1.GetElementsByTagName("ItemGroup");
                XmlNodeList nodes2 = document2.GetElementsByTagName("ItemGroup");

                Assert.Equal(1, nodes1.Count);
                Assert.Equal(1, nodes2.Count);

                XmlNode node1 = nodes1[0].FirstChild;
                XmlNode node2 = nodes2[0].FirstChild;

                Assert.NotNull(node1);
                Assert.NotNull(node2);
                Assert.NotSame(node1, node2);
                Assert.Same(node1.Value, node2.Value);
            }
            finally
            {
                File.Delete(path);
            }
        }
Beispiel #5
0
        public void RemoveOneInstance()
        {
            ProjectStringCache cache = new ProjectStringCache();

            XmlDocument document = new XmlDocument();

            string stringToAdd = "Test1";
            string return1     = cache.Add(stringToAdd, document);

            Assert.Equal(1, cache.Count);

            XmlDocument document2 = new XmlDocument();

            cache.Add(stringToAdd, document2);
            Assert.Equal(1, cache.Count);

            cache.Clear(document2);

            // Since there is still one document referencing the string, it should remain.
            Assert.Equal(1, cache.Count);

            // Build a new string guaranteed not to be optimized by the compiler into the same instance.
            StringBuilder builder = new StringBuilder();

            builder.Append("Test");
            builder.Append('1');
            XmlDocument document3 = new XmlDocument();

            string return3 = cache.Add(builder.ToString(), document3);

            // Returned references should be the same
            Assert.Same(return1, return3);

            // Still should only be one cached instance.
            Assert.Equal(1, cache.Count);
        }
Beispiel #6
0
        public void ContentCanBeModified()
        {
            string content = ObjectModelHelpers.CleanupFileContents(@"
                    <Project xmlns='msbuildnamespace' ToolsVersion='msbuilddefaulttoolsversion'>
                        <ItemGroup attr1='attr1value'>
                           Item group content
                        </ItemGroup>
                    </Project>
                    ");

            string path = FileUtilities.GetTemporaryFile();

            try
            {
                File.WriteAllText(path, content);
                ProjectStringCache      cache     = new ProjectStringCache();
                XmlDocumentWithLocation document1 = new XmlDocumentWithLocation();
                document1.StringCache = cache;
                document1.Load(path);

                XmlDocumentWithLocation document2 = new XmlDocumentWithLocation();
                document2.StringCache = cache;
                document2.Load(path);

                string outerXml1 = document1.OuterXml;
                string outerXml2 = document2.OuterXml;
                Assert.Equal(outerXml1, outerXml2);

                XmlNodeList nodes1 = document1.GetElementsByTagName("ItemGroup");
                XmlNodeList nodes2 = document2.GetElementsByTagName("ItemGroup");

                Assert.Equal(1, nodes1.Count);
                Assert.Equal(1, nodes2.Count);

                XmlNode node1 = nodes1[0];
                XmlNode node2 = nodes2[0];
                Assert.NotNull(node1);
                Assert.NotNull(node2);
                Assert.NotSame(node1, node2);
                Assert.Single(node1.Attributes);
                Assert.Single(node2.Attributes);
                Assert.Same(node1.Attributes[0].Value, node2.Attributes[0].Value);

                node2.Attributes[0].Value = "attr1value";
                Assert.Equal(node1.Attributes[0].Value, node2.Attributes[0].Value);
                Assert.NotSame(node1.Attributes[0].Value, node2.Attributes[0].Value);

                node1 = nodes1[0].FirstChild;
                node2 = nodes2[0].FirstChild;
                Assert.NotSame(node1, node2);
                Assert.Same(node1.Value, node2.Value);

                XmlText newText = document2.CreateTextNode("New Value");
                XmlNode parent  = node2.ParentNode;
                parent.ReplaceChild(newText, node2);

                Assert.NotEqual(outerXml1, document2.OuterXml);
            }
            finally
            {
                File.Delete(path);
            }
        }
Beispiel #7
0
        public void RemovingFilesRemovesEntries()
        {
            string content = ObjectModelHelpers.CleanupFileContents(@"
                    <Project xmlns='msbuildnamespace' ToolsVersion='msbuilddefaulttoolsversion'>
                        <ItemGroup>Content</ItemGroup>
                    </Project>
                    ");

            string path = FileUtilities.GetTemporaryFile();

            try
            {
                File.WriteAllText(path, content);

                ProjectStringCache cache      = new ProjectStringCache();
                ProjectCollection  collection = new ProjectCollection();
                int entryCount;

                ProjectRootElement pre1 = ProjectRootElement.Create(collection);
                pre1.XmlDocument.StringCache = cache;
                pre1.FullPath = path;
                pre1.XmlDocument.Load(path);

                entryCount = cache.Count;
                Assert.True(entryCount > 0);

                ProjectRootElement pre2 = ProjectRootElement.Create(collection);
                pre2.XmlDocument.StringCache = cache;
                pre2.FullPath = path;
                pre2.XmlDocument.Load(path);

                // Entry count should not have changed
                Assert.Equal(entryCount, cache.Count);

                string itemGroupContent = cache.Get("Content");
                Assert.NotNull(itemGroupContent);

                XmlNodeList nodes1 = pre1.XmlDocument.GetElementsByTagName("ItemGroup");
                XmlNodeList nodes2 = pre2.XmlDocument.GetElementsByTagName("ItemGroup");

                Assert.Equal(1, nodes1.Count);
                Assert.Equal(1, nodes2.Count);

                XmlNode node1 = nodes1[0];
                XmlNode node2 = nodes2[0];
                Assert.NotNull(node1);
                Assert.NotNull(node2);
                Assert.NotSame(node1, node2);
                Assert.Same(node1.Value, node2.Value);

                // Now remove one document
                collection.UnloadProject(pre1);

                // We should still be able to get Content
                itemGroupContent = cache.Get("Content");
                Assert.NotNull(itemGroupContent);

                // Now remove the second document
                collection.UnloadProject(pre2);

                // Now we should not be able to get Content
                itemGroupContent = cache.Get("Content");
                Assert.Null(itemGroupContent);

                // And there should be no entries
                Assert.Equal(0, cache.Count);
            }
            finally
            {
                File.Delete(path);
            }
        }
        public void ContentIsSameAcrossInstances()
        {
            string content = ObjectModelHelpers.CleanupFileContents(@"
                    <Project xmlns='msbuildnamespace' ToolsVersion='msbuilddefaulttoolsversion'>
                        <ItemGroup>
                           Item group content
                        </ItemGroup>
                    </Project>
                    ");

            string path = FileUtilities.GetTemporaryFile();

            try
            {
                File.WriteAllText(path, content);

                ProjectStringCache      cache     = new ProjectStringCache();
                XmlDocumentWithLocation document1 = new XmlDocumentWithLocation();
                document1.StringCache = cache;
#if FEATURE_XML_LOADPATH
                document1.Load(path);
#else
                var xmlReadSettings = new XmlReaderSettings {
                    DtdProcessing = DtdProcessing.Ignore
                };
                using (XmlReader xmlReader = XmlReader.Create(path, xmlReadSettings))
                {
                    document1.Load(xmlReader);
                }
#endif

                XmlDocumentWithLocation document2 = new XmlDocumentWithLocation();
                document2.StringCache = cache;
#if FEATURE_XML_LOADPATH
                document2.Load(path);
#else
                using (XmlReader xmlReader = XmlReader.Create(path, xmlReadSettings))
                {
                    document2.Load(xmlReader);
                }
#endif

                XmlNodeList nodes1 = document1.GetElementsByTagName("ItemGroup");
                XmlNodeList nodes2 = document2.GetElementsByTagName("ItemGroup");

                Assert.Equal(1, nodes1.Count);
                Assert.Equal(1, nodes2.Count);

                XmlNode node1 = nodes1[0].FirstChild;
                XmlNode node2 = nodes2[0].FirstChild;

                Assert.NotNull(node1);
                Assert.NotNull(node2);
                Assert.NotSame(node1, node2);
                Assert.Same(node1.Value, node2.Value);
            }
            finally
            {
                File.Delete(path);
            }
        }