From 8ba233c8630e4f2d722e2f69a9eebfbec55d047a Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Fri, 7 Apr 2017 16:28:38 -0700 Subject: [PATCH 01/11] Avoid unnecessary allocation. --- src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs b/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs index 24ac755b4365b..c01d547b5ba6e 100644 --- a/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs +++ b/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs @@ -35,7 +35,7 @@ internal sealed partial class PatternMatcher : IDisposable private readonly PatternSegment[] _dotSeparatedPatternSegments; private readonly Dictionary _stringToWordSpans = new Dictionary(); - private readonly Func _breakIntoWordSpans = StringBreaker.BreakIntoWordParts; + private static readonly Func _breakIntoWordSpans = StringBreaker.BreakIntoWordParts; // PERF: Cache the culture's compareInfo to avoid the overhead of asking for them repeatedly in inner loops private readonly CompareInfo _compareInfo; From a62d1ed751de080fc789fdf5df1d137b8c993a9c Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Fri, 7 Apr 2017 17:01:20 -0700 Subject: [PATCH 02/11] Fix issue where we weren't matching effectively when a candidate contained an underscore. --- .../Test/Utilities/PatternMatcherTests.cs | 100 +++++++++++++----- .../PatternMatching/PatternMatcher.cs | 15 +++ .../Shared/Utilities/StringBreaker.cs | 3 +- 3 files changed, 93 insertions(+), 25 deletions(-) diff --git a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs index f4423e5b6417d..86711299caef1 100644 --- a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs +++ b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs @@ -167,13 +167,65 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part AssertEx.Equal(parts, BreakIntoCharacterParts(original)); } + [Fact] + public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern1() + { + var match = TryMatchSingleWordPattern("_[|my|]Button", "my"); + + Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); + Assert.True(match.Value.IsCaseSensitive); + } + + [Fact] + public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern2() + { + var match = TryMatchSingleWordPattern("_[|myB|]utton", "myB"); + + Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); + Assert.True(match.Value.IsCaseSensitive); + } + + [Fact] + public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern3() + { + var match = TryMatchSingleWordPattern("_[|myB|]utton", "myb"); + + Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); + Assert.False(match.Value.IsCaseSensitive); + } + + [Fact] + public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern4() + { + var match = TryMatchSingleWordPattern("_[|my|]button", "my"); + + Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); + Assert.True(match.Value.IsCaseSensitive); + } + + [Fact] + public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern5() + { + var match = TryMatchSingleWordPattern("_mybutton", "myB"); + Assert.Null(match); + } + + [Fact] + public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern6() + { + var match = TryMatchSingleWordPattern("_[|myb|]utton", "myb"); + + Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); + Assert.True(match.Value.IsCaseSensitive); + } + [Fact] public void TryMatchSingleWordPattern_PreferCaseSensitiveExact() { var match = TryMatchSingleWordPattern("[|Foo|]", "Foo"); Assert.Equal(PatternMatchKind.Exact, match.Value.Kind); - Assert.Equal(true, match.Value.IsCaseSensitive); + Assert.True(match.Value.IsCaseSensitive); } [Fact] @@ -182,7 +234,7 @@ public void TryMatchSingleWordPattern_SingleWordPreferCaseSensitiveExactInsensit var match = TryMatchSingleWordPattern("[|foo|]", "Foo"); Assert.Equal(PatternMatchKind.Exact, match.Value.Kind); - Assert.Equal(false, match.Value.IsCaseSensitive); + Assert.False(match.Value.IsCaseSensitive); } [Fact] @@ -191,7 +243,7 @@ public void TryMatchSingleWordPattern_PreferCaseSensitivePrefix() var match = TryMatchSingleWordPattern("[|Fo|]o", "Fo"); Assert.Equal(PatternMatchKind.Prefix, match.Value.Kind); - Assert.Equal(true, match.Value.IsCaseSensitive); + Assert.True(match.Value.IsCaseSensitive); } [Fact] @@ -200,7 +252,7 @@ public void TryMatchSingleWordPattern_PreferCaseSensitivePrefixCaseInsensitive() var match = TryMatchSingleWordPattern("[|Fo|]o", "fo"); Assert.Equal(PatternMatchKind.Prefix, match.Value.Kind); - Assert.Equal(false, match.Value.IsCaseSensitive); + Assert.False(match.Value.IsCaseSensitive); } [Fact] @@ -209,7 +261,7 @@ public void TryMatchSingleWordPattern_PreferCaseSensitiveCamelCaseMatchSimple() var match = TryMatchSingleWordPattern("[|F|]og[|B|]ar", "FB"); Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.Equal(true, match.Value.IsCaseSensitive); + Assert.True(match.Value.IsCaseSensitive); Assert.InRange((int)match.Value.CamelCaseWeight, 1, int.MaxValue); } @@ -219,7 +271,7 @@ public void TryMatchSingleWordPattern_PreferCaseSensitiveCamelCaseMatchPartialPa var match = TryMatchSingleWordPattern("[|Fo|]g[|B|]ar", "FoB"); Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.Equal(true, match.Value.IsCaseSensitive); + Assert.True(match.Value.IsCaseSensitive); } [Fact] @@ -279,7 +331,7 @@ public void TryMatchSingleWordPattern_PreferCaseSensitiveLowercasePattern2() var match = TryMatchSingleWordPattern("[|F|]og[|B|]ar", "fB"); Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.Equal(false, match.Value.IsCaseSensitive); + Assert.False(match.Value.IsCaseSensitive); } [Fact] @@ -288,7 +340,7 @@ public void TryMatchSingleWordPattern_PreferCaseSensitiveTryUnderscoredName() var match = TryMatchSingleWordPattern("[|_f|]og[|B|]ar", "_fB"); Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.Equal(true, match.Value.IsCaseSensitive); + Assert.True(match.Value.IsCaseSensitive); } public void TryMatchSingleWordPattern_PreferCaseSensitiveTryUnderscoredName2() @@ -296,7 +348,7 @@ public void TryMatchSingleWordPattern_PreferCaseSensitiveTryUnderscoredName2() var match = TryMatchSingleWordPattern("_[|f|]og[|B|]ar", "fB"); Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.Equal(true, match.Value.IsCaseSensitive); + Assert.True(match.Value.IsCaseSensitive); } [Fact] @@ -305,7 +357,7 @@ public void TryMatchSingleWordPattern_PreferCaseSensitiveTryUnderscoredNameInsen var match = TryMatchSingleWordPattern("[|_F|]og[|B|]ar", "_fB"); Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.Equal(false, match.Value.IsCaseSensitive); + Assert.False(match.Value.IsCaseSensitive); } [Fact] @@ -314,7 +366,7 @@ public void TryMatchSingleWordPattern_PreferCaseSensitiveMiddleUnderscore() var match = TryMatchSingleWordPattern("[|F|]og_[|B|]ar", "FB"); Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.Equal(true, match.Value.IsCaseSensitive); + Assert.True(match.Value.IsCaseSensitive); } [Fact] @@ -323,7 +375,7 @@ public void TryMatchSingleWordPattern_PreferCaseSensitiveMiddleUnderscore2() var match = TryMatchSingleWordPattern("[|F|]og[|_B|]ar", "F_B"); Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.Equal(true, match.Value.IsCaseSensitive); + Assert.True(match.Value.IsCaseSensitive); } [Fact] @@ -340,7 +392,7 @@ public void TryMatchSingleWordPattern_PreferCaseSensitiveMiddleUnderscore4() var match = TryMatchSingleWordPattern("[|F|]og[|_B|]ar", "f_B"); Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.Equal(false, match.Value.IsCaseSensitive); + Assert.False(match.Value.IsCaseSensitive); } [Fact] @@ -349,7 +401,7 @@ public void TryMatchSingleWordPattern_PreferCaseSensitiveMiddleUnderscore5() var match = TryMatchSingleWordPattern("[|F|]og[|_B|]ar", "F_b"); Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.Equal(false, match.Value.IsCaseSensitive); + Assert.False(match.Value.IsCaseSensitive); } [Fact] @@ -388,7 +440,7 @@ public void TryMatchSingleWordPattern_PreferCaseInsensitiveBasicEquals() var match = TryMatchSingleWordPattern("[|Foo|]", "foo"); Assert.Equal(PatternMatchKind.Exact, match.Value.Kind); - Assert.Equal(false, match.Value.IsCaseSensitive); + Assert.False(match.Value.IsCaseSensitive); } [Fact] @@ -398,7 +450,7 @@ public void TryMatchSingleWordPattern_PreferCaseInsensitiveBasicEquals2() // Since it's actually case sensitive, we'll report it as such even though we didn't prefer it Assert.Equal(PatternMatchKind.Exact, match.Value.Kind); - Assert.Equal(true, match.Value.IsCaseSensitive); + Assert.True(match.Value.IsCaseSensitive); } [Fact] @@ -407,7 +459,7 @@ public void TryMatchSingleWordPattern_PreferCaseInsensitiveBasicPrefix() var match = TryMatchSingleWordPattern("[|Fog|]Bar", "fog"); Assert.Equal(PatternMatchKind.Prefix, match.Value.Kind); - Assert.Equal(false, match.Value.IsCaseSensitive); + Assert.False(match.Value.IsCaseSensitive); } [Fact] @@ -416,7 +468,7 @@ public void TryMatchSingleWordPattern_PreferCaseInsensitiveBasicPrefix2() var match = TryMatchSingleWordPattern("[|Fog|]Bar", "Fog"); Assert.Equal(PatternMatchKind.Prefix, match.Value.Kind); - Assert.Equal(true, match.Value.IsCaseSensitive); + Assert.True(match.Value.IsCaseSensitive); } [Fact] @@ -425,7 +477,7 @@ public void TryMatchSingleWordPattern_PreferCaseInsensitiveCamelCase1() var match = TryMatchSingleWordPattern("[|F|]og[|B|]ar", "FB"); Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.Equal(true, match.Value.IsCaseSensitive); + Assert.True(match.Value.IsCaseSensitive); } [Fact] @@ -434,7 +486,7 @@ public void TryMatchSingleWordPattern_PreferCaseInsensitiveCamelCase2() var match = TryMatchSingleWordPattern("[|F|]og[|B|]ar", "fB"); Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.Equal(false, match.Value.IsCaseSensitive); + Assert.False(match.Value.IsCaseSensitive); } [Fact] @@ -443,7 +495,7 @@ public void TryMatchSingleWordPattern_PreferCaseInsensitiveCamelCase3() var match = TryMatchSingleWordPattern("[|f|]og[|B|]ar", "fB"); Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.Equal(true, match.Value.IsCaseSensitive); + Assert.True(match.Value.IsCaseSensitive); } [Fact] @@ -461,7 +513,7 @@ public void TryMatchSingleWordPattern_PreferCaseInsensitiveWhenPrefix() var match = TryMatchSingleWordPattern("[|fog|]BarFoo", "Fog"); Assert.Equal(PatternMatchKind.Prefix, match.Value.Kind); - Assert.Equal(false, match.Value.IsCaseSensitive); + Assert.False(match.Value.IsCaseSensitive); } [Fact] @@ -470,7 +522,7 @@ public void TryMatchSingleWordPattern_CamelCase1() var match = TryMatchSingleWordPattern("[|Fo|]oBarry[|Bas|]il", "FoBas"); Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.Equal(true, match.Value.IsCaseSensitive); + Assert.True(match.Value.IsCaseSensitive); } [Fact] @@ -485,7 +537,7 @@ public void TryMatchSingleWordPattern_CamelCase3() var match = TryMatchSingleWordPattern("[|AbCd|]xxx[|Ef|]Cd[|Gh|]", "AbCdEfGh"); Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.Equal(true, match.Value.IsCaseSensitive); + Assert.True(match.Value.IsCaseSensitive); } private void AssertContainsType(PatternMatchKind type, IEnumerable results) diff --git a/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs b/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs index c01d547b5ba6e..79f91ece7963a 100644 --- a/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs +++ b/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs @@ -333,6 +333,21 @@ private static bool ContainsUpperCaseLetter(string pattern) // Note: We only have a substring match if the lowercase part is prefix match of some // word part. That way we don't match something like 'Class' when the user types 'a'. // But we would match 'FooAttribute' (since 'Attribute' starts with 'a'). + // + // Also, if we matched at location right after punctuation, then this is a good + // substring match. i.e. if the user is testing mybutton against _myButton + // then this should hit. As we really are finding the match at the beginning of + // a word. + if (char.IsPunctuation(candidate[caseInsensitiveIndex - 1])) + { + return new PatternMatch( + PatternMatchKind.Substring, punctuationStripped, + isCaseSensitive: PartStartsWith( + candidate, new TextSpan(caseInsensitiveIndex, patternChunk.Text.Length), + patternChunk.Text, CompareOptions.None), + matchedSpan: GetMatchedSpan(includeMatchSpans, caseInsensitiveIndex, patternChunk.Text.Length)); + } + var wordSpans = GetWordSpans(candidate); for (int i = 0; i < wordSpans.Count; i++) { diff --git a/src/Workspaces/Core/Portable/Shared/Utilities/StringBreaker.cs b/src/Workspaces/Core/Portable/Shared/Utilities/StringBreaker.cs index c5de38012b186..0785e57af16af 100644 --- a/src/Workspaces/Core/Portable/Shared/Utilities/StringBreaker.cs +++ b/src/Workspaces/Core/Portable/Shared/Utilities/StringBreaker.cs @@ -203,7 +203,8 @@ public static StringBreaks BreakIntoCharacterParts(string identifier) /// /// Breaks an identifier string into constituent parts. /// - public static StringBreaks BreakIntoWordParts(string identifier) => StringBreaks.Create(identifier, s_wordPartsGenerator); + public static StringBreaks BreakIntoWordParts(string identifier) + => StringBreaks.Create(identifier, s_wordPartsGenerator); private static readonly Func s_characterPartsGenerator = (identifier, start) => GenerateSpan(identifier, start, word: false); From 40d46b7736a3d674e0d26efb92210bfc47cfbdd4 Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Fri, 7 Apr 2017 17:13:10 -0700 Subject: [PATCH 03/11] Add tests. --- .../Test/Utilities/PatternMatcherTests.cs | 53 +++++++++++++++++++ .../PatternMatching/PatternMatcher.cs | 3 +- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs index 86711299caef1..5e477679de2b6 100644 --- a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs +++ b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs @@ -219,6 +219,59 @@ public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern6() Assert.True(match.Value.IsCaseSensitive); } + [Fact] + public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern7() + { + var match = TryMatchSingleWordPattern("_my[|_b|]utton", "_b"); + + Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); + Assert.True(match.Value.IsCaseSensitive); + } + + [Fact] + public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern8() + { + var match = TryMatchSingleWordPattern("_my[|_B|]utton", "_b"); + + Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); + Assert.False(match.Value.IsCaseSensitive); + } + + [Fact] + public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern9() + { + var match = TryMatchSingleWordPattern("[|_|]my_[|b|]utton", "_B"); + + Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); + Assert.False(match.Value.IsCaseSensitive); + } + + [Fact] + public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern10() + { + var match = TryMatchSingleWordPattern("my[|_b|]utton", "_b"); + + Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); + Assert.True(match.Value.IsCaseSensitive); + } + + [Fact] + public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern11() + { + var match = TryMatchSingleWordPattern("my[|_B|]utton", "_b"); + + Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); + Assert.False(match.Value.IsCaseSensitive); + } + + [Fact] + public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern12() + { + var match = TryMatchSingleWordPattern("my[|_b|]utton", "_B"); + Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); + Assert.False(match.Value.IsCaseSensitive); + } + [Fact] public void TryMatchSingleWordPattern_PreferCaseSensitiveExact() { diff --git a/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs b/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs index 79f91ece7963a..31c42ab5cee54 100644 --- a/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs +++ b/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs @@ -338,7 +338,8 @@ private static bool ContainsUpperCaseLetter(string pattern) // substring match. i.e. if the user is testing mybutton against _myButton // then this should hit. As we really are finding the match at the beginning of // a word. - if (char.IsPunctuation(candidate[caseInsensitiveIndex - 1])) + if (char.IsPunctuation(candidate[caseInsensitiveIndex - 1]) || + char.IsPunctuation(patternChunk.Text[0])) { return new PatternMatch( PatternMatchKind.Substring, punctuationStripped, From e50d8a7908864013b7ce16270bfe2302cd4e0b5d Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Fri, 7 Apr 2017 18:21:40 -0700 Subject: [PATCH 04/11] Move to theories to describe tests. --- .../Test/Utilities/PatternMatcherTests.cs | 628 +++--------------- .../PatternMatching/PatternMatcher.cs | 1 + 2 files changed, 94 insertions(+), 535 deletions(-) diff --git a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs index 5e477679de2b6..822e8165020cc 100644 --- a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs +++ b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs @@ -1,10 +1,12 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Globalization; +using System.IO; using System.Linq; +using System.Text; using System.Threading; using Microsoft.CodeAnalysis.PatternMatching; using Microsoft.CodeAnalysis.Shared.Utilities; @@ -167,432 +169,102 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part AssertEx.Equal(parts, BreakIntoCharacterParts(original)); } - [Fact] - public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern1() - { - var match = TryMatchSingleWordPattern("_[|my|]Button", "my"); - - Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern2() - { - var match = TryMatchSingleWordPattern("_[|myB|]utton", "myB"); - - Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern3() - { - var match = TryMatchSingleWordPattern("_[|myB|]utton", "myb"); - - Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern4() - { - var match = TryMatchSingleWordPattern("_[|my|]button", "my"); - - Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern5() - { - var match = TryMatchSingleWordPattern("_mybutton", "myB"); - Assert.Null(match); - } - - [Fact] - public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern6() - { - var match = TryMatchSingleWordPattern("_[|myb|]utton", "myb"); - - Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern7() - { - var match = TryMatchSingleWordPattern("_my[|_b|]utton", "_b"); - - Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern8() - { - var match = TryMatchSingleWordPattern("_my[|_B|]utton", "_b"); - - Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern9() - { - var match = TryMatchSingleWordPattern("[|_|]my_[|b|]utton", "_B"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern10() - { - var match = TryMatchSingleWordPattern("my[|_b|]utton", "_b"); - - Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern11() - { - var match = TryMatchSingleWordPattern("my[|_B|]utton", "_b"); - - Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_UnderscoreInCandidateButNotInPattern12() - { - var match = TryMatchSingleWordPattern("my[|_b|]utton", "_B"); - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveExact() - { - var match = TryMatchSingleWordPattern("[|Foo|]", "Foo"); - - Assert.Equal(PatternMatchKind.Exact, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_SingleWordPreferCaseSensitiveExactInsensitive() - { - var match = TryMatchSingleWordPattern("[|foo|]", "Foo"); - - Assert.Equal(PatternMatchKind.Exact, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitivePrefix() - { - var match = TryMatchSingleWordPattern("[|Fo|]o", "Fo"); - - Assert.Equal(PatternMatchKind.Prefix, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitivePrefixCaseInsensitive() - { - var match = TryMatchSingleWordPattern("[|Fo|]o", "fo"); - - Assert.Equal(PatternMatchKind.Prefix, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveCamelCaseMatchSimple() - { - var match = TryMatchSingleWordPattern("[|F|]og[|B|]ar", "FB"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - Assert.InRange((int)match.Value.CamelCaseWeight, 1, int.MaxValue); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveCamelCaseMatchPartialPattern() - { - var match = TryMatchSingleWordPattern("[|Fo|]g[|B|]ar", "FoB"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveCamelCaseMatchToLongPattern1() - { - var match = TryMatchSingleWordPattern("FogBar", "FBB"); - - Assert.Null(match); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveCamelCaseMatchToLongPattern2() - { - var match = TryMatchSingleWordPattern("FogBar", "FoooB"); - - Assert.Null(match); - } - - [Fact] - public void TryMatchSingleWordPattern_CamelCaseMatchPartiallyUnmatched() - { - var match = TryMatchSingleWordPattern("FogBarBaz", "FZ"); - - Assert.Null(match); - } - - [Fact] - public void TryMatchSingleWordPattern_CamelCaseMatchCompletelyUnmatched() - { - var match = TryMatchSingleWordPattern("FogBarBaz", "ZZ"); - - Assert.Null(match); - } - - [Fact] - [WorkItem(544975, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544975")] - public void TryMatchSingleWordPattern_TwoUppercaseCharacters() - { - var match = TryMatchSingleWordPattern("[|Si|]mple[|UI|]Element", "SiUI"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveLowercasePattern() - { - var match = TryMatchSingleWordPattern("Fog[|B|]ar", "b"); - - Assert.Equal(PatternMatchKind.Substring, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveLowercasePattern2() - { - var match = TryMatchSingleWordPattern("[|F|]og[|B|]ar", "fB"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveTryUnderscoredName() - { - var match = TryMatchSingleWordPattern("[|_f|]og[|B|]ar", "_fB"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - public void TryMatchSingleWordPattern_PreferCaseSensitiveTryUnderscoredName2() - { - var match = TryMatchSingleWordPattern("_[|f|]og[|B|]ar", "fB"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveTryUnderscoredNameInsensitive() - { - var match = TryMatchSingleWordPattern("[|_F|]og[|B|]ar", "_fB"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveMiddleUnderscore() - { - var match = TryMatchSingleWordPattern("[|F|]og_[|B|]ar", "FB"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveMiddleUnderscore2() - { - var match = TryMatchSingleWordPattern("[|F|]og[|_B|]ar", "F_B"); + private const bool CaseSensitive = true; + private const bool CaseInsensitive = !CaseSensitive; + + [Theory] + [InlineData("BazBar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] + [InlineData("Baz[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.NoBonus)] + [InlineData("[|CO|]DE_FIX_[|PRO|]VIDER", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("_[|my|]Button", "my", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("[|F|]og[|B|]ar", "fB", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("Fog[|B|]ar", "b", PatternMatchKind.Substring, CaseInsensitive)] + [InlineData("Abcdefghij[|EfgHij|]", "efghij", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] + [InlineData("[|F|]og[|_B|]ar", "F_b", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("_[|co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.NoBonus)] + [InlineData("Code[|Fi|]x[|Pro|]vider", "fipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] + [InlineData("[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("Bar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] + [InlineData("[|Foo|]", "Foo", PatternMatchKind.Exact, CaseSensitive)] + [InlineData("[|AbCd|]xxx[|Ef|]Cd[|Gh|]", "AbCdEfGh", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("_my[|_b|]utton", "_b", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("[|_f|]og[|B|]ar", "_fB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|Fog|]Bar", "fog", PatternMatchKind.Prefix, CaseInsensitive)] + [InlineData("[|Co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] + [InlineData("[|F|]og_[|B|]ar", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("[|foo|]", "Foo", PatternMatchKind.Exact, CaseInsensitive)] + [InlineData("FogBar[|ChangedEventArgs|]", "changedeventargs", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] + [InlineData("my[|_b|]utton", "_b", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("[|fog|]BarFoo", "Fog", PatternMatchKind.Prefix, CaseInsensitive)] + [InlineData("[|C|]lear[|Ofi|]lac[|Pro|]fessional", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|C|]ore[|Ofi|]lac[|Pro|]fessional", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|Fo|]o", "fo", PatternMatchKind.Prefix, CaseInsensitive)] + [InlineData("[|_F|]og[|B|]ar", "_fB", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|F|]og[|_B|]ar", "f_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|Si|]mple[|UI|]Element", "SiUI", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("A[|BCD|]EFGH", "bcd", PatternMatchKind.Substring, CaseInsensitive)] + [InlineData("[|_|]my_[|b|]utton", "_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("[|Fo|]g[|B|]ar", "FoB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("_[|myb|]utton", "myb", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("[|Fo|]o", "Fo", PatternMatchKind.Prefix, CaseSensitive)] + [InlineData("_my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] + [InlineData("[|Foo|]", "foo", PatternMatchKind.Exact, CaseInsensitive)] + [InlineData("[|Co|]de[|Fi|]x[|Pro|]vider", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("Code[|Fi|]xObject[|Pro|]vider", "fipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.NoBonus)] + [InlineData("_[|myB|]utton", "myB", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("_[|my|]button", "my", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("[|F|]og[|B|]ar", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|Fo|]oBarry[|Bas|]il", "FoBas", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("_[|myB|]utton", "myb", PatternMatchKind.Substring, CaseInsensitive)] + [InlineData("[|F|]og[|B|]arBaz", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|F|]ooFlob[|B|]az", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("[|F|]og[|_B|]ar", "F_B", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|Co|]deFix_[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("[|co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("[|Fog|]Bar", "Fog", PatternMatchKind.Prefix, CaseSensitive)] + [InlineData("my[|_b|]utton", "_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] + public void TryMatchSingleWordPattern( + string candidate, string pattern, int matchKindInt, bool isCaseSensitive, int? camelCaseWeight = null) + { + var match = TryMatchSingleWordPattern(candidate, pattern); + Assert.NotNull(match); + + var matchKind = (PatternMatchKind)matchKindInt; + Assert.Equal(match.Value.Kind, matchKind); + Assert.Equal(match.Value.IsCaseSensitive, isCaseSensitive); + + if (matchKind == PatternMatchKind.CamelCase) + { + Assert.NotNull(match.Value.CamelCaseWeight); + Assert.NotNull(camelCaseWeight); - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); + Assert.Equal(match.Value.CamelCaseWeight, camelCaseWeight); + } + else + { + Assert.Null(match.Value.CamelCaseWeight); + Assert.Null(camelCaseWeight); + } } - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveMiddleUnderscore3() - { - var match = TryMatchSingleWordPattern("Fog_Bar", "F__B"); - + [Theory] + [InlineData("CodeFixObjectProvider", "ficopro")] + [InlineData("FogBar", "FBB")] + [InlineData("FogBarBaz", "ZZ")] + [InlineData("FogBar", "FoooB")] + [InlineData("FooActBarCatAlp", "FooAlpBarCat")] + [InlineData("Abcdefghijefghij", "efghij")] + [InlineData("Fog_Bar", "F__B")] + [InlineData("FogBarBaz", "FZ")] + [InlineData("_mybutton", "myB")] + [InlineData("FogBarChangedEventArgs", "changedeventarrrgh")] + public void TryMatchSingleWordPattern_NoMatch(string candidate, string pattern) + { + var match = TryMatchSingleWordPattern(candidate, pattern); Assert.Null(match); } - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveMiddleUnderscore4() - { - var match = TryMatchSingleWordPattern("[|F|]og[|_B|]ar", "f_B"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveMiddleUnderscore5() - { - var match = TryMatchSingleWordPattern("[|F|]og[|_B|]ar", "F_b"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveRelativeWeights1() - { - var match1 = TryMatchSingleWordPattern("[|F|]og[|B|]arBaz", "FB"); - var match2 = TryMatchSingleWordPattern("[|F|]ooFlob[|B|]az", "FB"); - - // We should prefer something that starts at the beginning if possible - Assert.InRange((int)match1.Value.CamelCaseWeight, (int)match2.Value.CamelCaseWeight + 1, int.MaxValue); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveRelativeWeights2() - { - var match1 = TryMatchSingleWordPattern("BazBar[|F|]oo[|F|]oo[|F|]oo", "FFF"); - var match2 = TryMatchSingleWordPattern("Baz[|F|]ogBar[|F|]oo[|F|]oo", "FFF"); - - // Contiguous things should also be preferred - Assert.InRange((int)match1.Value.CamelCaseWeight, (int)match2.Value.CamelCaseWeight + 1, int.MaxValue); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveRelativeWeights3() - { - var match1 = TryMatchSingleWordPattern("[|F|]ogBar[|F|]oo[|F|]oo", "FFF"); - var match2 = TryMatchSingleWordPattern("Bar[|F|]oo[|F|]oo[|F|]oo", "FFF"); - - // The weight of being first should be greater than the weight of being contiguous - Assert.InRange((int)match1.Value.CamelCaseWeight, (int)match2.Value.CamelCaseWeight + 1, int.MaxValue); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseInsensitiveBasicEquals() - { - var match = TryMatchSingleWordPattern("[|Foo|]", "foo"); - - Assert.Equal(PatternMatchKind.Exact, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseInsensitiveBasicEquals2() - { - var match = TryMatchSingleWordPattern("[|Foo|]", "Foo"); - - // Since it's actually case sensitive, we'll report it as such even though we didn't prefer it - Assert.Equal(PatternMatchKind.Exact, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseInsensitiveBasicPrefix() - { - var match = TryMatchSingleWordPattern("[|Fog|]Bar", "fog"); - - Assert.Equal(PatternMatchKind.Prefix, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseInsensitiveBasicPrefix2() - { - var match = TryMatchSingleWordPattern("[|Fog|]Bar", "Fog"); - - Assert.Equal(PatternMatchKind.Prefix, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseInsensitiveCamelCase1() - { - var match = TryMatchSingleWordPattern("[|F|]og[|B|]ar", "FB"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseInsensitiveCamelCase2() - { - var match = TryMatchSingleWordPattern("[|F|]og[|B|]ar", "fB"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseInsensitiveCamelCase3() - { - var match = TryMatchSingleWordPattern("[|f|]og[|B|]ar", "fB"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseSensitiveWhenPrefix() - { - var match = TryMatchSingleWordPattern("[|fog|]BarFoo", "Fog"); - - Assert.Equal(PatternMatchKind.Prefix, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_PreferCaseInsensitiveWhenPrefix() - { - var match = TryMatchSingleWordPattern("[|fog|]BarFoo", "Fog"); - - Assert.Equal(PatternMatchKind.Prefix, match.Value.Kind); - Assert.False(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_CamelCase1() - { - var match = TryMatchSingleWordPattern("[|Fo|]oBarry[|Bas|]il", "FoBas"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - - [Fact] - public void TryMatchSingleWordPattern_CamelCase2() - { - Assert.Null(TryMatchSingleWordPattern("FooActBarCatAlp", "FooAlpBarCat")); - } - - [Fact] - public void TryMatchSingleWordPattern_CamelCase3() - { - var match = TryMatchSingleWordPattern("[|AbCd|]xxx[|Ef|]Cd[|Gh|]", "AbCdEfGh"); - - Assert.Equal(PatternMatchKind.CamelCase, match.Value.Kind); - Assert.True(match.Value.IsCaseSensitive); - } - private void AssertContainsType(PatternMatchKind type, IEnumerable results) { Assert.True(results.Any(r => r.Kind == type)); @@ -799,120 +471,6 @@ public void TryMatchSingleWordPattern_CultureAwareSingleWordPreferCaseSensitiveE } } - [Fact] - public void MatchAllLowerPattern1() - { - Assert.NotNull(TryMatchSingleWordPattern("FogBar[|ChangedEventArgs|]", "changedeventargs")); - } - - [Fact] - public void MatchAllLowerPattern2() - { - Assert.Null(TryMatchSingleWordPattern("FogBarChangedEventArgs", "changedeventarrrgh")); - } - - [Fact] - public void MatchAllLowerPattern3() - { - Assert.NotNull(TryMatchSingleWordPattern("A[|BCD|]EFGH", "bcd")); - } - - [Fact] - public void MatchAllLowerPattern4() - { - Assert.NotNull(TryMatchSingleWordPattern("Abcdefghij[|EfgHij|]", "efghij")); - } - - [Fact] - public void MatchAllLowerPattern5() - { - Assert.Null(TryMatchSingleWordPattern("Abcdefghijefghij", "efghij")); - } - - [Fact] - public void MatchAllLowerCamelCasePattern1() - { - var result =TryMatchSingleWordPattern("[|Co|]de[|Fi|]x[|Pro|]vider", "cofipro"); - Assert.NotNull(result); - Assert.Equal(PatternMatcher.CamelCaseMaxWeight, result.Value.CamelCaseWeight); - } - - [Fact] - public void MatchAllLowerCamelCasePattern2() - { - Assert.NotNull(TryMatchSingleWordPattern("[|C|]lear[|Ofi|]lac[|Pro|]fessional", "cofipro")); - } - - [Fact] - public void MatchAllLowerCamelCasePattern3() - { - Assert.NotNull(TryMatchSingleWordPattern("[|C|]ore[|Ofi|]lac[|Pro|]fessional", "cofipro")); - } - - [Fact] - public void MatchAllLowerCamelCasePattern4() - { - var result = TryMatchSingleWordPattern("[|Co|]deFix[|Pro|]vider", "copro"); - Assert.NotNull(result); - Assert.Equal(PatternMatcher.CamelCaseMatchesFromStartBonus, result.Value.CamelCaseWeight); - } - - [Fact] - public void MatchAllLowerCamelCasePattern5() - { - var result = TryMatchSingleWordPattern("Code[|Fi|]x[|Pro|]vider", "fipro"); - Assert.NotNull(result); - Assert.Equal(PatternMatcher.CamelCaseContiguousBonus, result.Value.CamelCaseWeight); - } - - [Fact] - public void MatchAllLowerCamelCasePattern6() - { - var result = TryMatchSingleWordPattern("Code[|Fi|]xObject[|Pro|]vider", "fipro"); - Assert.NotNull(result); - Assert.Equal(0, result.Value.CamelCaseWeight); - } - - [Fact] - public void MatchAllLowerCamelCasePattern7() - { - var result = TryMatchSingleWordPattern("[|co|]deFix[|Pro|]vider", "copro"); - Assert.NotNull(result); - Assert.Equal(PatternMatcher.CamelCaseMatchesFromStartBonus, result.Value.CamelCaseWeight); - } - - [Fact] - public void MatchAllLowerCamelCasePattern8() - { - var result = TryMatchSingleWordPattern("_[|co|]deFix[|Pro|]vider", "copro"); - Assert.NotNull(result); - Assert.Equal(0, result.Value.CamelCaseWeight); - } - - [Fact] - public void MatchAllLowerCamelCasePattern9() - { - var result = TryMatchSingleWordPattern("[|Co|]deFix_[|Pro|]vider", "copro"); - Assert.NotNull(result); - Assert.Equal(PatternMatcher.CamelCaseMatchesFromStartBonus, result.Value.CamelCaseWeight); - } - - [Fact] - public void MatchAllLowerCamelCasePattern10() - { - var result = TryMatchSingleWordPattern("[|CO|]DE_FIX_[|PRO|]VIDER", "copro"); - Assert.NotNull(result); - Assert.Equal(PatternMatcher.CamelCaseMatchesFromStartBonus, result.Value.CamelCaseWeight); - } - - [Fact] - public void DoNotMatchAllLowerCamelCasePatternReordered() - { - // We could consider supporting this in the future. - var result = TryMatchSingleWordPattern("CodeFixObjectProvider", "ficopro"); - Assert.Null(result); - } - private static IList PartListToSubstrings(string identifier, StringBreaks parts) { var result = new List(); diff --git a/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs b/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs index 31c42ab5cee54..bd72bcb6c9973 100644 --- a/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs +++ b/src/Workspaces/Core/Portable/PatternMatching/PatternMatcher.cs @@ -21,6 +21,7 @@ namespace Microsoft.CodeAnalysis.PatternMatching /// internal sealed partial class PatternMatcher : IDisposable { + public const int NoBonus = 0; public const int CamelCaseContiguousBonus = 1; public const int CamelCaseMatchesFromStartBonus = 2; public const int CamelCaseMaxWeight = CamelCaseContiguousBonus + CamelCaseMatchesFromStartBonus; From 49eb06150bf07649ce96a1e01b4c9f64a75381cd Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Fri, 7 Apr 2017 18:22:23 -0700 Subject: [PATCH 05/11] Move exact tests first. --- src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs index 822e8165020cc..9d92dd34161ae 100644 --- a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs +++ b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs @@ -173,6 +173,9 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part private const bool CaseInsensitive = !CaseSensitive; [Theory] + [InlineData("[|Foo|]", "Foo", PatternMatchKind.Exact, CaseSensitive)] + [InlineData("[|foo|]", "Foo", PatternMatchKind.Exact, CaseInsensitive)] + [InlineData("[|Foo|]", "foo", PatternMatchKind.Exact, CaseInsensitive)] [InlineData("BazBar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("Baz[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.NoBonus)] [InlineData("[|CO|]DE_FIX_[|PRO|]VIDER", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] @@ -185,7 +188,6 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part [InlineData("Code[|Fi|]x[|Pro|]vider", "fipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("Bar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] - [InlineData("[|Foo|]", "Foo", PatternMatchKind.Exact, CaseSensitive)] [InlineData("[|AbCd|]xxx[|Ef|]Cd[|Gh|]", "AbCdEfGh", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("_my[|_b|]utton", "_b", PatternMatchKind.Substring, CaseSensitive)] [InlineData("[|_f|]og[|B|]ar", "_fB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] @@ -193,7 +195,6 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part [InlineData("[|Co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("[|F|]og_[|B|]ar", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] - [InlineData("[|foo|]", "Foo", PatternMatchKind.Exact, CaseInsensitive)] [InlineData("FogBar[|ChangedEventArgs|]", "changedeventargs", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("my[|_b|]utton", "_b", PatternMatchKind.Substring, CaseSensitive)] [InlineData("[|fog|]BarFoo", "Fog", PatternMatchKind.Prefix, CaseInsensitive)] @@ -209,7 +210,6 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part [InlineData("_[|myb|]utton", "myb", PatternMatchKind.Substring, CaseSensitive)] [InlineData("[|Fo|]o", "Fo", PatternMatchKind.Prefix, CaseSensitive)] [InlineData("_my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] - [InlineData("[|Foo|]", "foo", PatternMatchKind.Exact, CaseInsensitive)] [InlineData("[|Co|]de[|Fi|]x[|Pro|]vider", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("Code[|Fi|]xObject[|Pro|]vider", "fipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.NoBonus)] [InlineData("_[|myB|]utton", "myB", PatternMatchKind.Substring, CaseSensitive)] From 4e4e8799010e2bf56072a9caddee100382b0966b Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Fri, 7 Apr 2017 18:23:09 -0700 Subject: [PATCH 06/11] Move prefix tests next --- .../Test/Utilities/PatternMatcherTests.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs index 9d92dd34161ae..54cb91539ce10 100644 --- a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs +++ b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs @@ -176,6 +176,13 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part [InlineData("[|Foo|]", "Foo", PatternMatchKind.Exact, CaseSensitive)] [InlineData("[|foo|]", "Foo", PatternMatchKind.Exact, CaseInsensitive)] [InlineData("[|Foo|]", "foo", PatternMatchKind.Exact, CaseInsensitive)] + + [InlineData("[|Fog|]Bar", "fog", PatternMatchKind.Prefix, CaseInsensitive)] + [InlineData("[|fog|]BarFoo", "Fog", PatternMatchKind.Prefix, CaseInsensitive)] + [InlineData("[|Fo|]o", "fo", PatternMatchKind.Prefix, CaseInsensitive)] + [InlineData("[|Fo|]o", "Fo", PatternMatchKind.Prefix, CaseSensitive)] + [InlineData("[|Fog|]Bar", "Fog", PatternMatchKind.Prefix, CaseSensitive)] + [InlineData("BazBar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("Baz[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.NoBonus)] [InlineData("[|CO|]DE_FIX_[|PRO|]VIDER", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] @@ -191,16 +198,13 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part [InlineData("[|AbCd|]xxx[|Ef|]Cd[|Gh|]", "AbCdEfGh", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("_my[|_b|]utton", "_b", PatternMatchKind.Substring, CaseSensitive)] [InlineData("[|_f|]og[|B|]ar", "_fB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("[|Fog|]Bar", "fog", PatternMatchKind.Prefix, CaseInsensitive)] [InlineData("[|Co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("[|F|]og_[|B|]ar", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("FogBar[|ChangedEventArgs|]", "changedeventargs", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("my[|_b|]utton", "_b", PatternMatchKind.Substring, CaseSensitive)] - [InlineData("[|fog|]BarFoo", "Fog", PatternMatchKind.Prefix, CaseInsensitive)] [InlineData("[|C|]lear[|Ofi|]lac[|Pro|]fessional", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|C|]ore[|Ofi|]lac[|Pro|]fessional", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("[|Fo|]o", "fo", PatternMatchKind.Prefix, CaseInsensitive)] [InlineData("[|_F|]og[|B|]ar", "_fB", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|F|]og[|_B|]ar", "f_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|Si|]mple[|UI|]Element", "SiUI", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] @@ -208,7 +212,6 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part [InlineData("[|_|]my_[|b|]utton", "_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("[|Fo|]g[|B|]ar", "FoB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("_[|myb|]utton", "myb", PatternMatchKind.Substring, CaseSensitive)] - [InlineData("[|Fo|]o", "Fo", PatternMatchKind.Prefix, CaseSensitive)] [InlineData("_my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("[|Co|]de[|Fi|]x[|Pro|]vider", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("Code[|Fi|]xObject[|Pro|]vider", "fipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.NoBonus)] @@ -222,7 +225,6 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part [InlineData("[|F|]og[|_B|]ar", "F_B", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|Co|]deFix_[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("[|co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] - [InlineData("[|Fog|]Bar", "Fog", PatternMatchKind.Prefix, CaseSensitive)] [InlineData("my[|_b|]utton", "_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] public void TryMatchSingleWordPattern( string candidate, string pattern, int matchKindInt, bool isCaseSensitive, int? camelCaseWeight = null) From 5e36be8da422f6648e89112fab6917b08dc26fa2 Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Fri, 7 Apr 2017 18:24:34 -0700 Subject: [PATCH 07/11] Then substring tests. --- .../Test/Utilities/PatternMatcherTests.cs | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs index 54cb91539ce10..75c6c1f90a672 100644 --- a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs +++ b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs @@ -183,12 +183,22 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part [InlineData("[|Fo|]o", "Fo", PatternMatchKind.Prefix, CaseSensitive)] [InlineData("[|Fog|]Bar", "Fog", PatternMatchKind.Prefix, CaseSensitive)] + [InlineData("_[|my|]Button", "my", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("Fog[|B|]ar", "b", PatternMatchKind.Substring, CaseInsensitive)] + [InlineData("_my[|_b|]utton", "_b", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] + [InlineData("my[|_b|]utton", "_b", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("A[|BCD|]EFGH", "bcd", PatternMatchKind.Substring, CaseInsensitive)] + [InlineData("_[|myb|]utton", "myb", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("_my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] + [InlineData("_[|myB|]utton", "myB", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("_[|my|]button", "my", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("_[|myB|]utton", "myb", PatternMatchKind.Substring, CaseInsensitive)] + [InlineData("BazBar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("Baz[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.NoBonus)] [InlineData("[|CO|]DE_FIX_[|PRO|]VIDER", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] - [InlineData("_[|my|]Button", "my", PatternMatchKind.Substring, CaseSensitive)] [InlineData("[|F|]og[|B|]ar", "fB", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("Fog[|B|]ar", "b", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("Abcdefghij[|EfgHij|]", "efghij", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("[|F|]og[|_B|]ar", "F_b", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("_[|co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.NoBonus)] @@ -196,30 +206,21 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part [InlineData("[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("Bar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("[|AbCd|]xxx[|Ef|]Cd[|Gh|]", "AbCdEfGh", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] - [InlineData("_my[|_b|]utton", "_b", PatternMatchKind.Substring, CaseSensitive)] [InlineData("[|_f|]og[|B|]ar", "_fB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|Co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] - [InlineData("my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("[|F|]og_[|B|]ar", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("FogBar[|ChangedEventArgs|]", "changedeventargs", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] - [InlineData("my[|_b|]utton", "_b", PatternMatchKind.Substring, CaseSensitive)] [InlineData("[|C|]lear[|Ofi|]lac[|Pro|]fessional", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|C|]ore[|Ofi|]lac[|Pro|]fessional", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|_F|]og[|B|]ar", "_fB", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|F|]og[|_B|]ar", "f_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|Si|]mple[|UI|]Element", "SiUI", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("A[|BCD|]EFGH", "bcd", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("[|_|]my_[|b|]utton", "_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("[|Fo|]g[|B|]ar", "FoB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("_[|myb|]utton", "myb", PatternMatchKind.Substring, CaseSensitive)] - [InlineData("_my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("[|Co|]de[|Fi|]x[|Pro|]vider", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("Code[|Fi|]xObject[|Pro|]vider", "fipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.NoBonus)] - [InlineData("_[|myB|]utton", "myB", PatternMatchKind.Substring, CaseSensitive)] - [InlineData("_[|my|]button", "my", PatternMatchKind.Substring, CaseSensitive)] [InlineData("[|F|]og[|B|]ar", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|Fo|]oBarry[|Bas|]il", "FoBas", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] - [InlineData("_[|myB|]utton", "myb", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("[|F|]og[|B|]arBaz", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|F|]ooFlob[|B|]az", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("[|F|]og[|_B|]ar", "F_B", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] From 7dacda7f762478d138fc8cc9ce8234080ed3fdb9 Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Fri, 7 Apr 2017 18:25:37 -0700 Subject: [PATCH 08/11] Case sensitive then insensitive --- .../Test/Utilities/PatternMatcherTests.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs index 75c6c1f90a672..01bad7f29f647 100644 --- a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs +++ b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs @@ -177,23 +177,23 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part [InlineData("[|foo|]", "Foo", PatternMatchKind.Exact, CaseInsensitive)] [InlineData("[|Foo|]", "foo", PatternMatchKind.Exact, CaseInsensitive)] + [InlineData("[|Fo|]o", "Fo", PatternMatchKind.Prefix, CaseSensitive)] [InlineData("[|Fog|]Bar", "fog", PatternMatchKind.Prefix, CaseInsensitive)] [InlineData("[|fog|]BarFoo", "Fog", PatternMatchKind.Prefix, CaseInsensitive)] [InlineData("[|Fo|]o", "fo", PatternMatchKind.Prefix, CaseInsensitive)] - [InlineData("[|Fo|]o", "Fo", PatternMatchKind.Prefix, CaseSensitive)] [InlineData("[|Fog|]Bar", "Fog", PatternMatchKind.Prefix, CaseSensitive)] [InlineData("_[|my|]Button", "my", PatternMatchKind.Substring, CaseSensitive)] - [InlineData("Fog[|B|]ar", "b", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("_my[|_b|]utton", "_b", PatternMatchKind.Substring, CaseSensitive)] - [InlineData("my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("my[|_b|]utton", "_b", PatternMatchKind.Substring, CaseSensitive)] - [InlineData("A[|BCD|]EFGH", "bcd", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("_[|myb|]utton", "myb", PatternMatchKind.Substring, CaseSensitive)] - [InlineData("_my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("_[|myB|]utton", "myB", PatternMatchKind.Substring, CaseSensitive)] [InlineData("_[|my|]button", "my", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] + [InlineData("_my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("_[|myB|]utton", "myb", PatternMatchKind.Substring, CaseInsensitive)] + [InlineData("Fog[|B|]ar", "b", PatternMatchKind.Substring, CaseInsensitive)] + [InlineData("A[|BCD|]EFGH", "bcd", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("BazBar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("Baz[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.NoBonus)] From 3396e2f561680e19a8b8b93db49abcf08f42c85d Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Fri, 7 Apr 2017 18:28:23 -0700 Subject: [PATCH 09/11] Group camel-case matches. --- .../Test/Utilities/PatternMatcherTests.cs | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs index 01bad7f29f647..7decec81bf3dc 100644 --- a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs +++ b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs @@ -195,37 +195,41 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part [InlineData("Fog[|B|]ar", "b", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("A[|BCD|]EFGH", "bcd", PatternMatchKind.Substring, CaseInsensitive)] + [InlineData("Abcdefghij[|EfgHij|]", "efghij", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] + [InlineData("[|AbCd|]xxx[|Ef|]Cd[|Gh|]", "AbCdEfGh", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("BazBar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("Baz[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.NoBonus)] - [InlineData("[|CO|]DE_FIX_[|PRO|]VIDER", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("[|F|]og[|B|]ar", "fB", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("Abcdefghij[|EfgHij|]", "efghij", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("[|F|]og[|_B|]ar", "F_b", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("_[|co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.NoBonus)] - [InlineData("Code[|Fi|]x[|Pro|]vider", "fipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("Bar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] - [InlineData("[|AbCd|]xxx[|Ef|]Cd[|Gh|]", "AbCdEfGh", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("[|_f|]og[|B|]ar", "_fB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("[|Co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("[|F|]og_[|B|]ar", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("FogBar[|ChangedEventArgs|]", "changedeventargs", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] - [InlineData("[|C|]lear[|Ofi|]lac[|Pro|]fessional", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("[|C|]ore[|Ofi|]lac[|Pro|]fessional", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|_F|]og[|B|]ar", "_fB", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|F|]og[|_B|]ar", "f_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("[|Si|]mple[|UI|]Element", "SiUI", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("[|_|]my_[|b|]utton", "_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("[|Fo|]g[|B|]ar", "FoB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("[|Co|]de[|Fi|]x[|Pro|]vider", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("Code[|Fi|]xObject[|Pro|]vider", "fipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.NoBonus)] [InlineData("[|F|]og[|B|]ar", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|Fo|]oBarry[|Bas|]il", "FoBas", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("[|F|]og[|B|]arBaz", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|F|]ooFlob[|B|]az", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("[|F|]og[|_B|]ar", "F_B", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] + + [InlineData("[|Si|]mple[|UI|]Element", "SiUI", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] + + [InlineData("_[|co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.NoBonus)] + [InlineData("[|Co|]de[|Fi|]x[|Pro|]vider", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|CO|]DE_FIX_[|PRO|]VIDER", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("Code[|Fi|]x[|Pro|]vider", "fipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] + [InlineData("[|Co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("[|C|]lear[|Ofi|]lac[|Pro|]fessional", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|C|]ore[|Ofi|]lac[|Pro|]fessional", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("Code[|Fi|]xObject[|Pro|]vider", "fipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.NoBonus)] [InlineData("[|Co|]deFix_[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("[|co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + + [InlineData("[|_|]my_[|b|]utton", "_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("my[|_b|]utton", "_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] public void TryMatchSingleWordPattern( string candidate, string pattern, int matchKindInt, bool isCaseSensitive, int? camelCaseWeight = null) From f0906ea0af1ce70c63e6e6caa96eb8e44fbaee40 Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Fri, 7 Apr 2017 18:29:32 -0700 Subject: [PATCH 10/11] Sort by sensitivity --- src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs index 7decec81bf3dc..727eed92b2ced 100644 --- a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs +++ b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs @@ -201,20 +201,20 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part [InlineData("BazBar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("Baz[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.NoBonus)] [InlineData("[|F|]og[|B|]ar", "fB", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("[|F|]og[|_B|]ar", "F_b", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("Bar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("[|_f|]og[|B|]ar", "_fB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|F|]og_[|B|]ar", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] - [InlineData("FogBar[|ChangedEventArgs|]", "changedeventargs", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] - [InlineData("[|_F|]og[|B|]ar", "_fB", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("[|F|]og[|_B|]ar", "f_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|Fo|]g[|B|]ar", "FoB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|F|]og[|B|]ar", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|Fo|]oBarry[|Bas|]il", "FoBas", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("[|F|]og[|B|]arBaz", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|F|]ooFlob[|B|]az", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("[|F|]og[|_B|]ar", "F_B", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|F|]og[|_B|]ar", "F_b", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("FogBar[|ChangedEventArgs|]", "changedeventargs", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] + [InlineData("[|_F|]og[|B|]ar", "_fB", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|F|]og[|_B|]ar", "f_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|Si|]mple[|UI|]Element", "SiUI", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] From 045c38b32039ca92a7a8670a13b2ffa0f9152f94 Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Fri, 7 Apr 2017 18:33:01 -0700 Subject: [PATCH 11/11] Sort from shortest to longest --- .../Test/Utilities/PatternMatcherTests.cs | 53 ++++++++++--------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs index 727eed92b2ced..d6ac11d88818a 100644 --- a/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs +++ b/src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs @@ -178,59 +178,64 @@ private void VerifyBreakIntoCharacterParts(string original, params string[] part [InlineData("[|Foo|]", "foo", PatternMatchKind.Exact, CaseInsensitive)] [InlineData("[|Fo|]o", "Fo", PatternMatchKind.Prefix, CaseSensitive)] + [InlineData("[|Fog|]Bar", "Fog", PatternMatchKind.Prefix, CaseSensitive)] + + [InlineData("[|Fo|]o", "fo", PatternMatchKind.Prefix, CaseInsensitive)] [InlineData("[|Fog|]Bar", "fog", PatternMatchKind.Prefix, CaseInsensitive)] [InlineData("[|fog|]BarFoo", "Fog", PatternMatchKind.Prefix, CaseInsensitive)] - [InlineData("[|Fo|]o", "fo", PatternMatchKind.Prefix, CaseInsensitive)] - [InlineData("[|Fog|]Bar", "Fog", PatternMatchKind.Prefix, CaseSensitive)] + + [InlineData("Fog[|B|]ar", "b", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("_[|my|]Button", "my", PatternMatchKind.Substring, CaseSensitive)] - [InlineData("_my[|_b|]utton", "_b", PatternMatchKind.Substring, CaseSensitive)] [InlineData("my[|_b|]utton", "_b", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("_[|my|]button", "my", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("_my[|_b|]utton", "_b", PatternMatchKind.Substring, CaseSensitive)] [InlineData("_[|myb|]utton", "myb", PatternMatchKind.Substring, CaseSensitive)] [InlineData("_[|myB|]utton", "myB", PatternMatchKind.Substring, CaseSensitive)] - [InlineData("_[|my|]button", "my", PatternMatchKind.Substring, CaseSensitive)] + [InlineData("my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("_my[|_B|]utton", "_b", PatternMatchKind.Substring, CaseInsensitive)] [InlineData("_[|myB|]utton", "myb", PatternMatchKind.Substring, CaseInsensitive)] - [InlineData("Fog[|B|]ar", "b", PatternMatchKind.Substring, CaseInsensitive)] - [InlineData("A[|BCD|]EFGH", "bcd", PatternMatchKind.Substring, CaseInsensitive)] - [InlineData("Abcdefghij[|EfgHij|]", "efghij", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("[|AbCd|]xxx[|Ef|]Cd[|Gh|]", "AbCdEfGh", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] - [InlineData("BazBar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] - [InlineData("Baz[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.NoBonus)] - [InlineData("[|F|]og[|B|]ar", "fB", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] - [InlineData("Bar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] - [InlineData("[|_f|]og[|B|]ar", "_fB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("[|F|]og_[|B|]ar", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] - [InlineData("[|Fo|]g[|B|]ar", "FoB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("A[|BCD|]EFGH", "bcd", PatternMatchKind.Substring, CaseInsensitive)] + [InlineData("Abcdefghij[|EfgHij|]", "efghij", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] + [InlineData("[|F|]og[|B|]ar", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("[|Fo|]oBarry[|Bas|]il", "FoBas", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("[|Fo|]g[|B|]ar", "FoB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|_f|]og[|B|]ar", "_fB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|F|]og[|_B|]ar", "F_B", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|F|]og[|B|]ar", "fB", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("Baz[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.NoBonus)] [InlineData("[|F|]og[|B|]arBaz", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|F|]og_[|B|]ar", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("[|F|]ooFlob[|B|]az", "FB", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] - [InlineData("[|F|]og[|_B|]ar", "F_B", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("Bar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] + [InlineData("BazBar[|F|]oo[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseContiguousBonus)] + [InlineData("[|Fo|]oBarry[|Bas|]il", "FoBas", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("[|F|]ogBar[|F|]oo[|F|]oo", "FFF", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("[|F|]og[|_B|]ar", "F_b", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("FogBar[|ChangedEventArgs|]", "changedeventargs", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("[|_F|]og[|B|]ar", "_fB", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("[|F|]og[|_B|]ar", "f_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("FogBar[|ChangedEventArgs|]", "changedeventargs", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("[|Si|]mple[|UI|]Element", "SiUI", PatternMatchKind.CamelCase, CaseSensitive, PatternMatcher.CamelCaseMaxWeight)] [InlineData("_[|co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.NoBonus)] + [InlineData("Code[|Fi|]xObject[|Pro|]vider", "fipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.NoBonus)] [InlineData("[|Co|]de[|Fi|]x[|Pro|]vider", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("[|CO|]DE_FIX_[|PRO|]VIDER", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("Code[|Fi|]x[|Pro|]vider", "fipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] [InlineData("[|Co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] - [InlineData("[|C|]lear[|Ofi|]lac[|Pro|]fessional", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("[|C|]ore[|Ofi|]lac[|Pro|]fessional", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] - [InlineData("Code[|Fi|]xObject[|Pro|]vider", "fipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.NoBonus)] - [InlineData("[|Co|]deFix_[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("[|co|]deFix[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("[|Co|]deFix_[|Pro|]vider", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] + [InlineData("[|C|]ore[|Ofi|]lac[|Pro|]fessional", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|C|]lear[|Ofi|]lac[|Pro|]fessional", "cofipro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMaxWeight)] + [InlineData("[|CO|]DE_FIX_[|PRO|]VIDER", "copro", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] - [InlineData("[|_|]my_[|b|]utton", "_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] [InlineData("my[|_b|]utton", "_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseContiguousBonus)] + [InlineData("[|_|]my_[|b|]utton", "_B", PatternMatchKind.CamelCase, CaseInsensitive, PatternMatcher.CamelCaseMatchesFromStartBonus)] public void TryMatchSingleWordPattern( string candidate, string pattern, int matchKindInt, bool isCaseSensitive, int? camelCaseWeight = null) {