コード例 #1
0
        public void DoNotUnloadDependencyTwiceOfSameBundle_DoNotUnloadDependencyBundle()
        {
            // B has dependency to A
            // C has dependency to A
            // D has dependency to B so it has to A
            // Unload B and his dependency TWICE
            // A should not be unload because it is a dependency of C
            // B should not be unload because it a dependency of D

            var bundleA = new MockBundle(Substitute.For <IBundle>(), "A");

            var bundleB = CreateBundleWithDependencyOn("B", bundleA);

            LoadBundleWithDependencyInstantly(bundleB);

            // Create dependency bundle to keep A alive
            var bundleC = CreateBundleWithDependencyOn("C", bundleA);

            LoadBundleWithDependencyInstantly(bundleC);

            // Create dependency bundle to keep B alive (if not releaseRef will return false because B won't be loaded)
            var bundleD = CreateBundleWithDependencyOn("D", bundleB);

            LoadBundleWithDependencyInstantly(bundleD);

            UnloadBundleWithDependency(bundleB);
            bundleB.Bundle.Received(0).Unload(); // D is dependent on it
            bundleA.Bundle.Received(0).Unload(); // C is dependent on it

            // Unload bundle twice (should not decrease dependency ref and keep it loaded)
            UnloadBundleWithDependency(bundleB);
            bundleB.Bundle.Received(0).Unload(); // D is dependent on it
            bundleA.Bundle.Received(0).Unload(); // C is dependent on it
        }
コード例 #2
0
 private void UnloadDependency(MockBundle bundle)
 {
     foreach (var dependency in bundle.Dependencies)
     {
         _fixture.UnloadDependency(dependency.Name, bundle.Name);
     }
 }
コード例 #3
0
        private void LoadBundleWithDependencyInstantly(MockBundle mockBundle, Options options = null)
        {
            SetUpInnerLoaderReturns(Observable.Return(mockBundle.Bundle));
            _fixture.Load(mockBundle.Name, options ?? new Options())
            .Do(x => (x as IDisposable)?.Dispose())
            .Wait();

            LoadBundleDependencyInstantly(mockBundle, options);
        }
コード例 #4
0
        private bool UnloadBundleWithDependency(MockBundle bundle)
        {
            if (!_fixture.Unload(bundle.Name))
            {
                return(false);
            }

            UnloadDependency(bundle);
            return(true);
        }
コード例 #5
0
 private void LoadBundleDependencyInstantly(MockBundle mockBundle, Options options = null)
 {
     foreach (var dependency in mockBundle.Dependencies)
     {
         SetUpInnerLoaderReturns(Observable.Return(dependency.Bundle));
         _fixture.LoadDependency(dependency.Name, options ?? new Options(), mockBundle.Name)
         .Do(x => (x as IDisposable)?.Dispose())
         .Wait();
     }
 }
コード例 #6
0
        public void SetUp()
        {
            _innerLoader = Substitute.For <ILoader>();

            var platformProvider = Substitute.For <IPlatformProvider>();

            platformProvider.GetPlatformName()
            .Returns(PlatformName);

            _fixture = new BundleCacheLoader(_innerLoader, platformProvider, BaseUri);

            _mockBundle = new MockBundle(Substitute.For <IBundle>(), BundleName);
        }
コード例 #7
0
        public void UnloadBundleOnlyIfNoMoreDependency_UnloadBundle()
        {
            // B has dependency to A
            // C has dependency to A
            // D has dependency to B so it has to A
            // Unload B and his dependency TWICE
            // A should not be unload because it is a dependency of C
            // B should not be unload because it a dependency of D

            // Will get load only from dependency
            var bundleA = new MockBundle(Substitute.For <IBundle>(), "A");

            var bundleB = CreateBundleWithDependencyOn("B", bundleA);

            LoadBundleWithDependencyInstantly(bundleB);

            // Create dependency bundle to keep A alive
            var bundleC = CreateBundleWithDependencyOn("C", bundleA);

            LoadBundleWithDependencyInstantly(bundleC);

            // Create dependency bundle to keep B alive (if not releaseRef will return false because B won't be loaded)
            // bundleD is also dependent on A because of bundleB
            var bundleD = CreateBundleWithDependencyOn("D", bundleB, bundleA);

            LoadBundleWithDependencyInstantly(bundleD);

            UnloadBundleWithDependency(bundleB);
            bundleB.Bundle.Received(0).Unload(); // D is dependent on B
            bundleA.Bundle.Received(0).Unload(); // B is dependent on A

            UnloadBundleWithDependency(bundleC);
            bundleC.Bundle.Received(1).Unload(); // No more dependency
            bundleA.Bundle.Received(0).Unload(); // D is dependent on B that is dependent on A

            UnloadBundleWithDependency(bundleD);
            bundleD.Bundle.Received(1).Unload(); // No more dependency
            bundleB.Bundle.Received(1).Unload(); // No more dependency
            bundleA.Bundle.Received(1).Unload(); // No more dependency
        }
コード例 #8
0
 private IObservable <IBundle> LoadBundleDependency(MockBundle bundle)
 => _fixture.LoadDependency(bundle.Name, new Options(), bundle.Name);
コード例 #9
0
 private IObservable <IBundle> LoadBundle(MockBundle bundle) => _fixture.Load(bundle.Name, new Options());