示例#1
0
        /// <summary>
        /// Enumerate the directory and apply a given action to its members
        /// </summary>
        public PathExistence EnumerateDirectory(PathTable pathTable, AbsolutePath path, Action <AbsolutePath, string> handleChildPath)
        {
            // We can bail out early if the path is known as either a file or as being nonexistent
            var id = GetIndexByPath(path);

            bool atLeastOneChild = false;

            if (id >= m_bitset.Length)
            {
                // It means that the path is not in the table when we construct the pip file system.
                // We can safely ignore it and return Nonexistent.
                return(PathExistence.Nonexistent);
            }

            foreach (var childPathValue in pathTable.EnumerateImmediateChildren(path.Value))
            {
                var index = HierarchicalNameTable.GetIndexFromValue(childPathValue.Value);

                if (index >= m_bitset.Length)
                {
                    continue;
                }

                if (m_bitset.Contains(index))
                {
                    atLeastOneChild = true;
                    var filePath = GetPathByIndex(pathTable, index);
                    handleChildPath(filePath, filePath.GetName(pathTable).ToString(pathTable.StringTable));
                }
            }

            return(atLeastOneChild ? PathExistence.ExistsAsDirectory : PathExistence.Nonexistent);
        }
        public void TryExpandNameRelativeToAnother()
        {
            var hnt = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
            HierarchicalNameId root = hnt.AddName(A("c", "dir", "root"));
            HierarchicalNameId immediateDescendant = hnt.AddName(A("c", "dir", "root", "file"));
            HierarchicalNameId furtherDescendant   = hnt.AddName(A("c", "dir", "root", "moredir", "file2"));
            HierarchicalNameId sibling             = hnt.AddName(A("c", "dir", "sibling"));

            string immediateDescendantPath;

            XAssert.IsTrue(hnt.TryExpandNameRelativeToAnother(root, immediateDescendant, out immediateDescendantPath));
            XAssert.AreEqual("file", immediateDescendantPath);

            string furtherDescendantPath;

            XAssert.IsTrue(hnt.TryExpandNameRelativeToAnother(root, furtherDescendant, out furtherDescendantPath));
            XAssert.AreEqual(R("moredir", "file2"), furtherDescendantPath);

            string siblingPath;

            XAssert.IsFalse(hnt.TryExpandNameRelativeToAnother(root, sibling, out siblingPath));
            XAssert.IsNull(siblingPath);

            string emptyPath;

            XAssert.IsTrue(hnt.TryExpandNameRelativeToAnother(root, root, out emptyPath));
            XAssert.AreEqual(string.Empty, emptyPath);
        }
示例#3
0
        private string ToDebuggerDisplay()
        {
            string annotation;

            switch (m_rewriteCountAndFileExistence)
            {
            case 0:
                annotation = "source";
                break;

            case 1:
                annotation = "output";
                break;

            default:
                annotation = "rewrite:" + m_rewriteCountAndFileExistence.ToString(CultureInfo.InvariantCulture);
                break;
            }

            string path;

            if (!Path.IsValid)
            {
                path = "Invalid";
            }
            else
            {
                PathTable owner = HierarchicalNameTable.DebugTryGetTableForId(Path.Value) as PathTable;
                path = (owner == null)
                    ? "{Unable to expand AbsolutePath; this may occur after the allocation of a large number of PathTables}"
                    : Path.ToString(owner);
            }

            return(string.Format(CultureInfo.InvariantCulture, "{{{0} ({1}): {2}}}", path, annotation, FileExistence));
        }
        public void EnumeratingImmediateChildren()
        {
            var ht = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
            HierarchicalNameId rootChild1      = ht.AddName(R("root", "rootChild1"));
            HierarchicalNameId otherRoot       = ht.AddName(R("otherRoot"));
            HierarchicalNameId rootChild2      = ht.AddName(R("root", "rootChild2"));
            HierarchicalNameId rootGrandchild1 = ht.AddName(R("root", "rootChild1", "grandchild1"));
            HierarchicalNameId rootGrandchild2 = ht.AddName(R("root", "rootChild2", "grandchild2"));
            HierarchicalNameId rootGrandchild3 = ht.AddName(R("root", "rootChild2", "grandchild3"));
            HierarchicalNameId root            = ht.AddName(R("root"));

            XAssert.AreEqual(0, ht.EnumerateImmediateChildren(otherRoot).Count());
            Assert.Equal(
                ht.EnumerateImmediateChildren(root).ToArray(),
                new[]
            {
                // Siblings are in reverse addition order.
                rootChild2,
                rootChild1,
            });
            Assert.Equal(
                ht.EnumerateImmediateChildren(rootChild1).ToArray(),
                new[]
            {
                rootGrandchild1
            });
            Assert.Equal(
                ht.EnumerateImmediateChildren(rootChild2).ToArray(),
                new[]
            {
                rootGrandchild3,
                rootGrandchild2,
            });
            XAssert.AreEqual(0, ht.EnumerateImmediateChildren(rootGrandchild2).Count());
        }
        public void GetAndSetFlags()
        {
            var ht = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
            HierarchicalNameId tag1 = ht.AddName(R("c", "tag1"));
            HierarchicalNameId tag2 = ht.AddName(R("c", "tag2"));

            XAssert.AreEqual(ht.GetContainer(tag1), ht.GetContainerAndFlags(tag1).Item1);

            XAssert.IsTrue(ht.SetFlags(tag2, HierarchicalNameTable.NameFlags.Marked));

            XAssert.IsTrue(ht.SetFlags(tag1, HierarchicalNameTable.NameFlags.Marked));
            XAssert.IsFalse(ht.SetFlags(tag1, HierarchicalNameTable.NameFlags.Marked));
            XAssert.AreEqual(HierarchicalNameTable.NameFlags.Marked, ht.GetContainerAndFlags(tag1).Item2);

            XAssert.IsTrue(ht.SetFlags(tag1, HierarchicalNameTable.NameFlags.Sealed));
            XAssert.AreEqual(HierarchicalNameTable.NameFlags.Marked | HierarchicalNameTable.NameFlags.Sealed, ht.GetContainerAndFlags(tag1).Item2);

            XAssert.IsTrue(ht.SetFlags(tag1, HierarchicalNameTable.NameFlags.Sealed, clear: true));
            XAssert.AreEqual(HierarchicalNameTable.NameFlags.Marked, ht.GetContainerAndFlags(tag1).Item2);

            XAssert.IsFalse(ht.SetFlags(tag1, HierarchicalNameTable.NameFlags.Marked | HierarchicalNameTable.NameFlags.Sealed, clear: true));
            XAssert.AreEqual(HierarchicalNameTable.NameFlags.None, ht.GetContainerAndFlags(tag1).Item2);

            // tag2 should be the same as before
            XAssert.AreEqual(HierarchicalNameTable.NameFlags.Marked, ht.GetContainerAndFlags(tag2).Item2);
        }
示例#6
0
 public void IsWithin()
 {
     var hnt = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
     HierarchicalNameId tree = hnt.AddName(A("c"));
     HierarchicalNameId path = hnt.AddName(A("c","windows"));
     XAssert.IsTrue(hnt.IsWithin(tree, path));
     XAssert.IsFalse(hnt.IsWithin(path, tree));
     XAssert.IsTrue(hnt.IsWithin(tree, tree));
     XAssert.IsTrue(hnt.IsWithin(path, path));
 }
        private string ToDebuggerDisplay()
        {
            if (this == Invalid)
            {
                return(ToString());
            }

            SymbolTable owner = HierarchicalNameTable.DebugTryGetTableForId(Value) as SymbolTable;

            return(owner == null
                ? "{Unable to expand FullSymbol; this may occur after the allocation of a large number of SymbolTables}"
                : I($"{{Identifier '{ToString(owner)}' (id: {Value.Value:x})}}"));
        }
        public void ManyNames()
        {
            var hnt = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
            var sb  = new StringBuilder();

            for (char ch1 = '\u0000'; ch1 <= '\ufffe'; ch1++)
            {
                char ch2 = 'a';
                sb.Length = 0;
                sb.AppendFormat("C:\\{0}\\{1}", ch1, ch2);
                hnt.AddName(sb.ToString());
            }
        }
        public Task ConcurrentGetAndSetExtendedFlags()
        {
            // This test parallel get and set flags that may involve memory ordering.
            var ht    = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
            var name  = ht.AddName(R("a", "b", "c", "d.cpp"));
            var flags = new HashSet <HierarchicalNameTable.ExtendedNameFlags>(new[] {
                HierarchicalNameTable.ExtendedNameFlags.Flag1,
                HierarchicalNameTable.ExtendedNameFlags.Flag2,
                HierarchicalNameTable.ExtendedNameFlags.Flag3,
                HierarchicalNameTable.ExtendedNameFlags.Flag4
            });

            var tasks = new List <Task>();

            foreach (var flag in flags)
            {
                ht.SetExtendedFlags(name, flag);
            }

            var allFlags = flags.Aggregate((f1, f2) => f1 | f2);

            XAssert.AreEqual(allFlags, ht.GetExtendedFlags(name) & allFlags);

            foreach (var flag in flags)
            {
                tasks.Add(Task.Run(() =>
                {
                    var otherFlags = HierarchicalNameTable.ExtendedNameFlags.None;
                    foreach (var of in flags)
                    {
                        if (of != flag)
                        {
                            otherFlags |= of;
                        }
                    }

                    bool clear = false;

                    for (int i = 0; i < 10000; ++i)
                    {
                        ht.SetExtendedFlags(name, flag, clear: clear);
                        XAssert.AreEqual(clear, (ht.GetExtendedFlags(name) & flag) == 0);
                        clear = !clear;
                    }

                    XAssert.AreEqual(!clear, (ht.GetExtendedFlags(name) & flag) == 0);
                }));
            }

            return(Task.WhenAll(tasks));
        }
        public static HierarchicalNameId AddName(this HierarchicalNameTable table, string name)
        {
            Contract.Requires(name != null);

            string[] components   = GetComponents(table, name);
            var      componentIds = new StringId[components.Length];

            for (int i = 0; i < components.Length; i++)
            {
                componentIds[i] = table.StringTable.AddString(components[i]);
            }

            return(table.AddComponents(HierarchicalNameId.Invalid, componentIds));
        }
        public void GetContainer()
        {
            var hnt = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
            HierarchicalNameId cid     = hnt.AddName(A("c", "a", "b", "c"));
            HierarchicalNameId bid     = hnt.GetContainer(cid);
            HierarchicalNameId aid     = hnt.GetContainer(bid);
            HierarchicalNameId root    = hnt.GetContainer(aid);
            HierarchicalNameId invalid = hnt.GetContainer(root);

            XAssert.AreEqual(A("c", "a", "b", "c"), hnt.ExpandName(cid));
            XAssert.AreEqual(A("c", "a", "b"), hnt.ExpandName(bid));
            XAssert.AreEqual(A("c", "a"), hnt.ExpandName(aid));
            XAssert.AreEqual(OperatingSystemHelper.IsUnixOS ? Path.VolumeSeparatorChar.ToString() : "c:", hnt.ExpandName(root));
            XAssert.AreEqual(HierarchicalNameId.Invalid, invalid);
        }
        public static bool TryGetName(this HierarchicalNameTable table, string name, out HierarchicalNameId hierarchicalNameId)
        {
            Contract.Requires(name != null);

            string[] components = GetComponents(table, name);

            var componentIds = new StringId[components.Length];

            for (int i = 0; i < components.Length; i++)
            {
                componentIds[i] = table.StringTable.AddString(components[i]);
            }

            return(table.TryGetName(componentIds, out hierarchicalNameId));
        }
示例#13
0
        public void ExpandFinalComponent()
        {
            var hnt = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
            HierarchicalNameId id = hnt.AddName(A("c","a","b","c"));
            XAssert.AreEqual("c", hnt.ExpandFinalComponent(id));

            id = hnt.GetContainer(id);
            XAssert.AreEqual("b", hnt.ExpandFinalComponent(id));

            id = hnt.GetContainer(id);
            XAssert.AreEqual("a", hnt.ExpandFinalComponent(id));

            id = hnt.GetContainer(id);
            XAssert.AreEqual(OperatingSystemHelper.IsUnixOS ? Path.VolumeSeparatorChar.ToString() : "c:", hnt.ExpandFinalComponent(id));
        }
示例#14
0
        public void SetFlags()
        {
            var ht = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
            HierarchicalNameId tag1 = ht.AddName(R("c", "tag1"));

            XAssert.IsTrue(ht.SetFlags(tag1, HierarchicalNameTable.NameFlags.Marked));
            XAssert.IsFalse(ht.SetFlags(tag1, HierarchicalNameTable.NameFlags.Marked));
            XAssert.IsTrue(ht.SetFlags(tag1, HierarchicalNameTable.NameFlags.Root));
            XAssert.IsFalse(ht.SetFlags(tag1, HierarchicalNameTable.NameFlags.Root));

            HierarchicalNameId tag2 = ht.AddName(R("c", "tag2"));
            XAssert.IsTrue(ht.SetFlags(tag2, HierarchicalNameTable.NameFlags.Marked | HierarchicalNameTable.NameFlags.Root));
            XAssert.IsFalse(ht.SetFlags(tag2, HierarchicalNameTable.NameFlags.Marked));
            XAssert.IsFalse(ht.SetFlags(tag2, HierarchicalNameTable.NameFlags.Root));
        }
        private static string[] GetComponents(this HierarchicalNameTable table, string name)
        {
            Contract.Requires(name != null);

            var components = name.Split(new char[] { Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries);

            // Make sure to add the UnixPathRootSentinel to signal the root node existence on Unix
            if (OperatingSystemHelper.IsUnixOS)
            {
                List <string> pathList = new List <string>(components);
                pathList.Insert(0, HierarchicalNameTable.UnixPathRootSentinel);
                components = pathList.ToArray();
            }

            return(components);
        }
示例#16
0
        public void IgnoreCase()
        {
            var hnt = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
            {
                HierarchicalNameId id1 = hnt.AddName("A"+Path.DirectorySeparatorChar+"B");
                HierarchicalNameId id2 = hnt.AddName("a" + Path.DirectorySeparatorChar + "b");
                XAssert.AreEqual(id1, id2);
            }

            hnt = new HierarchicalNameTable(new StringTable(), false, Path.DirectorySeparatorChar);
            {
                HierarchicalNameId id1 = hnt.AddName("A" + Path.DirectorySeparatorChar + "B");
                HierarchicalNameId id2 = hnt.AddName("a" + Path.DirectorySeparatorChar + "b");
                XAssert.AreNotEqual(id1, id2);
            }
        }
示例#17
0
        public void TryGetValue()
        {
            var hnt = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
            HierarchicalNameId other;

            XAssert.IsFalse(hnt.TryGetName(string.Empty, out other));

            XAssert.IsFalse(hnt.TryGetName(A("c","d"), out other));

            HierarchicalNameId id = hnt.AddName(A("c","a","b","c"));
            XAssert.IsTrue(hnt.TryGetName(A("c", "a", "b", "c"), out other));
            XAssert.AreEqual(id, other);

            XAssert.IsTrue(hnt.TryGetName(A("c", "a", "b"), out other));

            XAssert.IsFalse(hnt.TryGetName(A("c","d"), out other));
        }
示例#18
0
        public void EnumeratingBottomUp()
        {
            var ht = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
            ht.AddName(R("a", "b", "sibling", "sibling.txt"));
            HierarchicalNameId name = ht.AddName(R("a", "b", "c", "d.cpp"));

            var enumeration = ht.EnumerateHierarchyBottomUp(name).ToArray();
            var expectation = new[]
            {
                ht.AddName(R("a","b","c","d.cpp")),
                ht.AddName(R("a","b","c")),
                ht.AddName(R("a","b")),
                ht.AddName(R("a"))
            };

            Assert.Equal(enumeration, expectation);
        }
示例#19
0
        private string ToDebuggerDisplay()
        {
            string path;

            if (!Path.IsValid)
            {
                path = "Invalid";
            }
            else
            {
                PathTable owner = HierarchicalNameTable.DebugTryGetTableForId(Path.Value) as PathTable;
                path = owner == null
                    ? "{Unable to expand AbsolutePath; this may occur after the allocation of a large number of PathTables}"
                    : Path.ToString(owner);
            }

            return(I($"{{{path} ({GetAnnotation()})}}"));
        }
示例#20
0
        public string ToString(HierarchicalNameTable symbolTable, char separator = '.')
        {
            Contract.RequiresNotNull(symbolTable);

            using (PooledObjectWrapper <StringBuilder> wrap = Pools.GetStringBuilder())
            {
                symbolTable.StringTable.CopyString(Head.StringId, wrap.Instance);
                DottedIdentifier tail = m_tail;
                while (tail != null)
                {
                    wrap.Instance.Append(separator);
                    symbolTable.StringTable.CopyString(tail.Head.StringId, wrap.Instance);
                    tail = tail.m_tail;
                }

                return(wrap.Instance.ToString());
            }
        }
示例#21
0
            /// <summary>
            /// Constructs a debug view from a normal FullSymbol.
            /// </summary>
            /// <remarks>
            /// This constructor is required by the debugger.
            /// Consequently, Invalid AbsoluteIds are allowed.
            /// </remarks>
            public AbsoluteIdDebuggerView(FullSymbol fullSymbol)
            {
                Id = fullSymbol.Value;

                if (fullSymbol == Invalid)
                {
                    OwningSymbolTable = null;
                    Identifier        = null;
                }
                else
                {
                    OwningSymbolTable = HierarchicalNameTable.DebugTryGetTableForId(fullSymbol.Value) as SymbolTable;
                    if (OwningSymbolTable != null)
                    {
                        Identifier = fullSymbol.ToString(OwningSymbolTable);
                    }
                }
            }
        public void Basic()
        {
            var hnt = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
            int c1  = hnt.Count;

            XAssert.IsTrue(c1 > 0);

            HierarchicalNameId id  = hnt.AddName(A("c", "a", "b", "c"));
            string             str = hnt.ExpandName(id);

            XAssert.AreEqual(A("c", "a", "b", "c"), str);

            int c2 = hnt.Count;

            XAssert.IsTrue(c2 > c1);

            hnt.AddName(A("c", "a", "b", "c", "d"));
            hnt.AddName(A("c", "a", "b", "c"));

            int c3 = hnt.Count;

            XAssert.IsTrue(c3 > c2);

            long size = hnt.SizeInBytes;

            XAssert.IsTrue(size > 0);

            if (OperatingSystemHelper.IsUnixOS)
            {
                var id2 = hnt.AddName("/");
                c3 = hnt.Count;
                XAssert.AreEqual("/", hnt.ExpandName(id2));
                XAssert.ArrayEqual(new[] { id2 }, hnt.EnumerateHierarchyBottomUp(id2).ToArray());
            }

            hnt.Freeze();

            size = hnt.SizeInBytes;
            XAssert.IsTrue(size > 0);

            int c4 = hnt.Count;

            XAssert.AreEqual(c3, c4);
        }
示例#23
0
        public void CaseFolding()
        {
            var hnt = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);

            // shouldn't be interference between different hierarchies and case should be preserved
            HierarchicalNameId id1 = hnt.AddName(A("c","a","b","c"));
            HierarchicalNameId id3 = hnt.AddName(A("c","A","B","C"));

            HierarchicalNameId id2 = hnt.AddName(A("c","X","A","B","C"));
            XAssert.AreEqual(A("c","a","b","c"), hnt.ExpandName(id1));
            XAssert.AreEqual(A("c","X","A","B","C"), hnt.ExpandName(id2));

            // we expect to find an existing path when using different casing
            // HierarchicalNameId id3 = hnt.AddName((A("c","\A\B\C");
            XAssert.AreEqual(id1, id3);

            // and we expect for common paths to have "first one in wins" casing
            HierarchicalNameId id4 = hnt.AddName(A("c","A","B","C","D"));
            XAssert.AreEqual(A("c","a","b","c","D"), hnt.ExpandName(id4));
        }
        public void EnumeratingBottomUpWithFlagFilter()
        {
            var ht = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
            HierarchicalNameId tag1     = ht.AddName(R("c", "tag1"));
            HierarchicalNameId tag2     = ht.AddName(R("c", "tag1", "notag", "tag2"));
            HierarchicalNameId wrongTag = ht.AddName(R("c", "tag1", "notag", "tag2", "wrongtag"));
            HierarchicalNameId leafTag  = ht.AddName(R("c", "tag1", "notag", "tag2", "wrongtag", "leaftag"));

            ht.SetFlags(tag1, HierarchicalNameTable.NameFlags.Marked);
            ht.SetFlags(tag2, HierarchicalNameTable.NameFlags.Marked);
            ht.SetFlags(wrongTag, HierarchicalNameTable.NameFlags.Root);
            ht.SetFlags(leafTag, HierarchicalNameTable.NameFlags.Marked);

            Assert.Equal(
                ht.EnumerateHierarchyBottomUp(leafTag, HierarchicalNameTable.NameFlags.Marked).ToArray(),
                new[]
            {
                leafTag,
                tag2,
                tag1,
            });
        }
        public void EnumeratingDescendants()
        {
            var ht = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
            HierarchicalNameId rootChild1      = ht.AddName(R("root", "rootChild1"));
            HierarchicalNameId otherRoot       = ht.AddName(R("otherRoot"));
            HierarchicalNameId rootChild2      = ht.AddName(R("root", "rootChild2"));
            HierarchicalNameId rootGrandchild1 = ht.AddName(R("root", "rootChild1", "grandchild1"));
            HierarchicalNameId rootGrandchild2 = ht.AddName(R("root", "rootChild2", "grandchild2"));
            HierarchicalNameId rootGrandchild3 = ht.AddName(R("root", "rootChild2", "grandchild3"));
            HierarchicalNameId root            = ht.AddName(R("root"));

            XAssert.AreEqual(0, ht.EnumerateHierarchyTopDown(otherRoot).Count());
            Assert.Equal(
                ht.EnumerateHierarchyTopDown(root).ToArray(),
                new[]
            {
                // Note that the we traverse depth first, and with siblings in reverse order of addition.
                rootChild2,
                rootGrandchild3,
                rootGrandchild2,
                rootChild1,
                rootGrandchild1,
            });
            Assert.Equal(
                ht.EnumerateHierarchyTopDown(rootChild1).ToArray(),
                new[]
            {
                rootGrandchild1
            });
            Assert.Equal(
                ht.EnumerateHierarchyTopDown(rootChild2).ToArray(),
                new[]
            {
                rootGrandchild3,
                rootGrandchild2,
            });
            XAssert.AreEqual(0, ht.EnumerateHierarchyTopDown(rootGrandchild2).Count());
        }
        private void CheckExpandedNameComparerWithCaseSensitivity(bool ignoreCase, params string[] names)
        {
            // For all-pairs in 'names', verifies the expanded name comparer agrees with expanding the names and then comparing.
            var ht = new HierarchicalNameTable(new StringTable(), ignoreCase, Path.DirectorySeparatorChar);

            IComparer <string>             stringComparer = ignoreCase ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal;
            IComparer <HierarchicalNameId> nameComparer   = ht.ExpandedNameComparer;

            HierarchicalNameId[] nameIds = new HierarchicalNameId[names.Length];
            for (int i = 0; i < names.Length; i++)
            {
                nameIds[i] = ht.AddName(names[i]);
            }

            for (int i = 0; i < names.Length; i++)
            {
                for (int j = 0; i < names.Length; i++)
                {
                    string expandedI = ht.ExpandName(nameIds[i]);
                    string expandedJ = ht.ExpandName(nameIds[j]);
                    int    expected  = stringComparer.Compare(expandedI, expandedJ);
                    int    actual    = nameComparer.Compare(nameIds[i], nameIds[j]);

                    if (expected < 0)
                    {
                        XAssert.IsTrue(actual < 0, "Case-sensitive: {3} ; Result {0}, expecting {1} < {2}", actual, names[i], names[j], !ignoreCase);
                    }
                    else if (expected > 0)
                    {
                        XAssert.IsTrue(actual > 0, "Case-sensitive: {3} ; Result {0}, expecting {1} > {2}", actual, names[i], names[j], !ignoreCase);
                    }
                    else
                    {
                        XAssert.IsTrue(actual == 0, "Case-sensitive: {3} ; Result {0}, expecting {1} == {2}", actual, names[i], names[j], !ignoreCase);
                    }
                }
            }
        }
        public void GetAndSetExtendedFlags()
        {
            var ht = new HierarchicalNameTable(new StringTable(), true, Path.DirectorySeparatorChar);
            HierarchicalNameId tag1 = ht.AddName(R("c", "tag1"));
            HierarchicalNameId tag2 = ht.AddName(R("c", "tag2"));

            XAssert.IsTrue(ht.SetExtendedFlags(tag2, HierarchicalNameTable.ExtendedNameFlags.Flag1));

            XAssert.IsTrue(ht.SetExtendedFlags(tag1, HierarchicalNameTable.ExtendedNameFlags.Flag1));
            XAssert.IsFalse(ht.SetExtendedFlags(tag1, HierarchicalNameTable.ExtendedNameFlags.Flag1));
            XAssert.AreEqual(HierarchicalNameTable.ExtendedNameFlags.Flag1, ht.GetExtendedFlags(tag1));

            XAssert.IsTrue(ht.SetExtendedFlags(tag1, HierarchicalNameTable.ExtendedNameFlags.Flag3));
            XAssert.AreEqual(HierarchicalNameTable.ExtendedNameFlags.Flag1 | HierarchicalNameTable.ExtendedNameFlags.Flag3, ht.GetExtendedFlags(tag1));

            XAssert.IsTrue(ht.SetExtendedFlags(tag1, HierarchicalNameTable.ExtendedNameFlags.Flag3, clear: true));
            XAssert.AreEqual(HierarchicalNameTable.ExtendedNameFlags.Flag1, ht.GetExtendedFlags(tag1));

            XAssert.IsFalse(ht.SetExtendedFlags(tag1, HierarchicalNameTable.ExtendedNameFlags.Flag1 | HierarchicalNameTable.ExtendedNameFlags.Flag3, clear: true));
            XAssert.AreEqual(HierarchicalNameTable.ExtendedNameFlags.None, ht.GetExtendedFlags(tag1));

            // tag2 should be the same as before
            XAssert.AreEqual(HierarchicalNameTable.ExtendedNameFlags.Flag1, ht.GetExtendedFlags(tag2));
        }
示例#28
0
 private static TableStats TableToStats(HierarchicalNameTable table)
 {
     return(new TableStats(count: table.Count, sizeInBytes: table.SizeInBytes));
 }
示例#29
0
 /// <summary>
 /// Get the index of path
 /// </summary>
 private static int GetIndexByPath(AbsolutePath path)
 {
     return(HierarchicalNameTable.GetIndexFromValue(path.Value.Value));
 }
示例#30
0
 /// <summary>
 /// Creates a name set which contains some subset of those that have all of <paramref name="flags" /> set.
 /// </summary>
 public FlaggedHierarchicalNameSet(HierarchicalNameTable nameTable, HierarchicalNameTable.NameFlags flags)
 {
     Contract.Requires(nameTable != null);
     m_nameTable   = nameTable;
     m_memberFlags = flags;
 }