Skip to content

Commit e3faff0

Browse files
committed
code and page
1 parent f288004 commit e3faff0

File tree

16 files changed

+1793
-362
lines changed

16 files changed

+1793
-362
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
name: Deploy GitHub Pages
2+
3+
on:
4+
release:
5+
types: [published]
6+
push:
7+
branches:
8+
- main
9+
paths:
10+
- 'gh-pages/**'
11+
- '.github/workflows/gh-pages-deploy.yml'
12+
workflow_dispatch:
13+
14+
permissions:
15+
contents: read
16+
pages: write
17+
id-token: write
18+
19+
concurrency:
20+
group: pages
21+
cancel-in-progress: false
22+
23+
jobs:
24+
build:
25+
name: Build Pages
26+
runs-on: ubuntu-latest
27+
steps:
28+
- uses: actions/checkout@v6
29+
with:
30+
fetch-depth: 0
31+
32+
- name: Fetch Latest Release Info
33+
id: release
34+
env:
35+
GH_TOKEN: ${{ github.token }}
36+
run: |
37+
release_info=$(gh api repos/${{ github.repository }}/releases/latest 2>/dev/null || echo '{}')
38+
39+
if [[ "$release_info" == "{}" ]] || [[ -z "$(echo "$release_info" | jq -r '.tag_name // empty')" ]]; then
40+
echo "No releases found, using default values"
41+
echo "version=1.0.0" >> "$GITHUB_OUTPUT"
42+
echo "macos_url=https://github.com/${{ github.repository }}/releases" >> "$GITHUB_OUTPUT"
43+
echo "windows_url=https://github.com/${{ github.repository }}/releases" >> "$GITHUB_OUTPUT"
44+
echo "linux_url=https://github.com/${{ github.repository }}/releases" >> "$GITHUB_OUTPUT"
45+
exit 0
46+
fi
47+
48+
version=$(echo "$release_info" | jq -r '.tag_name' | sed 's/^v//')
49+
echo "version=${version}" >> "$GITHUB_OUTPUT"
50+
51+
macos_url=$(echo "$release_info" | jq -r '.assets[] | select(.name | contains("macos")) | .browser_download_url' | head -n 1)
52+
windows_url=$(echo "$release_info" | jq -r '.assets[] | select(.name | contains("windows")) | .browser_download_url' | head -n 1)
53+
linux_url=$(echo "$release_info" | jq -r '.assets[] | select(.name | contains("linux")) | .browser_download_url' | head -n 1)
54+
55+
releases_url="https://github.com/${{ github.repository }}/releases/latest"
56+
echo "macos_url=${macos_url:-$releases_url}" >> "$GITHUB_OUTPUT"
57+
echo "windows_url=${windows_url:-$releases_url}" >> "$GITHUB_OUTPUT"
58+
echo "linux_url=${linux_url:-$releases_url}" >> "$GITHUB_OUTPUT"
59+
60+
- name: Prepare Site
61+
run: |
62+
mkdir -p ./site
63+
64+
cp ./gh-pages/index.html ./site/index.html
65+
66+
sed -i "s|{{VERSION}}|${{ steps.release.outputs.version }}|g" ./site/index.html
67+
sed -i "s|{{MACOS_URL}}|${{ steps.release.outputs.macos_url }}|g" ./site/index.html
68+
sed -i "s|{{WINDOWS_URL}}|${{ steps.release.outputs.windows_url }}|g" ./site/index.html
69+
sed -i "s|{{LINUX_URL}}|${{ steps.release.outputs.linux_url }}|g" ./site/index.html
70+
71+
- name: Setup Pages
72+
uses: actions/configure-pages@v5
73+
74+
- name: Upload Artifact
75+
uses: actions/upload-pages-artifact@v3
76+
with:
77+
path: ./site
78+
79+
deploy:
80+
name: Deploy to GitHub Pages
81+
environment:
82+
name: github-pages
83+
url: ${{ steps.deployment.outputs.page_url }}
84+
runs-on: ubuntu-latest
85+
needs: build
86+
steps:
87+
- name: Deploy to GitHub Pages
88+
id: deployment
89+
uses: actions/deploy-pages@v4

DotPilot.Tests/Chat/Configuration/ChatComposerKeyboardPolicyTests.cs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,68 @@ public void ResolveReturnsNoneWhenKeyIsNotEnter()
5656

5757
action.Should().Be(ChatComposerKeyboardAction.None);
5858
}
59+
60+
[Test]
61+
public void ShouldHandleInComposerReturnsTrueForPlainEnterWhenEnterSends()
62+
{
63+
var action = ChatComposerKeyboardPolicy.Resolve(
64+
behavior: ComposerSendBehavior.EnterSends,
65+
isEnterKey: true,
66+
hasModifier: false);
67+
68+
var shouldHandle = ChatComposerKeyboardPolicy.ShouldHandleInComposer(
69+
ComposerSendBehavior.EnterSends,
70+
action,
71+
hasModifier: false);
72+
73+
shouldHandle.Should().BeTrue();
74+
}
75+
76+
[Test]
77+
public void ShouldHandleInComposerReturnsTrueForModifierEnterWhenEnterSends()
78+
{
79+
var action = ChatComposerKeyboardPolicy.Resolve(
80+
behavior: ComposerSendBehavior.EnterSends,
81+
isEnterKey: true,
82+
hasModifier: true);
83+
84+
var shouldHandle = ChatComposerKeyboardPolicy.ShouldHandleInComposer(
85+
ComposerSendBehavior.EnterSends,
86+
action,
87+
hasModifier: true);
88+
89+
shouldHandle.Should().BeTrue();
90+
}
91+
92+
[Test]
93+
public void ShouldHandleInComposerReturnsFalseForPlainEnterWhenEnterAddsNewLine()
94+
{
95+
var action = ChatComposerKeyboardPolicy.Resolve(
96+
behavior: ComposerSendBehavior.EnterInsertsNewLine,
97+
isEnterKey: true,
98+
hasModifier: false);
99+
100+
var shouldHandle = ChatComposerKeyboardPolicy.ShouldHandleInComposer(
101+
ComposerSendBehavior.EnterInsertsNewLine,
102+
action,
103+
hasModifier: false);
104+
105+
shouldHandle.Should().BeFalse();
106+
}
107+
108+
[Test]
109+
public void ShouldHandleInComposerReturnsTrueForModifierEnterWhenEnterAddsNewLine()
110+
{
111+
var action = ChatComposerKeyboardPolicy.Resolve(
112+
behavior: ComposerSendBehavior.EnterInsertsNewLine,
113+
isEnterKey: true,
114+
hasModifier: true);
115+
116+
var shouldHandle = ChatComposerKeyboardPolicy.ShouldHandleInComposer(
117+
ComposerSendBehavior.EnterInsertsNewLine,
118+
action,
119+
hasModifier: true);
120+
121+
shouldHandle.Should().BeTrue();
122+
}
59123
}

DotPilot.Tests/Chat/Configuration/ChatComposerModifierStateTests.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,16 @@ public void RegisterKeyUpKeepsModifierPressedWhileSameModifierFamilyIsStillHeld(
5757
state.HasPressedModifier.Should().BeTrue();
5858
}
5959

60+
[Test]
61+
public void IsPressedNormalizesModifierFamilies()
62+
{
63+
var state = new ChatComposerModifierState();
64+
state.RegisterKeyDown(VirtualKey.RightMenu);
65+
66+
state.IsPressed(VirtualKey.Menu).Should().BeTrue();
67+
state.IsPressed(VirtualKey.LeftMenu).Should().BeTrue();
68+
}
69+
6070
[Test]
6171
public void ResetClearsTrackedModifiers()
6272
{

DotPilot.UITests/ChatSessions/Flows/GivenChatSessionsShell.cs

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using DotPilot.UITests.Harness;
2+
using FluentAssertions;
23
using OpenQA.Selenium;
34
using UITestPlatform = Uno.UITest.Helpers.Queries.Platform;
45

@@ -345,8 +346,62 @@ public async Task WhenChangingMessageSendBehaviorThenChatHintReflectsTheSelectio
345346
TakeScreenshot("chat_message_send_behavior");
346347
}
347348

349+
[TestCase(BrowserEnterModifier.Shift)]
350+
[TestCase(BrowserEnterModifier.Control)]
351+
[TestCase(BrowserEnterModifier.Alt)]
352+
[TestCase(BrowserEnterModifier.Command)]
353+
public async Task WhenEnterSendsThenModifierEnterInsertsANewLine(BrowserEnterModifier modifier)
354+
{
355+
await Task.CompletedTask;
356+
357+
EnsureOnChatScreen();
358+
ClickActionAutomationElement(ChatStartNewButtonAutomationId);
359+
WaitForTextContains(ChatTitleTextAutomationId, DefaultSessionTitle, ScreenTransitionTimeout);
360+
361+
ReplaceTextAutomationElement(ChatComposerInputAutomationId, UserPrompt);
362+
PressModifierEnterAutomationElement(ChatComposerInputAutomationId, modifier);
363+
364+
TryReadBrowserInputValue(ChatComposerInputAutomationId, out var composerValue).Should().BeTrue();
365+
NormalizeText(composerValue).Should().Be(UserPrompt);
366+
composerValue.Replace("\r\n", "\n", StringComparison.Ordinal).Should().EndWith("\n");
367+
await Task.Delay(TimeSpan.FromSeconds(1));
368+
HasTextContaining(ChatMessageTextAutomationId, DebugResponsePrefix).Should().BeFalse();
369+
}
370+
348371
[Test]
349-
public async Task WhenEnterAddsNewLineThenModifierEnterStillSendsTheMessage()
372+
public async Task WhenEnterAddsNewLineThenPlainEnterInsertsANewLine()
373+
{
374+
await Task.CompletedTask;
375+
376+
EnsureOnChatScreen();
377+
TapAutomationElement(ProvidersNavButtonAutomationId);
378+
WaitForElement(SettingsScreenAutomationId);
379+
ClickActionAutomationElement(SettingsSectionMessagesButtonAutomationId);
380+
WaitForElement(ComposerBehaviorSectionAutomationId);
381+
ClickActionAutomationElement(ComposerBehaviorEnterInsertsNewLineButtonAutomationId);
382+
WaitForTextContains(ComposerBehaviorCurrentHintAutomationId, "Enter adds a new line.", ScreenTransitionTimeout);
383+
384+
TapAutomationElement(ChatNavButtonAutomationId);
385+
EnsureOnChatScreen();
386+
WaitForTextContains(ChatComposerHintAutomationId, "Enter adds a new line.", ScreenTransitionTimeout);
387+
ClickActionAutomationElement(ChatStartNewButtonAutomationId);
388+
WaitForTextContains(ChatTitleTextAutomationId, DefaultSessionTitle, ScreenTransitionTimeout);
389+
390+
ReplaceTextAutomationElement(ChatComposerInputAutomationId, UserPrompt);
391+
PressEnterAutomationElement(ChatComposerInputAutomationId);
392+
393+
TryReadBrowserInputValue(ChatComposerInputAutomationId, out var composerValue).Should().BeTrue();
394+
NormalizeText(composerValue).Should().Be(UserPrompt);
395+
composerValue.Replace("\r\n", "\n", StringComparison.Ordinal).Should().EndWith("\n");
396+
await Task.Delay(TimeSpan.FromSeconds(1));
397+
HasTextContaining(ChatMessageTextAutomationId, DebugResponsePrefix).Should().BeFalse();
398+
}
399+
400+
[TestCase(BrowserEnterModifier.Shift)]
401+
[TestCase(BrowserEnterModifier.Control)]
402+
[TestCase(BrowserEnterModifier.Alt)]
403+
[TestCase(BrowserEnterModifier.Command)]
404+
public async Task WhenEnterAddsNewLineThenModifierEnterSendsTheMessage(BrowserEnterModifier modifier)
350405
{
351406
await Task.CompletedTask;
352407

@@ -365,14 +420,14 @@ public async Task WhenEnterAddsNewLineThenModifierEnterStillSendsTheMessage()
365420
WaitForTextContains(ChatTitleTextAutomationId, DefaultSessionTitle, ScreenTransitionTimeout);
366421

367422
ReplaceTextAutomationElement(ChatComposerInputAutomationId, UserPrompt);
368-
PressModifierEnterAutomationElement(ChatComposerInputAutomationId);
423+
PressModifierEnterAutomationElement(ChatComposerInputAutomationId, modifier);
369424
WaitForElement(ChatActivityItemAutomationId);
370425
WaitForTextContains(ChatActivityLabelAutomationId, "status", ScreenTransitionTimeout);
371426
WaitForTextContains(ChatActivityLabelAutomationId, "tool", ScreenTransitionTimeout);
372427
WaitForTextContains(ChatMessageTextAutomationId, DebugResponsePrefix, ScreenTransitionTimeout);
373428
WaitForTextContains(ChatMessageTextAutomationId, DebugToolFinishedText, ScreenTransitionTimeout);
374429

375-
TakeScreenshot("chat_shift_enter_send_behavior");
430+
TakeScreenshot($"chat_{modifier.ToString().ToLowerInvariant()}_enter_send_behavior");
376431
}
377432

378433
private void EnsureOnChatScreen()
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace DotPilot.UITests.Harness;
2+
3+
public enum BrowserEnterModifier
4+
{
5+
None,
6+
Shift,
7+
Control,
8+
Alt,
9+
Command,
10+
}

0 commit comments

Comments
 (0)