public void TestRemoveAllUsingRemoveAtFromEnd()
        {
            var objects = new List <object>
            {
                new object(),
                new object(),
                new object(),
                new object(),
                new object(),
                new object(),
            };

            var list = new WeakList <object>();

            foreach (object o in objects)
            {
                list.Add(o);
            }

            for (int i = 0; i < objects.Count; i++)
            {
                list.RemoveAt(list.Count() - 1);
            }

            Assert.That(list.Count(), Is.Zero);
        }
        public void TestUnloadViaScroll()
        {
            WeakList <Container> references = new WeakList <Container>();

            AddStep("populate panels", () =>
            {
                references.Clear();

                for (int i = 0; i < 16; i++)
                {
                    flow.Add(new Container
                    {
                        Size     = new Vector2(128),
                        Children = new Drawable[]
                        {
                            new DelayedLoadUnloadWrapper(() =>
                            {
                                var container = new Container
                                {
                                    RelativeSizeAxes = Axes.Both,
                                    Children         = new Drawable[]
                                    {
                                        new TestBox {
                                            RelativeSizeAxes = Axes.Both
                                        }
                                    },
                                };

                                references.Add(container);

                                return(container);
                            }, 500, 2000),
                            new SpriteText {
                                Text = i.ToString()
                            },
                        }
                    });
                }

                flow.Add(
                    new Container
                {
                    Size = new Vector2(128, 1280),
                });
            });

            AddUntilStep("references loaded", () => references.Count() == 16 && references.All(c => c.IsLoaded));

            AddStep("scroll to end", () => scroll.ScrollToEnd());

            AddUntilStep("references lost", () =>
            {
                GC.Collect();
                return(!references.Any());
            });

            AddStep("scroll to start", () => scroll.ScrollToStart());

            AddUntilStep("references restored", () => references.Count() == 16);
        }
        public void TestRemoveObjectsAtSides()
        {
            var objects = new List <object>
            {
                new object(),
                new object(),
                new object(),
                new object(),
                new object(),
                new object(),
            };

            var list = new WeakList <object>();

            foreach (object o in objects)
            {
                list.Add(o);
            }

            list.Remove(objects[0]);
            list.Remove(objects[1]);
            list.Remove(objects[4]);
            list.Remove(objects[5]);

            Assert.That(list.Count(), Is.EqualTo(2));
            Assert.That(list, Does.Contain(objects[2]));
            Assert.That(list, Does.Contain(objects[3]));
        }
        public void TestAddAfterRemoveFromEnd()
        {
            var objects = new List <object>
            {
                new object(),
                new object(),
                new object(),
            };

            object newLastObject = new object();

            var list = new WeakList <object>();

            foreach (object o in objects)
            {
                list.Add(o);
            }

            list.Remove(objects[2]);
            list.Add(newLastObject);

            Assert.That(list.Count(), Is.EqualTo(3));
            Assert.That(list, Does.Contain(objects[0]));
            Assert.That(list, Does.Contain(objects[0]));
            Assert.That(list, Does.Not.Contain(objects[2]));
            Assert.That(list, Does.Contain(newLastObject));
        }
        public void TestRemovedStillUnload()
        {
            WeakList <Container> references = new WeakList <Container>();

            AddStep("populate panels", () =>
            {
                references.Clear();

                for (int i = 0; i < 16; i++)
                {
                    flow.Add(new Container
                    {
                        Size     = new Vector2(128),
                        Children = new Drawable[]
                        {
                            new DelayedLoadUnloadWrapper(() =>
                            {
                                var container = new Container
                                {
                                    RelativeSizeAxes = Axes.Both,
                                    Children         = new Drawable[]
                                    {
                                        new TestBox {
                                            RelativeSizeAxes = Axes.Both
                                        }
                                    },
                                };

                                references.Add(container);

                                return(container);
                            }, 500, 2000),
                            new SpriteText {
                                Text = i.ToString()
                            },
                        }
                    });
                }
            });

            AddUntilStep("references loaded", () => references.Count() == 16 && references.All(c => c.IsLoaded));

            AddAssert("check schedulers present", () => scroll.Scheduler.HasPendingTasks);

            AddStep("Remove all panels", () => flow.Clear(false));

            AddUntilStep("repeating schedulers removed", () => !scroll.Scheduler.HasPendingTasks);

            AddUntilStep("references lost", () =>
            {
                GC.Collect();
                return(!references.Any());
            });
        }
        public void TestEnumerate()
        {
            object obj  = new object();
            var    list = new WeakList <object> {
                obj
            };

            Assert.That(list.Count(), Is.EqualTo(1));
            Assert.That(list, Does.Contain(obj));

            GC.KeepAlive(obj);
        }
        public void TestRemove()
        {
            object obj  = new object();
            var    list = new WeakList <object> {
                obj
            };

            list.Remove(obj);

            Assert.That(list.Count(), Is.Zero);
            Assert.That(list, Does.Not.Contain(obj));

            GC.KeepAlive(obj);
        }
        public void TestRemoveWeakReference()
        {
            object obj     = new object();
            var    weakRef = new WeakReference <object>(obj);
            var    list    = new WeakList <object> {
                weakRef
            };

            list.Remove(weakRef);

            Assert.That(list.Count(), Is.Zero);
            Assert.That(list.Contains(weakRef), Is.False);

            GC.KeepAlive(obj);
        }
        public void TestRemoveAllUsingRemoveAtFromBothSides()
        {
            var objects = new List <object>
            {
                new object(),
                new object(),
                new object(),
                new object(),
                new object(),
                new object(),
                new object(),
                new object(),
                new object(),
            };

            var list = new WeakList <object>();

            foreach (var o in objects)
            {
                list.Add(o);
            }

            for (int i = 0; i < objects.Count; i++)
            {
                if (i % 2 == 0)
                {
                    list.RemoveAt(0);
                }
                else
                {
                    list.RemoveAt(list.Count() - 1);
                }
            }

            Assert.That(list.Count(), Is.Zero);
        }
Esempio n. 10
0
        public void TestCountIsZeroAfterClear()
        {
            object obj     = new object();
            var    weakRef = new WeakReference <object>(obj);
            var    list    = new WeakList <object> {
                obj, weakRef
            };

            list.Clear();

            Assert.That(list.Count(), Is.Zero);
            Assert.That(list, Does.Not.Contain(obj));
            Assert.That(list.Contains(weakRef), Is.False);

            GC.KeepAlive(obj);
        }
        public static void LogAndFlush()
        {
            if (!DebugUtils.IsDebugBuild)
            {
                return;
            }

            lock (loading_components)
            {
                Logger.Log($"⏳ Currently loading components ({loading_components.Count()})");

                foreach (var c in loading_components.OrderBy(c => c.LoadThread?.Name).ThenBy(c => c.LoadState))
                {
                    Logger.Log(c.ToString());
                    Logger.Log($"- thread: {c.LoadThread?.Name ?? "none"}");
                    Logger.Log($"- state:  {c.LoadState}");
                }

                loading_components.Clear();

                Logger.Log("🧵 Task schedulers");

                Logger.Log(CompositeDrawable.SCHEDULER_STANDARD.GetStatusString());
                Logger.Log(CompositeDrawable.SCHEDULER_LONG_LOAD.GetStatusString());
            }

            ThreadPool.GetAvailableThreads(out int workerAvailable, out int completionAvailable);
            ThreadPool.GetMinThreads(out int workerMin, out int completionMin);
            ThreadPool.GetMaxThreads(out int workerMax, out int completionMax);

            Logger.Log("🎱 Thread pool");
            // TODO: use after net6
            // Logger.Log($"threads:         {ThreadPool.ThreadCount:#,0}");
            // Logger.Log($"work pending:    {ThreadPool.PendingWorkItemCount:#,0}");
            // Logger.Log($"work completed:  {ThreadPool.CompletedWorkItemCount:#,0}");
            Logger.Log($"worker:          min {workerMin,-6:#,0} max {workerMax,-6:#,0} available {workerAvailable,-6:#,0}");
            Logger.Log($"completion:      min {completionMin,-6:#,0} max {completionMax,-6:#,0} available {completionAvailable,-6:#,0}");
        }
Esempio n. 12
0
        public void TestAddAfterClear()
        {
            var objects = new List <object>
            {
                new object(),
                new object(),
                new object(),
            };

            object newObject = new object();

            var list = new WeakList <object>();

            foreach (object o in objects)
            {
                list.Add(o);
            }

            list.Clear();
            list.Add(newObject);

            Assert.That(list.Count(), Is.EqualTo(1));
            Assert.That(list, Does.Contain(newObject));
        }