File: System\Windows\Forms\ControlInvokeTests.vb
Web Access
Project: src\src\Microsoft.VisualBasic.Forms\tests\UnitTests\Microsoft.VisualBasic.Forms.Tests.vbproj (Microsoft.VisualBasic.Forms.Tests)
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
 
Imports System.Windows.Forms
Imports FluentAssertions
Imports Xunit
 
Namespace Microsoft.VisualBasic.Forms.Tests
 
    Public Class ControlInvokeTests
 
        Public Shared Function FaultingFunc(a As Integer) As Integer
            Return a \ 0
        End Function
 
        Public Shared Sub FaultingMethod()
            Throw New DivideByZeroException()
        End Sub
 
        <WinFormsFact>
        Public Sub Control_Invoke_Action_calls_correct_method()
            Using _control As New Control
                _control.CreateControl()
 
                Dim testCode As Action =
                    Sub()
                        _control.Invoke(AddressOf FaultingMethod)
                    End Sub
 
                Dim exception As Exception = Assert.Throws(Of DivideByZeroException)(testCode)
 
                '    Expecting something Like the following.
                '    The first frame must be the this method, followed by MarshaledInvoke at previous location.
                '
                '    at Microsoft.VisualBasic.Forms.Tests.ControlInvokeTests.FaultingMethod() in ...\winforms\src\Microsoft.VisualBasic.Forms\tests\UnitTests\ControlInvokeTests.vb:line 28
                '       at System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme) in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6511
                '       at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj) in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6487
                '       at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme) in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6459
                '       at System.Windows.Forms.Control.InvokeMarshaledCallbacks() in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6563
                '    --- End of stack trace from previous location ---
                '       at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous) in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6951
                '       at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args) in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6413
                '       at System.Windows.Forms.Control.Invoke(Delegate method) in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6393
                '       at Microsoft.VisualBasic.Forms.Tests.ControlInvokeTests._Closure$__1-1._Lambda$__0() in ...\winforms\src\Microsoft.VisualBasic.Forms\tests\UnitTests\ControlInvokeTests.vb:line 18
 
                exception.StackTrace.Should.Contain(NameOf(FaultingMethod))
                exception.StackTrace.Should.Contain(" System.Windows.Forms.Control.Invoke(Action method) ")
            End Using
        End Sub
 
        <WinFormsFact>
        Public Sub Control_Invoke_Delegate_MethodInvoker_calls_correct_method()
            Using _control As New Control
                _control.CreateControl()
 
                Dim testCode As Action =
                    Sub()
                        _control.Invoke(New MethodInvoker(AddressOf FaultingMethod))
                    End Sub
                Dim exception As Exception = Assert.Throws(Of DivideByZeroException)(testCode)
 
                '    Expecting something Like the following.
                '    The first frame must be the this method, followed by MarshaledInvoke at previous location.
                '
                '    at Microsoft.VisualBasic.Forms.Tests.ControlInvokeTests.FaultingMethod() in ...\winforms\src\Microsoft.VisualBasic.Forms\tests\UnitTests\ControlInvokeTests.vb:line 28
                '       at System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme) in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6511
                '       at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj) in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6487
                '       at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme) in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6459
                '       at System.Windows.Forms.Control.InvokeMarshaledCallbacks() in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6563
                '    --- End of stack trace from previous location ---
                '       at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous) in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6951
                '       at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args) in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6413
                '       at System.Windows.Forms.Control.Invoke(Delegate method) in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6393
                '       at Microsoft.VisualBasic.Forms.Tests.ControlInvokeTests._Closure$__1-1._Lambda$__0() in ...\winforms\src\Microsoft.VisualBasic.Forms\tests\UnitTests\ControlInvokeTests.vb:line 18
 
                exception.StackTrace.Should.Contain(NameOf(FaultingMethod))
                exception.StackTrace.Should.Contain(" System.Windows.Forms.Control.Invoke(Delegate method) ")
            End Using
        End Sub
 
        <WinFormsFact>
        Public Sub Control_Invoke_Func_calls_correct_method()
            Using _control As New Control
                _control.CreateControl()
 
                Dim testCode As Action =
                    Sub()
                        Dim result As Integer =
                            _control.Invoke(Function() CType(AddressOf FaultingFunc, Func(Of Integer, Integer))(19))
                    End Sub
 
                Dim exception As Exception = Assert.Throws(Of DivideByZeroException)(testCode)
 
                '    Expecting something Like the following.
                '    The first frame must be the this method, followed by MarshaledInvoke at previous location.
                '
                '    at Microsoft.VisualBasic.Forms.Tests.ControlInvokeTests.FaultingFunc(Int32 a) in ...\winforms\src\Microsoft.VisualBasic.Forms\tests\UnitTests\ControlInvokeTests.vb:line 144
                '       at Microsoft.VisualBasic.Forms.Tests.ControlInvokeTests._Closure$__4-1._Lambda$__1() in ...\winforms\src\Microsoft.VisualBasic.Forms\tests\UnitTests\ControlInvokeTests.vb:line 112
                '    --- End of stack trace from previous location ---
                '       at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous) in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6951
                '       at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args) in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6413
                '       at System.Windows.Forms.Control.Invoke[T](Func`1 method) in ...\winforms\src\System.Windows.Forms\src\System\Windows\Forms\Control.cs:line 6422
                '       at Microsoft.VisualBasic.Forms.Tests.ControlInvokeTests._Closure$__4-1._Lambda$__0() in ...\winforms\src\Microsoft.VisualBasic.Forms\tests\UnitTests\ControlInvokeTests.vb:line 111
                '       at Xunit.Assert.RecordException(Action testCode) in C:\Dev\xunit\xunit\src\xunit.assert\Asserts\Record.cs:line 27
 
                exception.StackTrace.Should.Contain(NameOf(FaultingFunc))
                exception.StackTrace.Should.Contain(" System.Windows.Forms.Control.Invoke[T](Func`1 method) ")
            End Using
        End Sub
 
    End Class
End Namespace