Skip to content

Commit a3fbc64

Browse files
committed
Merge remote-tracking branch 'origin/main' into dev/migrie/fhl/non-terminal-panes-2023
2 parents de5f7af + 8a1e8ac commit a3fbc64

File tree

134 files changed

+2015
-724
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

134 files changed

+2015
-724
lines changed

.github/actions/spelling/allow/allow.txt

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ CMMI
1717
copyable
1818
Counterintuitively
1919
CtrlDToClose
20+
CVS
2021
CUI
2122
cybersecurity
2223
dalet

.github/actions/spelling/allow/apis.txt

+8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
aalt
2+
abvm
13
ACCEPTFILES
24
ACCESSDENIED
35
acl
@@ -36,6 +38,7 @@ delayimp
3638
DERR
3739
dlldata
3840
DNE
41+
dnom
3942
DONTADDTORECENT
4043
DWMSBT
4144
DWMWA
@@ -49,6 +52,7 @@ EXPCMDFLAGS
4952
EXPCMDSTATE
5053
filetime
5154
FILTERSPEC
55+
fina
5256
FORCEFILESYSTEM
5357
FORCEMINIMIZE
5458
frac
@@ -120,6 +124,7 @@ LSHIFT
120124
LTGRAY
121125
MAINWINDOW
122126
MAXIMIZEBOX
127+
medi
123128
memchr
124129
memicmp
125130
MENUCOMMAND
@@ -150,6 +155,7 @@ NOTIFYBYPOS
150155
NOTIFYICON
151156
NOTIFYICONDATA
152157
ntprivapi
158+
numr
153159
oaidl
154160
ocidl
155161
ODR
@@ -175,9 +181,11 @@ REGCLS
175181
RETURNCMD
176182
rfind
177183
RLO
184+
rnrn
178185
ROOTOWNER
179186
roundf
180187
RSHIFT
188+
rvrn
181189
SACL
182190
schandle
183191
SEH

.github/actions/spelling/allow/microsoft.txt

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ MSAA
4646
msixbundle
4747
MSVC
4848
MSVCP
49+
mtu
4950
muxc
5051
netcore
5152
Onefuzz

.github/actions/spelling/expect/expect.txt

+1
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,7 @@ DECSTBM
453453
DECSTGLT
454454
DECSTR
455455
DECSWL
456+
DECSWT
456457
DECTABSR
457458
DECTCEM
458459
DECXCPR

OpenConsole.sln

+27-2
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,6 @@ EndProject
270270
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestHostApp", "src\cascadia\LocalTests_TerminalApp\TestHostApp\TestHostApp.vcxproj", "{A021EDFF-45C8-4DC2-BEF7-36E1B3B8CFE8}"
271271
ProjectSection(ProjectDependencies) = postProject
272272
{CA5CAD1A-082C-4476-9F33-94B339494076} = {CA5CAD1A-082C-4476-9F33-94B339494076}
273-
{CA5CAD1A-9B68-456A-B13E-C8218070DC42} = {CA5CAD1A-9B68-456A-B13E-C8218070DC42}
274273
{CA5CAD1A-B11C-4DDB-A4FE-C3AFAE9B5506} = {CA5CAD1A-B11C-4DDB-A4FE-C3AFAE9B5506}
275274
EndProjectSection
276275
EndProject
@@ -350,7 +349,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.Terminal.Settings
350349
{CA5CAD1A-D7EC-4107-B7C6-79CB77AE2907} = {CA5CAD1A-D7EC-4107-B7C6-79CB77AE2907}
351350
EndProjectSection
352351
EndProject
353-
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LocalTests_SettingsModel", "src\cascadia\LocalTests_SettingsModel\SettingsModel.LocalTests.vcxproj", "{CA5CAD1A-9B68-456A-B13E-C8218070DC42}"
352+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTests_SettingsModel", "src\cascadia\UnitTests_SettingsModel\SettingsModel.UnitTests.vcxproj", "{CA5CAD1A-9B68-456A-B13E-C8218070DC42}"
354353
ProjectSection(ProjectDependencies) = postProject
355354
{CA5CAD1A-082C-4476-9F33-94B339494076} = {CA5CAD1A-082C-4476-9F33-94B339494076}
356355
{CA5CAD1A-C46D-4588-B1C0-40F31AE9100B} = {CA5CAD1A-C46D-4588-B1C0-40F31AE9100B}
@@ -413,6 +412,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TerminalStress", "src\tools
413412
EndProject
414413
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RenderingTests", "src\tools\RenderingTests\RenderingTests.vcxproj", "{37C995E0-2349-4154-8E77-4A52C0C7F46D}"
415414
EndProject
415+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UIHelpers", "src\cascadia\UIHelpers\UIHelpers.vcxproj", "{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}"
416+
EndProject
416417
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "benchcat", "src\tools\benchcat\benchcat.vcxproj", "{2C836962-9543-4CE5-B834-D28E1F124B66}"
417418
EndProject
418419
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ConsoleMonitor", "src\tools\ConsoleMonitor\ConsoleMonitor.vcxproj", "{328729E9-6723-416E-9C98-951F1473BBE1}"
@@ -2357,6 +2358,29 @@ Global
23572358
{37C995E0-2349-4154-8E77-4A52C0C7F46D}.Release|ARM64.ActiveCfg = Release|ARM64
23582359
{37C995E0-2349-4154-8E77-4A52C0C7F46D}.Release|x64.ActiveCfg = Release|x64
23592360
{37C995E0-2349-4154-8E77-4A52C0C7F46D}.Release|x86.ActiveCfg = Release|Win32
2361+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.AuditMode|Any CPU.ActiveCfg = AuditMode|x64
2362+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.AuditMode|ARM64.ActiveCfg = AuditMode|ARM64
2363+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.AuditMode|x64.ActiveCfg = AuditMode|x64
2364+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.AuditMode|x64.Build.0 = AuditMode|x64
2365+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.AuditMode|x86.ActiveCfg = AuditMode|Win32
2366+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Debug|Any CPU.ActiveCfg = Debug|x64
2367+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Debug|ARM64.ActiveCfg = Debug|ARM64
2368+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Debug|ARM64.Build.0 = Debug|ARM64
2369+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Debug|x64.ActiveCfg = Debug|x64
2370+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Debug|x64.Build.0 = Debug|x64
2371+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Debug|x86.ActiveCfg = Debug|Win32
2372+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Debug|x86.Build.0 = Debug|Win32
2373+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Fuzzing|Any CPU.ActiveCfg = Fuzzing|x64
2374+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Fuzzing|ARM64.ActiveCfg = Fuzzing|ARM64
2375+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Fuzzing|x64.ActiveCfg = Fuzzing|x64
2376+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Fuzzing|x86.ActiveCfg = Fuzzing|Win32
2377+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Release|Any CPU.ActiveCfg = Release|x64
2378+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Release|ARM64.ActiveCfg = Release|ARM64
2379+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Release|ARM64.Build.0 = Release|ARM64
2380+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Release|x64.ActiveCfg = Release|x64
2381+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Release|x64.Build.0 = Release|x64
2382+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Release|x86.ActiveCfg = Release|Win32
2383+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F}.Release|x86.Build.0 = Release|Win32
23602384
{2C836962-9543-4CE5-B834-D28E1F124B66}.AuditMode|Any CPU.ActiveCfg = AuditMode|Win32
23612385
{2C836962-9543-4CE5-B834-D28E1F124B66}.AuditMode|ARM64.ActiveCfg = Release|ARM64
23622386
{2C836962-9543-4CE5-B834-D28E1F124B66}.AuditMode|x64.ActiveCfg = Release|x64
@@ -2512,6 +2536,7 @@ Global
25122536
{3C67784E-1453-49C2-9660-483E2CC7F7AD} = {40BD8415-DD93-4200-8D82-498DDDC08CC8}
25132537
{613CCB57-5FA9-48EF-80D0-6B1E319E20C4} = {A10C4720-DCA4-4640-9749-67F4314F527C}
25142538
{37C995E0-2349-4154-8E77-4A52C0C7F46D} = {A10C4720-DCA4-4640-9749-67F4314F527C}
2539+
{6515F03F-E56D-4DB4-B23D-AC4FB80DB36F} = {61901E80-E97D-4D61-A9BB-E8F2FDA8B40C}
25152540
{2C836962-9543-4CE5-B834-D28E1F124B66} = {A10C4720-DCA4-4640-9749-67F4314F527C}
25162541
{328729E9-6723-416E-9C98-951F1473BBE1} = {A10C4720-DCA4-4640-9749-67F4314F527C}
25172542
{BE92101C-04F8-48DA-99F0-E1F4F1D2DC48} = {A10C4720-DCA4-4640-9749-67F4314F527C}

build/pipelines/templates-v2/job-run-pgo-tests.yml

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ jobs:
5656
- task: PowerShell@2
5757
displayName: 'Run PGO Tests'
5858
inputs:
59+
pwsh: true
5960
targetType: filePath
6061
filePath: build\scripts\Run-Tests.ps1
6162
arguments: >-

build/pipelines/templates-v2/job-test-project.yml

+2
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ jobs:
4444
- task: PowerShell@2
4545
displayName: 'Run Unit Tests'
4646
inputs:
47+
pwsh: true
4748
targetType: filePath
4849
filePath: build\scripts\Run-Tests.ps1
4950
arguments: -MatchPattern '*unit.test*.dll' -Platform '$(OutputBuildPlatform)' -Configuration '$(BuildConfiguration)' -LogPath '${{ parameters.testLogPath }}' -Root "$(Terminal.BinDir)"
@@ -52,6 +53,7 @@ jobs:
5253
- task: PowerShell@2
5354
displayName: 'Run Feature Tests'
5455
inputs:
56+
pwsh: true
5557
targetType: filePath
5658
filePath: build\scripts\Run-Tests.ps1
5759
arguments: -MatchPattern '*feature.test*.dll' -Platform '$(OutputBuildPlatform)' -Configuration '$(BuildConfiguration)' -LogPath '${{ parameters.testLogPath }}' -Root "$(Terminal.BinDir)"

build/rules/GenerateFeatureFlags.proj

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
<IntermediateOutputPath>$(SolutionDir)obj\$(Configuration)\GenerateFeatureFlags\</IntermediateOutputPath>
3131
<OpenConsoleCommonOutDir>$(SolutionDir)bin\$(Configuration)\</OpenConsoleCommonOutDir>
3232

33+
<_WTBrandingName Condition="'$(WindowsTerminalBranding)'=='Canary'">Canary</_WTBrandingName>
3334
<_WTBrandingName Condition="'$(WindowsTerminalBranding)'=='Preview'">Preview</_WTBrandingName>
3435
<_WTBrandingName Condition="'$(WindowsTerminalBranding)'=='Release'">Release</_WTBrandingName>
3536
<_WTBrandingName Condition="'$(_WTBrandingName)'==''">Dev</_WTBrandingName>

build/scripts/Run-Tests.ps1

+35-9
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,48 @@ Param(
1616
# Find test DLLs based on the provided root, match pattern, and recursion
1717
$testDlls = Get-ChildItem -Path $Root -Recurse -Filter $MatchPattern
1818

19-
$args = @()
19+
$teArgs = @()
2020

2121
# Check if the LogPath parameter is provided and enable WTT logging
2222
if ($LogPath) {
23-
$args += '/enablewttlogging'
24-
$args += '/appendwttlogging'
25-
$args += "/logFile:$LogPath"
23+
$teArgs += '/enablewttlogging'
24+
$teArgs += '/appendwttlogging'
25+
$teArgs += "/logFile:$LogPath"
2626
Write-Host "WTT Logging Enabled"
2727
}
2828

29-
# Invoke the te.exe executable with arguments and test DLLs
30-
& "$Root\te.exe" $args $testDlls.FullName $AdditionalTaefArguments
29+
$rootTe = "$Root\te.exe"
3130

32-
# Check the exit code of the te.exe process and exit accordingly
33-
if ($LASTEXITCODE -ne 0) {
34-
Exit $LASTEXITCODE
31+
# Some of our test fixtures depend on resources.pri in the same folder as the .exe hosting them.
32+
# Unfortunately, that means that we need to run the te.exe *next to* each test DLL we discover.
33+
# This code establishes a mapping from te.exe to test DLL (or DLLs)
34+
$testDllTaefGroups = $testDlls | % {
35+
$localTe = Get-Item (Join-Path (Split-Path $_ -Parent) "te.exe") -EA:Ignore
36+
If ($null -eq $localTe) {
37+
$finalTePath = $rootTe
38+
} Else {
39+
$finalTePath = $localTe.FullName
40+
}
41+
[PSCustomObject]@{
42+
TePath = $finalTePath;
43+
TestDll = $_;
44+
}
45+
}
46+
47+
# Invoke the te.exe executables with arguments and test DLLs
48+
$anyFailed = $false
49+
$testDllTaefGroups | Group-Object TePath | % {
50+
$te = $_.Group[0].TePath
51+
$dlls = $_.Group.TestDll
52+
Write-Verbose "Running $te (for $($dlls.Name))"
53+
& $te $teArgs $dlls.FullName $AdditionalTaefArguments
54+
if ($LASTEXITCODE -ne 0) {
55+
$anyFailed = $true
56+
}
57+
}
58+
59+
if ($anyFailed) {
60+
Exit 1
3561
}
3662

3763
Exit 0

scratch/ScratchIslandApp/SampleApp/MyPage.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,12 @@ namespace winrt::SampleApp::implementation
3131
auto connectionSettings{ TerminalConnection::ConptyConnection::CreateSettings(L"cmd.exe /k echo This TermControl is hosted in-proc...",
3232
winrt::hstring{},
3333
L"",
34+
false,
35+
L"",
3436
nullptr,
3537
32,
3638
80,
39+
winrt::guid(),
3740
winrt::guid()) };
3841

3942
// "Microsoft.Terminal.TerminalConnection.ConptyConnection"

src/buffer/out/Row.cpp

+22-34
Original file line numberDiff line numberDiff line change
@@ -92,47 +92,35 @@ CharToColumnMapper::CharToColumnMapper(const wchar_t* chars, const uint16_t* cha
9292

9393
// If given a position (`offset`) inside the ROW's text, this function will return the corresponding column.
9494
// This function in particular returns the glyph's first column.
95-
til::CoordType CharToColumnMapper::GetLeadingColumnAt(ptrdiff_t offset) noexcept
95+
til::CoordType CharToColumnMapper::GetLeadingColumnAt(ptrdiff_t targetOffset) noexcept
9696
{
97-
offset = clamp(offset, 0, _lastCharOffset);
97+
targetOffset = clamp(targetOffset, 0, _lastCharOffset);
98+
99+
// This code needs to fulfill two conditions on top of the obvious (a forward/backward search):
100+
// A: We never want to stop on a column that is marked with CharOffsetsTrailer (= "GetLeadingColumn").
101+
// B: With these parameters we always want to stop at currentOffset=4:
102+
// _charOffsets={4, 6}
103+
// currentOffset=4 *OR* 6
104+
// targetOffset=5
105+
// This is because we're being asked for a "LeadingColumn", while the caller gave us the offset of a
106+
// trailing surrogate pair or similar. Returning the column of the leading half is the correct choice.
98107

99108
auto col = _currentColumn;
100-
const auto currentOffset = _charOffsets[col] & CharOffsetsMask;
109+
auto currentOffset = _charOffsets[col];
101110

102-
// Goal: Move the _currentColumn cursor to a cell which contains the given target offset.
103-
// Depending on where the target offset is we have to either search forward or backward.
104-
if (offset < currentOffset)
111+
// A plain forward-search until we find our targetOffset.
112+
// This loop may iterate too far and thus violate our example in condition B, however...
113+
while (targetOffset > (currentOffset & CharOffsetsMask))
105114
{
106-
// Backward search.
107-
// Goal: Find the first preceding column where the offset is <= the target offset. This results in the first
108-
// cell that contains our target offset, even if that offset is in the middle of a long grapheme.
109-
//
110-
// We abuse the fact that the trailing half of wide glyphs is marked with CharOffsetsTrailer to our advantage.
111-
// Since they're >0x8000, the `offset < _charOffsets[col]` check will always be true and ensure we iterate over them.
112-
//
113-
// Since _charOffsets cannot contain negative values and because offset has been
114-
// clamped to be positive we naturally exit when reaching the first column.
115-
for (; offset < _charOffsets[col - 1]; --col)
116-
{
117-
}
115+
currentOffset = _charOffsets[++col];
118116
}
119-
else if (offset > currentOffset)
117+
// This backward-search is not just a counter-part to the above, but simultaneously also handles conditions A and B.
118+
// It abuses the fact that columns marked with CharOffsetsTrailer are >0x8000 and targetOffset is always <0x8000.
119+
// This means we skip all "trailer" columns when iterating backwards, and only stop on a non-trailer (= condition A).
120+
// Condition B is fixed simply because we iterate backwards after the forward-search (in that exact order).
121+
while (targetOffset < currentOffset)
120122
{
121-
// Forward search.
122-
// Goal: Find the first subsequent column where the offset is > the target offset.
123-
// We stop 1 column before that however so that the next loop works correctly.
124-
// It's the inverse of the loop above.
125-
//
126-
// Since offset has been clamped to be at most 1 less than the maximum
127-
// _charOffsets value the loop naturally exits before hitting the end.
128-
for (; offset >= (_charOffsets[col + 1] & CharOffsetsMask); ++col)
129-
{
130-
}
131-
// Now that we found the cell that definitely includes this char offset,
132-
// we have to iterate back to the cell's starting column.
133-
for (; WI_IsFlagSet(_charOffsets[col], CharOffsetsTrailer); --col)
134-
{
135-
}
123+
currentOffset = _charOffsets[--col];
136124
}
137125

138126
_currentColumn = col;

src/buffer/out/Row.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ struct CharToColumnMapper
7171
{
7272
CharToColumnMapper(const wchar_t* chars, const uint16_t* charOffsets, ptrdiff_t lastCharOffset, til::CoordType currentColumn) noexcept;
7373

74-
til::CoordType GetLeadingColumnAt(ptrdiff_t offset) noexcept;
74+
til::CoordType GetLeadingColumnAt(ptrdiff_t targetOffset) noexcept;
7575
til::CoordType GetTrailingColumnAt(ptrdiff_t offset) noexcept;
7676
til::CoordType GetLeadingColumnAt(const wchar_t* str) noexcept;
7777
til::CoordType GetTrailingColumnAt(const wchar_t* str) noexcept;

src/buffer/out/ut_textbuffer/TextBuffer.Unit.Tests.vcxproj

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<ClCompile Include="ReflowTests.cpp" />
1515
<ClCompile Include="TextColorTests.cpp" />
1616
<ClCompile Include="TextAttributeTests.cpp" />
17+
<ClCompile Include="UTextAdapterTests.cpp" />
1718
<ClCompile Include="precomp.cpp">
1819
<PrecompiledHeader>Create</PrecompiledHeader>
1920
</ClCompile>
@@ -41,4 +42,4 @@
4142
<Import Project="$(SolutionDir)src\common.build.post.props" />
4243
<Import Project="$(SolutionDir)src\common.build.tests.props" />
4344
<Import Project="$(SolutionDir)src\common.nugetversions.targets" />
44-
</Project>
45+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT license.
3+
4+
#include "precomp.h"
5+
6+
#include "WexTestClass.h"
7+
#include "../textBuffer.hpp"
8+
#include "../../renderer/inc/DummyRenderer.hpp"
9+
10+
template<>
11+
class WEX::TestExecution::VerifyOutputTraits<std::vector<til::point_span>>
12+
{
13+
public:
14+
static WEX::Common::NoThrowString ToString(const std::vector<til::point_span>& vec)
15+
{
16+
WEX::Common::NoThrowString str;
17+
str.Append(L"{ ");
18+
for (size_t i = 0; i < vec.size(); ++i)
19+
{
20+
const auto& s = vec[i];
21+
if (i != 0)
22+
{
23+
str.Append(L", ");
24+
}
25+
str.AppendFormat(L"{(%d, %d), (%d, %d)}", s.start.x, s.start.y, s.end.x, s.end.y);
26+
}
27+
str.Append(L" }");
28+
return str;
29+
}
30+
};
31+
32+
class UTextAdapterTests
33+
{
34+
TEST_CLASS(UTextAdapterTests);
35+
36+
TEST_METHOD(Unicode)
37+
{
38+
DummyRenderer renderer;
39+
TextBuffer buffer{ til::size{ 24, 1 }, TextAttribute{}, 0, false, renderer };
40+
41+
RowWriteState state{
42+
.text = L"abc 𝒶𝒷𝒸 abc ネコちゃん",
43+
};
44+
buffer.Write(0, TextAttribute{}, state);
45+
VERIFY_IS_TRUE(state.text.empty());
46+
47+
static constexpr auto s = [](til::CoordType beg, til::CoordType end) -> til::point_span {
48+
return { { beg, 0 }, { end, 0 } };
49+
};
50+
51+
auto expected = std::vector{ s(0, 2), s(8, 10) };
52+
auto actual = buffer.SearchText(L"abc", false);
53+
VERIFY_ARE_EQUAL(expected, actual);
54+
55+
expected = std::vector{ s(5, 5) };
56+
actual = buffer.SearchText(L"𝒷", false);
57+
VERIFY_ARE_EQUAL(expected, actual);
58+
59+
expected = std::vector{ s(12, 15) };
60+
actual = buffer.SearchText(L"ネコ", false);
61+
VERIFY_ARE_EQUAL(expected, actual);
62+
}
63+
};

0 commit comments

Comments
 (0)