public void release_from_the_cache()
        {
            var cache = new TrackingTransientCache();

            var instance = new SmartInstance<Target>();
            var session = new FakeBuildSession();

            var t1 = cache.Get(typeof(Target), instance, session).As<Target>();
            var t2 = cache.Get(typeof(Target), instance, session).As<Target>();
            var t3 = cache.Get(typeof(Target), instance, session).As<Target>();

            // pre-conditions
            t2.WasDisposed.ShouldBeFalse();
            cache.Tracked.ShouldHaveTheSameElementsAs(t1, t2, t3);


            cache.Release(t2);

            // only t2 should be disposed
            t1.WasDisposed.ShouldBeFalse();
            t2.WasDisposed.ShouldBeTrue();
            t3.WasDisposed.ShouldBeFalse();

            // t2 should be removed from tracked
            cache.Tracked.ShouldHaveTheSameElementsAs(t1, t3);
        }
        public void tracks_disposable_objects_only()
        {
            var cache = new TrackingTransientCache();
            var session = new FakeBuildSession();

            var disposable = cache.Get(typeof (Target), new SmartInstance<Target>(), session);
            var notDisposable = cache.Get(typeof (NotTracked), new SmartInstance<NotTracked>(), session);

            cache.Tracked.Single().ShouldBeTheSameAs(disposable);
        }
        public void get_builds_a_new_object_everytime_it_is_called()
        {
            var cache = new TrackingTransientCache();

            var instance = new SmartInstance<Target>();
            var session = new FakeBuildSession();

            var t1 = cache.Get(typeof (Target), instance, session);
            var t2 = cache.Get(typeof (Target), instance, session);
            var t3 = cache.Get(typeof (Target), instance, session);

            t1.ShouldNotBeTheSameAs(t2);
            t1.ShouldNotBeTheSameAs(t3);
            t2.ShouldNotBeTheSameAs(t3);
        }
        public void dispose_and_clear_all()
        {
            var cache = new TrackingTransientCache();

            var instance = new SmartInstance<Target>();
            var session = new FakeBuildSession();

            var t1 = cache.Get(typeof(Target), instance, session).As<Target>();
            var t2 = cache.Get(typeof(Target), instance, session).As<Target>();
            var t3 = cache.Get(typeof(Target), instance, session).As<Target>();


            cache.DisposeAndClear();

            cache.Tracked.Any().ShouldBeFalse();

            t1.WasDisposed.ShouldBeTrue();
            t2.WasDisposed.ShouldBeTrue();
            t3.WasDisposed.ShouldBeTrue();
        }