From f602d3bd1dfc6c7b1f63caab62d5d05e34036e0e Mon Sep 17 00:00:00 2001
From: Igor Bagdamyan <37334640+En3Tho@users.noreply.github.com>
Date: Thu, 30 Sep 2021 00:14:32 +0300
Subject: [PATCH] ComboBox cursonDownKey nullref fix (#1472)
* added null guard to fix null ref when pressing keyDown inside combobox
Improved an error message when view cannot be found
* Added a unit test to ensure combobox can process all key events
Found and fixed a new nullref
* Found a new bug when source is already present and combobox is added to a top view
* searchSet is auto initialized to new List() now to make the code a little bit safer
---
Terminal.Gui/Core/View.cs | 23 +++++++++++++----------
Terminal.Gui/Views/ComboBox.cs | 19 ++++++-------------
UnitTests/ComboBoxTests.cs | 24 ++++++++++++++++++++++++
3 files changed, 43 insertions(+), 23 deletions(-)
create mode 100644 UnitTests/ComboBoxTests.cs
diff --git a/Terminal.Gui/Core/View.cs b/Terminal.Gui/Core/View.cs
index e94b1fa81..642a92729 100644
--- a/Terminal.Gui/Core/View.cs
+++ b/Terminal.Gui/Core/View.cs
@@ -1870,16 +1870,19 @@ namespace Terminal.Gui {
}
}
- if (edges.Any () && edges.First ().From != Application.Top) {
- if (!ReferenceEquals (edges.First ().From, edges.First ().To)) {
- throw new InvalidOperationException ($"TopologicalSort (for Pos/Dim) cannot find {edges.First ().From}. Did you forget to add it to {this}?");
- } else {
- throw new InvalidOperationException ("TopologicalSort encountered a recursive cycle in the relative Pos/Dim in the views of " + this);
- }
- } else {
- // return L (a topologically sorted order)
- return result;
- }
+ if (edges.Any ()) {
+ var (from, to) = edges.First ();
+ if (from != Application.Top) {
+ if (!ReferenceEquals (from, to)) {
+ throw new InvalidOperationException ($"TopologicalSort (for Pos/Dim) cannot find {from} linked with {to}. Did you forget to add it to {this}?");
+ } else {
+ throw new InvalidOperationException ("TopologicalSort encountered a recursive cycle in the relative Pos/Dim in the views of " + this);
+ }
+ }
+ }
+
+ // return L (a topologically sorted order)
+ return result;
}
///
diff --git a/Terminal.Gui/Views/ComboBox.cs b/Terminal.Gui/Views/ComboBox.cs
index 3eea30eb9..edda3950b 100644
--- a/Terminal.Gui/Views/ComboBox.cs
+++ b/Terminal.Gui/Views/ComboBox.cs
@@ -64,7 +64,7 @@ namespace Terminal.Gui {
///
public event Action OpenSelectedItem;
- IList searchset;
+ readonly IList searchset = new List