private async Task Function()
        {
            var count = 1_000_000;
            var ints  = new AsyncObservableKeyedSet <int, int>(i => i);

            var t1 = Task.Run(async() => {
                for (int i = 0; i < count; i++)
                {
                    await ints.AddAsync(i);
                }


                Console.WriteLine($"FINISHED ADDING FROM THE FIRST THREAD, {ints.Count} ITEMS IN DICTIONARY");
            });
            var t2 = Task.Run(async() => {
                for (int i = 0; i < count; i++)
                {
                    await ints.AddAsync(i + 1_000_000); //.ConfigureAwait(false);
                }


                Console.WriteLine($"FINISHED ADDING FROM THE second THREAD, {ints.Count} ITEMS IN DICTIONARY");
            });

            await Task.WhenAll(t1, t2);

            Console.WriteLine(ints.Count + " items");
        }
Example #2
0
        public void BasicKeyIndexedAccess()
        {
            var set = new AsyncObservableKeyedSet <int, int>(param => param / 5, Context, new[] { 15, 20, 25 });

            Ensure(set[3], Is.EqualTo(15));
            Ensure(set[5], Is.EqualTo(25));
        }
Example #3
0
        public void TryAddDuplicateItemReturnsFalse()
        {
            var set = new AsyncObservableKeyedSet <int, int>(param => param, Context, new[] { 1, 2, 3 });

            Ensure(set.TryAddAsync(2), Is.False);
            Ensure(set.Count, Is.EqualTo(3));
            Ensure(set.TryAddAsync(67532), Is.True);
            Ensure(set.Count, Is.EqualTo(4));
        }
Example #4
0
        public void BasicRemoveKey()
        {
            var set = new AsyncObservableKeyedSet <int, int>(param => param / 5, Context, new[] { 15, 20, 25 });

            Ensure(set.Count, Is.EqualTo(3));
            Ensure(set.RemoveKeyAsync(3), Is.True);
            Ensure(set.Count, Is.EqualTo(2));
            Ensure(set.RemoveKeyAsync(67532), Is.False);
            Ensure(set.Count, Is.EqualTo(2));
            Ensure(set.RemoveKeyAsync(15), Is.False);
            Ensure(set.Count, Is.EqualTo(2));
        }
Example #5
0
        public void ClearRemovesAllEntries()
        {
            var set = new AsyncObservableKeyedSet <int, int>(param => param, Context, new[] { 1, 436, 768, 79876, 5, 435, 4634, 243, 2 });

            Ensure(set, Is.Not.Empty);
            Task.Run(set.ClearAsync).RunTaskSynchronously();
            Ensure(set, Is.Empty);
            Ensure(set.Count, Is.Zero);

            foreach (var _ in set)
            {
                Assert.Fail();
            }
        }
Example #6
0
        public void TryAddDuplicateKeyReturnsFalse()
        {
            var set = new AsyncObservableKeyedSet <int, int>(param => param % 5, Context, new[] { 15 });

            Ensure(set.TryAddAsync(30), Is.False);
            Ensure(set.Count, Is.EqualTo(1));
            Ensure(set.TryAddAsync(31), Is.True);
            Ensure(set.TryAddAsync(31), Is.False);
            Ensure(set.TryAddAsync(33), Is.True);
            Ensure(set.TryAddAsync(33), Is.False);
            Ensure(set.TryAddAsync(33), Is.False);
            Ensure(set.Count, Is.EqualTo(3));

            Ensure(set.TryAddAsync(30), Is.False);
            Ensure(Task.Run(() => set.Count), Is.EqualTo(3));
            Ensure(set.TryAddAsync(32), Is.True);
            Ensure(set.Count, Is.EqualTo(4));
        }
        // ReSharper disable once NotNullMemberIsNotInitialized - CorrespondingCollection can't be initialized here because it doesn't exist yet
        private FolderCollection(Func <bool> isDesiredThread, PauseTokenSource pauseTokenSource)
        {
            PauseTokenSource = pauseTokenSource;
            if (PauseTokenSource != null)
            {
                PauseToken = pauseTokenSource.Token;
            }

            Folders = new AsyncObservableKeyedSet <string, GameFolder>(folder => folder.Name, isDesiredThread,
                                                                       comparer: StringComparer.OrdinalIgnoreCase);

            InitDirectoryWatcher();

            Folders.CollectionChanged += (sender, args) => {
                switch (args.Action)
                {
                case NotifyCollectionChangedAction.Add:
                case NotifyCollectionChangedAction.Remove:
                case NotifyCollectionChangedAction.Replace:
                    args.OldItems?.OfType <GameFolder>()
                    .Where(folder => folder.IsJunction)
                    .ForEach(folder => JunctionTargetsDictionary.Remove(folder.JunctionTarget, folder));

                    args.NewItems?.OfType <GameFolder>()
                    .Where(folder => folder.IsJunction)
                    .ForEach(folder => JunctionTargetsDictionary.Add(folder.JunctionTarget, folder));
                    break;

                case NotifyCollectionChangedAction.Reset:
                    JunctionTargetsDictionary.Clear();
                    break;

                case NotifyCollectionChangedAction.Move:
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            };
        }
Example #8
0
        public void AddDuplicateThrowsException()
        {
            var set = new AsyncObservableKeyedSet <int, int>(param => param, Context, new[] { 1 });

            EnsureException(() => set.AddAsync(1), Hurls.ArgumentException);
        }