@ -61,6 +61,7 @@ public class AssemblyTreeTests
@@ -61,6 +61,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
// Act — pick CoreLib (always ships localised error-message tables), expand it.
@ -88,6 +89,7 @@ public class AssemblyTreeTests
@@ -88,6 +89,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
// Act — locate the realised DataGrid inside the AssemblyListPane.
@ -110,6 +112,7 @@ public class AssemblyTreeTests
@@ -110,6 +112,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var typeNode = vm . AssemblyTreeModel . FindNode < TypeTreeNode > (
@ -117,7 +120,7 @@ public class AssemblyTreeTests
@@ -117,7 +120,7 @@ public class AssemblyTreeTests
typeNode . EnsureLazyChildren ( ) ;
typeNode . IsExpanded = true ;
var first = typeNode . Children . OfType < MethodTreeNode > ( )
. Single ( m = > m . MethodDefinition . Name = = "AsEnumerable " ) ;
. First ( m = > m . MethodDefinition . Name = = "ElementAt " ) ;
var second = typeNode . Children . OfType < MethodTreeNode > ( )
. First ( m = > m . MethodDefinition . Name = = "Empty" ) ;
@ -150,6 +153,7 @@ public class AssemblyTreeTests
@@ -150,6 +153,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var tempDir = Path . Combine ( Path . GetTempPath ( ) , "ILSpy.Tests" , System . Guid . NewGuid ( ) . ToString ( "N" ) ) ;
@ -170,6 +174,7 @@ public class AssemblyTreeTests
@@ -170,6 +174,7 @@ public class AssemblyTreeTests
var openCommand = registry . Commands
. Single ( c = > c . Metadata . Header = = nameof ( Resources . _ Open ) )
. CreateExport ( ) . Value ;
// execute openCommand
openCommand . Execute ( zipPath ) ;
await Waiters . WaitForAsync ( ( ) = >
@ -207,6 +212,7 @@ public class AssemblyTreeTests
@@ -207,6 +212,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var coreLibName = typeof ( object ) . Assembly . GetName ( ) . Name ! ;
@ -241,6 +247,7 @@ public class AssemblyTreeTests
@@ -241,6 +247,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var assemblyNode = vm . AssemblyTreeModel . FindNode < AssemblyTreeNode > ( "System.Linq" ) ;
@ -272,6 +279,7 @@ public class AssemblyTreeTests
@@ -272,6 +279,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var assemblyNode = vm . AssemblyTreeModel . FindNode < AssemblyTreeNode > ( "System.Linq" ) ;
@ -304,6 +312,7 @@ public class AssemblyTreeTests
@@ -304,6 +312,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var assemblyNode = vm . AssemblyTreeModel . FindNode < AssemblyTreeNode > ( "System.Linq" ) ;
@ -340,6 +349,7 @@ public class AssemblyTreeTests
@@ -340,6 +349,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var assemblyNode = vm . AssemblyTreeModel . FindNode < AssemblyTreeNode > ( "System.Linq" ) ;
@ -365,6 +375,7 @@ public class AssemblyTreeTests
@@ -365,6 +375,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var assemblyNode = vm . AssemblyTreeModel . FindNode < AssemblyTreeNode > ( "System.Linq" ) ;
@ -394,6 +405,7 @@ public class AssemblyTreeTests
@@ -394,6 +405,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var assemblyNode = vm . AssemblyTreeModel . FindNode < AssemblyTreeNode > ( "System.Linq" ) ;
@ -447,6 +459,7 @@ public class AssemblyTreeTests
@@ -447,6 +459,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var coreLibDir = System . IO . Path . GetDirectoryName ( typeof ( object ) . Assembly . Location ) ! ;
@ -460,6 +473,7 @@ public class AssemblyTreeTests
@@ -460,6 +473,7 @@ public class AssemblyTreeTests
var openCommand = registry . Commands
. Single ( c = > c . Metadata . Header = = nameof ( Resources . _ Open ) )
. CreateExport ( ) . Value ;
// execute openCommand
openCommand . Execute ( mscorlibPath ) ;
await Waiters . WaitForAsync ( ( ) = >
@ -509,6 +523,7 @@ public class AssemblyTreeTests
@@ -509,6 +523,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var assemblyNode = vm . AssemblyTreeModel . FindNode < AssemblyTreeNode > ( "System.Linq" ) ;
@ -546,6 +561,7 @@ public class AssemblyTreeTests
@@ -546,6 +561,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var assemblyNode = vm . AssemblyTreeModel . FindNode < AssemblyTreeNode > ( "System.Linq" ) ;
@ -586,6 +602,7 @@ public class AssemblyTreeTests
@@ -586,6 +602,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var newAsmPath = typeof ( System . Net . Http . HttpClient ) . Assembly . Location ;
@ -593,6 +610,7 @@ public class AssemblyTreeTests
@@ -593,6 +610,7 @@ public class AssemblyTreeTests
var openCommand = registry . Commands
. Single ( c = > c . Metadata . Header = = nameof ( Resources . _ Open ) )
. CreateExport ( ) . Value ;
// execute openCommand
openCommand . Execute ( newAsmPath ) ;
await Waiters . WaitForAsync ( ( ) = >
@ -616,7 +634,8 @@ public class AssemblyTreeTests
@@ -616,7 +634,8 @@ public class AssemblyTreeTests
var methodNode = typeNode . Children . OfType < MethodTreeNode > ( )
. First ( m = > m . MethodDefinition . Name = = "CancelPendingRequests" ) ;
vm . AssemblyTreeModel . SelectedItem = methodNode ;
// select methodNode
vm . AssemblyTreeModel . SelectNode ( methodNode ) ;
await vm . DockWorkspace . WaitForDecompiledTextAsync ( ) ;
await Waiters . WaitForAsync ( ( ) = >
@ -648,6 +667,7 @@ public class AssemblyTreeTests
@@ -648,6 +667,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var newAsmPath = typeof ( System . Net . Http . HttpClient ) . Assembly . Location ;
@ -655,6 +675,7 @@ public class AssemblyTreeTests
@@ -655,6 +675,7 @@ public class AssemblyTreeTests
var openCommand = registry . Commands
. Single ( c = > c . Metadata . Header = = nameof ( Resources . _ Open ) )
. CreateExport ( ) . Value ;
// execute openCommand
openCommand . Execute ( newAsmPath ) ;
await Waiters . WaitForAsync ( ( ) = >
@ -672,7 +693,8 @@ public class AssemblyTreeTests
@@ -672,7 +693,8 @@ public class AssemblyTreeTests
var methodNode = typeNode . Children . OfType < MethodTreeNode > ( )
. First ( m = > m . MethodDefinition . Name = = "CancelPendingRequests" ) ;
vm . AssemblyTreeModel . SelectedItem = methodNode ;
// select methodNode
vm . AssemblyTreeModel . SelectNode ( methodNode ) ;
await vm . DockWorkspace . WaitForDecompiledTextAsync ( ) ;
await Waiters . WaitForAsync ( ( ) = >
@ -712,6 +734,7 @@ public class AssemblyTreeTests
@@ -712,6 +734,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var newAsmPath = typeof ( System . Net . Http . HttpClient ) . Assembly . Location ;
@ -722,6 +745,7 @@ public class AssemblyTreeTests
@@ -722,6 +745,7 @@ public class AssemblyTreeTests
var openCommand = registry . Commands
. Single ( c = > c . Metadata . Header = = nameof ( Resources . _ Open ) )
. CreateExport ( ) . Value ;
// execute openCommand
openCommand . Execute ( newAsmPath ) ;
await Waiters . WaitForAsync ( ( ) = >
@ -753,6 +777,7 @@ public class AssemblyTreeTests
@@ -753,6 +777,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var enumerable = vm . AssemblyTreeModel . FindNode < TypeTreeNode > (
@ -762,16 +787,23 @@ public class AssemblyTreeTests
@@ -762,16 +787,23 @@ public class AssemblyTreeTests
var ns = ( NamespaceTreeNode ) enumerable . Parent ! ;
ns . EnsureLazyChildren ( ) ;
ns . IsExpanded = true ;
// expand ns
var asm = ( AssemblyTreeNode ) ns . Parent ! ;
// expand asm
asm . IsExpanded = true ;
foreach ( var child in ns . Children . OfType < TypeTreeNode > ( ) )
{
child . EnsureLazyChildren ( ) ;
child . IsExpanded = true ;
// expand child
}
var pane = await window . WaitForComponent < AssemblyListPane > ( ) ;
var grid = await pane . WaitForComponent < DataGrid > ( ) ;
vm . AssemblyTreeModel . SelectedItem = enumerable ;
// select enumerable
vm . AssemblyTreeModel . SelectNode ( enumerable ) ;
// wait for the predicate
await Waiters . WaitForAsync ( ( ) = > ReferenceEquals ( vm . AssemblyTreeModel . SelectedItem , enumerable ) ) ;
for ( int i = 0 ; i < 8 ; i + + )
{
@ -831,16 +863,19 @@ public class AssemblyTreeTests
@@ -831,16 +863,19 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var probe = new SaveProbeNode ( ) ;
vm . AssemblyTreeModel . SelectedItem = probe ;
// select probe
vm . AssemblyTreeModel . SelectNode ( probe ) ;
// Act — fire the Save Code main-menu command.
var registry = AppComposition . Current . GetExport < MainMenuCommandRegistry > ( ) ;
var saveCmd = registry . Commands
. Single ( c = > c . Metadata . Header = = nameof ( Resources . _ SaveCode ) )
. CreateExport ( ) . Value ;
// execute saveCmd
saveCmd . Execute ( null ) ;
// Assert — probe's Save() ran.
@ -870,6 +905,7 @@ public class AssemblyTreeTests
@@ -870,6 +905,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var typeNode = vm . AssemblyTreeModel . FindNode < TypeTreeNode > (
@ -878,7 +914,8 @@ public class AssemblyTreeTests
@@ -878,7 +914,8 @@ public class AssemblyTreeTests
typeNode . IsExpanded = true ;
var method = typeNode . Children . OfType < MethodTreeNode > ( )
. First ( m = > m . MethodDefinition . Name = = "AsEnumerable" ) ;
vm . AssemblyTreeModel . SelectedItem = method ;
// select method
vm . AssemblyTreeModel . SelectNode ( method ) ;
await vm . DockWorkspace . WaitForDecompiledTextAsync ( ) ;
// Act — invoke SaveCodeAsync with a temp path (bypassing the file picker so the test
@ -922,12 +959,15 @@ public class AssemblyTreeTests
@@ -922,12 +959,15 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var sacrificialName = typeof ( System . Linq . Enumerable ) . Assembly . GetName ( ) . Name ! ;
var survivorName = typeof ( object ) . Assembly . GetName ( ) . Name ! ;
var sacrificialNode = vm . AssemblyTreeModel . FindNode < AssemblyTreeNode > ( sacrificialName ) ;
vm . AssemblyTreeModel . SelectedItem = sacrificialNode ;
// select sacrificialNode
vm . AssemblyTreeModel . SelectNode ( sacrificialNode ) ;
// wait for the predicate
await Waiters . WaitForAsync ( ( ) = > ReferenceEquals ( vm . AssemblyTreeModel . SelectedItem , sacrificialNode ) ) ;
var pane = await window . WaitForComponent < AssemblyListPane > ( ) ;
@ -963,6 +1003,7 @@ public class AssemblyTreeTests
@@ -963,6 +1003,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
vm . AssemblyTreeModel . AssemblyList ! . Count . Should ( ) . BeGreaterThan ( 0 ) ;
@ -972,9 +1013,11 @@ public class AssemblyTreeTests
@@ -972,9 +1013,11 @@ public class AssemblyTreeTests
. Single ( c = > c . Metadata . Header = = nameof ( Resources . ClearAssemblyList ) )
. CreateExport ( ) . Value ;
clearCmd . CanExecute ( null ) . Should ( ) . BeTrue ( "non-empty list must enable Clear" ) ;
// execute clearCmd
clearCmd . Execute ( null ) ;
// Assert — the list goes to zero entries.
// wait for the predicate
await Waiters . WaitForAsync ( ( ) = > vm . AssemblyTreeModel . AssemblyList ! . Count = = 0 ) ;
vm . AssemblyTreeModel . AssemblyList ! . Count . Should ( ) . Be ( 0 ) ;
}
@ -991,6 +1034,7 @@ public class AssemblyTreeTests
@@ -991,6 +1034,7 @@ public class AssemblyTreeTests
var window = AppComposition . Current . GetExport < MainWindow > ( ) ;
window . Show ( ) ;
var vm = ( MainWindowViewModel ) window . DataContext ! ;
// wait for assemblies to load
await vm . AssemblyTreeModel . WaitForAssembliesAsync ( minimumCount : 3 ) ;
var brokenPath = System . IO . Path . Combine (
@ -1006,6 +1050,7 @@ public class AssemblyTreeTests
@@ -1006,6 +1050,7 @@ public class AssemblyTreeTests
var broken = vm . AssemblyTreeModel . AssemblyList ! . GetAssemblies ( )
. First ( a = > string . Equals ( a . FileName , brokenPath , System . StringComparison . OrdinalIgnoreCase ) ) ;
// GetLoadResultAsync rethrows the load failure; HasLoadError is the safe probe.
// wait for the predicate
await Waiters . WaitForAsync ( ( ) = > broken . HasLoadError ) ;
var validBefore = vm . AssemblyTreeModel . AssemblyList ! . GetAssemblies ( )
@ -1020,6 +1065,7 @@ public class AssemblyTreeTests
@@ -1020,6 +1065,7 @@ public class AssemblyTreeTests
. Single ( c = > c . Metadata . Header = = nameof ( Resources . _ RemoveAssembliesWithLoadErrors ) )
. CreateExport ( ) . Value ;
cmd . CanExecute ( null ) . Should ( ) . BeTrue ( "a broken entry must enable the command" ) ;
// execute cmd
cmd . Execute ( null ) ;
await Waiters . WaitForAsync ( ( ) = >