public void StrongFingerprintVariations()
        {
            PathTable pathTable = new PathTable();

            AbsolutePath pathA = AbsolutePath.Create(pathTable, X("/X/bar"));
            AbsolutePath pathB = AbsolutePath.Create(pathTable, X("/X/foo"));

            WeakContentFingerprint wfp1 = new WeakContentFingerprint(CreateFakeFingerprint(1));
            WeakContentFingerprint wfp2 = new WeakContentFingerprint(CreateFakeFingerprint(2));

            ContentHash content1 = CreateFakeContentHash(3);
            ContentHash content2 = CreateFakeContentHash(4);

            FingerprintingHarness harness = new FingerprintingHarness(pathTable);

            // Initial
            harness.AssertFingerprintIsNew(
                wfp1,
                ObservedInput.CreateFileContentRead(pathA, content1));

            // Change WFP of Initial
            harness.AssertFingerprintIsNew(
                wfp2, // Changed
                ObservedInput.CreateFileContentRead(pathA, content1));

            // Change observation type of Initial
            harness.AssertFingerprintIsNew(
                wfp1,
                ObservedInput.CreateAbsentPathProbe(pathA)); // Changed
            harness.AssertFingerprintIsNew(
                wfp1,
                ObservedInput.CreateDirectoryEnumeration(pathA, new DirectoryFingerprint(content1))); // Changed

            // Change file content of Initial
            harness.AssertFingerprintIsNew(
                wfp1,
                ObservedInput.CreateFileContentRead(pathA, content2)); // Changed

            // Add a second file to Initial
            harness.AssertFingerprintIsNew(
                wfp1,
                ObservedInput.CreateFileContentRead(pathA, content1),
                ObservedInput.CreateFileContentRead(pathB, content1)); // New

            // Change WFP versus previous
            harness.AssertFingerprintIsNew(
                wfp2, // Changed
                ObservedInput.CreateFileContentRead(pathA, content1),
                ObservedInput.CreateFileContentRead(pathB, content1));

            harness.AssertFingerprintIsNew(
                wfp1,
                ObservedInput.CreateExistingDirectoryProbe(pathA)); // Changed
        }
        public void ProjectPathSet()
        {
            var pathTable = new PathTable();

            AbsolutePath firstPath  = AbsolutePath.Create(pathTable, X("/X/bar"));
            AbsolutePath secondPath = AbsolutePath.Create(pathTable, X("/X/foo"));

            var p = CreateResult(
                pathTable,
                ObservedInput.CreateFileContentRead(firstPath, ContentHashingUtilities.EmptyHash),
                ObservedInput.CreateFileContentRead(secondPath, ContentHashingUtilities.EmptyHash));

            ObservedPathSet projected = p.GetPathSet(unsafeOptions: null);

            ObservedPathSetTestUtilities.AssertPathSetsEquivalent(
                projected,
                ObservedPathSetTestUtilities.CreatePathSet(pathTable, firstPath, secondPath));
        }