Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/BuiltInTools/Watch/Build/BuildNames.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ internal static class PropertyNames
public const string DesignTimeBuild = nameof(DesignTimeBuild);
public const string SkipCompilerExecution = nameof(SkipCompilerExecution);
public const string ProvideCommandLineArgs = nameof(ProvideCommandLineArgs);
public const string NonExistentFile = nameof(NonExistentFile);
}

internal static class ItemNames
Expand Down
8 changes: 7 additions & 1 deletion src/BuiltInTools/Watch/Build/EvaluationResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections.Immutable;
using System.Diagnostics;
using Microsoft.Build.Execution;
using Microsoft.Build.Graph;
using Microsoft.DotNet.HotReload;
Expand Down Expand Up @@ -51,7 +52,9 @@ public static ImmutableDictionary<string, string> GetGlobalBuildOptions(IEnumera
.SetItem(PropertyNames.DotNetWatchBuild, "true")
.SetItem(PropertyNames.DesignTimeBuild, "true")
.SetItem(PropertyNames.SkipCompilerExecution, "true")
.SetItem(PropertyNames.ProvideCommandLineArgs, "true");
.SetItem(PropertyNames.ProvideCommandLineArgs, "true")
// this will force CoreCompile task to execute and return command line args even if all inputs and outputs are up to date:
.SetItem(PropertyNames.NonExistentFile, "__NonExistentSubDir__\\__NonExistentFile__");
Comment thread
tmat marked this conversation as resolved.
}

/// <summary>
Expand Down Expand Up @@ -126,6 +129,9 @@ public static ImmutableDictionary<string, string> GetGlobalBuildOptions(IEnumera
}
}

// command line args items should be available:
Debug.Assert(Path.GetExtension(projectInstance.FullPath) != ".csproj" || projectInstance.GetItems("CscCommandLineArgs").Any());

Comment thread
tmat marked this conversation as resolved.
var projectPath = projectInstance.FullPath;
var projectDirectory = Path.GetDirectoryName(projectPath)!;

Expand Down
22 changes: 11 additions & 11 deletions test/dotnet-watch.Tests/Browser/BrowserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public async Task LaunchesBrowserOnStart()
App.Start(testAsset, [], testFlags: TestFlags.MockBrowser);

// check that all app output is printed out:
await App.WaitForOutputLineContaining("Content root path:");
await App.WaitUntilOutputContains("Content root path:");

Assert.Contains(App.Process.Output, line => line.Contains("Application started. Press Ctrl+C to shut down."));
Assert.Contains(App.Process.Output, line => line.Contains("Hosting environment: Development"));
Expand All @@ -38,9 +38,9 @@ public async Task BrowserDiagnostics()

App.Start(testAsset, ["--urls", url], relativeProjectDirectory: "RazorApp", testFlags: TestFlags.ReadKeyFromStdin);

await App.WaitForOutputLineContaining(MessageDescriptor.ConfiguredToUseBrowserRefresh);
await App.WaitForOutputLineContaining(MessageDescriptor.ConfiguredToLaunchBrowser);
await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
await App.WaitUntilOutputContains(MessageDescriptor.ConfiguredToUseBrowserRefresh);
await App.WaitUntilOutputContains(MessageDescriptor.ConfiguredToLaunchBrowser);
await App.WaitUntilOutputContains(MessageDescriptor.WaitingForChanges);

// Verify the browser has been launched.
await App.WaitUntilOutputContains($"🧪 Test browser opened at '{url}'.");
Expand All @@ -60,9 +60,9 @@ public async Task BrowserDiagnostics()
var errorMessage = $"{homePagePath}(13,9): error ENC0023: Adding an abstract method or overriding an inherited method requires restarting the application.";
var jsonErrorMessage = JsonSerializer.Serialize(errorMessage);

await App.WaitForOutputLineContaining(errorMessage);
await App.WaitUntilOutputContains(errorMessage);

await App.WaitForOutputLineContaining("Do you want to restart your app?");
await App.WaitUntilOutputContains("Do you want to restart your app?");

await App.WaitUntilOutputContains($$"""
🧪 Received: {"type":"ReportDiagnostics","diagnostics":[{{jsonErrorMessage}}]}
Expand All @@ -72,7 +72,7 @@ await App.WaitUntilOutputContains($$"""
App.SendKey('a');

// browser page is reloaded when the app restarts:
await App.WaitForOutputLineContaining(MessageDescriptor.ReloadingBrowser, $"RazorApp ({tfm})");
await App.WaitUntilOutputContains(MessageDescriptor.ReloadingBrowser, $"RazorApp ({tfm})");

// browser page was reloaded after the app restarted:
await App.WaitUntilOutputContains("""
Expand All @@ -82,21 +82,21 @@ await App.WaitUntilOutputContains("""
// no other browser message sent:
Assert.Equal(2, App.Process.Output.Count(line => line.Contains("🧪")));

await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
await App.WaitUntilOutputContains(MessageDescriptor.WaitingForChanges);

App.Process.ClearOutput();

// another rude edit:
UpdateSourceFile(homePagePath, src => src.Replace("public virtual int F() => 1;", "/* member placeholder */"));

errorMessage = $"{homePagePath}(11,5): error ENC0033: Deleting method 'F()' requires restarting the application.";
await App.WaitForOutputLineContaining("[auto-restart] " + errorMessage);
await App.WaitUntilOutputContains("[auto-restart] " + errorMessage);

await App.WaitUntilOutputContains($$"""
🧪 Received: {"type":"ReportDiagnostics","diagnostics":["Restarting application to apply changes ..."]}
""");

await App.WaitForOutputLineContaining(MessageDescriptor.WaitingForChanges);
await App.WaitUntilOutputContains(MessageDescriptor.WaitingForChanges);

// browser page was reloaded after the app restarted:
await App.WaitUntilOutputContains("""
Expand All @@ -111,7 +111,7 @@ await App.WaitUntilOutputContains("""
// valid edit:
UpdateSourceFile(homePagePath, src => src.Replace("/* member placeholder */", "public int F() => 1;"));

await App.WaitForOutputLineContaining(MessageDescriptor.ManagedCodeChangesApplied);
await App.WaitUntilOutputContains(MessageDescriptor.ManagedCodeChangesApplied);

await App.WaitUntilOutputContains($$"""
🧪 Received: {"type":"ReportDiagnostics","diagnostics":[]}
Expand Down
Loading