720 lines
19 KiB
C#
720 lines
19 KiB
C#
using System.Collections.ObjectModel;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Headless.XUnit;
|
|
using Avalonia.Threading;
|
|
using Avalonia.VisualTree;
|
|
using HeadlessTest.Ursa.TestHelpers;
|
|
using Ursa.Controls;
|
|
using AutoCompleteBox = Avalonia.Controls.AutoCompleteBox;
|
|
|
|
namespace HeadlessTest.Ursa.Controls.AutoCompleteBoxTests;
|
|
|
|
public class MultiAutoCompleteBoxTests
|
|
{
|
|
[AvaloniaFact]
|
|
public void Search_Filters()
|
|
{
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.Contains)("am", "name"));
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.Contains)("AME", "name"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.Contains)("hello", "name"));
|
|
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.ContainsCaseSensitive)("na", "name"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.ContainsCaseSensitive)("AME", "name"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.ContainsCaseSensitive)("hello", "name"));
|
|
|
|
Assert.Null(GetFilter(AutoCompleteFilterMode.Custom));
|
|
Assert.Null(GetFilter(AutoCompleteFilterMode.None));
|
|
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.Equals)("na", "na"));
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.Equals)("na", "NA"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.Equals)("hello", "name"));
|
|
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.EqualsCaseSensitive)("na", "na"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.EqualsCaseSensitive)("na", "NA"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.EqualsCaseSensitive)("hello", "name"));
|
|
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.StartsWith)("na", "name"));
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.StartsWith)("NAM", "name"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.StartsWith)("hello", "name"));
|
|
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.StartsWithCaseSensitive)("na", "name"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.StartsWithCaseSensitive)("NAM", "name"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.StartsWithCaseSensitive)("hello", "name"));
|
|
}
|
|
|
|
[AvaloniaFact]
|
|
public void Ordinal_Search_Filters()
|
|
{
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.ContainsOrdinal)("am", "name"));
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.ContainsOrdinal)("AME", "name"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.ContainsOrdinal)("hello", "name"));
|
|
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.ContainsOrdinalCaseSensitive)("na", "name"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.ContainsOrdinalCaseSensitive)("AME", "name"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.ContainsOrdinalCaseSensitive)("hello", "name"));
|
|
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.EqualsOrdinal)("na", "na"));
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.EqualsOrdinal)("na", "NA"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.EqualsOrdinal)("hello", "name"));
|
|
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.EqualsOrdinalCaseSensitive)("na", "na"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.EqualsOrdinalCaseSensitive)("na", "NA"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.EqualsOrdinalCaseSensitive)("hello", "name"));
|
|
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.StartsWithOrdinal)("na", "name"));
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.StartsWithOrdinal)("NAM", "name"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.StartsWithOrdinal)("hello", "name"));
|
|
|
|
Assert.True(GetFilter(AutoCompleteFilterMode.StartsWithOrdinalCaseSensitive)("na", "name"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.StartsWithOrdinalCaseSensitive)("NAM", "name"));
|
|
Assert.False(GetFilter(AutoCompleteFilterMode.StartsWithOrdinalCaseSensitive)("hello", "name"));
|
|
}
|
|
|
|
private static AutoCompleteFilterPredicate<string> GetFilter(AutoCompleteFilterMode mode)
|
|
{
|
|
return new MultiAutoCompleteBox { FilterMode = mode }
|
|
.TextFilter;
|
|
}
|
|
|
|
[AvaloniaFact]
|
|
public void Fires_DropDown_Event()
|
|
{
|
|
Window window = new Window();
|
|
var control = new MultiAutoCompleteBox(){ MinimumPrefixLength = 1 };
|
|
|
|
bool openEvent = false;
|
|
bool closeEvent = false;
|
|
control.DropDownOpened += (s, e) => openEvent = true;
|
|
control.DropDownClosed += (s, e) => closeEvent = true;
|
|
control.ItemsSource = CreateSimpleStringArray();
|
|
|
|
window.Content = control;
|
|
window.Show();
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
var textBox = control.FindDescendantOfType<TextBox>();
|
|
|
|
Assert.NotNull(textBox);
|
|
|
|
textBox.Text = "a";
|
|
Dispatcher.UIThread.RunJobs();
|
|
Assert.True(control.SearchText == "a");
|
|
Assert.True(control.IsDropDownOpen);
|
|
Assert.True(openEvent);
|
|
|
|
textBox.Text = String.Empty;
|
|
Dispatcher.UIThread.RunJobs();
|
|
Assert.True(control.SearchText == String.Empty);
|
|
Assert.False(control.IsDropDownOpen);
|
|
Assert.True(closeEvent);
|
|
}
|
|
|
|
[AvaloniaFact]
|
|
public void Custom_FilterMode_Without_ItemFilter_Setting_Throws_Exception()
|
|
{
|
|
Window window = new Window();
|
|
var control = new MultiAutoCompleteBox()
|
|
{
|
|
ItemsSource = CreateSimpleStringArray()
|
|
};
|
|
window.Content = control;
|
|
window.Show();
|
|
|
|
control.FilterMode = AutoCompleteFilterMode.Custom;
|
|
Assert.Throws<Exception>(() => { control.Text = "a"; });
|
|
}
|
|
|
|
private static IList<string> CreateSimpleStringArray()
|
|
{
|
|
return new List<string>
|
|
{
|
|
"a",
|
|
"abide",
|
|
"able",
|
|
"about",
|
|
"above",
|
|
"absence",
|
|
"absurd",
|
|
"accept",
|
|
"acceptance",
|
|
"accepted",
|
|
"accepting",
|
|
"access",
|
|
"accessed",
|
|
"accessible",
|
|
"accident",
|
|
"accidentally",
|
|
"accordance",
|
|
"account",
|
|
"accounting",
|
|
"accounts",
|
|
"accusation",
|
|
"accustomed",
|
|
"ache",
|
|
"across",
|
|
"act",
|
|
"active",
|
|
"actual",
|
|
"actually",
|
|
"ada",
|
|
"added",
|
|
"adding",
|
|
"addition",
|
|
"additional",
|
|
"additions",
|
|
"address",
|
|
"addressed",
|
|
"addresses",
|
|
"addressing",
|
|
"adjourn",
|
|
"adoption",
|
|
"advance",
|
|
"advantage",
|
|
"adventures",
|
|
"advice",
|
|
"advisable",
|
|
"advise",
|
|
"affair",
|
|
"affectionately",
|
|
"afford",
|
|
"afore",
|
|
"afraid",
|
|
"after",
|
|
"afterwards",
|
|
"again",
|
|
"against",
|
|
"age",
|
|
"aged",
|
|
"agent",
|
|
"ago",
|
|
"agony",
|
|
"agree",
|
|
"agreed",
|
|
"agreement",
|
|
"ah",
|
|
"ahem",
|
|
"air",
|
|
"airs",
|
|
"ak",
|
|
"alarm",
|
|
"alarmed",
|
|
"alas",
|
|
"alice",
|
|
"alive",
|
|
"all",
|
|
"allow",
|
|
"almost",
|
|
"alone",
|
|
"along",
|
|
"aloud",
|
|
"already",
|
|
"also",
|
|
"alteration",
|
|
"altered",
|
|
"alternate",
|
|
"alternately",
|
|
"altogether",
|
|
"always",
|
|
"am",
|
|
"ambition",
|
|
"among",
|
|
"an",
|
|
"ancient",
|
|
"and",
|
|
"anger",
|
|
"angrily",
|
|
"angry",
|
|
"animal",
|
|
"animals",
|
|
"ann",
|
|
"annoy",
|
|
"annoyed",
|
|
"another",
|
|
"answer",
|
|
"answered",
|
|
"answers",
|
|
"antipathies",
|
|
"anxious",
|
|
"anxiously",
|
|
"any",
|
|
"anyone",
|
|
"anything",
|
|
"anywhere",
|
|
"appealed",
|
|
"appear",
|
|
"appearance",
|
|
"appeared",
|
|
"appearing",
|
|
"appears",
|
|
"applause",
|
|
"apple",
|
|
"apples",
|
|
"applicable",
|
|
"apply",
|
|
"approach",
|
|
"arch",
|
|
"archbishop",
|
|
"arches",
|
|
"archive",
|
|
"are",
|
|
"argue",
|
|
"argued",
|
|
"argument",
|
|
"arguments",
|
|
"arise",
|
|
"arithmetic",
|
|
"arm",
|
|
"arms",
|
|
"around",
|
|
"arranged",
|
|
"array",
|
|
"arrived",
|
|
"arrow",
|
|
"arrum",
|
|
"as",
|
|
"ascii",
|
|
"ashamed",
|
|
"ask",
|
|
"askance",
|
|
"asked",
|
|
"asking",
|
|
"asleep",
|
|
"assembled",
|
|
"assistance",
|
|
"associated",
|
|
"at",
|
|
"ate",
|
|
"atheling",
|
|
"atom",
|
|
"attached",
|
|
"attempt",
|
|
"attempted",
|
|
"attempts",
|
|
"attended",
|
|
"attending",
|
|
"attends",
|
|
"audibly",
|
|
"australia",
|
|
"author",
|
|
"authority",
|
|
"available",
|
|
"avoid",
|
|
"away",
|
|
"awfully",
|
|
"axes",
|
|
"axis",
|
|
"b",
|
|
"baby",
|
|
"back",
|
|
"backs",
|
|
"bad",
|
|
"bag",
|
|
"baked",
|
|
"balanced",
|
|
"bank",
|
|
"banks",
|
|
"banquet",
|
|
"bark",
|
|
"barking",
|
|
"barley",
|
|
"barrowful",
|
|
"based",
|
|
"bat",
|
|
"bathing",
|
|
"bats",
|
|
"bawled",
|
|
"be",
|
|
"beak",
|
|
"bear",
|
|
"beast",
|
|
"beasts",
|
|
"beat",
|
|
"beating",
|
|
"beau",
|
|
"beauti",
|
|
"beautiful",
|
|
"beautifully",
|
|
"beautify",
|
|
"became",
|
|
"because",
|
|
"become",
|
|
"becoming",
|
|
"bed",
|
|
"beds",
|
|
"bee",
|
|
"been",
|
|
"before",
|
|
"beg",
|
|
"began",
|
|
"begged",
|
|
"begin",
|
|
"beginning",
|
|
"begins",
|
|
"begun",
|
|
"behead",
|
|
"beheaded",
|
|
"beheading",
|
|
"behind",
|
|
"being",
|
|
"believe",
|
|
"believed",
|
|
"bells",
|
|
"belong",
|
|
"belongs",
|
|
"beloved",
|
|
"below",
|
|
"belt",
|
|
"bend",
|
|
"bent",
|
|
"besides",
|
|
"best",
|
|
"better",
|
|
"between",
|
|
"bill",
|
|
"binary",
|
|
"bird",
|
|
"birds",
|
|
"birthday",
|
|
"bit",
|
|
"bite",
|
|
"bitter",
|
|
"blacking",
|
|
"blades",
|
|
"blame",
|
|
"blasts",
|
|
"bleeds",
|
|
"blew",
|
|
"blow",
|
|
"blown",
|
|
"blows",
|
|
"body",
|
|
"boldly",
|
|
"bone",
|
|
"bones",
|
|
"book",
|
|
"books",
|
|
"boon",
|
|
"boots",
|
|
"bore",
|
|
"both",
|
|
"bother",
|
|
"bottle",
|
|
"bottom",
|
|
"bough",
|
|
"bound",
|
|
"bowed",
|
|
"bowing",
|
|
"box",
|
|
"boxed",
|
|
"boy",
|
|
"brain",
|
|
"branch",
|
|
"branches",
|
|
"brandy",
|
|
"brass",
|
|
"brave",
|
|
"breach",
|
|
"bread",
|
|
"break",
|
|
"breath",
|
|
"breathe",
|
|
"breeze",
|
|
"bright",
|
|
"brightened",
|
|
"bring",
|
|
"bringing",
|
|
"bristling",
|
|
"broke",
|
|
"broken",
|
|
"brother",
|
|
"brought",
|
|
"brown",
|
|
"brush",
|
|
"brushing",
|
|
"burn",
|
|
"burning",
|
|
"burnt",
|
|
"burst",
|
|
"bursting",
|
|
"busily",
|
|
"business",
|
|
"business@pglaf",
|
|
"busy",
|
|
"but",
|
|
"butter",
|
|
"buttercup",
|
|
"buttered",
|
|
"butterfly",
|
|
"buttons",
|
|
"by",
|
|
"bye",
|
|
"c",
|
|
"cackled",
|
|
"cake",
|
|
"cakes",
|
|
"calculate",
|
|
"calculated",
|
|
"call",
|
|
"called",
|
|
"calling",
|
|
"calmly",
|
|
"came",
|
|
"camomile",
|
|
"can",
|
|
"canary",
|
|
"candle",
|
|
"cannot",
|
|
"canterbury",
|
|
"canvas",
|
|
"capering",
|
|
"capital",
|
|
"card",
|
|
"cardboard",
|
|
"cards",
|
|
"care",
|
|
"carefully",
|
|
"cares",
|
|
"carried",
|
|
"carrier",
|
|
"carroll",
|
|
"carry",
|
|
"carrying",
|
|
"cart",
|
|
"cartwheels",
|
|
"case",
|
|
"cat",
|
|
"catch",
|
|
"catching",
|
|
"caterpillar",
|
|
"cats",
|
|
"cattle",
|
|
"caucus",
|
|
"caught",
|
|
"cauldron",
|
|
"cause",
|
|
"caused",
|
|
"cautiously",
|
|
"cease",
|
|
"ceiling",
|
|
"centre",
|
|
"certain",
|
|
"certainly",
|
|
"chain",
|
|
"chains",
|
|
"chair",
|
|
"chance",
|
|
"chanced",
|
|
"change",
|
|
"changed",
|
|
"changes",
|
|
"changing",
|
|
"chapter",
|
|
"character",
|
|
"charge",
|
|
"charges",
|
|
"charitable",
|
|
"charities",
|
|
"chatte",
|
|
"cheap",
|
|
"cheated",
|
|
"check",
|
|
"checked",
|
|
"checks",
|
|
"cheeks",
|
|
"cheered",
|
|
"cheerfully",
|
|
"cherry",
|
|
"cheshire",
|
|
"chief",
|
|
"child",
|
|
"childhood",
|
|
"children",
|
|
"chimney",
|
|
"chimneys",
|
|
"chin",
|
|
"choice",
|
|
"choke",
|
|
"choked",
|
|
"choking",
|
|
"choose",
|
|
"choosing",
|
|
"chop",
|
|
"chorus",
|
|
"chose",
|
|
"christmas",
|
|
"chrysalis",
|
|
"chuckled",
|
|
"circle",
|
|
"circumstances",
|
|
"city",
|
|
"civil",
|
|
"claim",
|
|
"clamour",
|
|
"clapping",
|
|
"clasped",
|
|
"classics",
|
|
"claws",
|
|
"clean",
|
|
"clear",
|
|
"cleared",
|
|
"clearer",
|
|
"clearly",
|
|
"clever",
|
|
"climb",
|
|
"clinging",
|
|
"clock",
|
|
"close",
|
|
"closed",
|
|
"closely",
|
|
"closer",
|
|
"clubs",
|
|
"coast",
|
|
"coaxing",
|
|
"codes",
|
|
"coils",
|
|
"cold",
|
|
"collar",
|
|
"collected",
|
|
"collection",
|
|
"come",
|
|
"comes",
|
|
"comfits",
|
|
"comfort",
|
|
"comfortable",
|
|
"comfortably",
|
|
"coming",
|
|
"commercial",
|
|
"committed",
|
|
"common",
|
|
"commotion",
|
|
"company",
|
|
"compilation",
|
|
"complained",
|
|
"complaining",
|
|
"completely",
|
|
"compliance",
|
|
"comply",
|
|
"complying",
|
|
"compressed",
|
|
"computer",
|
|
"computers",
|
|
"concept",
|
|
"concerning",
|
|
"concert",
|
|
"concluded",
|
|
"conclusion",
|
|
"condemn",
|
|
"conduct",
|
|
"confirmation",
|
|
"confirmed",
|
|
"confused",
|
|
"confusing",
|
|
"confusion",
|
|
"conger",
|
|
"conqueror",
|
|
"conquest",
|
|
"consented",
|
|
"consequential",
|
|
"consider",
|
|
"considerable",
|
|
"considered",
|
|
"considering",
|
|
"constant",
|
|
"consultation",
|
|
"contact",
|
|
"contain",
|
|
"containing",
|
|
"contempt",
|
|
"contemptuous",
|
|
"contemptuously",
|
|
"content",
|
|
"continued",
|
|
"contract",
|
|
"contradicted",
|
|
"contributions",
|
|
"conversation",
|
|
"conversations",
|
|
"convert",
|
|
"cook",
|
|
"cool",
|
|
"copied",
|
|
"copies",
|
|
"copy",
|
|
"copying",
|
|
"copyright",
|
|
"corner",
|
|
"corners",
|
|
"corporation",
|
|
"corrupt",
|
|
"cost",
|
|
"costs",
|
|
"could",
|
|
"couldn",
|
|
"counting",
|
|
"countries",
|
|
"country",
|
|
"couple",
|
|
"couples",
|
|
"courage",
|
|
"course",
|
|
"court",
|
|
"courtiers",
|
|
"coward",
|
|
"crab",
|
|
"crash",
|
|
"crashed",
|
|
"crawled",
|
|
"crawling",
|
|
"crazy",
|
|
"created",
|
|
"creating",
|
|
"creation",
|
|
"creature",
|
|
"creatures",
|
|
"credit",
|
|
"creep",
|
|
"crept",
|
|
"cried",
|
|
"cries",
|
|
"crimson",
|
|
"critical",
|
|
"crocodile",
|
|
"croquet",
|
|
"croqueted",
|
|
"croqueting",
|
|
"cross",
|
|
"crossed",
|
|
"crossly",
|
|
"crouched",
|
|
"crowd",
|
|
"crowded",
|
|
"crown",
|
|
"crumbs",
|
|
"crust",
|
|
"cry",
|
|
"crying",
|
|
"cucumber",
|
|
"cunning",
|
|
"cup",
|
|
"cupboards",
|
|
"cur",
|
|
"curiosity",
|
|
"curious",
|
|
"curiouser",
|
|
"curled",
|
|
"curls",
|
|
"curly",
|
|
"currants",
|
|
"current",
|
|
"curtain",
|
|
"curtsey",
|
|
"curtseying",
|
|
"curving",
|
|
"cushion",
|
|
"custard",
|
|
"custody",
|
|
"cut",
|
|
"cutting",
|
|
};
|
|
}
|
|
} |