1 write to App
dotnet-watch.Tests (1)
TestUtilities\DotNetWatchTestBase.cs (1)
19App = new WatchableApp(debugLogger);
387 references to App
dotnet-watch.Tests (387)
Browser\BrowserLaunchTests.cs (10)
21App.Start(testAsset, [], testFlags: TestFlags.MockBrowser); 24await App.WaitForOutputLineContaining("Content root path:"); 26Assert.Contains(App.Process.Output, line => line.Contains("Application started. Press Ctrl+C to shut down.")); 27Assert.Contains(App.Process.Output, line => line.Contains("Hosting environment: Development")); 30Assert.Contains(App.Process.Output, line => line.Contains("dotnet watch ⌚ Launching browser: https://localhost:5001")); 39App.EnvironmentVariables.Add("DOTNET_WATCH_BROWSER_PATH", "mycustombrowser.bat"); 41App.Start(testAsset, [], testFlags: TestFlags.MockBrowser); 42await App.WaitForOutputLineContaining(MessageDescriptor.ConfiguredToUseBrowserRefresh); 43await App.WaitForOutputLineContaining(MessageDescriptor.ConfiguredToLaunchBrowser); 46await App.AssertOutputLineStartsWith("dotnet watch ⌚ Launching browser: mycustombrowser.bat https://localhost:5001");
CommandLine\LaunchSettingsTests.cs (28)
27App.Start(testAsset, []); 28Assert.Equal("1", await App.AssertOutputLineStartsWith("DOTNET_WATCH = ")); 42App.DotnetWatchArgs.Add("--no-hot-reload"); 45App.Start(testAsset, []); 46Assert.Equal("<<<First>>>", await App.AssertOutputLineStartsWith("DOTNET_LAUNCH_PROFILE = ")); 60App.DotnetWatchArgs.Add("--no-hot-reload"); 63App.DotnetWatchArgs.Add("--launch-profile"); 64App.DotnetWatchArgs.Add("Second"); 65App.Start(testAsset, []); 66Assert.Equal("<<<Second>>>", await App.AssertOutputLineStartsWith("DOTNET_LAUNCH_PROFILE = ")); 80App.DotnetWatchArgs.Add("--no-hot-reload"); 83App.Start(testAsset, ["--", "--launch-profile", "Third"]); 84Assert.Equal("<<<First>>>", await App.AssertOutputLineStartsWith("DOTNET_LAUNCH_PROFILE = ")); 93App.Start(testAsset, []); 95await App.AssertStarted(); 101var value = await App.AssertOutputLineStartsWith(messagePrefix); 104await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting); 107await App.AssertStarted(); 109value = await App.AssertOutputLineStartsWith(messagePrefix); 119App.Start(testAsset, []); 121await App.AssertOutputLineEquals("Environment: Development"); 133App.Start( 138await App.AssertOutputLineEquals("Environment: Development"); 147App.EnvironmentVariables.Add("READ_INPUT", "true"); 148App.Start(testAsset, ["--non-interactive"]); 150await App.AssertStarted(); 152var standardInput = App.Process.Process.StandardInput; 156Assert.Equal(inputString, await App.AssertOutputLineStartsWith("Echo: "));
CommandLine\ProgramTests.cs (71)
63App.DotnetWatchArgs.Clear(); 64App.Start(testAsset, arguments); 66Assert.Equal(expectedApplicationArgs, await App.AssertOutputLineStartsWith("Arguments = ")); 81App.Start(testAsset, arguments); 83AssertEx.Equal(expectedApplicationArgs, await App.AssertOutputLineStartsWith("Arguments = ")); 93App.DotnetWatchArgs.Clear(); 94App.Start(testAsset, arguments: 109Assert.Equal("-v", await App.AssertOutputLineStartsWith("Arguments = ")); 110Assert.Equal("WatchHotReloadAppMultiTfm, Version=1.2.3.4, Culture=neutral, PublicKeyToken=null", await App.AssertOutputLineStartsWith("AssemblyName = ")); 111Assert.Equal("' | A=B'\tC | '", await App.AssertOutputLineStartsWith("AssemblyTitle = ")); 112Assert.Equal(".NETCoreApp,Version=v6.0", await App.AssertOutputLineStartsWith("TFM = ")); 115Assert.Contains(App.Process.Output, l => l.Contains("Determining projects to restore...")); 118Assert.DoesNotContain(App.Process.Output, l => l.Contains("Working directory:")); 128App.DotnetWatchArgs.Clear(); 129App.Start(testAsset, arguments: 143Assert.Equal("WatchHotReloadAppMultiTfm, Version=1.2.3.4, Culture=neutral, PublicKeyToken=null", await App.AssertOutputLineStartsWith("AssemblyName = ")); 144Assert.Equal("' | A=B'\tC | '", await App.AssertOutputLineStartsWith("AssemblyTitle = ")); 145Assert.Equal(".NETCoreApp,Version=v6.0", await App.AssertOutputLineStartsWith("TFM = ")); 148Assert.DoesNotContain(App.Process.Output, l => l.Contains("Working directory:")); 150Assert.Contains(App.Process.Output, l => l.Contains("Hot reload enabled.")); 161App.Start(testAsset, arguments: new[] 169Assert.Equal(expectedArgs, await App.AssertOutputLineStartsWith("Arguments: ")); 171Assert.Contains(App.Process.Output, l => l.Contains($"Found named launch profile '{profileName}'.")); 172Assert.Contains(App.Process.Output, l => l.Contains("Hot Reload disabled by command line switch.")); 183App.Start(testAsset, arguments: new[] 190Assert.Equal(expectedArgs, await App.AssertOutputLineStartsWith("Arguments: ")); 192Assert.Contains(App.Process.Output, l => l.Contains($"Found named launch profile '{profileName}'.")); 201App.Start(testAsset, ["--verbose", "test", "--list-tests", "/p:VSTestUseMSBuildOutput=false"]); 203await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting); 205App.AssertOutputContains("The following Tests are available:"); 206App.AssertOutputContains(" TestNamespace.VSTestXunitTests.VSTestXunitPassTest"); 207App.Process.ClearOutput(); 214await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting); 216App.AssertOutputContains("The following Tests are available:"); 217App.AssertOutputContains(" TestNamespace.VSTestXunitTests.VSTestXunitPassTest2"); 226App.Start(testAsset, ["--verbose", "test", "--framework", ToolsetInfo.CurrentTargetFramework, "--list-tests", "/p:VSTestUseMSBuildOutput=false"]); 228await App.AssertOutputLineEquals("The following Tests are available:"); 229await App.AssertOutputLineEquals(" TestNamespace.VSTestXunitTests.VSTestXunitFailTestNetCoreApp"); 238App.Start(testAsset, ["--verbose", "--property", "TestProperty=123", "build", "/t:TestTarget"]); 240await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting); 243Assert.Contains("TestProperty", App.Process.Output.Single(line => line.Contains("/t:GenerateWatchList"))); 245App.AssertOutputContains("dotnet watch ⌚ Command 'build' does not support Hot Reload."); 246App.AssertOutputContains("warning : The value of property is '123'"); 255App.Start(testAsset, ["--verbose", "/p:TestProperty=123", "msbuild", "/t:TestTarget"]); 257await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting); 260Assert.DoesNotContain("TestProperty", App.Process.Output.Single(line => line.Contains("/t:GenerateWatchList"))); 262App.AssertOutputContains("dotnet watch ⌚ Command 'msbuild' does not support Hot Reload."); 263App.AssertOutputContains("warning : The value of property is '123'"); 272App.Start(testAsset, ["--verbose", "pack", "-c", "Release"]); 276await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting); 279Assert.Contains("-property:Configuration=Release", App.Process.Output.Single(line => line.Contains("/t:GenerateWatchList"))); 281App.AssertOutputContains("dotnet watch ⌚ Command 'pack' does not support Hot Reload."); 282App.AssertOutputContains($"Successfully created package '{packagePath}'"); 291App.Start(testAsset, ["--verbose", "publish", "-c", "Release"]); 293await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting); 296Assert.Contains("-property:Configuration=Release", App.Process.Output.Single(line => line.Contains("/t:GenerateWatchList"))); 298App.AssertOutputContains("dotnet watch ⌚ Command 'publish' does not support Hot Reload."); 300App.AssertOutputContains(Path.Combine("Release", ToolsetInfo.CurrentTargetFramework, "publish")); 309App.DotnetWatchArgs.Clear(); 310App.Start(testAsset, ["--verbose", "format", "--verbosity", "detailed"]); 312await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting); 314App.AssertOutputContains("dotnet watch ⌚ Command 'format' does not support Hot Reload."); 316App.AssertOutputContains("format --verbosity detailed"); 317App.AssertOutputContains("Format complete in"); 338App.Start(testAsset, [], "AppWithDeps"); 340await App.AssertOutputLineStartsWith("dotnet watch ⌚ Fix the error to continue or press Ctrl+C to exit."); 342App.AssertOutputContains(@"dotnet watch 🔨 Failed to load project graph."); 343App.AssertOutputContains($"dotnet watch ❌ The project file could not be loaded. Could not find a part of the path '{Path.Combine(testAsset.Path, "AppWithDeps", "NonExistentDirectory", "X.csproj")}'"); 352App.DotnetWatchArgs.Clear(); 353App.Start(testAsset, ["--list"]); 354var lines = await App.Process.GetAllOutputLinesAsync(CancellationToken.None);
HotReload\ApplyDeltaTests.cs (249)
22App.Start(testAsset, [], "AppWithDeps"); 24await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 35await App.WaitForOutputLineContaining(MessageDescriptor.ReEvaluationCompleted); 46await App.AssertOutputLineStartsWith("Changed!"); 57App.Start(testAsset, [], "AppWithDeps"); 59await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 71await App.AssertOutputLineStartsWith("Changed!"); 82App.Start(testAsset, [], "AppWithDeps"); 84await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 90await App.WaitForOutputLineContaining(MessageDescriptor.NoCSharpChangesToApply); 91App.AssertOutputContains(MessageDescriptor.ProjectChangeTriggeredReEvaluation); 92App.Process.ClearOutput(); 108await App.AssertOutputLineStartsWith("Changed!"); 109await App.WaitUntilOutputContains($"dotnet watch 🔥 [App.WithDeps ({ToolsetInfo.CurrentTargetFramework})] Hot reload succeeded."); 139App.Start(testAsset, ["--non-interactive"], "AppWithDeps"); 141await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 142await App.WaitUntilOutputContains($"{symbolName} set"); 143App.Process.ClearOutput(); 147await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 148App.AssertOutputContains(MessageDescriptor.ProjectChangeTriggeredReEvaluation); 149App.AssertOutputContains("dotnet watch ⌚ [auto-restart] error ENC1102: Changing project setting 'DefineConstants'"); 151await App.WaitUntilOutputContains($"{symbolName} not set"); 181App.Start(testAsset, [], "AppWithDeps"); 183await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 184await App.WaitUntilOutputContains("BUILD_CONST_IN_PROPS set"); 185App.Process.ClearOutput(); 191await App.WaitUntilOutputContains($"dotnet watch 🔥 [App.WithDeps ({ToolsetInfo.CurrentTargetFramework})] Hot reload succeeded."); 192await App.WaitUntilOutputContains("BUILD_CONST not set"); 194App.AssertOutputContains(MessageDescriptor.ProjectChangeTriggeredReEvaluation); 221App.Start(testAsset, [], "AppWithDeps"); 223await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 224await App.WaitUntilOutputContains("BUILD_CONST_IN_PROPS set"); 229await App.WaitForOutputLineContaining(MessageDescriptor.NoCSharpChangesToApply); 230App.AssertOutputContains(MessageDescriptor.ProjectChangeTriggeredReEvaluation); 231App.Process.ClearOutput(); 233await App.AssertOutputLineStartsWith("BUILD_CONST_IN_PROPS not set"); 255App.Start(testAsset, []); 257await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 258App.AssertOutputContains(new Regex(@"dotnet watch ⌚ Exclusion glob: 'AppData/[*][*]/[*][.][*];bin[/\\]+Debug[/\\]+[*][*];obj[/\\]+Debug[/\\]+[*][*];bin[/\\]+[*][*];obj[/\\]+[*][*]")); 259App.Process.ClearOutput(); 265await App.WaitUntilOutputContains($"dotnet watch ⌚ Ignoring change in excluded file '{appDataFilePath}': Add. Path matches DefaultItemExcludes glob 'AppData/**/*.*' set in '{testAsset.Path}'."); 296App.Start(testAsset, []); 298await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 299App.AssertOutputContains($"dotnet watch ⌚ Excluded directory: '{binDir}'"); 300App.AssertOutputContains($"dotnet watch ⌚ Excluded directory: '{objDir}'"); 301App.Process.ClearOutput(); 306await App.WaitUntilOutputContains($"dotnet watch ⌚ Ignoring change in output directory: Add '{binDirFilePath}'"); 307await App.WaitUntilOutputContains($"dotnet watch ⌚ Ignoring change in output directory: Add '{objDirFilePath}'"); 319App.Start(testAsset, []); 321await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 331await App.WaitForOutputLineContaining(MessageDescriptor.UnableToApplyChanges); 340await App.WaitForOutputLineContaining(MessageDescriptor.HotReloadSucceeded, $"WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})"); 342await App.WaitUntilOutputContains(">>> System.Xml.Linq.XDocument"); 344App.AssertOutputContains(MessageDescriptor.ReEvaluationCompleted); 360App.DotnetWatchArgs.Clear(); 361App.Start(testAsset, ["--verbose", $"-bl:{binLogPath}"], testFlags: TestFlags.None); 363await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 384await App.WaitForOutputLineContaining(MessageDescriptor.ReEvaluationCompleted); 422App.Start(testAsset, nonInteractive ? ["--non-interactive"] : []); 424await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 429await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 431App.AssertOutputContains(MessageDescriptor.RestartNeededToApplyChanges); 432App.AssertOutputContains($"⌚ [auto-restart] {programPath}(38,11): error ENC0023: Adding an abstract method or overriding an inherited method requires restarting the application."); 433App.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Exited"); 434App.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Launched"); 435App.Process.ClearOutput(); 440await App.WaitForOutputLineContaining(MessageDescriptor.HotReloadSucceeded); 451App.Start(testAsset, [], testFlags: TestFlags.ReadKeyFromStdin); 453await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 454App.Process.ClearOutput(); 459await App.AssertOutputLineStartsWith(" ❔ Do you want to restart your app? Yes (y) / No (n) / Always (a) / Never (v)", failure: _ => false); 461App.AssertOutputContains(MessageDescriptor.RestartNeededToApplyChanges); 462App.AssertOutputContains($"❌ {programPath}(38,11): error ENC0023: Adding an abstract method or overriding an inherited method requires restarting the application."); 463App.Process.ClearOutput(); 465App.SendKey('a'); 467await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 469App.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Exited"); 470App.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Launched"); 471App.Process.ClearOutput(); 476await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 478App.AssertOutputContains(MessageDescriptor.RestartNeededToApplyChanges); 479App.AssertOutputContains($"⌚ [auto-restart] {programPath}(38,1): error ENC0033: Deleting method 'F()' requires restarting the application."); 480App.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Exited"); 481App.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Launched"); 506App.Start(testAsset, nonInteractive ? ["--non-interactive"] : []); 508await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 509App.Process.ClearOutput(); 514await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 516App.AssertOutputContains(MessageDescriptor.RestartNeededToApplyChanges); 517App.AssertOutputContains($"⌚ [auto-restart] {programPath}(16,19): warning ENC0118: Changing 'top-level code' might not have any effect until the application is restarted."); 518App.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Exited"); 519App.AssertOutputContains($"[WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Launched"); 520App.AssertOutputContains("<Updated>"); 521App.Process.ClearOutput(); 526await App.WaitForOutputLineContaining(MessageDescriptor.HotReloadSucceeded); 544App.Start(testAsset, []); 546await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting); 552await App.WaitUntilOutputContains("<Updated>"); 561App.Start(testAsset, []); 563await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting); 567await App.WaitUntilOutputContains("<Updated>"); 594App.Start(testAsset, []); 596await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 600await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 601await App.AssertOutputLineStartsWith("<Updated>"); 605await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 606await App.AssertOutputLineStartsWith("<Updated2>"); 616App.Start(testAsset, [], "App"); 618await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 637await App.AssertOutputLineStartsWith("Updated types: Printer"); 660App.Start(testAsset, []); 662await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 666await App.WaitForOutputLineContaining("<Updated>"); 668await App.WaitUntilOutputContains( 697App.DotnetWatchArgs.Clear(); 700App.Start(testAsset, [], testFlags: TestFlags.ElevateWaitingForChangesMessageSeverity); 702await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 706await App.WaitForOutputLineContaining("<Updated>"); 708await App.WaitUntilOutputContains($"dotnet watch ⚠ [WatchHotReloadApp ({ToolsetInfo.CurrentTargetFramework})] Exception from 'AppUpdateHandler.ClearCache': System.InvalidOperationException: Bug!"); 712await App.WaitUntilOutputContains(MessageDescriptor.UpdatesApplied); 717App.AssertOutputDoesNotContain("🕵️"); 738App.Start(testAsset, [], testFlags: TestFlags.ReadKeyFromStdin); 740await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 742await App.WaitUntilOutputContains(new Regex(@"dotnet watch 🕵️ \[.*\] Windows Ctrl\+C handling enabled.")); 744await App.WaitUntilOutputContains("Started"); 746App.SendControlC(); 748await App.WaitForOutputLineContaining("Ctrl+C detected! Performing cleanup..."); 749await App.WaitUntilOutputContains("exited with exit code 0."); 772App.Start(testAsset, ["--urls", "http://localhost:" + port], testFlags: TestFlags.MockBrowser); 774await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 776App.AssertOutputContains(MessageDescriptor.ConfiguredToUseBrowserRefresh); 777App.AssertOutputContains(MessageDescriptor.ConfiguredToLaunchBrowser); 780await App.WaitUntilOutputContains($"dotnet watch ⌚ Launching browser: http://localhost:{port}"); 783App.AssertOutputContains("dbug: Microsoft.AspNetCore.Watch.BrowserRefresh.BlazorWasmHotReloadMiddleware[0]"); 784App.AssertOutputContains("dbug: Microsoft.AspNetCore.Watch.BrowserRefresh.BrowserScriptMiddleware[0]"); 785App.AssertOutputContains("Middleware loaded. Script /_framework/aspnetcore-browser-refresh.js"); 786App.AssertOutputContains("Middleware loaded. Script /_framework/blazor-hotreload.js"); 787App.AssertOutputContains("dbug: Microsoft.AspNetCore.Watch.BrowserRefresh.BrowserRefreshMiddleware"); 788App.AssertOutputContains("Middleware loaded: DOTNET_MODIFIABLE_ASSEMBLIES=debug, __ASPNETCORE_BROWSER_TOOLS=true"); 791App.AssertOutputDoesNotContain("🕵️"); 799await App.WaitForOutputLineContaining(MessageDescriptor.HotReloadSucceeded, $"blazorwasm ({ToolsetInfo.CurrentTargetFramework})"); 804App.AssertOutputContains("dotnet watch 🔥 Hot reload capabilities: Baseline AddMethodToExistingType."); 808App.AssertOutputContains("dotnet watch 🔥 Hot reload capabilities: Baseline AddMethodToExistingType AddStaticFieldToExistingType NewTypeDefinition ChangeCustomAttributes AddInstanceFieldToExistingType GenericAddMethodToExistingType GenericUpdateMethod UpdateParameters GenericAddFieldToExistingType."); 828App.Start(testAsset, ["--urls", "http://localhost:" + port], testFlags: TestFlags.MockBrowser); 830await App.AssertOutputLineStartsWith("dotnet watch ⚠ msbuild: [Warning] Duplicate source file"); 831await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 841App.Start(testAsset, ["--urls", "http://localhost:" + port, "--non-interactive"], testFlags: TestFlags.ReadKeyFromStdin | TestFlags.MockBrowser); 843await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 845App.AssertOutputContains(MessageDescriptor.ConfiguredToUseBrowserRefresh); 846App.AssertOutputContains(MessageDescriptor.ConfiguredToLaunchBrowser); 847App.AssertOutputContains(MessageDescriptor.PressCtrlRToRestart); 850await App.WaitUntilOutputContains($"dotnet watch ⌚ Launching browser: http://localhost:{port}"); 852App.SendControlR(); 854await App.WaitUntilOutputContains(MessageDescriptor.ReloadingBrowser); 866App.Start(testAsset, ["--urls", "http://localhost:" + port], "blazorhosted", testFlags: TestFlags.MockBrowser); 868await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 870App.AssertOutputContains(MessageDescriptor.ConfiguredToUseBrowserRefresh); 871App.AssertOutputContains(MessageDescriptor.ConfiguredToLaunchBrowser); 872App.AssertOutputContains(MessageDescriptor.ApplicationKind_BlazorHosted); 875App.AssertOutputContains($"dotnet watch ⌚ [blazorhosted ({tfm})] Project 'blazorwasm ({tfm})' specifies capabilities: 'Baseline AddMethodToExistingType AddStaticFieldToExistingType NewTypeDefinition ChangeCustomAttributes AddInstanceFieldToExistingType GenericAddMethodToExistingType GenericUpdateMethod UpdateParameters GenericAddFieldToExistingType'"); 878App.AssertOutputContains($"dotnet watch ⌚ [blazorhosted ({tfm})] Capabilities: 'Baseline AddMethodToExistingType AddStaticFieldToExistingType AddInstanceFieldToExistingType NewTypeDefinition ChangeCustomAttributes UpdateParameters GenericUpdateMethod GenericAddMethodToExistingType GenericAddFieldToExistingType AddFieldRva'"); 888App.Start(testAsset, ["--urls", "http://localhost:" + port], relativeProjectDirectory: "RazorApp", testFlags: TestFlags.MockBrowser); 890await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 892App.AssertOutputContains(MessageDescriptor.ConfiguredToUseBrowserRefresh); 893App.AssertOutputContains(MessageDescriptor.ConfiguredToLaunchBrowser); 894App.AssertOutputContains($"dotnet watch ⌚ Launching browser: http://localhost:{port}"); 895App.Process.ClearOutput(); 906await App.WaitForOutputLineContaining(MessageDescriptor.HotReloadChangeHandled); 908App.AssertOutputContains(MessageDescriptor.SendingStaticAssetUpdateRequest.GetMessage("RazorApp.css")); 909App.AssertOutputContains(MessageDescriptor.HotReloadOfScopedCssSucceeded); 910App.AssertOutputContains(MessageDescriptor.NoCSharpChangesToApply); 911App.Process.ClearOutput(); 916await App.WaitForOutputLineContaining(MessageDescriptor.HotReloadChangeHandled); 919App.AssertOutputContains(MessageDescriptor.SendingStaticAssetUpdateRequest.GetMessage("wwwroot/app.css")); 920App.AssertOutputContains(MessageDescriptor.HotReloadOfStaticAssetsSucceeded); 921App.AssertOutputContains(MessageDescriptor.NoCSharpChangesToApply); 922App.Process.ClearOutput(); 945App.Start(testAsset, ["-f", tfm]); 947await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 953await App.WaitForOutputLineContaining(MessageDescriptor.HotReloadChangeHandled); 956App.AssertOutputContains("Updates applied: 1 out of 1."); 957App.AssertOutputContains("Microsoft.AspNetCore.Components.HotReload.HotReloadManager.UpdateApplication"); 958App.Process.ClearOutput(); 964await App.WaitForOutputLineContaining(MessageDescriptor.HotReloadChangeHandled); 965App.AssertOutputContains("Updates applied: 1 out of 1."); 966App.AssertOutputContains("Microsoft.AspNetCore.Components.WebView.StaticContentHotReloadManager.UpdateContent"); 967App.AssertOutputContains("No C# changes to apply."); 977App.Start(testAsset, [], "App"); 979await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 1004await App.AssertOutputLineStartsWith("Updated types: Printer"); 1039App.Start(testAsset, [], "AppWithDeps"); 1041await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 1056await App.AssertOutputLineStartsWith("> Renamed.cs"); 1093App.Start(testAsset, ["--non-interactive"], "AppWithDeps"); 1095await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 1114await App.AssertOutputLineStartsWith("> NewSubdir", failure: _ => false); 1131App.Start(testAsset, ["-lp", "http"], relativeProjectDirectory: "WatchAspire.AppHost", testFlags: TestFlags.ReadKeyFromStdin); 1133await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 1136await App.WaitUntilOutputContains("dotnet watch ⭐ Now listening on:"); 1139await App.WaitUntilOutputContains("dotnet watch ⭐ Session started: #1"); 1142await App.WaitUntilOutputContains($"ApiService working directory: '{Path.GetDirectoryName(serviceProjectPath)}'"); 1149await App.WaitForOutputLineContaining(MessageDescriptor.HotReloadChangeHandled); 1151App.AssertOutputContains("Using Aspire process launcher."); 1152App.AssertOutputContains(MessageDescriptor.HotReloadSucceeded, $"WatchAspire.AppHost ({tfm})"); 1153App.AssertOutputContains(MessageDescriptor.HotReloadSucceeded, $"WatchAspire.ApiService ({tfm})"); 1154App.AssertOutputContains(MessageDescriptor.HotReloadSucceeded, $"WatchAspire.Web ({tfm})"); 1157Assert.Equal(1, App.Process.Output.Count(line => line.StartsWith("dotnet watch ⌚ Launching browser: "))); 1158App.Process.ClearOutput(); 1165await App.WaitForOutputLineContaining(" ❔ Do you want to restart these projects? Yes (y) / No (n) / Always (a) / Never (v)"); 1167App.AssertOutputContains(MessageDescriptor.RestartNeededToApplyChanges); 1168App.AssertOutputContains($"dotnet watch ❌ {serviceSourcePath}(40,1): error ENC0020: Renaming record 'WeatherForecast' requires restarting the application."); 1169App.AssertOutputContains("dotnet watch ⌚ Affected projects:"); 1170App.AssertOutputContains("dotnet watch ⌚ WatchAspire.ApiService"); 1171App.Process.ClearOutput(); 1173App.SendKey('y'); 1175await App.WaitForOutputLineContaining(MessageDescriptor.FixBuildError); 1177App.AssertOutputContains("Application is shutting down..."); 1180App.AssertOutputContains($"[WatchAspire.ApiService ({tfm})] Exited"); 1181App.AssertOutputContains(new Regex(@"dotnet watch ⌚ \[WatchAspire.ApiService \(net.*\)\] Process id [0-9]+ ran for [0-9]+ms and exited with exit code 0")); 1183App.AssertOutputContains(MessageDescriptor.Building.GetMessage(serviceProjectPath)); 1184App.AssertOutputContains("error CS0246: The type or namespace name 'WeatherForecast' could not be found"); 1185App.Process.ClearOutput(); 1192await App.WaitForOutputLineContaining(MessageDescriptor.Capabilities, $"WatchAspire.ApiService ({tfm})"); 1194App.AssertOutputContains(MessageDescriptor.BuildSucceeded.GetMessage(serviceProjectPath)); 1195App.AssertOutputContains(MessageDescriptor.ProjectsRebuilt); 1196App.AssertOutputContains($"dotnet watch ⭐ Starting project: {serviceProjectPath}"); 1198App.SendControlC(); 1200await App.WaitForOutputLineContaining(MessageDescriptor.ShutdownRequested); 1202await App.WaitUntilOutputContains($"[WatchAspire.ApiService ({tfm})] Exited"); 1203await App.WaitUntilOutputContains($"[WatchAspire.AppHost ({tfm})] Exited"); 1204await App.WaitUntilOutputContains(new Regex(@"dotnet watch ⌚ \[WatchAspire.ApiService \(net.*\)\] Process id [0-9]+ ran for [0-9]+ms and exited with exit code 0")); 1205await App.WaitUntilOutputContains(new Regex(@"dotnet watch ⌚ \[WatchAspire.AppHost \(net.*\)\] Process id [0-9]+ ran for [0-9]+ms and exited with exit code 0")); 1207await App.WaitUntilOutputContains("dotnet watch ⭐ Waiting for server to shutdown ..."); 1209App.AssertOutputContains("dotnet watch ⭐ Stop session #1"); 1210App.AssertOutputContains("dotnet watch ⭐ [#1] Sending 'sessionTerminated'"); 1224App.Start(testAsset, ["-lp", "http", "--non-interactive"], relativeProjectDirectory: "WatchAspire.AppHost"); 1226await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 1229await App.WaitUntilOutputContains("dotnet watch ⭐ Session started: #2"); 1230App.Process.ClearOutput(); 1235await App.WaitForOutputLineContaining(MessageDescriptor.HotReloadChangeHandled); 1236await App.WaitUntilOutputContains("dotnet watch ⭐ Session started: #2"); 1238App.AssertOutputContains(MessageDescriptor.ProjectsRestarted.GetMessage(1)); 1239App.AssertOutputDoesNotContain("⚠"); 1241App.Process.ClearOutput(); 1246await App.WaitForOutputLineContaining(MessageDescriptor.HotReloadChangeHandled); 1247App.AssertOutputContains($"dotnet watch 🕵️ [WatchAspire.Web ({tfm})] Updates applied."); 1248App.AssertOutputDoesNotContain("Projects rebuilt"); 1249App.AssertOutputDoesNotContain("Projects restarted"); 1250App.AssertOutputDoesNotContain("⚠");
TestUtilities\DotNetWatchTestBase.cs (3)
26public DebugTestOutputLogger Logger => App.Logger; 29=> App.Logger.Log(message, testPath, testLine); 62App.Dispose();
Watch\GlobbingAppTests.cs (13)
13App.Start(testAsset, ["--no-hot-reload"]); 15await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 16await App.WaitUntilOutputContains("Defined types = 2"); 17App.Process.ClearOutput(); 21await App.WaitUntilOutputContains($"Defined types = {expectedTypesAfterOperation}"); 76App.Start(testAsset, ["--no-hot-reload"]); 78await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 79await App.WaitUntilOutputContains("Defined types = 2"); 80App.Process.ClearOutput(); 86var fileChanged = App.AssertFileChanged(); 97App.DotnetWatchArgs.Clear(); 98App.Start(testAsset, ["--list"]); 99var lines = await App.Process.GetAllOutputLinesAsync(CancellationToken.None);
Watch\NoDepsAppTests.cs (13)
16App.Start(testAsset, ["--no-hot-reload", "--no-exit"]); 17var processIdentifier = await App.AssertOutputLineStartsWith("Process identifier ="); 21await App.AssertStarted(); 22Assert.DoesNotContain(App.Process.Output, l => l.StartsWith("Exited with error code")); 24var processIdentifier2 = await App.AssertOutputLineStartsWith("Process identifier ="); 34App.Start(testAsset, []); 36var processIdentifier = await App.AssertOutputLineStartsWith("Process identifier ="); 39await App.AssertExiting(); 41await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForFileChangeBeforeRestarting); 42await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges); 45await App.AssertStarted(); 47var processIdentifier2 = await App.AssertOutputLineStartsWith("Process identifier ="); 49await App.AssertExiting(); // process should exit after run