File: TaskList\TaskListTableDataSourceTests.vb
Web Access
Project: ..\..\..\src\VisualStudio\Core\Test\Microsoft.VisualStudio.LanguageServices.UnitTests.vbproj (Microsoft.VisualStudio.LanguageServices.UnitTests)
' 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.
 
Imports System.Collections.Immutable
Imports System.Threading
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Editor.[Shared].Utilities
Imports Microsoft.CodeAnalysis.Editor.TaskList
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces
Imports Microsoft.CodeAnalysis.TaskList
Imports Microsoft.CodeAnalysis.Test.Utilities
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.VisualStudio.LanguageServices.Implementation.TableDataSource
Imports Microsoft.VisualStudio.LanguageServices.UnitTests.Diagnostics
Imports Microsoft.VisualStudio.Shell.TableManager
Imports Roslyn.Test.Utilities
Imports Roslyn.Utilities
 
Namespace Microsoft.VisualStudio.LanguageServices.UnitTests.TaskList
    <[UseExportProvider]>
    Public Class TaskListTableDataSourceTests
        <Fact>
        Public Sub TestCreation()
            Using workspace = TestWorkspace.CreateCSharp(String.Empty)
                Dim threadingContext = workspace.GetService(Of IThreadingContext)()
                Dim provider = New TestTaskListProvider()
                Dim tableManagerProvider = New TestTableManagerProvider()
 
                Dim table = New VisualStudioTaskListTable(workspace, threadingContext, tableManagerProvider, provider)
                Dim manager = DirectCast(table.TableManager, TestTableManagerProvider.TestTableManager)
 
                Assert.Equal(manager.Identifier, StandardTables.TasksTable)
                Assert.Equal(1, manager.Sources.Count())
 
                Dim source = DirectCast(manager.Sources.First(), AbstractRoslynTableDataSource(Of TaskListTableItem, TaskListUpdatedArgs))
                AssertEx.SetEqual(table.Columns, manager.GetColumnsForSources(SpecializedCollections.SingletonEnumerable(source)))
 
                Assert.Equal(ServicesVSResources.CSharp_VB_Todo_List_Table_Data_Source, source.DisplayName)
                Assert.Equal(StandardTableDataSources.CommentTableDataSource, source.SourceTypeIdentifier)
 
                Assert.Equal(1, manager.Sinks_TestOnly.Count())
 
                Dim sinkAndSubscription = manager.Sinks_TestOnly.First()
                Dim sink = DirectCast(sinkAndSubscription.Key, TestTableManagerProvider.TestTableManager.TestSink)
                Dim subscription = sinkAndSubscription.Value
 
                Assert.Equal(0, sink.Entries.Count())
                Assert.Equal(1, source.NumberOfSubscription_TestOnly)
 
                subscription.Dispose()
                Assert.Equal(0, source.NumberOfSubscription_TestOnly)
            End Using
        End Sub
 
        <Fact>
        Public Sub TestInitialEntries()
            Using workspace = TestWorkspace.CreateCSharp(String.Empty)
                Dim threadingContext = workspace.GetService(Of IThreadingContext)()
                Dim documentId = workspace.CurrentSolution.Projects.First().DocumentIds.First()
                Dim provider = New TestTaskListProvider(CreateItem(documentId))
                Dim tableManagerProvider = New TestTableManagerProvider()
 
                Dim table = New VisualStudioTaskListTable(workspace, threadingContext, tableManagerProvider, provider)
                provider.RaiseTodoListUpdated(workspace)
 
                Dim manager = DirectCast(table.TableManager, TestTableManagerProvider.TestTableManager)
                Dim source = DirectCast(manager.Sources.First(), AbstractRoslynTableDataSource(Of TaskListTableItem, TaskListUpdatedArgs))
                Dim sinkAndSubscription = manager.Sinks_TestOnly.First()
 
                Dim sink = DirectCast(sinkAndSubscription.Key, TestTableManagerProvider.TestTableManager.TestSink)
                Assert.Equal(1, sink.Entries.Count)
            End Using
        End Sub
 
        <Fact>
        Public Sub TestEntryChanged()
            Using workspace = TestWorkspace.CreateCSharp(String.Empty)
                Dim threadingContext = workspace.GetService(Of IThreadingContext)()
                Dim documentId = workspace.CurrentSolution.Projects.First().DocumentIds.First()
                Dim provider = New TestTaskListProvider()
                Dim tableManagerProvider = New TestTableManagerProvider()
 
                Dim table = New VisualStudioTaskListTable(workspace, threadingContext, tableManagerProvider, provider)
                Dim manager = DirectCast(table.TableManager, TestTableManagerProvider.TestTableManager)
 
                Dim source = DirectCast(manager.Sources.First(), AbstractRoslynTableDataSource(Of TaskListTableItem, TaskListUpdatedArgs))
                Dim sinkAndSubscription = manager.Sinks_TestOnly.First()
 
                Dim sink = DirectCast(sinkAndSubscription.Key, TestTableManagerProvider.TestTableManager.TestSink)
 
                provider.Items = New TaskListItem() {CreateItem(documentId)}
                provider.RaiseTodoListUpdated(workspace)
                Assert.Equal(1, sink.Entries.Count)
 
                provider.Items = Array.Empty(Of TaskListItem)()
                provider.RaiseClearTodoListUpdated(workspace, documentId)
                Assert.Equal(0, sink.Entries.Count)
            End Using
        End Sub
 
        <Fact>
        Public Sub TestEntry()
            Using workspace = TestWorkspace.CreateCSharp(String.Empty)
                Dim threadingContext = workspace.GetService(Of IThreadingContext)()
                Dim documentId = workspace.CurrentSolution.Projects.First().DocumentIds.First()
 
                Dim item = CreateItem(documentId)
                Dim provider = New TestTaskListProvider(item)
                Dim tableManagerProvider = New TestTableManagerProvider()
 
                Dim table = New VisualStudioTaskListTable(workspace, threadingContext, tableManagerProvider, provider)
                provider.RaiseTodoListUpdated(workspace)
 
                Dim manager = DirectCast(table.TableManager, TestTableManagerProvider.TestTableManager)
                Dim source = DirectCast(manager.Sources.First(), AbstractRoslynTableDataSource(Of TaskListTableItem, TaskListUpdatedArgs))
                Dim sinkAndSubscription = manager.Sinks_TestOnly.First()
 
                Dim sink = DirectCast(sinkAndSubscription.Key, TestTableManagerProvider.TestTableManager.TestSink)
                Dim subscription = sinkAndSubscription.Value
 
                Dim snapshot = sink.Entries.First().GetCurrentSnapshot()
 
                Assert.Equal(1, snapshot.Count)
 
                Dim filename = Nothing
                Assert.True(snapshot.TryGetValue(0, StandardTableKeyNames.DocumentName, filename))
                Assert.Equal(item.Span.Path, filename)
 
                Dim text = Nothing
                Assert.True(snapshot.TryGetValue(0, StandardTableKeyNames.Text, text))
                Assert.Equal(item.Message, text)
 
                Dim line = Nothing
                Assert.True(snapshot.TryGetValue(0, StandardTableKeyNames.Line, line))
                Assert.Equal(item.MappedSpan.StartLinePosition.Line, line)
 
                Dim column = Nothing
                Assert.True(snapshot.TryGetValue(0, StandardTableKeyNames.Column, column))
                Assert.Equal(item.MappedSpan.StartLinePosition.Character, column)
            End Using
        End Sub
 
        <Fact>
        Public Sub TestSnapshotEntry()
            Using workspace = TestWorkspace.CreateCSharp(String.Empty)
                Dim threadingContext = workspace.GetService(Of IThreadingContext)()
                Dim documentId = workspace.CurrentSolution.Projects.First().DocumentIds.First()
 
                Dim item = CreateItem(documentId)
                Dim provider = New TestTaskListProvider(item)
                Dim tableManagerProvider = New TestTableManagerProvider()
 
                Dim table = New VisualStudioTaskListTable(workspace, threadingContext, tableManagerProvider, provider)
                provider.RaiseTodoListUpdated(workspace)
 
                Dim manager = DirectCast(table.TableManager, TestTableManagerProvider.TestTableManager)
                Dim source = DirectCast(manager.Sources.First(), AbstractRoslynTableDataSource(Of TaskListTableItem, TaskListUpdatedArgs))
                Dim sinkAndSubscription = manager.Sinks_TestOnly.First()
 
                Dim sink = DirectCast(sinkAndSubscription.Key, TestTableManagerProvider.TestTableManager.TestSink)
                Dim subscription = sinkAndSubscription.Value
 
                Dim factory = TryCast(sink.Entries.First(), TableEntriesFactory(Of TaskListTableItem, TaskListUpdatedArgs))
                Dim snapshot1 = factory.GetCurrentSnapshot()
 
                factory.OnRefreshed()
 
                Dim snapshot2 = factory.GetCurrentSnapshot()
 
                Assert.Equal(snapshot1.VersionNumber + 1, snapshot2.VersionNumber)
 
                Assert.Equal(1, snapshot1.Count)
 
                Dim filename = Nothing
                Assert.True(snapshot1.TryGetValue(0, StandardTableKeyNames.DocumentName, filename))
                Assert.Equal(item.Span.Path, filename)
 
                Dim text = Nothing
                Assert.True(snapshot1.TryGetValue(0, StandardTableKeyNames.Text, text))
                Assert.Equal(item.Message, text)
 
                Dim line = Nothing
                Assert.True(snapshot1.TryGetValue(0, StandardTableKeyNames.Line, line))
                Assert.Equal(item.MappedSpan.StartLinePosition.Line, line)
 
                Dim column = Nothing
                Assert.True(snapshot1.TryGetValue(0, StandardTableKeyNames.Column, column))
                Assert.Equal(item.MappedSpan.StartLinePosition.Character, column)
            End Using
        End Sub
 
        <Fact>
        Public Sub TestSnapshotTranslateTo()
            Using workspace = TestWorkspace.CreateCSharp(String.Empty)
                Dim threadingContext = workspace.GetService(Of IThreadingContext)()
                Dim documentId = workspace.CurrentSolution.Projects.First().DocumentIds.First()
 
                Dim item = CreateItem(documentId)
                Dim provider = New TestTaskListProvider(item)
                Dim tableManagerProvider = New TestTableManagerProvider()
 
                Dim table = New VisualStudioTaskListTable(workspace, threadingContext, tableManagerProvider, provider)
                provider.RaiseTodoListUpdated(workspace)
 
                Dim manager = DirectCast(table.TableManager, TestTableManagerProvider.TestTableManager)
                Dim source = DirectCast(manager.Sources.First(), AbstractRoslynTableDataSource(Of TaskListTableItem, TaskListUpdatedArgs))
                Dim sinkAndSubscription = manager.Sinks_TestOnly.First()
 
                Dim sink = DirectCast(sinkAndSubscription.Key, TestTableManagerProvider.TestTableManager.TestSink)
                Dim subscription = sinkAndSubscription.Value
 
                Dim factory = TryCast(sink.Entries.First(), TableEntriesFactory(Of TaskListTableItem, TaskListUpdatedArgs))
                Dim snapshot1 = factory.GetCurrentSnapshot()
 
                factory.OnRefreshed()
 
                Dim snapshot2 = factory.GetCurrentSnapshot()
 
                Assert.Equal(0, snapshot1.IndexOf(0, snapshot2))
            End Using
        End Sub
 
        <Fact>
        Public Sub TestSnapshotTranslateTo2()
            Using workspace = TestWorkspace.CreateCSharp(String.Empty)
                Dim threadingContext = workspace.GetService(Of IThreadingContext)()
                Dim documentId = workspace.CurrentSolution.Projects.First().DocumentIds.First()
 
                Dim item = CreateItem(documentId)
                Dim provider = New TestTaskListProvider(item)
                Dim tableManagerProvider = New TestTableManagerProvider()
 
                Dim table = New VisualStudioTaskListTable(workspace, threadingContext, tableManagerProvider, provider)
                provider.RaiseTodoListUpdated(workspace)
 
                Dim manager = DirectCast(table.TableManager, TestTableManagerProvider.TestTableManager)
                Dim source = DirectCast(manager.Sources.First(), AbstractRoslynTableDataSource(Of TaskListTableItem, TaskListUpdatedArgs))
                Dim sinkAndSubscription = manager.Sinks_TestOnly.First()
 
                Dim sink = DirectCast(sinkAndSubscription.Key, TestTableManagerProvider.TestTableManager.TestSink)
                Dim subscription = sinkAndSubscription.Value
 
                Dim factory = TryCast(sink.Entries.First(), TableEntriesFactory(Of TaskListTableItem, TaskListUpdatedArgs))
                Dim snapshot1 = factory.GetCurrentSnapshot()
 
                Dim pos = New LinePosition(11, 21)
                Dim span2 = New FileLinePositionSpan("test2", pos, pos)
                Dim span1 = New FileLinePositionSpan("test1", pos, pos)
                provider.Items = New TaskListItem() {
                    New TaskListItem(Priority:=TaskListItemPriority.Medium, Message:="test2", DocumentId:=documentId, Span:=span2, MappedSpan:=span2),
                    New TaskListItem(Priority:=TaskListItemPriority.Low, Message:="test", DocumentId:=documentId, Span:=span1, MappedSpan:=span1)
                }
 
                provider.RaiseTodoListUpdated(workspace)
 
                Dim snapshot2 = factory.GetCurrentSnapshot()
                Assert.Equal(1, snapshot1.IndexOf(0, snapshot2))
            End Using
        End Sub
 
        <Fact>
        Public Sub TestSnapshotTranslateTo3()
            Using workspace = TestWorkspace.CreateCSharp(String.Empty)
                Dim threadingContext = workspace.GetService(Of IThreadingContext)()
                Dim documentId = workspace.CurrentSolution.Projects.First().DocumentIds.First()
 
                Dim item = CreateItem(documentId)
                Dim provider = New TestTaskListProvider(item)
                Dim tableManagerProvider = New TestTableManagerProvider()
 
                Dim table = New VisualStudioTaskListTable(workspace, threadingContext, tableManagerProvider, provider)
                provider.RaiseTodoListUpdated(workspace)
 
                Dim manager = DirectCast(table.TableManager, TestTableManagerProvider.TestTableManager)
                Dim source = DirectCast(manager.Sources.First(), AbstractRoslynTableDataSource(Of TaskListTableItem, TaskListUpdatedArgs))
                Dim sinkAndSubscription = manager.Sinks_TestOnly.First()
 
                Dim sink = DirectCast(sinkAndSubscription.Key, TestTableManagerProvider.TestTableManager.TestSink)
                Dim subscription = sinkAndSubscription.Value
 
                Dim factory = TryCast(sink.Entries.First(), TableEntriesFactory(Of TaskListTableItem, TaskListUpdatedArgs))
                Dim snapshot1 = factory.GetCurrentSnapshot()
 
                Dim pos = New LinePosition(11, 21)
                Dim span2 = New FileLinePositionSpan("test2", pos, pos)
                Dim span3 = New FileLinePositionSpan("test3", pos, pos)
                provider.Items = New TaskListItem() {
                    New TaskListItem(Priority:=TaskListItemPriority.Medium, Message:="test2", DocumentId:=documentId, Span:=span2, MappedSpan:=span2),
                    New TaskListItem(Priority:=TaskListItemPriority.Low, Message:="test3", DocumentId:=documentId, Span:=span3, MappedSpan:=span3)
                }
 
                provider.RaiseTodoListUpdated(workspace)
 
                Dim snapshot2 = factory.GetCurrentSnapshot()
                Assert.Equal(-1, snapshot1.IndexOf(0, snapshot2))
            End Using
        End Sub
 
        <Fact>
        Public Sub TestInvalidEntry()
            Using workspace = TestWorkspace.CreateCSharp(String.Empty)
                Dim threadingContext = workspace.GetService(Of IThreadingContext)()
                Dim documentId = workspace.CurrentSolution.Projects.First().DocumentIds.First()
 
                Dim item = CreateItem(documentId)
                Dim provider = New TestTaskListProvider(item)
                Dim tableManagerProvider = New TestTableManagerProvider()
 
                Dim table = New VisualStudioTaskListTable(workspace, threadingContext, tableManagerProvider, provider)
                provider.RaiseTodoListUpdated(workspace)
 
                Dim manager = DirectCast(table.TableManager, TestTableManagerProvider.TestTableManager)
                Dim source = DirectCast(manager.Sources.First(), AbstractRoslynTableDataSource(Of TaskListTableItem, TaskListUpdatedArgs))
                Dim sinkAndSubscription = manager.Sinks_TestOnly.First()
 
                Dim sink = DirectCast(sinkAndSubscription.Key, TestTableManagerProvider.TestTableManager.TestSink)
                Dim snapshot = sink.Entries.First().GetCurrentSnapshot()
 
                Assert.Equal(1, snapshot.Count)
 
                Dim temp = Nothing
                Assert.False(snapshot.TryGetValue(-1, StandardTableKeyNames.DocumentName, temp))
                Assert.False(snapshot.TryGetValue(1, StandardTableKeyNames.DocumentName, temp))
                Assert.False(snapshot.TryGetValue(0, "Test", temp))
            End Using
        End Sub
 
        <Fact>
        Public Sub TestAggregatedEntries()
            Dim markup = <Workspace>
                             <Project Language="C#" CommonReferences="true" AssemblyName="Proj1">
                                 <Document FilePath="test1"><![CDATA[// TODO hello]]></Document>
                             </Project>
                             <Project Language="C#" CommonReferences="true" AssemblyName="Proj2">
                                 <Document IsLinkFile="true" LinkAssemblyName="Proj1" LinkFilePath="test1"/>
                             </Project>
                         </Workspace>
 
            Using workspace = TestWorkspace.Create(markup)
                Dim threadingContext = workspace.GetService(Of IThreadingContext)()
                Dim projects = workspace.CurrentSolution.Projects.ToArray()
 
                Dim item1 = CreateItem(projects(0).DocumentIds.First())
                Dim item2 = CreateItem(projects(1).DocumentIds.First())
 
                Dim provider = New TestTaskListProvider()
                Dim tableManagerProvider = New TestTableManagerProvider()
 
                Dim table = New VisualStudioTaskListTable(workspace, threadingContext, tableManagerProvider, provider)
 
                provider.Items = New TaskListItem() {item1, item2}
                provider.RaiseTodoListUpdated(workspace)
 
                Dim manager = DirectCast(table.TableManager, TestTableManagerProvider.TestTableManager)
                Dim source = DirectCast(manager.Sources.First(), AbstractRoslynTableDataSource(Of TaskListTableItem, TaskListUpdatedArgs))
                Dim sinkAndSubscription = manager.Sinks_TestOnly.First()
 
                Dim sink = DirectCast(sinkAndSubscription.Key, TestTableManagerProvider.TestTableManager.TestSink)
                Dim snapshot = sink.Entries.First().GetCurrentSnapshot()
                Assert.Equal(1, snapshot.Count)
 
                Dim filename As Object = Nothing
                Assert.True(snapshot.TryGetValue(0, StandardTableKeyNames.DocumentName, filename))
                Assert.Equal("test1", filename)
 
                Dim projectname As Object = Nothing
                Assert.True(snapshot.TryGetValue(0, StandardTableKeyNames.ProjectName, projectname))
                Assert.Equal("Proj1, Proj2", projectname)
 
                Dim projectnames As Object = Nothing
                Assert.True(snapshot.TryGetValue(0, StandardTableKeyNames.ProjectName + "s", projectnames))
                Assert.Equal(2, DirectCast(projectnames, String()).Length)
 
                Dim projectguid As Object = Nothing
                Assert.False(snapshot.TryGetValue(0, StandardTableKeyNames.ProjectGuid, projectguid))
            End Using
        End Sub
 
        Private Shared Function CreateItem(documentId As DocumentId) As TaskListItem
            Dim pos = New LinePosition(10, 20)
            Dim span = New FileLinePositionSpan("test1", pos, pos)
            Return New TaskListItem(
                priority:=0,
                message:="test",
                documentId:=documentId,
                span:=span,
                mappedSpan:=span)
        End Function
 
        Private Class TestTaskListProvider
            Implements ITaskListProvider
 
            Public Items As TaskListItem()
 
            Public Sub New(ParamArray items As TaskListItem())
                Me.Items = items
            End Sub
 
            Public Event TaskListUpdated As EventHandler(Of TaskListUpdatedArgs) Implements ITaskListProvider.TaskListUpdated
 
            Public Function GetTaskListItems(workspace As Workspace, documentId As DocumentId, cancellationToken As CancellationToken) As ImmutableArray(Of TaskListItem) Implements ITaskListProvider.GetTaskListItems
                Assert.NotNull(workspace)
                Assert.NotNull(documentId)
 
                Return Items.Where(Function(t) t.DocumentId Is documentId).ToImmutableArrayOrEmpty()
            End Function
 
            Public Sub RaiseTodoListUpdated(workspace As Workspace)
                Dim map = Items.ToLookup(Function(t) t.DocumentId)
 
                For Each group In map
                    RaiseEvent TaskListUpdated(Me, New TaskListUpdatedArgs(
                        Me, workspace.CurrentSolution, group.Key, group.ToImmutableArrayOrEmpty()))
                Next
            End Sub
 
            Public Sub RaiseClearTodoListUpdated(workspace As Microsoft.CodeAnalysis.Workspace, documentId As DocumentId)
                RaiseEvent TaskListUpdated(Me, New TaskListUpdatedArgs(
                    Me, workspace.CurrentSolution, documentId, ImmutableArray(Of TaskListItem).Empty))
            End Sub
        End Class
    End Class
End Namespace