' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Roslyn.Test.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics Public Class SelectCaseTests Inherits BasicTestBase Public Sub SelectCaseExpression_NothingLiteral() Dim compilation = CreateCompilationWithMscorlib( ) Dim semanticSummary = CompilationUtils.GetSemanticInfoSummary(Of LiteralExpressionSyntax)(compilation, "a.vb") Assert.Null(semanticSummary.Type) Assert.Equal("System.Object", semanticSummary.ConvertedType.ToTestDisplayString()) Assert.Equal(TypeKind.Class, semanticSummary.ConvertedType.TypeKind) Assert.Equal(ConversionKind.WideningNothingLiteral, semanticSummary.ImplicitConversion.Kind) Assert.Null(semanticSummary.Symbol) Assert.Equal(CandidateReason.None, semanticSummary.CandidateReason) Assert.Equal(0, semanticSummary.CandidateSymbols.Length) Assert.Null(semanticSummary.Alias) Assert.Equal(0, semanticSummary.MemberGroup.Length) Assert.True(semanticSummary.ConstantValue.HasValue) Assert.Null(semanticSummary.ConstantValue.Value) End Sub Public Sub SelectCaseExpression_Literal() Dim compilation = CreateCompilationWithMscorlib( ) Dim semanticSummary = CompilationUtils.GetSemanticInfoSummary(Of LiteralExpressionSyntax)(compilation, "a.vb") Assert.Equal("System.Double", semanticSummary.Type.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.Type.TypeKind) Assert.Equal("System.Double", semanticSummary.ConvertedType.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.ConvertedType.TypeKind) Assert.Equal(ConversionKind.Identity, semanticSummary.ImplicitConversion.Kind) Assert.Null(semanticSummary.Symbol) Assert.Equal(CandidateReason.None, semanticSummary.CandidateReason) Assert.Equal(0, semanticSummary.CandidateSymbols.Length) Assert.Null(semanticSummary.Alias) Assert.Equal(0, semanticSummary.MemberGroup.Length) Assert.True(semanticSummary.ConstantValue.HasValue) Assert.Equal(1.1, semanticSummary.ConstantValue.Value) End Sub Public Sub SelectCaseExpression_Local_IdentifierNameSyntax() Dim compilation = CreateCompilationWithMscorlib( ) Dim semanticSummary = CompilationUtils.GetSemanticInfoSummary(Of IdentifierNameSyntax)(compilation, "a.vb") Assert.Equal("System.Int32", semanticSummary.Type.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.Type.TypeKind) Assert.Equal("System.Int32", semanticSummary.ConvertedType.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.ConvertedType.TypeKind) Assert.Equal(ConversionKind.Identity, semanticSummary.ImplicitConversion.Kind) Assert.Equal("number As System.Int32", semanticSummary.Symbol.ToTestDisplayString()) Assert.Equal(SymbolKind.Local, semanticSummary.Symbol.Kind) Assert.Equal(0, semanticSummary.CandidateSymbols.Length) Assert.Null(semanticSummary.Alias) Assert.Equal(0, semanticSummary.MemberGroup.Length) Assert.False(semanticSummary.ConstantValue.HasValue) End Sub Public Sub SelectCaseExpression_MethodCall_InvocationExpressionSyntax() Dim compilation = CreateCompilationWithMscorlib( ) Dim semanticSummary = CompilationUtils.GetSemanticInfoSummary(Of InvocationExpressionSyntax)(compilation, "a.vb") Assert.Equal("System.Int32", semanticSummary.Type.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.Type.TypeKind) Assert.Equal("System.Int32", semanticSummary.ConvertedType.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.ConvertedType.TypeKind) Assert.Equal(ConversionKind.Identity, semanticSummary.ImplicitConversion.Kind) Assert.Equal("Function M1.Goo() As System.Int32", semanticSummary.Symbol.ToTestDisplayString()) Assert.Equal(SymbolKind.Method, semanticSummary.Symbol.Kind) Assert.Equal(0, semanticSummary.CandidateSymbols.Length) Assert.Null(semanticSummary.Alias) Assert.Equal(0, semanticSummary.MemberGroup.Length) Assert.False(semanticSummary.ConstantValue.HasValue) End Sub Public Sub SelectCaseExpression_MethodCall_IdentifierNameSyntax() Dim compilation = CreateCompilationWithMscorlib( ) Dim semanticSummary = CompilationUtils.GetSemanticInfoSummary(Of IdentifierNameSyntax)(compilation, "a.vb") Assert.Null(semanticSummary.Type) Assert.Null(semanticSummary.ConvertedType) Assert.Equal(ConversionKind.Identity, semanticSummary.ImplicitConversion.Kind) Assert.Equal("Function M1.Goo() As System.Int32", semanticSummary.Symbol.ToTestDisplayString()) Assert.Equal(SymbolKind.Method, semanticSummary.Symbol.Kind) Assert.Equal(0, semanticSummary.CandidateSymbols.Length) Assert.Null(semanticSummary.Alias) Assert.Equal(1, semanticSummary.MemberGroup.Length) Dim sortedMethodGroup = semanticSummary.MemberGroup.AsEnumerable().OrderBy(Function(s) s.ToTestDisplayString()).ToArray() Assert.Equal("Function M1.Goo() As System.Int32", sortedMethodGroup(0).ToTestDisplayString()) Assert.False(semanticSummary.ConstantValue.HasValue) End Sub Public Sub SelectCaseExpression_Lambda() Dim compilation = CreateCompilationWithMscorlib( ) Dim semanticSummary = CompilationUtils.GetSemanticInfoSummary(Of SingleLineLambdaExpressionSyntax)(compilation, "a.vb") Assert.Null(semanticSummary.Type) Assert.Equal("Function (arg As System.Object) As System.Boolean", semanticSummary.ConvertedType.ToTestDisplayString()) Assert.Equal(TypeKind.Delegate, semanticSummary.ConvertedType.TypeKind) Assert.Equal(ConversionKind.Widening Or ConversionKind.Lambda, semanticSummary.ImplicitConversion.Kind) Assert.Equal("Function (arg As System.Object) As System.Boolean", semanticSummary.Symbol.ToTestDisplayString()) Assert.Equal(SymbolKind.Method, semanticSummary.Symbol.Kind) Assert.Equal(0, semanticSummary.CandidateSymbols.Length) Assert.Null(semanticSummary.Alias) Assert.Equal(0, semanticSummary.MemberGroup.Length) Assert.False(semanticSummary.ConstantValue.HasValue) End Sub Public Sub SelectCaseExpression_ParenthesizedLambda() Dim compilation = CreateCompilationWithMscorlib( ) Dim semanticSummary = CompilationUtils.GetSemanticInfoSummary(Of ParenthesizedExpressionSyntax)(compilation, "a.vb") Assert.Equal("Function (arg As System.Object) As System.Boolean", semanticSummary.Type.ToTestDisplayString()) Assert.Equal(TypeKind.Delegate, semanticSummary.Type.TypeKind) Assert.Equal("Function (arg As System.Object) As System.Boolean", semanticSummary.ConvertedType.ToTestDisplayString()) Assert.Equal(TypeKind.Delegate, semanticSummary.ConvertedType.TypeKind) Assert.Equal(ConversionKind.Identity, semanticSummary.ImplicitConversion.Kind) Assert.Null(semanticSummary.Symbol) Assert.Equal(CandidateReason.None, semanticSummary.CandidateReason) Assert.Equal(0, semanticSummary.CandidateSymbols.Length) Assert.Null(semanticSummary.Alias) Assert.Equal(0, semanticSummary.MemberGroup.Length) Assert.False(semanticSummary.ConstantValue.HasValue) End Sub Public Sub SelectCaseExpression_Error_NotAValue_InvocationExpressionSyntax() Dim compilation = CreateCompilationWithMscorlib( ) Dim semanticSummary = CompilationUtils.GetSemanticInfoSummary(Of InvocationExpressionSyntax)(compilation, "a.vb") Assert.Equal("System.Void", semanticSummary.Type.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.Type.TypeKind) Assert.Equal("System.Void", semanticSummary.ConvertedType.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.ConvertedType.TypeKind) Assert.Equal(ConversionKind.Identity, semanticSummary.ImplicitConversion.Kind) Assert.Null(semanticSummary.Symbol) Assert.Equal(CandidateReason.NotAValue, semanticSummary.CandidateReason) Assert.Equal(1, semanticSummary.CandidateSymbols.Length) Dim sortedCandidates = semanticSummary.CandidateSymbols.AsEnumerable().OrderBy(Function(s) s.ToTestDisplayString()).ToArray() Assert.Equal("Sub M1.Goo()", sortedCandidates(0).ToTestDisplayString()) Assert.Equal(SymbolKind.Method, sortedCandidates(0).Kind) Assert.Null(semanticSummary.Alias) Assert.Equal(0, semanticSummary.MemberGroup.Length) Assert.False(semanticSummary.ConstantValue.HasValue) End Sub Public Sub SelectCaseExpression_Error_NotAValue_IdentifierNameSyntax() Dim compilation = CreateCompilationWithMscorlib( ) Dim semanticSummary = CompilationUtils.GetSemanticInfoSummary(Of IdentifierNameSyntax)(compilation, "a.vb") Assert.Equal("System.Void", semanticSummary.Type.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.Type.TypeKind) Assert.Equal("System.Void", semanticSummary.ConvertedType.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.ConvertedType.TypeKind) Assert.Equal(ConversionKind.Identity, semanticSummary.ImplicitConversion.Kind) Assert.Null(semanticSummary.Symbol) Assert.Equal(CandidateReason.NotAValue, semanticSummary.CandidateReason) Assert.Equal(1, semanticSummary.CandidateSymbols.Length) Dim sortedCandidates = semanticSummary.CandidateSymbols.AsEnumerable().OrderBy(Function(s) s.ToTestDisplayString()).ToArray() Assert.Equal("Sub M1.Goo()", sortedCandidates(0).ToTestDisplayString()) Assert.Equal(SymbolKind.Method, sortedCandidates(0).Kind) Assert.Null(semanticSummary.Alias) Assert.Equal(0, semanticSummary.MemberGroup.Length) Assert.False(semanticSummary.ConstantValue.HasValue) End Sub Public Sub SelectCaseExpression_Error_OverloadResolutionFailure() Dim compilation = CreateCompilationWithMscorlib( ) Dim semanticSummary = CompilationUtils.GetSemanticInfoSummary(Of IdentifierNameSyntax)(compilation, "a.vb") Assert.Null(semanticSummary.Type) Assert.Equal("System.Void", semanticSummary.ConvertedType.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.ConvertedType.TypeKind) Assert.Equal(ConversionKind.Identity, semanticSummary.ImplicitConversion.Kind) Assert.Null(semanticSummary.Symbol) Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticSummary.CandidateReason) Assert.Equal(1, semanticSummary.CandidateSymbols.Length) Dim sortedCandidates = semanticSummary.CandidateSymbols.AsEnumerable().OrderBy(Function(s) s.ToTestDisplayString()).ToArray() Assert.Equal("Sub M1.Goo(i As System.Int32)", sortedCandidates(0).ToTestDisplayString()) Assert.Equal(SymbolKind.Method, sortedCandidates(0).Kind) Assert.Null(semanticSummary.Alias) Assert.Equal(1, semanticSummary.MemberGroup.Length) Dim sortedMethodGroup = semanticSummary.MemberGroup.AsEnumerable().OrderBy(Function(s) s.ToTestDisplayString()).ToArray() Assert.Equal("Sub M1.Goo(i As System.Int32)", sortedMethodGroup(0).ToTestDisplayString()) Assert.False(semanticSummary.ConstantValue.HasValue) End Sub Public Sub SelectCase_RelationalCaseClauseExpression_Literal() Dim compilation = CreateCompilationWithMscorlib( ) Dim semanticSummary = CompilationUtils.GetSemanticInfoSummary(Of LiteralExpressionSyntax)(compilation, "a.vb") Assert.Equal("System.Int32", semanticSummary.Type.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.Type.TypeKind) Assert.Equal("System.Int32", semanticSummary.ConvertedType.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.ConvertedType.TypeKind) Assert.Equal(ConversionKind.Identity, semanticSummary.ImplicitConversion.Kind) Assert.Null(semanticSummary.Symbol) Assert.Equal(CandidateReason.None, semanticSummary.CandidateReason) Assert.Equal(0, semanticSummary.CandidateSymbols.Length) Assert.Null(semanticSummary.Alias) Assert.Equal(0, semanticSummary.MemberGroup.Length) Assert.True(semanticSummary.ConstantValue.HasValue) Assert.Equal(1, semanticSummary.ConstantValue.Value) End Sub Public Sub SelectCase_RangeCaseClauseExpression_MethodCall() Dim compilation = CreateCompilationWithMscorlib( ) Dim semanticSummary = CompilationUtils.GetSemanticInfoSummary(Of InvocationExpressionSyntax)(compilation, "a.vb") Assert.Equal("System.Int32", semanticSummary.Type.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.Type.TypeKind) Assert.Equal("System.Int32", semanticSummary.ConvertedType.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.ConvertedType.TypeKind) Assert.Equal(ConversionKind.Identity, semanticSummary.ImplicitConversion.Kind) Assert.Equal("Function M1.Goo() As System.Int32", semanticSummary.Symbol.ToTestDisplayString()) Assert.Equal(SymbolKind.Method, semanticSummary.Symbol.Kind) Assert.Equal(0, semanticSummary.CandidateSymbols.Length) Assert.Null(semanticSummary.Alias) Assert.Equal(0, semanticSummary.MemberGroup.Length) Assert.False(semanticSummary.ConstantValue.HasValue) End Sub Public Sub SelectCase_SimpleCaseClauseExpression_DateTime() Dim compilation = CreateCompilationWithMscorlib( ) Dim semanticSummary = CompilationUtils.GetSemanticInfoSummary(Of LiteralExpressionSyntax)(compilation, "a.vb") Assert.Equal("System.DateTime", semanticSummary.Type.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.Type.TypeKind) Assert.Equal("System.Int32", semanticSummary.ConvertedType.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.ConvertedType.TypeKind) Assert.Equal(ConversionKind.DelegateRelaxationLevelNone, semanticSummary.ImplicitConversion.Kind) Assert.Null(semanticSummary.Symbol) Assert.Equal(CandidateReason.None, semanticSummary.CandidateReason) Assert.Equal(0, semanticSummary.CandidateSymbols.Length) Assert.Null(semanticSummary.Alias) Assert.Equal(0, semanticSummary.MemberGroup.Length) Assert.True(semanticSummary.ConstantValue.HasValue) Assert.Equal(#8/13/2002 12:14:00 PM#, semanticSummary.ConstantValue.Value) End Sub Public Sub SelectCase_BoundLocal() Dim compilation = CreateCompilationWithMscorlib( ) Dim semanticSummary = CompilationUtils.GetSemanticInfoSummary(Of IdentifierNameSyntax)(compilation, "a.vb") Assert.Equal("System.Int32", semanticSummary.Type.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.Type.TypeKind) Assert.Equal("System.Int32", semanticSummary.ConvertedType.ToTestDisplayString()) Assert.Equal(TypeKind.Structure, semanticSummary.ConvertedType.TypeKind) Assert.Equal(ConversionKind.Identity, semanticSummary.ImplicitConversion.Kind) Assert.Equal("i As System.Int32", semanticSummary.Symbol.ToTestDisplayString()) Assert.Equal(SymbolKind.Local, semanticSummary.Symbol.Kind) Assert.Equal(0, semanticSummary.CandidateSymbols.Length) Assert.Null(semanticSummary.Alias) Assert.Equal(0, semanticSummary.MemberGroup.Length) Assert.False(semanticSummary.ConstantValue.HasValue) End Sub Public Sub SelectCase_AnonymousLambda() Dim compilation = CreateCompilationWithMscorlibAndVBRuntime( , options:=TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom)) CompileAndVerify(compilation, expectedOutput:= ) AssertTheseDiagnostics(compilation, BC42036: Operands of type Object used in expressions for 'Select', 'Case' statements; runtime errors could occur. Select Case Nothing ~~~~~~~ BC42016: Implicit conversion from 'Object' to 'Boolean'. Case Function() 5 ~~~~~~~~~~~~ ) End Sub Public Sub SelectCase_AnonymousLambda_OperationTree() Dim source = .Value Dim expectedOperationTree = () As System.Int32) (Syntax: 'Function() 5') Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null) Operand: ILambdaExpression (Signature: Function () As System.Int32) (OperationKind.LambdaExpression, Type: null) (Syntax: 'Function() 5') IBlockStatement (3 statements, 1 locals) (OperationKind.BlockStatement) (Syntax: 'Function() 5') Locals: Local_1: As System.Int32 IReturnStatement (OperationKind.ReturnStatement) (Syntax: '5') ReturnedValue: ILiteralExpression (Text: 5) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 5) (Syntax: '5') ILabelStatement (Label: exit) (OperationKind.LabelStatement) (Syntax: 'Function() 5') LabeledStatement: null IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'Function() 5') ReturnedValue: ILocalReferenceExpression: (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'Function() 5') Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Case Functi ... e("Failed")') IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'System.Cons ... e("Failed")') Expression: IInvocationExpression (Sub System.Console.WriteLine(value As System.String)) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'System.Cons ... e("Failed")') Instance Receiver: null Arguments(1): IArgument (ArgumentKind.Explicit, Matching Parameter: value) (OperationKind.Argument) (Syntax: '"Failed"') ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: "Failed") (Syntax: '"Failed"') ISwitchCase (1 case clauses, 1 statements) (OperationKind.SwitchCase) (Syntax: 'Case Else ... Succeeded")') Clauses: IDefaultCaseClause (CaseKind.Default) (OperationKind.DefaultCaseClause) (Syntax: 'Case Else') Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Case Else ... Succeeded")') IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'System.Cons ... Succeeded")') Expression: IInvocationExpression (Sub System.Console.WriteLine(value As System.String)) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'System.Cons ... Succeeded")') Instance Receiver: null Arguments(1): IArgument (ArgumentKind.Explicit, Matching Parameter: value) (OperationKind.Argument) (Syntax: '"Succeeded"') ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: "Succeeded") (Syntax: '"Succeeded"') ]]>.Value Dim expectedDiagnostics = String.Empty VerifyOperationTreeAndDiagnosticsForTest(Of SelectBlockSyntax)(source, expectedOperationTree, expectedDiagnostics) End Sub Public Sub Bug948019_01() Dim compilation = CreateCompilationWithMscorlib( ) Dim node = CompilationUtils.FindBindingText(Of IdentifierNameSyntax)(compilation, "a.vb") Dim semanticModel = compilation.GetSemanticModel(node.SyntaxTree) Dim typeInfo = semanticModel.GetTypeInfo(node) Assert.Equal("C.DayOfWeek", typeInfo.Type.ToTestDisplayString()) Assert.Equal("C.DayOfWeek", typeInfo.ConvertedType.ToTestDisplayString()) Assert.Equal(ConversionKind.Identity, semanticModel.GetConversion(node).Kind) Dim symbolInfo = semanticModel.GetSymbolInfo(node) Assert.Equal("day As C.DayOfWeek", symbolInfo.Symbol.ToTestDisplayString()) Assert.Equal(SymbolKind.Parameter, symbolInfo.Symbol.Kind) End Sub Public Sub Bug948019_02() Dim compilation = CreateCompilationWithMscorlib( ) Dim node = CompilationUtils.FindBindingText(Of IdentifierNameSyntax)(compilation, "a.vb") Dim semanticModel = compilation.GetSemanticModel(node.SyntaxTree) Dim typeInfo = semanticModel.GetTypeInfo(node) Assert.Equal("C.DayOfWeek", typeInfo.Type.ToTestDisplayString()) Assert.Equal("C.DayOfWeek", typeInfo.ConvertedType.ToTestDisplayString()) Assert.Equal(ConversionKind.Identity, semanticModel.GetConversion(node).Kind) Dim symbolInfo = semanticModel.GetSymbolInfo(node) Assert.Equal("day As C.DayOfWeek", symbolInfo.Symbol.ToTestDisplayString()) Assert.Equal(SymbolKind.Parameter, symbolInfo.Symbol.Kind) End Sub End Class End Namespace