public void TestComparison_NullComparisonChecks()
        {
            AegisVirtualFilePath vpath1;
            AegisVirtualFilePath vpath2;

            // Both references are null.
            vpath1 = null;
            vpath2 = null;
            Assert.IsTrue(vpath1 <= vpath2);
            Assert.IsTrue(vpath2 <= vpath1);
            Assert.IsTrue(vpath1 >= vpath2);
            Assert.IsTrue(vpath2 >= vpath1);
            Assert.IsFalse(vpath1 < vpath2);
            Assert.IsFalse(vpath2 < vpath1);
            Assert.IsFalse(vpath1 > vpath2);
            Assert.IsFalse(vpath2 > vpath1);

            // Non-null reference compared to null.
            vpath1 = new AegisVirtualFilePath("foo.ags");
            Assert.IsFalse(vpath1 <= null);
            Assert.IsTrue(null <= vpath1);
            Assert.IsTrue(vpath1 >= null);
            Assert.IsFalse(null >= vpath1);
            Assert.IsFalse(vpath1 < null);
            Assert.IsTrue(null < vpath1);
            Assert.IsTrue(vpath1 > null);
            Assert.IsFalse(null > vpath1);
            Assert.IsTrue(vpath1.CompareTo(null) > 0);
        }
        public void TestComparison_CaseInsensitivity()
        {
            AegisVirtualFilePath vpath1;
            AegisVirtualFilePath vpath2;

            // Matching bare file names with case difference.
            vpath1 = new AegisVirtualFilePath("foo.ags");
            vpath2 = new AegisVirtualFilePath("FOO.AGS");
            Assert.IsTrue(vpath1 <= vpath2);
            Assert.IsTrue(vpath2 <= vpath1);
            Assert.IsTrue(vpath1 >= vpath2);
            Assert.IsTrue(vpath2 >= vpath1);
            Assert.IsFalse(vpath1 < vpath2);
            Assert.IsFalse(vpath2 < vpath1);
            Assert.IsFalse(vpath1 > vpath2);
            Assert.IsFalse(vpath2 > vpath1);
            Assert.AreEqual(0, vpath1.CompareTo(vpath2));
            Assert.AreEqual(0, vpath2.CompareTo(vpath1));

            // Matching files with paths, file names have case difference.
            vpath1 = new AegisVirtualFilePath("/dir/foo.ags");
            vpath2 = new AegisVirtualFilePath("/dir/FOO.AGS");
            Assert.IsTrue(vpath1 <= vpath2);
            Assert.IsTrue(vpath2 <= vpath1);
            Assert.IsTrue(vpath1 >= vpath2);
            Assert.IsTrue(vpath2 >= vpath1);
            Assert.IsFalse(vpath1 < vpath2);
            Assert.IsFalse(vpath2 < vpath1);
            Assert.IsFalse(vpath1 > vpath2);
            Assert.IsFalse(vpath2 > vpath1);
            Assert.AreEqual(0, vpath1.CompareTo(vpath2));
            Assert.AreEqual(0, vpath2.CompareTo(vpath1));

            // Matching files with paths, directory names have case difference.
            vpath1 = new AegisVirtualFilePath("/dir/foo.ags");
            vpath2 = new AegisVirtualFilePath("/DIR/foo.ags");
            Assert.IsTrue(vpath1 <= vpath2);
            Assert.IsTrue(vpath2 <= vpath1);
            Assert.IsTrue(vpath1 >= vpath2);
            Assert.IsTrue(vpath2 >= vpath1);
            Assert.IsFalse(vpath1 < vpath2);
            Assert.IsFalse(vpath2 < vpath1);
            Assert.IsFalse(vpath1 > vpath2);
            Assert.IsFalse(vpath2 > vpath1);
            Assert.AreEqual(0, vpath1.CompareTo(vpath2));
            Assert.AreEqual(0, vpath2.CompareTo(vpath1));
        }
        public void TestComparison_DifferingPathLengths()
        {
            AegisVirtualFilePath vpath1;
            AegisVirtualFilePath vpath2;

            // One directory is parent to the other (path1 preceeds path2).
            vpath1 = new AegisVirtualFilePath("/dir1/foo.ags");
            vpath2 = new AegisVirtualFilePath("/dir1/dir2/foo.ags");
            Assert.IsTrue(vpath1 <= vpath2);
            Assert.IsFalse(vpath2 <= vpath1);
            Assert.IsFalse(vpath1 >= vpath2);
            Assert.IsTrue(vpath2 >= vpath1);
            Assert.IsTrue(vpath1 < vpath2);
            Assert.IsFalse(vpath2 < vpath1);
            Assert.IsFalse(vpath1 > vpath2);
            Assert.IsTrue(vpath2 > vpath1);
            Assert.IsTrue(vpath1.CompareTo(vpath2) < 0);
            Assert.IsTrue(vpath2.CompareTo(vpath1) > 0);

            // Directory paths are siblings (path1 preceeds path2).
            vpath1 = new AegisVirtualFilePath("/dir1/dir2/foo.ags");
            vpath2 = new AegisVirtualFilePath("/dir1/dir3/foo.ags");
            Assert.IsTrue(vpath1 <= vpath2);
            Assert.IsFalse(vpath2 <= vpath1);
            Assert.IsFalse(vpath1 >= vpath2);
            Assert.IsTrue(vpath2 >= vpath1);
            Assert.IsTrue(vpath1 < vpath2);
            Assert.IsFalse(vpath2 < vpath1);
            Assert.IsFalse(vpath1 > vpath2);
            Assert.IsTrue(vpath2 > vpath1);
            Assert.IsTrue(vpath1.CompareTo(vpath2) < 0);
            Assert.IsTrue(vpath2.CompareTo(vpath1) > 0);

            // One directory name is shorter than the other (path1 preceeds path2).
            vpath1 = new AegisVirtualFilePath("/d/foo.ags");
            vpath2 = new AegisVirtualFilePath("/dir/foo.ags");
            Assert.IsTrue(vpath1 <= vpath2);
            Assert.IsFalse(vpath2 <= vpath1);
            Assert.IsFalse(vpath1 >= vpath2);
            Assert.IsTrue(vpath2 >= vpath1);
            Assert.IsTrue(vpath1 < vpath2);
            Assert.IsFalse(vpath2 < vpath1);
            Assert.IsFalse(vpath1 > vpath2);
            Assert.IsTrue(vpath2 > vpath1);
            Assert.IsTrue(vpath1.CompareTo(vpath2) < 0);
            Assert.IsTrue(vpath2.CompareTo(vpath1) > 0);

            // Directory paths are unrelated (path1 preceeds path2).
            vpath1 = new AegisVirtualFilePath("/dir1/foo.ags");
            vpath2 = new AegisVirtualFilePath("/dir2/dir3/foo.ags");
            Assert.IsTrue(vpath1 <= vpath2);
            Assert.IsFalse(vpath2 <= vpath1);
            Assert.IsFalse(vpath1 >= vpath2);
            Assert.IsTrue(vpath2 >= vpath1);
            Assert.IsTrue(vpath1 < vpath2);
            Assert.IsFalse(vpath2 < vpath1);
            Assert.IsFalse(vpath1 > vpath2);
            Assert.IsTrue(vpath2 > vpath1);
            Assert.IsTrue(vpath1.CompareTo(vpath2) < 0);
            Assert.IsTrue(vpath2.CompareTo(vpath1) > 0);

            // Bare file vs path -- similar to being in parent directory (path1 preceeds path2).
            vpath1 = new AegisVirtualFilePath("foo.ags");
            vpath2 = new AegisVirtualFilePath("/dir1/foo.ags");
            Assert.IsTrue(vpath1 <= vpath2);
            Assert.IsFalse(vpath2 <= vpath1);
            Assert.IsFalse(vpath1 >= vpath2);
            Assert.IsTrue(vpath2 >= vpath1);
            Assert.IsTrue(vpath1 < vpath2);
            Assert.IsFalse(vpath2 < vpath1);
            Assert.IsFalse(vpath1 > vpath2);
            Assert.IsTrue(vpath2 > vpath1);
            Assert.IsTrue(vpath1.CompareTo(vpath2) < 0);
            Assert.IsTrue(vpath2.CompareTo(vpath1) > 0);
        }
        public void TestComparison_BasicChecks()
        {
            AegisVirtualFilePath vpath1;
            AegisVirtualFilePath vpath2;

            // Bare file name -- compare to self.
            vpath1 = new AegisVirtualFilePath("foo.ags");
#pragma warning disable CS1718 // Comparison made to same variable
            Assert.IsTrue(vpath1 <= vpath1);
            Assert.IsTrue(vpath1 >= vpath1);
            Assert.IsFalse(vpath1 < vpath1);
            Assert.IsFalse(vpath1 > vpath1);
            Assert.AreEqual(0, vpath1.CompareTo(vpath1));
#pragma warning restore CS1718 // Comparison made to same variable

            // Identical bare file names -- compare to each other.
            vpath1 = new AegisVirtualFilePath("foo.ags");
            vpath2 = new AegisVirtualFilePath("foo.ags");
            Assert.IsTrue(vpath1 <= vpath2);
            Assert.IsTrue(vpath2 <= vpath1);
            Assert.IsTrue(vpath1 >= vpath2);
            Assert.IsTrue(vpath2 >= vpath1);
            Assert.IsFalse(vpath1 < vpath2);
            Assert.IsFalse(vpath2 < vpath1);
            Assert.IsFalse(vpath1 > vpath2);
            Assert.IsFalse(vpath2 > vpath1);
            Assert.AreEqual(0, vpath1.CompareTo(vpath2));
            Assert.AreEqual(0, vpath2.CompareTo(vpath1));

            // Mismatching bare file names -- compare to each other.
            vpath1 = new AegisVirtualFilePath("bar.ags");
            vpath2 = new AegisVirtualFilePath("foo.ags");
            Assert.IsTrue(vpath1 <= vpath2);
            Assert.IsFalse(vpath2 <= vpath1);
            Assert.IsFalse(vpath1 >= vpath2);
            Assert.IsTrue(vpath2 >= vpath1);
            Assert.IsTrue(vpath1 < vpath2);
            Assert.IsFalse(vpath2 < vpath1);
            Assert.IsFalse(vpath1 > vpath2);
            Assert.IsTrue(vpath2 > vpath1);
            Assert.IsTrue(vpath1.CompareTo(vpath2) < 0);
            Assert.IsTrue(vpath2.CompareTo(vpath1) > 0);

            // File with path -- compare to self.
            vpath1 = new AegisVirtualFilePath("/dir/foo.ags");
#pragma warning disable CS1718 // Comparison made to same variable
            Assert.IsTrue(vpath1 <= vpath1);
            Assert.IsTrue(vpath1 >= vpath1);
            Assert.IsFalse(vpath1 < vpath1);
            Assert.IsFalse(vpath1 > vpath1);
            Assert.AreEqual(0, vpath1.CompareTo(vpath1));
#pragma warning restore CS1718 // Comparison made to same variable

            // Identical files with paths -- compare to each other.
            vpath1 = new AegisVirtualFilePath("/dir/foo.ags");
            vpath2 = new AegisVirtualFilePath("/dir/foo.ags");
            Assert.IsTrue(vpath1 <= vpath2);
            Assert.IsTrue(vpath2 <= vpath1);
            Assert.IsTrue(vpath1 >= vpath2);
            Assert.IsTrue(vpath2 >= vpath1);
            Assert.IsFalse(vpath1 < vpath2);
            Assert.IsFalse(vpath2 < vpath1);
            Assert.IsFalse(vpath1 > vpath2);
            Assert.IsFalse(vpath2 > vpath1);
            Assert.AreEqual(0, vpath1.CompareTo(vpath2));
            Assert.AreEqual(0, vpath2.CompareTo(vpath1));

            // Mismatching files with paths -- file names mismatch -- compare to each other.
            vpath1 = new AegisVirtualFilePath("/dir/bar.ags");
            vpath2 = new AegisVirtualFilePath("/dir/foo.ags");
            Assert.IsTrue(vpath1 <= vpath2);
            Assert.IsFalse(vpath2 <= vpath1);
            Assert.IsFalse(vpath1 >= vpath2);
            Assert.IsTrue(vpath2 >= vpath1);
            Assert.IsTrue(vpath1 < vpath2);
            Assert.IsFalse(vpath2 < vpath1);
            Assert.IsFalse(vpath1 > vpath2);
            Assert.IsTrue(vpath2 > vpath1);
            Assert.IsTrue(vpath1.CompareTo(vpath2) < 0);
            Assert.IsTrue(vpath2.CompareTo(vpath1) > 0);

            // Mismatching files with paths -- directory names mismatch -- compare to each other.
            vpath1 = new AegisVirtualFilePath("/dir/foo.ags");
            vpath2 = new AegisVirtualFilePath("/wat/foo.ags");
            Assert.IsTrue(vpath1 <= vpath2);
            Assert.IsFalse(vpath2 <= vpath1);
            Assert.IsFalse(vpath1 >= vpath2);
            Assert.IsTrue(vpath2 >= vpath1);
            Assert.IsTrue(vpath1 < vpath2);
            Assert.IsFalse(vpath2 < vpath1);
            Assert.IsFalse(vpath1 > vpath2);
            Assert.IsTrue(vpath2 > vpath1);
            Assert.IsTrue(vpath1.CompareTo(vpath2) < 0);
            Assert.IsTrue(vpath2.CompareTo(vpath1) > 0);
        }