Beispiel #1
0
        public void AddTriggerThenManyOnNextOneAdd()
        {
            var source = new ObservableCollection <int> {
                1, 2, 3
            };
            var scheduler = new TestScheduler();

            using var trigger = new Subject <object?>();
            using var view    = new FilteredView <int>(source, x => true, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true, triggers: trigger);
            using var actual  = view.SubscribeAll();
            source.Add(4);
            for (var i = 0; i < 10; i++)
            {
                trigger.OnNext(null);
            }

            CollectionAssert.IsEmpty(actual);
            CollectionAssert.AreEqual(new[] { 1, 2, 3 }, view);

            scheduler.Start();

            var expected = new EventArgs[]
            {
                CachedEventArgs.CountPropertyChanged,
                CachedEventArgs.IndexerPropertyChanged,
                Diff.CreateAddEventArgs(4, 3),
            };

            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
            CollectionAssert.AreEqual(new[] { 1, 2, 3, 4 }, view);
        }
            public void ManyOnNextsOneReset()
            {
                var source = new ObservableCollection <int> {
                    1, 2, 3
                };
                var scheduler = new TestScheduler();

                using (var trigger = new Subject <object>())
                {
                    using (var view = new FilteredView <int>(source, x => true, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true, triggers: trigger))
                    {
                        using (var actual = view.SubscribeAll())
                        {
                            source.Clear();
                            for (var i = 0; i < 10; i++)
                            {
                                trigger.OnNext(null);
                            }

                            CollectionAssert.IsEmpty(actual);
                            CollectionAssert.AreEqual(new[] { 1, 2, 3 }, view);
                            scheduler.Start();

                            var expected = new EventArgs[]
                            {
                                CachedEventArgs.CountPropertyChanged,
                                CachedEventArgs.IndexerPropertyChanged,
                                CachedEventArgs.NotifyCollectionReset
                            };
                            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
                            CollectionAssert.IsEmpty(view);
                        }
                    }
                }
            }
            public void Repro1()
            {
                var source = new ObservableCollection <int> {
                    1, 2, 3
                };
                var scheduler = new TestScheduler();
                var max       = 5;

                using (var trigger = new Subject <object>())
                {
                    // ReSharper disable once AccessToModifiedClosure
                    using (var view = new FilteredView <int>(source, x => x < max, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true, triggers: trigger))
                    {
                        using (var actual = view.SubscribeAll())
                        {
                            CollectionAssert.AreEqual(new[] { 1, 2, 3 }, view);
                            CollectionAssert.IsEmpty(actual);

                            max = 2;
                            trigger.OnNext(null);
                            scheduler.Start();

                            var expected = new List <EventArgs>
                            {
                                CachedEventArgs.CountPropertyChanged,
                                CachedEventArgs.IndexerPropertyChanged,
                                CachedEventArgs.NotifyCollectionReset,
                            };
                            CollectionAssert.AreEqual(new[] { 1 }, view);
                            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);

                            for (var i = 0; i < 10; i++)
                            {
                                source.Add(i);
                            }

                            scheduler.Start();
                            CollectionAssert.AreEqual(new[] { 1, 0, 1 }, view);
                            expected.AddRange(new EventArgs[]
                            {
                                CachedEventArgs.CountPropertyChanged,
                                CachedEventArgs.IndexerPropertyChanged,
                                CachedEventArgs.NotifyCollectionReset,
                            });
                            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);

                            source.Clear();
                            scheduler.Start();
                            CollectionAssert.IsEmpty(view);
                            expected.AddRange(new EventArgs[]
                            {
                                CachedEventArgs.CountPropertyChanged,
                                CachedEventArgs.IndexerPropertyChanged,
                                CachedEventArgs.NotifyCollectionReset,
                            });
                            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
                        }
                    }
                }
            }
Beispiel #4
0
    codePane.CodeAreaHeight - codePane.Cursor.Row >= VerticalPaddingHeight + configuration.MinCompletionItemsCount;     // offset + top border + MinCompletionItemsCount + bottom border

    async Task IKeyPressHandler.OnKeyUp(KeyPress key, CancellationToken cancellationToken)
    {
        if (!EnoughRoomToDisplay(codePane))
        {
            return;
        }

        bool wasAlreadyOpen = IsOpen;

        if (!IsOpen)
        {
            if (!char.IsControl(key.ConsoleKeyInfo.KeyChar) &&
                !completionListTriggeredOnKeyDown &&
                await promptCallbacks.ShouldOpenCompletionWindowAsync(codePane.Document.GetText(), codePane.Document.Caret, key, cancellationToken).ConfigureAwait(false))
            {
                Open();
            }
        }

        if (IsOpen)
        {
            var documentText  = codePane.Document.GetText();
            int documentCaret = codePane.Document.Caret;
            var spanToReplace = await promptCallbacks.GetSpanToReplaceByCompletionkAsync(documentText, documentCaret, cancellationToken).ConfigureAwait(false);

            if (wasAlreadyOpen &&
                lastSpanToReplaceOnKeyDown.TryGet(out var spanToReplaceOld))
            {
                if (spanToReplace.Start != spanToReplaceOld.Start && spanToReplace.End != spanToReplaceOld.End)
                {
                    Close();
                    return;
                }
            }

            if (allCompletions.Count == 0)
            {
                var completions = await promptCallbacks.GetCompletionItemsAsync(documentText, documentCaret, spanToReplace, cancellationToken).ConfigureAwait(false);

                if (completions.Any())
                {
                    allCompletions = completions;
                    if (completions.Any())
                    {
                        int height = Math.Min(codePane.CodeAreaHeight - VerticalPaddingHeight, configuration.MaxCompletionItemsCount);
                        FilteredView.UpdateItems(completions, documentText, documentCaret, spanToReplace, height);
                    }
                }
                else
                {
                    Close();
                }
            }
            else if (!key.Handled)
            {
                FilteredView.Match(documentText, documentCaret, spanToReplace);
            }
        }
    }
Beispiel #5
0
 private void UpdateViewFilter()
 {
     using (FilteredView.DeferRefresh()) {
         if (string.IsNullOrEmpty(FilterValue) || Mode == BuiltInGridMode.SameCar || Mode == BuiltInGridMode.Custom)
         {
             FilteredView.Filter = null;
         }
         else
         {
             var filter = StringBasedFilter.Filter.Create(CarObjectTester.Instance, FilterValue);
             FilteredView.Filter = o => filter.Test(((RaceGridEntry)o).Car);
         }
     }
 }
Beispiel #6
0
        public void Clear()
        {
            var source = new ObservableCollection <int> {
                1, 2, 3
            };

            using var expected = source.SubscribeAll();
            var scheduler = new TestScheduler();

            using var view   = new FilteredView <int>(source, x => true, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true);
            using var actual = view.SubscribeAll();
            source.Clear();
            CollectionAssert.IsEmpty(actual);
            scheduler.Start();
            CollectionAssert.AreEqual(source, view);
            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
        }
            public async Task BindItemsSource()
            {
                var listBox = new ListBox();
                var source  = new ObservableCollection <int> {
                    1, 2, 3
                };

                using (var view = new FilteredView <int>(source, x => x == 2, TimeSpan.Zero, WpfSchedulers.Dispatcher, leaveOpen: true, triggers: new Subject <object>()))
                {
                    var binding = new Binding {
                        Source = view,
                    };
                    BindingOperations.SetBinding(listBox, ItemsControl.ItemsSourceProperty, binding);
                    view.Refresh();
                    await Application.Current.Dispatcher.SimulateYield();

                    CollectionAssert.AreEqual(new[] { 2 }, listBox.Items); // Filtered
                }
            }
            public void UpdatesAndNotifiesOnCollectionChanged()
            {
                var ints = new ObservableCollection <int> {
                    1, 2, 3
                };

                using (var expected = ints.SubscribeAll())
                {
                    var scheduler = new TestScheduler();
                    using (var view = new FilteredView <int>(ints, x => true, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true))
                    {
                        using (var actual = view.SubscribeAll())
                        {
                            ints.Add(4);
                            CollectionAssert.IsEmpty(actual);
                            scheduler.Start();
                            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
                        }
                    }
                }
            }
Beispiel #9
0
        public void Test_Construction()
        {
            SoftwareSystem    softwareSystem    = Model.AddSoftwareSystem("Name", "Description");
            SystemContextView systemContextView = Views.CreateSystemContextView(softwareSystem, "SystemContext", "Description");
            FilteredView      filteredView      = Views.CreateFilteredView(
                systemContextView,
                "CurrentStateSystemContext",
                "The system context as-is.",
                FilterMode.Exclude,
                "v2", "v3"
                );

            Assert.Equal("CurrentStateSystemContext", filteredView.Key);
            Assert.Equal("SystemContext", filteredView.BaseViewKey);
            Assert.Same(systemContextView, filteredView.View);
            Assert.Equal("The system context as-is.", filteredView.Description);
            Assert.Equal(FilterMode.Exclude, filteredView.Mode);
            Assert.Equal(2, filteredView.Tags.Count);
            Assert.True(filteredView.Tags.Contains("v2"));
            Assert.True(filteredView.Tags.Contains("v3"));
        }
Beispiel #10
0
        public void Repro3()
        {
            var source = new ObservableCollection <int> {
                1, 2, 3
            };
            var scheduler = new TestScheduler();
            var max       = 5;

            using var trigger = new Subject <object?>();
            //// ReSharper disable once AccessToModifiedClosure
            using var view   = new FilteredView <int>(source, x => x < max, TimeSpan.Zero, scheduler, leaveOpen: true, triggers: trigger);
            using var actual = view.SubscribeAll();
            CollectionAssert.AreEqual(new[] { 1, 2, 3 }, view);
            CollectionAssert.IsEmpty(actual);

            max = 2;
            trigger.OnNext(null);
            scheduler.Start();
            var expected = new List <EventArgs>
            {
                CachedEventArgs.CountPropertyChanged,
                CachedEventArgs.IndexerPropertyChanged,
                CachedEventArgs.NotifyCollectionReset,
            };

            CollectionAssert.AreEqual(new[] { 1 }, view);
            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);

            source.Clear();
            view.Refresh();
            scheduler.Start();
            CollectionAssert.IsEmpty(view);
            expected.AddRange(new EventArgs[]
            {
                CachedEventArgs.CountPropertyChanged,
                CachedEventArgs.IndexerPropertyChanged,
                Diff.CreateRemoveEventArgs(1, 0),
            });
            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
        }
Beispiel #11
0
        public void Move()
        {
            var source = new ObservableCollection <int> {
                1, 2, 3
            };
            var scheduler = new TestScheduler();

            using var view   = new FilteredView <int>(source, x => true, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true);
            using var actual = view.SubscribeAll();
            source.Move(0, 2);
            CollectionAssert.IsEmpty(actual);
            scheduler.Start();
            CollectionAssert.AreEqual(source, view);
            var expected = new List <EventArgs>
            {
                CachedEventArgs.CountPropertyChanged,
                CachedEventArgs.IndexerPropertyChanged,
                CachedEventArgs.NotifyCollectionReset,
            };

            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
        }
Beispiel #12
0
        FilteredView GetCommitView(CSVersion excluded)
        {
            Debug.Assert(excluded == null || _repoVersions.Versions.Any(t => t.ThisTag == excluded));
            if (excluded == null)
            {
                if (_default == null)
                {
                    _default = new FilteredView(this, null);
                }
                return(_default);
            }
            if (_filtered == null)
            {
                _filtered = new Dictionary <CSVersion, FilteredView>();
            }
            else if (_filtered.TryGetValue(excluded, out var view))
            {
                return(view);
            }
            var v = new FilteredView(this, excluded);

            _filtered.Add(excluded, v);
            return(v);
        }
Beispiel #13
0
        private void treeViewDoc_AfterSelect(object sender, TreeViewEventArgs e)
        {
            this.CurrentView = e.Node.Tag as FilteredView <DataItemBase>;
            if (this.CurrentView == null)
            {
                return;
            }

            // *** DataGridView population ***
            // SendMessage(this.dataGridViewMain.Handle, WM_SETREDRAW, false, 0);
            Debug.WriteLine("Suspend layout");
            this.dataGridViewMain.Rows.Clear();

            Debug.WriteLine("rows cleared");
            if (!this.CurrentView.IsInitialized)
            {
                this.progressBarMain.Value   = 0;
                this.progressBarMain.Visible = true;
                var bw = new BackgroundWorker();
                bw.WorkerReportsProgress = true;

                bw.RunWorkerCompleted += (s, e1) =>
                {
                    this.progressBarMain.Visible   = false;
                    this.toolStripStatusLabel.Text = "Ready";
                    this.dataGridViewMain.RowCount = this.CurrentView.TotalCount;
                    bw.Dispose();
                };

                bw.ProgressChanged += (s, e1) =>
                {
                    if (this.progressBarMain.Value != e1.ProgressPercentage)
                    {
                        this.progressBarMain.Value     = e1.ProgressPercentage;
                        this.dataGridViewMain.RowCount = this.CurrentView.TotalCount;
                        this.toolStripStatusLabel.Text = $"Filtering ... {e1.ProgressPercentage}%";
                    }
                };

                bw.DoWork += (s, e1) =>
                {
                    foreach (int progress in this.CurrentView.Initialize(Settings.Default.Display_Statistics, this.cts.Token))
                    {
                        bw.ReportProgress(progress);
                    }
                };

                bw.RunWorkerAsync();
                this.toolStripStatusLabel.Text = "Filtering ...";
            }
            else
            {
                this.dataGridViewMain.RowCount = this.CurrentView.TotalCount;
            }

            Debug.WriteLine("Setting scroll index");
            if (this.CurrentView.FirstDisplayedScrollingRowIndex.HasValue)
            {
                this.dataGridViewMain.FirstDisplayedScrollingRowIndex = this.CurrentView.FirstDisplayedScrollingRowIndex.Value;
            }
            // Add rows to DGV here
            //  SendMessage(this.dataGridViewMain.Handle, WM_SETREDRAW, true, 0);
            this.dataGridViewMain.Refresh();
            Debug.WriteLine("Resume layout");
        }
Beispiel #14
0
        public async Task <IList <Game.AiCar> > GenerateGameEntries(CancellationToken cancellation = default(CancellationToken))
        {
            if (IsBusy)
            {
                await RebuildGridAsync();

                if (cancellation.IsCancellationRequested)
                {
                    return(null);
                }
            }

            var opponentsNumber = OpponentsNumberLimited;

            if (FilteredView.Count == 0 || opponentsNumber == 0)
            {
                return(new Game.AiCar[0]);
            }

            var skins = new Dictionary <string, GoodShuffle <CarSkinObject> >();

            foreach (var car in FilteredView.OfType <RaceGridEntry>().Where(x => x.CarSkin == null).Select(x => x.Car).Distinct())
            {
                await car.SkinsManager.EnsureLoadedAsync();

                if (cancellation.IsCancellationRequested)
                {
                    return(null);
                }

                skins[car.Id] = GoodShuffle.Get(car.EnabledOnlySkins);
            }

            NameNationality[] nameNationalities;
            if (opponentsNumber == 7 && OptionNfsPorscheNames)
            {
                nameNationalities = new[] {
                    new NameNationality {
                        Name = "Dylan", Nationality = "Wales"
                    },
                    new NameNationality {
                        Name = "Parise", Nationality = "Italy"
                    },
                    new NameNationality {
                        Name = "Steele", Nationality = "United States"
                    },
                    new NameNationality {
                        Name = "Wingnut", Nationality = "England"
                    },
                    new NameNationality {
                        Name = "Leadfoot", Nationality = "Australia"
                    },
                    new NameNationality {
                        Name = "Amazon", Nationality = "United States"
                    },
                    new NameNationality {
                        Name = "Backlash", Nationality = "United States"
                    }
                };
            }
            else if (DataProvider.Instance.NationalitiesAndNames.Any())
            {
                nameNationalities = GoodShuffle.Get(DataProvider.Instance.NationalitiesAndNamesList).Take(opponentsNumber).ToArray();
            }
            else
            {
                nameNationalities = null;
            }

            List <int> aiLevels;

            if (AiLevelFixed)
            {
                aiLevels = null;
            }
            else
            {
                var aiLevelsInner = from i in Enumerable.Range(0, opponentsNumber)
                                    select AiLevelMin + ((opponentsNumber < 2 ? 1d : 1d - i / (opponentsNumber - 1d)) * (AiLevel - AiLevelMin)).RoundToInt();
                if (AiLevelArrangeReverse)
                {
                    aiLevelsInner = aiLevelsInner.Reverse();
                }

                if (Equals(AiLevelArrangeRandom, 1d))
                {
                    aiLevelsInner = GoodShuffle.Get(aiLevelsInner);
                }
                else if (AiLevelArrangeRandom > 0d)
                {
                    aiLevelsInner = LimitedShuffle.Get(aiLevelsInner, AiLevelArrangeRandom);
                }

                aiLevels = aiLevelsInner.Take(opponentsNumber).ToList();
                Logging.Debug("AI levels: " + aiLevels.Select(x => $@"{x}%").JoinToString(@", "));
            }

            IEnumerable <RaceGridEntry> final;

            if (Mode.CandidatesMode)
            {
                var list = FilteredView.OfType <RaceGridEntry>().SelectMany(x => new[] { x }.Repeat(x.CandidatePriority)).ToList();

                if (ShuffleCandidates)
                {
                    var shuffled = GoodShuffle.Get(list);

                    if (_playerCar != null)
                    {
                        var same = list.FirstOrDefault(x => x.Car == _playerCar);
                        if (same != null)
                        {
                            shuffled.IgnoreOnce(same);
                        }
                    }

                    final = shuffled.Take(opponentsNumber);
                }
                else
                {
                    var skip = _playerCar;
                    final = LinqExtension.RangeFrom().Select(x => list.RandomElement()).Where(x => {
                        if (x.Car == skip)
                        {
                            skip = null;
                            return(false);
                        }

                        return(true);
                    }).Take(opponentsNumber);
                }
            }
            else
            {
                final = NonfilteredList.Where(x => !x.SpecialEntry);
            }

            if (_playerCar != null)
            {
                skins.GetValueOrDefault(_playerCar.Id)?.IgnoreOnce(_playerCar.SelectedSkin);
            }

            var takenNames = new List <string>(opponentsNumber);

            return(final.Take(opponentsNumber).Select((entry, i) => {
                var level = entry.AiLevel ?? aiLevels?[i] ?? 100;

                var skin = entry.CarSkin;
                if (skin == null)
                {
                    skin = skins.GetValueOrDefault(entry.Car.Id)?.Next;
                }

                var name = entry.Name;
                if (string.IsNullOrWhiteSpace(name) && SettingsHolder.Drive.QuickDriveUseSkinNames)
                {
                    var skinDriverNames = skin?.DriverName?.Split(',').Select(x => x.Trim()).Where(x => x.Length > 0).ToList();
                    if (skinDriverNames?.Count > 0)
                    {
                        name = GoodShuffle.Get(skinDriverNames).Take(skinDriverNames.Count).FirstOrDefault(x => !takenNames.Contains(x)) ?? name;
                        takenNames.Add(name);
                    }
                }

                if (string.IsNullOrWhiteSpace(name))
                {
                    name = nameNationalities?[i].Name ?? @"AI #" + i;
                    takenNames.Add(name);
                }

                var nationality = entry.Nationality ?? nameNationalities?[i].Nationality ?? @"Italy";
                var skinId = skin?.Id;

                return new Game.AiCar {
                    AiLevel = level,
                    CarId = entry.Car.Id,
                    DriverName = AiLevelInDriverName ? $@"{name} ({level}%)" : name,
                    Nationality = nationality,
                    Setup = "",
                    SkinId = skinId
                };
            }).ToList());
        }