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