public static void TestMultipleListeners()
        {
            AssetChangeTracker tracker   = new AssetChangeTracker(new MockAssetDatabaseAccess());
            TestListener       listener1 = new TestListener();
            TestListener       listener2 = new TestListener();
            TestListener       listener3 = new TestListener();

            // Registration triggers OnExists(), with assets for the corresponding type
            tracker.AddListener(typeof(TestAssetType), listener1);
            Assert.AreEqual(2, listener1.AssetPaths.Count);
            Assert.AreEqual(1, listener1.OnExistsCallCount);
            tracker.AddListener(typeof(TestAssetType), listener2);
            Assert.AreEqual(2, listener2.AssetPaths.Count);
            Assert.AreEqual(1, listener2.OnExistsCallCount);
            tracker.AddListener(typeof(TestAssetType2), listener3);
            Assert.AreEqual(1, listener3.AssetPaths.Count);
            Assert.AreEqual(1, listener3.OnExistsCallCount);

            // Adding an asset of type TestAssetType notifies the first two listeners only
            tracker.OnReimported(new string[] { file3 });
            Assert.AreEqual(1, listener1.OnAddedCallCount);
            Assert.AreEqual(1, listener2.OnAddedCallCount);
            Assert.AreEqual(0, listener3.OnAddedCallCount);

            // Deleting an asset of type TestAssetType2 notifies the last listener only
            tracker.OnDeleted(new string[] { file5 });
            Assert.AreEqual(0, listener1.OnDeletedCallCount);
            Assert.AreEqual(0, listener2.OnDeletedCallCount);
            Assert.AreEqual(1, listener3.OnDeletedCallCount);
        }
        public static void TestNotifications()
        {
            AssetChangeTracker tracker  = new AssetChangeTracker(new MockAssetDatabaseAccess());
            TestListener       listener = new TestListener();

            // Registration triggers OnExists()
            tracker.AddListener(typeof(TestAssetType), listener);
            Assert.AreEqual(1, listener.OnExistsCallCount);
            Assert.AreEqual(1, listener.CallbackCount);
            Assert.IsTrue(listener.AssetPaths.Contains(file1));
            Assert.IsTrue(listener.AssetPaths.Contains(file2));
            Assert.IsFalse(listener.AssetPaths.Contains(file3));
            Assert.IsFalse(listener.AssetPaths.Contains(file4));

            // Reimporting an already-existing file triggers OnChanged()
            tracker.OnReimported(new string[] { file2 });
            Assert.AreEqual(1, listener.OnChangedCallCount);
            Assert.AreEqual(2, listener.CallbackCount);
            Assert.IsTrue(listener.AssetPaths.Contains(file1));
            Assert.IsTrue(listener.AssetPaths.Contains(file2));
            Assert.IsFalse(listener.AssetPaths.Contains(file3));
            Assert.IsFalse(listener.AssetPaths.Contains(file4));

            // Reimporting a new file triggers OnAdded()
            tracker.OnReimported(new string[] { file3 });
            Assert.AreEqual(1, listener.OnAddedCallCount);
            Assert.AreEqual(3, listener.CallbackCount);
            Assert.IsTrue(listener.AssetPaths.Contains(file1));
            Assert.IsTrue(listener.AssetPaths.Contains(file2));
            Assert.IsTrue(listener.AssetPaths.Contains(file3));
            Assert.IsFalse(listener.AssetPaths.Contains(file4));

            // Deleting a file triggers OnDeleted()
            tracker.OnDeleted(new string[] { file2 });
            Assert.AreEqual(1, listener.OnDeletedCallCount);
            Assert.AreEqual(4, listener.CallbackCount);
            Assert.IsTrue(listener.AssetPaths.Contains(file1));
            Assert.IsFalse(listener.AssetPaths.Contains(file2));
            Assert.IsTrue(listener.AssetPaths.Contains(file3));
            Assert.IsFalse(listener.AssetPaths.Contains(file4));

            // Moving a file triggers OnMoved()
            tracker.OnMoved(new string[] { file1 }, new string[] { file4 });
            Assert.AreEqual(1, listener.OnMovedCallCount);
            Assert.AreEqual(5, listener.CallbackCount);
            Assert.IsFalse(listener.AssetPaths.Contains(file1));
            Assert.IsFalse(listener.AssetPaths.Contains(file2));
            Assert.IsTrue(listener.AssetPaths.Contains(file3));
            Assert.IsTrue(listener.AssetPaths.Contains(file4));
        }
        public static void TestRegistrationAndUnRegistration()
        {
            AssetChangeTracker tracker  = new AssetChangeTracker(new MockAssetDatabaseAccess());
            TestListener       listener = new TestListener();

            // Subscribe listener
            tracker.AddListener(typeof(TestAssetType), listener);
            Assert.AreEqual(1, listener.OnExistsCallCount);
            Assert.AreEqual(1, listener.CallbackCount);

            // Reimport notifies the listener
            tracker.OnReimported(new string[] { file2 });
            Assert.AreEqual(2, listener.CallbackCount);

            // Unsubscribe listener
            tracker.RemoveListener(typeof(TestAssetType), listener);
            Assert.AreEqual(2, listener.CallbackCount);

            // Reimport notifies the listener
            tracker.OnReimported(new string[] { file2 });
            Assert.AreEqual(2, listener.CallbackCount);
        }