浏览代码

Added Unit Tests

sdoroff 7 年之前
父节点
当前提交
5927e7acfe
共有 1 个文件被更改,包括 1042 次插入0 次删除
  1. 1042 0
      tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs

+ 1042 - 0
tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs

@@ -0,0 +1,1042 @@
+// Copyright (c) The Avalonia Project. All rights reserved.
+// Licensed under the MIT license. See licence.md file in the project root for full license information.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using Avalonia.Controls.Primitives;
+using Avalonia.Controls.Presenters;
+using Avalonia.Controls.Templates;
+using Avalonia.Data;
+using Avalonia.Markup.Xaml.Data;
+using Avalonia.Platform;
+using Avalonia.Threading;
+using Avalonia.UnitTests;
+using Moq;
+using Xunit;
+using System.Collections.ObjectModel;
+
+namespace Avalonia.Controls.UnitTests
+{
+    public class AutoCompleteBoxTests
+    {
+        [Fact]
+        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"));
+        }
+
+        [Fact]
+        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"));
+        }
+
+        [Fact]
+        public void Fires_DropDown_Events()
+        {
+            RunTest((control, textbox) =>
+            {
+                bool openEvent = false;
+                bool closeEvent = false;
+                control.DropDownOpened += (s, e) => openEvent = true;
+                control.DropDownClosed += (s, e) => closeEvent = true;
+                control.Items = CreateSimpleStringArray();
+
+                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);
+            });
+        }
+
+        [Fact]
+        public void Text_Completion_Via_Text_Property()
+        {
+            RunTest((control, textbox) =>
+            {
+                control.IsTextCompletionEnabled = true;
+
+                Assert.Equal(String.Empty, control.Text);
+                control.Text = "close";
+                Assert.NotNull(control.SelectedItem);
+            });
+        }
+
+        [Fact]
+        public void Text_Completion_Selects_Text()
+        {
+            RunTest((control, textbox) =>
+            {
+                control.IsTextCompletionEnabled = true;
+
+                textbox.Text = "ac";
+                textbox.SelectionEnd = textbox.SelectionStart = 2;
+                Dispatcher.UIThread.RunJobs();
+
+                Assert.True(control.IsDropDownOpen);
+                Assert.True(Math.Abs(textbox.SelectionEnd - textbox.SelectionStart) > 2);
+            });
+        }
+
+        [Fact]
+        public void TextChanged_Event_Fires()
+        {
+            RunTest((control, textbox) =>
+            {
+                bool textChanged = false;
+                control.TextChanged += (s, e) => textChanged = true;
+
+                textbox.Text = "a";
+                Dispatcher.UIThread.RunJobs();
+                Assert.True(textChanged);
+
+                textChanged = false;
+                control.Text = "conversati";
+                Dispatcher.UIThread.RunJobs();
+                Assert.True(textChanged);
+
+                textChanged = false;
+                control.Text = null;
+                Dispatcher.UIThread.RunJobs();
+                Assert.True(textChanged);
+            });
+        }
+
+        [Fact]
+        public void MinimumPrefixLength_Works()
+        {
+            RunTest((control, textbox) =>
+            {
+                textbox.Text = "a";
+                Dispatcher.UIThread.RunJobs();
+                Assert.True(control.IsDropDownOpen);
+
+
+                textbox.Text = String.Empty;
+                Dispatcher.UIThread.RunJobs();
+                Assert.False(control.IsDropDownOpen);
+
+                control.MinimumPrefixLength = 3;
+
+                textbox.Text = "a";
+                Dispatcher.UIThread.RunJobs();
+                Assert.False(control.IsDropDownOpen);
+
+                textbox.Text = "acc";
+                Dispatcher.UIThread.RunJobs();
+                Assert.True(control.IsDropDownOpen);
+            });
+        }
+
+        [Fact]
+        public void Can_Cancel_DropDown_Opening()
+        {
+            RunTest((control, textbox) =>
+            {
+                control.DropDownOpening += (s, e) => e.Cancel = true;
+
+                textbox.Text = "a";
+                Dispatcher.UIThread.RunJobs();
+                Assert.False(control.IsDropDownOpen);
+            });
+        }
+
+        [Fact]
+        public void Can_Cancel_DropDown_Closing()
+        {
+            RunTest((control, textbox) =>
+            {
+                control.DropDownClosing += (s, e) => e.Cancel = true;
+
+                textbox.Text = "a";
+                Dispatcher.UIThread.RunJobs();
+                Assert.True(control.IsDropDownOpen);
+
+                control.IsDropDownOpen = false;
+                Assert.True(control.IsDropDownOpen);
+            });
+        }
+
+        [Fact]
+        public void Can_Cancel_Population()
+        {
+            RunTest((control, textbox) =>
+            {
+                bool populating = false;
+                bool populated = false;
+                control.FilterMode = AutoCompleteFilterMode.None;
+                control.Populating += (s, e) =>
+                {
+                    e.Cancel = true;
+                    populating = true;
+                };
+                control.Populated += (s, e) => populated = true;
+
+                textbox.Text = "accounti";
+                Dispatcher.UIThread.RunJobs();
+
+                Assert.True(populating);
+                Assert.False(populated);
+            });
+        }
+
+        [Fact]
+        public void Custom_Population_Supported()
+        {
+            RunTest((control, textbox) =>
+            {
+                string custom = "Custom!";
+                string search = "accounti";
+                bool populated = false;
+                bool populatedOk = false;
+                control.FilterMode = AutoCompleteFilterMode.None;
+                control.Populating += (s, e) =>
+                {
+                    control.Items = new string[] { custom };
+                    Assert.Equal(search, e.Parameter);
+                };
+                control.Populated += (s, e) =>
+                {
+                    populated = true;
+                    ReadOnlyCollection<object> collection = e.Data as ReadOnlyCollection<object>;
+                    populatedOk = collection != null && collection.Count == 1;
+                };
+
+                textbox.Text = search;
+                Dispatcher.UIThread.RunJobs();
+
+                Assert.True(populated);
+                Assert.True(populatedOk);
+            });
+        }
+
+        [Fact]
+        public void Text_Completion()
+        {
+            RunTest((control, textbox) =>
+            {
+                control.IsTextCompletionEnabled = true;
+                textbox.Text = "accounti";
+                textbox.SelectionStart = textbox.SelectionEnd = textbox.Text.Length;
+                Dispatcher.UIThread.RunJobs();
+                Assert.Equal("accounti", control.SearchText);
+                Assert.Equal("accounting", textbox.Text);
+            });
+        }
+
+        [Fact]
+        public void String_Search()
+        {
+            RunTest((control, textbox) =>
+            {
+                textbox.Text = "a";
+                Dispatcher.UIThread.RunJobs();
+                Assert.Equal(textbox.Text, control.Text);
+
+                textbox.Text = "acc";
+                Dispatcher.UIThread.RunJobs();
+                Assert.Equal(textbox.Text, control.Text);
+
+                textbox.Text = "a";
+                Dispatcher.UIThread.RunJobs();
+                Assert.Equal(textbox.Text, control.Text);
+
+                textbox.Text = "";
+                Dispatcher.UIThread.RunJobs();
+                Assert.Equal(textbox.Text, control.Text);
+
+                textbox.Text = "cook";
+                Dispatcher.UIThread.RunJobs();
+                Assert.Equal(textbox.Text, control.Text);
+
+                textbox.Text = "accept";
+                Dispatcher.UIThread.RunJobs();
+                Assert.Equal(textbox.Text, control.Text);
+
+                textbox.Text = "cook";
+                Dispatcher.UIThread.RunJobs();
+                Assert.Equal(textbox.Text, control.Text);
+            });
+        }
+
+        [Fact]
+        public void Item_Search()
+        {
+            RunTest((control, textbox) =>
+            {
+                control.FilterMode = AutoCompleteFilterMode.Custom;
+                control.ItemFilter = (search, item) =>
+                {
+                    string s = item as string;
+                    return s == null ? false : true;
+                };
+
+                // Just set to null briefly to exercise that code path
+                AutoCompleteFilterPredicate<object> filter = control.ItemFilter;
+                Assert.NotNull(filter);
+                control.ItemFilter = null;
+                Assert.Null(control.ItemFilter);
+                control.ItemFilter = filter;
+                Assert.NotNull(control.ItemFilter);
+
+                textbox.Text = "a";
+                Dispatcher.UIThread.RunJobs();
+                Assert.Equal(textbox.Text, control.Text);
+
+                textbox.Text = "acc";
+                Dispatcher.UIThread.RunJobs();
+                Assert.Equal(textbox.Text, control.Text);
+
+                textbox.Text = "a";
+                Dispatcher.UIThread.RunJobs();
+                Assert.Equal(textbox.Text, control.Text);
+
+                textbox.Text = "";
+                Dispatcher.UIThread.RunJobs();
+                Assert.Equal(textbox.Text, control.Text);
+
+                textbox.Text = "cook";
+                Dispatcher.UIThread.RunJobs();
+                Assert.Equal(textbox.Text, control.Text);
+
+                textbox.Text = "accept";
+                Dispatcher.UIThread.RunJobs();
+                Assert.Equal(textbox.Text, control.Text);
+
+                textbox.Text = "cook";
+                Dispatcher.UIThread.RunJobs();
+                Assert.Equal(textbox.Text, control.Text);
+            });
+        }
+        
+        /// <summary>
+        /// Retrieves a defined predicate filter through a new AutoCompleteBox 
+        /// control instance.
+        /// </summary>
+        /// <param name="mode">The FilterMode of interest.</param>
+        /// <returns>Returns the predicate instance.</returns>
+        private static AutoCompleteFilterPredicate<string> GetFilter(AutoCompleteFilterMode mode)
+        {
+            return new AutoCompleteBox { FilterMode = mode }
+                .TextFilter;
+        }
+
+        /// <summary>
+        /// Creates a large list of strings for AutoCompleteBox testing.
+        /// </summary>
+        /// <returns>Returns a new List of string values.</returns>
+        private 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",
+            };
+        }
+        private void RunTest(Action<AutoCompleteBox, TextBox> test)
+        {
+            using (UnitTestApplication.Start(Services))
+            {
+                AutoCompleteBox control = CreateControl();
+                control.Items = CreateSimpleStringArray();
+                TextBox textBox = GetTextBox(control);
+                Dispatcher.UIThread.RunJobs();
+                test.Invoke(control, textBox);
+            }
+        }
+
+        private static TestServices Services => TestServices.StyledWindow;
+
+        /*private static TestServices Services => TestServices.MockThreadingInterface.With(
+            standardCursorFactory: Mock.Of<IStandardCursorFactory>(),
+            windowingPlatform: new MockWindowingPlatform());*/
+
+        private AutoCompleteBox CreateControl()
+        {
+            var datePicker =
+                new AutoCompleteBox
+                {
+                    Template = CreateTemplate()
+                };
+
+            datePicker.ApplyTemplate();
+            return datePicker;
+        }
+        private TextBox GetTextBox(AutoCompleteBox control)
+        {
+            return control.GetTemplateChildren()
+                          .OfType<TextBox>()
+                          .First();
+        }
+        private IControlTemplate CreateTemplate()
+        {
+            return new FuncControlTemplate<AutoCompleteBox>(control =>
+            {
+                var textBox =
+                    new TextBox
+                    {
+                        Name = "PART_TextBox"
+                    };
+                var listbox =
+                    new ListBox
+                    {
+                        Name = "PART_SelectingItemsControl"
+                    };
+                var popup =
+                    new Popup
+                    {
+                        Name = "PART_Popup"
+                    };
+
+                var panel = new Panel();
+                panel.Children.Add(textBox);
+                panel.Children.Add(popup);
+                panel.Children.Add(listbox);
+
+                return panel;
+            });
+        }
+    }
+}