зеркало из https://github.com/dotnet/razor.git
CodeBase some Roslyn assemblies and fix Integration test failures
This commit is contained in:
Родитель
1fa572208c
Коммит
fbd5c12cfe
|
@ -80,6 +80,7 @@
|
|||
<package pattern="humanizer.core" />
|
||||
<package pattern="iced" />
|
||||
<package pattern="icsharpcode.decompiler" />
|
||||
<package pattern="inputsimulatorplus" />
|
||||
<package pattern="mediatr" />
|
||||
<package pattern="messagepack" />
|
||||
<package pattern="messagepack.annotations" />
|
||||
|
|
|
@ -84,6 +84,8 @@
|
|||
<MicrosoftCommonLanguageServerProtocolFrameworkPackageVersion>$(RoslynPackageVersion)</MicrosoftCommonLanguageServerProtocolFrameworkPackageVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="Manual">
|
||||
<InputSimulatorPlusVersion>1.0.7</InputSimulatorPlusVersion>
|
||||
|
||||
<!-- dotnet/runtime packages -->
|
||||
<MicrosoftExtensionsPackageVersion>6.0.0</MicrosoftExtensionsPackageVersion>
|
||||
<SystemCollectionsImmutablePackageVersion>6.0.0</SystemCollectionsImmutablePackageVersion>
|
||||
|
|
|
@ -1,13 +1,160 @@
|
|||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Licensed under the MIT license. See License.txt in the project root for license information.
|
||||
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using Microsoft.VisualStudio.Threading;
|
||||
using System;
|
||||
using WindowsInput;
|
||||
using System.Collections.Immutable;
|
||||
using WindowsInput.Native;
|
||||
|
||||
namespace Microsoft.VisualStudio.Extensibility.Testing
|
||||
{
|
||||
internal struct InputKey
|
||||
{
|
||||
public readonly ImmutableArray<VirtualKeyCode> Modifiers;
|
||||
public readonly VirtualKeyCode VirtualKeyCode;
|
||||
public readonly char? Character;
|
||||
public readonly string? Text;
|
||||
|
||||
public InputKey(VirtualKeyCode virtualKeyCode)
|
||||
{
|
||||
Modifiers = ImmutableArray<VirtualKeyCode>.Empty;
|
||||
VirtualKeyCode = virtualKeyCode;
|
||||
Character = null;
|
||||
Text = null;
|
||||
}
|
||||
|
||||
public InputKey(VirtualKeyCode virtualKeyCode, ImmutableArray<VirtualKeyCode> modifiers)
|
||||
{
|
||||
Modifiers = modifiers;
|
||||
VirtualKeyCode = virtualKeyCode;
|
||||
Character = null;
|
||||
Text = null;
|
||||
}
|
||||
|
||||
public InputKey(char character)
|
||||
{
|
||||
Modifiers = ImmutableArray<VirtualKeyCode>.Empty;
|
||||
VirtualKeyCode = 0;
|
||||
Character = character;
|
||||
Text = null;
|
||||
}
|
||||
|
||||
public InputKey(string text)
|
||||
{
|
||||
Modifiers = ImmutableArray<VirtualKeyCode>.Empty;
|
||||
VirtualKeyCode = 0;
|
||||
Character = null;
|
||||
Text = text;
|
||||
}
|
||||
|
||||
public static implicit operator InputKey(VirtualKeyCode virtualKeyCode)
|
||||
=> new(virtualKeyCode);
|
||||
|
||||
public static implicit operator InputKey(char character)
|
||||
=> new(character);
|
||||
|
||||
public static implicit operator InputKey(string text)
|
||||
=> new(text);
|
||||
|
||||
public void Apply(IInputSimulator simulator)
|
||||
{
|
||||
if (Character is { } c)
|
||||
{
|
||||
if (c == '\n')
|
||||
simulator.Keyboard.KeyPress(VirtualKeyCode.RETURN);
|
||||
else if (c == '\t')
|
||||
simulator.Keyboard.KeyPress(VirtualKeyCode.TAB);
|
||||
else
|
||||
simulator.Keyboard.TextEntry(c);
|
||||
|
||||
return;
|
||||
}
|
||||
else if (Text is not null)
|
||||
{
|
||||
var offset = 0;
|
||||
while (offset < Text.Length)
|
||||
{
|
||||
if (Text[offset] == '\r' && offset < Text.Length - 1 && Text[offset + 1] == '\n')
|
||||
{
|
||||
// Treat \r\n as a single RETURN character
|
||||
offset++;
|
||||
continue;
|
||||
}
|
||||
else if (Text[offset] == '\n')
|
||||
{
|
||||
simulator.Keyboard.KeyPress(VirtualKeyCode.RETURN);
|
||||
offset++;
|
||||
continue;
|
||||
}
|
||||
else if (Text[offset] == '\t')
|
||||
{
|
||||
simulator.Keyboard.KeyPress(VirtualKeyCode.TAB);
|
||||
offset++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
var nextSpecial = Text.IndexOfAny(new[] { '\r', '\n', '\t' }, offset);
|
||||
var endOfCurrentSegment = nextSpecial < 0 ? Text.Length : nextSpecial;
|
||||
simulator.Keyboard.TextEntry(Text[offset..endOfCurrentSegment]);
|
||||
offset = endOfCurrentSegment;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (Modifiers.IsEmpty)
|
||||
{
|
||||
simulator.Keyboard.KeyPress(VirtualKeyCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
simulator.Keyboard.ModifiedKeyStroke(Modifiers, VirtualKeyCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[TestService]
|
||||
internal partial class InputInProcess
|
||||
{
|
||||
internal Task SendAsync(InputKey key, CancellationToken cancellationToken)
|
||||
=> SendAsync(new InputKey[] { key }, cancellationToken);
|
||||
|
||||
internal Task SendAsync(InputKey[] keys, CancellationToken cancellationToken)
|
||||
{
|
||||
return SendAsync(
|
||||
simulator =>
|
||||
{
|
||||
foreach (var key in keys)
|
||||
{
|
||||
key.Apply(simulator);
|
||||
}
|
||||
}, cancellationToken);
|
||||
}
|
||||
|
||||
internal async Task SendAsync(Action<IInputSimulator> callback, CancellationToken cancellationToken)
|
||||
{
|
||||
// AbstractSendKeys runs synchronously, so switch to a background thread before the call
|
||||
await TaskScheduler.Default;
|
||||
|
||||
TestServices.JoinableTaskFactory.Run(async () =>
|
||||
{
|
||||
await TestServices.Editor.ActivateAsync(cancellationToken);
|
||||
});
|
||||
|
||||
callback(new InputSimulator());
|
||||
|
||||
TestServices.JoinableTaskFactory.Run(async () =>
|
||||
{
|
||||
await WaitForApplicationIdleAsync(cancellationToken);
|
||||
});
|
||||
}
|
||||
|
||||
internal void Send(string keys)
|
||||
{
|
||||
SendKeys.Send(keys);
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="InputSimulatorPlus" Version="$(InputSimulatorPlusVersion)" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Editor" Version="$(MicrosoftVisualStudioEditorPackageVersion)" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Extensibility.Testing.Xunit" Version="$(MicrosoftVisualStudioExtensibilityTestingXunitVersion)" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Extensibility.Testing.SourceGenerator" Version="$(MicrosoftVisualStudioExtensibilityTestingSourceGeneratorVersion)" />
|
||||
|
|
|
@ -116,7 +116,7 @@ A
|
|||
|
||||
// Act
|
||||
await TestServices.Editor.PlaceCaretAsync("@onclick='thing'", charsOffset: 1, ControlledHangMitigatingCancellationToken);
|
||||
TestServices.Input.Send("{ENTER}");
|
||||
await TestServices.Input.SendAsync(WindowsInput.Native.VirtualKeyCode.RETURN, ControlledHangMitigatingCancellationToken);
|
||||
|
||||
// Assert
|
||||
await TestServices.Editor.VerifyTextContainsAsync(@"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
0,1,RazorTransition,
|
||||
1,8,RazorDirective,
|
||||
10,19,class name,
|
||||
10,19,identifier,
|
||||
33,1,HTML Tag Delimiter,
|
||||
34,9,RazorComponentElement,
|
||||
43,1,HTML Tag Delimiter,
|
||||
|
@ -76,7 +76,7 @@
|
|||
337,1,HTML Attribute Value,
|
||||
338,1,HTML Tag Delimiter,
|
||||
353,1,RazorTransition,
|
||||
354,4,property name,
|
||||
354,4,identifier,
|
||||
368,1,HTML Tag Delimiter,
|
||||
369,1,HTML Tag Delimiter,
|
||||
370,7,HTML Element Name,
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
89,1,HTML Attribute Value,
|
||||
90,1,HTML Tag Delimiter,
|
||||
106,1,RazorTransition,
|
||||
107,12,field name,
|
||||
107,12,identifier,
|
||||
119,1,HTML Tag Delimiter,
|
||||
120,1,HTML Tag Delimiter,
|
||||
121,1,HTML Element Name,
|
||||
|
@ -41,7 +41,7 @@
|
|||
160,7,RazorDirectiveAttribute,
|
||||
167,1,HTML Operator,
|
||||
168,1,HTML Attribute Value,
|
||||
169,14,method name,
|
||||
169,14,identifier,
|
||||
183,1,HTML Attribute Value,
|
||||
184,1,HTML Tag Delimiter,
|
||||
193,1,HTML Tag Delimiter,
|
||||
|
@ -63,7 +63,7 @@
|
|||
283,1,punctuation,
|
||||
284,1,punctuation,
|
||||
291,1,punctuation,
|
||||
302,12,field name,
|
||||
302,12,identifier,
|
||||
314,2,operator,
|
||||
316,1,punctuation,
|
||||
323,1,punctuation,
|
||||
|
|
Загрузка…
Ссылка в новой задаче