/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/CSharp/Test/Symbol/Compilation/SymbolSearchTests.cs
263 строки
12 KB
Jared Parsons
generated move
28 сен 2020, 19:36
28 сен 2020, 19:36
1cca63b
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System; using System.Linq; using Microsoft.CodeAnalysis.CSharp.Test.Utilities; using Roslyn.Test.Utilities; using Xunit; namespace Microsoft.CodeAnalysis.CSharp.UnitTests { public class SymbolSearchTests : CSharpTestBase { [Fact] public void TestSymbolFilterNone() { Assert.Throws<ArgumentException>(() => { var compilation = GetTestCompilation(); compilation.ContainsSymbolsWithName(n => true, SymbolFilter.None); }); Assert.Throws<ArgumentException>(() => { var compilation = GetTestCompilation(); compilation.GetSymbolsWithName(n => true, SymbolFilter.None); }); Assert.Throws<ArgumentException>(() => { var compilation = GetTestCompilation(); compilation.ContainsSymbolsWithName("", SymbolFilter.None); }); Assert.Throws<ArgumentException>(() => { var compilation = GetTestCompilation(); compilation.GetSymbolsWithName("", SymbolFilter.None); }); } [Fact] public void TestPredicateNull() { Assert.Throws<ArgumentNullException>(() => { var compilation = GetTestCompilation(); compilation.ContainsSymbolsWithName(predicate: null); }); Assert.Throws<ArgumentNullException>(() => { var compilation = GetTestCompilation(); compilation.GetSymbolsWithName(predicate: null); }); } [Fact] public void TestNameNull() { Assert.Throws<ArgumentNullException>(() => { var compilation = GetTestCompilation(); compilation.ContainsSymbolsWithName(name: null); }); Assert.Throws<ArgumentNullException>(() => { var compilation = GetTestCompilation(); compilation.GetSymbolsWithName(name: null); }); } [Fact] public void TestMergedNamespace() { var compilation = GetTestCompilation(); TestNameAndPredicate(compilation, "System", includeNamespace: true, includeType: false, includeMember: false, count: 1); TestNameAndPredicate(compilation, "System", includeNamespace: true, includeType: true, includeMember: false, count: 1); TestNameAndPredicate(compilation, "System", includeNamespace: true, includeType: false, includeMember: true, count: 1); TestNameAndPredicate(compilation, "System", includeNamespace: true, includeType: true, includeMember: true, count: 1); TestNameAndPredicate(compilation, "System", includeNamespace: false, includeType: false, includeMember: true, count: 0); TestNameAndPredicate(compilation, "System", includeNamespace: false, includeType: true, includeMember: false, count: 0); TestNameAndPredicate(compilation, "System", includeNamespace: false, includeType: true, includeMember: true, count: 0); } [Fact] public void TestSourceNamespace() { var compilation = GetTestCompilation(); TestNameAndPredicate(compilation, "MyNamespace", includeNamespace: true, includeType: false, includeMember: false, count: 1); TestNameAndPredicate(compilation, "MyNamespace", includeNamespace: true, includeType: true, includeMember: false, count: 1); TestNameAndPredicate(compilation, "MyNamespace", includeNamespace: true, includeType: false, includeMember: true, count: 1); TestNameAndPredicate(compilation, "MyNamespace", includeNamespace: true, includeType: true, includeMember: true, count: 1); TestNameAndPredicate(compilation, "MyNamespace", includeNamespace: false, includeType: false, includeMember: true, count: 0); TestNameAndPredicate(compilation, "MyNamespace", includeNamespace: false, includeType: true, includeMember: false, count: 0); TestNameAndPredicate(compilation, "MyNamespace", includeNamespace: false, includeType: true, includeMember: true, count: 0); } [Fact] public void TestClassInMergedNamespace() { var compilation = GetTestCompilation(); TestNameAndPredicate(compilation, "Test", includeNamespace: false, includeType: true, includeMember: false, count: 1); TestNameAndPredicate(compilation, "Test", includeNamespace: false, includeType: true, includeMember: true, count: 1); TestNameAndPredicate(compilation, "Test", includeNamespace: true, includeType: true, includeMember: false, count: 1); TestNameAndPredicate(compilation, "Test", includeNamespace: true, includeType: true, includeMember: true, count: 1); TestNameAndPredicate(compilation, "Test", includeNamespace: false, includeType: false, includeMember: true, count: 0); TestNameAndPredicate(compilation, "Test", includeNamespace: true, includeType: false, includeMember: false, count: 0); TestNameAndPredicate(compilation, "Test", includeNamespace: true, includeType: false, includeMember: true, count: 0); } [Fact] public void TestClassInSourceNamespace() { var compilation = GetTestCompilation(); TestNameAndPredicate(compilation, "Test1", includeNamespace: false, includeType: true, includeMember: false, count: 1); TestNameAndPredicate(compilation, "Test1", includeNamespace: false, includeType: true, includeMember: true, count: 1); TestNameAndPredicate(compilation, "Test1", includeNamespace: true, includeType: true, includeMember: false, count: 1); TestNameAndPredicate(compilation, "Test1", includeNamespace: true, includeType: true, includeMember: true, count: 1); TestNameAndPredicate(compilation, "Test1", includeNamespace: false, includeType: false, includeMember: true, count: 0); TestNameAndPredicate(compilation, "Test1", includeNamespace: true, includeType: false, includeMember: false, count: 0); TestNameAndPredicate(compilation, "Test1", includeNamespace: true, includeType: false, includeMember: true, count: 0); } [Fact] public void TestMembers() { var compilation = GetTestCompilation(); TestNameAndPredicate(compilation, "myField", includeNamespace: false, includeType: false, includeMember: true, count: 1); TestNameAndPredicate(compilation, "myField", includeNamespace: false, includeType: true, includeMember: true, count: 1); TestNameAndPredicate(compilation, "myField", includeNamespace: true, includeType: false, includeMember: true, count: 1); TestNameAndPredicate(compilation, "myField", includeNamespace: true, includeType: true, includeMember: true, count: 1); TestNameAndPredicate(compilation, "myField", includeNamespace: false, includeType: true, includeMember: false, count: 0); TestNameAndPredicate(compilation, "myField", includeNamespace: true, includeType: false, includeMember: false, count: 0); TestNameAndPredicate(compilation, "myField", includeNamespace: true, includeType: true, includeMember: false, count: 0); } [Fact] public void TestPartialSearch() { var compilation = GetTestCompilation(); Test(compilation, n => n.IndexOf("my", StringComparison.OrdinalIgnoreCase) >= 0, includeNamespace: false, includeType: false, includeMember: true, count: 4); Test(compilation, n => n.IndexOf("my", StringComparison.OrdinalIgnoreCase) >= 0, includeNamespace: false, includeType: true, includeMember: false, count: 4); Test(compilation, n => n.IndexOf("my", StringComparison.OrdinalIgnoreCase) >= 0, includeNamespace: false, includeType: true, includeMember: true, count: 8); Test(compilation, n => n.IndexOf("my", StringComparison.OrdinalIgnoreCase) >= 0, includeNamespace: true, includeType: false, includeMember: false, count: 1); Test(compilation, n => n.IndexOf("my", StringComparison.OrdinalIgnoreCase) >= 0, includeNamespace: true, includeType: false, includeMember: true, count: 5); Test(compilation, n => n.IndexOf("my", StringComparison.OrdinalIgnoreCase) >= 0, includeNamespace: true, includeType: true, includeMember: false, count: 5); Test(compilation, n => n.IndexOf("my", StringComparison.OrdinalIgnoreCase) >= 0, includeNamespace: true, includeType: true, includeMember: true, count: 9); Test(compilation, n => n.IndexOf("enum", StringComparison.OrdinalIgnoreCase) >= 0, includeNamespace: true, includeType: true, includeMember: true, count: 2); } [WorkItem(876191, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/876191")] [Fact] public void TestExplicitInterfaceSearch() { const string source = @" interface I { void M(); } class Explicit : I { void I.M() { } } class Implicit : I { public void M() { } } "; var compilation = CreateCompilation(new[] { source }); Test(compilation, n => n.IndexOf("M", StringComparison.OrdinalIgnoreCase) >= 0, includeNamespace: false, includeType: false, includeMember: true, count: 3); } private static CSharpCompilation GetTestCompilation() { const string source = @" namespace System { public class Test { } } namespace MyNamespace { public class Test1 { } } public class MyClass { private int myField; internal int MyProperty { get; set; } void MyMethod() { } public event EventHandler MyEvent; delegate string MyDelegate(int i); } struct MyStruct { } interface MyInterface { } enum Enum { EnumValue } "; return CreateCompilation(source: new string[] { source }); } private static void TestNameAndPredicate(CSharpCompilation compilation, string name, bool includeNamespace, bool includeType, bool includeMember, int count) { Test(compilation, name, includeNamespace, includeType, includeMember, count); Test(compilation, n => n == name, includeNamespace, includeType, includeMember, count); } private static void Test(CSharpCompilation compilation, string name, bool includeNamespace, bool includeType, bool includeMember, int count) { SymbolFilter filter = ComputeFilter(includeNamespace, includeType, includeMember); Assert.Equal(count > 0, compilation.ContainsSymbolsWithName(name, filter)); Assert.Equal(count, compilation.GetSymbolsWithName(name, filter).Count()); } private static void Test(CSharpCompilation compilation, Func<string, bool> predicate, bool includeNamespace, bool includeType, bool includeMember, int count) { SymbolFilter filter = ComputeFilter(includeNamespace, includeType, includeMember); Assert.Equal(count > 0, compilation.ContainsSymbolsWithName(predicate, filter)); Assert.Equal(count, compilation.GetSymbolsWithName(predicate, filter).Count()); } private static SymbolFilter ComputeFilter(bool includeNamespace, bool includeType, bool includeMember) { var filter = SymbolFilter.None; filter = includeNamespace ? (filter | SymbolFilter.Namespace) : filter; filter = includeType ? (filter | SymbolFilter.Type) : filter; filter = includeMember ? (filter | SymbolFilter.Member) : filter; return filter; } } }