Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
132 commits
Select commit Hold shift + click to select a range
0249c46
initialize correctly
NeoCoderMatrix86 May 29, 2026
236ea99
first step towards multiple files
NeoCoderMatrix86 May 29, 2026
2628f1b
add button for removing all files
NeoCoderMatrix86 May 29, 2026
1a11f37
Update Audiofiles.razor
NeoCoderMatrix86 May 29, 2026
8643232
file rename
NeoCoderMatrix86 Jun 1, 2026
96f1fcd
add validation errors display
NeoCoderMatrix86 Jun 1, 2026
8f93fdc
Update Audiofiles.razor
NeoCoderMatrix86 Jun 1, 2026
aaaeb96
display error messages
NeoCoderMatrix86 Jun 1, 2026
20c461d
Update Audiofiles.razor
NeoCoderMatrix86 Jun 1, 2026
fee03ce
remove expanables on first layer
NeoCoderMatrix86 Jun 1, 2026
e088f47
Update Audiofiles.razor
NeoCoderMatrix86 Jun 1, 2026
2b3cab6
Update ViewModeFull.razor
NeoCoderMatrix86 Jun 1, 2026
820d6f3
final layout for audiofiles
NeoCoderMatrix86 Jun 2, 2026
8d1a8b8
set relation for track to audiofile
NeoCoderMatrix86 Jun 9, 2026
42fe356
add TODOs
NeoCoderMatrix86 Jun 9, 2026
9775a58
Update Track.cs
NeoCoderMatrix86 Jun 11, 2026
f686c53
Update Index.razor
NeoCoderMatrix86 Jun 16, 2026
8341323
Update AudiofileManager.cs
NeoCoderMatrix86 Jun 17, 2026
21aae8c
add removing of tracks from audiofile
NeoCoderMatrix86 Jun 17, 2026
8b71869
Update TrackManager.cs
NeoCoderMatrix86 Jun 17, 2026
f2ae159
fix recalculation of tracks
NeoCoderMatrix86 Jun 17, 2026
bab0009
Update Projectfile.cs
NeoCoderMatrix86 Jun 18, 2026
b50c84b
Update AudiofileManager.cs
NeoCoderMatrix86 Jun 18, 2026
582933e
fix project file tests
NeoCoderMatrix86 Jun 18, 2026
582d012
fix tests
NeoCoderMatrix86 Jun 18, 2026
00ca4c0
Update TrackList.razor
NeoCoderMatrix86 Jun 18, 2026
bac9e34
add audiofile validation
NeoCoderMatrix86 Jun 18, 2026
88b913f
remove constructors
NeoCoderMatrix86 Jun 18, 2026
bdd781f
Update CuesheetTests.cs
NeoCoderMatrix86 Jun 18, 2026
33b2c6e
fix cuesheet export
NeoCoderMatrix86 Jun 19, 2026
916b006
remove howler library since its not supported anymore
NeoCoderMatrix86 Jul 23, 2026
285e1ab
add native audio support
NeoCoderMatrix86 Jul 23, 2026
e585c45
use native audio playback
NeoCoderMatrix86 Jul 23, 2026
0f95d2f
switched to event base native playback
NeoCoderMatrix86 Jul 23, 2026
dc51036
dispose properly
NeoCoderMatrix86 Jul 23, 2026
c2e4742
Update PlaybackService.cs
NeoCoderMatrix86 Jul 23, 2026
293a56e
simplyfy playback service
NeoCoderMatrix86 Jul 23, 2026
efafe9f
Update PlaybackService.cs
NeoCoderMatrix86 Jul 23, 2026
7729a36
added setting of source
NeoCoderMatrix86 Jul 24, 2026
45d5a4b
multiple audio file handling basic concept
NeoCoderMatrix86 Jul 24, 2026
dfde876
play next audiofile automatically
NeoCoderMatrix86 Jul 24, 2026
e0e347f
fixed seeking
NeoCoderMatrix86 Jul 24, 2026
a8758de
Update PlaybackService.cs
NeoCoderMatrix86 Jul 24, 2026
d30e273
register audio in javascript
NeoCoderMatrix86 Jul 27, 2026
507d9ad
fix removing of object urls
NeoCoderMatrix86 Jul 27, 2026
d4d8bff
fix pause button
NeoCoderMatrix86 Jul 27, 2026
14b14a4
edit import model
NeoCoderMatrix86 Jul 29, 2026
cbaa939
fix tests
NeoCoderMatrix86 Jul 29, 2026
a1d637e
fix tests
NeoCoderMatrix86 Jul 29, 2026
8e3ae9f
fix tests
NeoCoderMatrix86 Jul 29, 2026
0c96324
fix tests
NeoCoderMatrix86 Jul 29, 2026
a58d7e3
calculate last track duration
NeoCoderMatrix86 Jul 30, 2026
968b587
Update ImportManager.cs
NeoCoderMatrix86 Jul 30, 2026
2cd4e0d
Update ImportManager.cs
NeoCoderMatrix86 Jul 30, 2026
439b67e
fix import manager
NeoCoderMatrix86 Jul 30, 2026
df2222f
Update CuesheetImportService.cs
NeoCoderMatrix86 Jul 30, 2026
e2b83d7
fix import
NeoCoderMatrix86 Jul 30, 2026
14bac5b
import audiofiles
NeoCoderMatrix86 Jul 31, 2026
1f86de7
Update TextImportService.cs
NeoCoderMatrix86 Jul 31, 2026
8b7c8dd
add import profile audiofiles
NeoCoderMatrix86 Aug 3, 2026
8bb45d8
Update Importprofiles.razor
NeoCoderMatrix86 Aug 3, 2026
6b81aba
fix import display
NeoCoderMatrix86 Aug 3, 2026
45702cb
Update Importprofile.cs
NeoCoderMatrix86 Aug 4, 2026
a4e86cd
Update TextImportService.cs
NeoCoderMatrix86 Aug 4, 2026
696f6db
Update TextImportService.cs
NeoCoderMatrix86 Aug 4, 2026
9ffee74
Update TextImportService.cs
NeoCoderMatrix86 Aug 4, 2026
c5972ed
fix import tests
NeoCoderMatrix86 Aug 5, 2026
9a582e1
fix import tests
NeoCoderMatrix86 Aug 5, 2026
73b4abe
Update TextImportServiceTests.cs
NeoCoderMatrix86 Aug 5, 2026
b4e897d
fix moving of tracks
NeoCoderMatrix86 Aug 21, 2026
d078015
fix tests
NeoCoderMatrix86 Aug 21, 2026
7677108
Update ControlRecording.razor
NeoCoderMatrix86 Aug 24, 2026
1c21e7a
Update ControlRecording.razor
NeoCoderMatrix86 Aug 24, 2026
1b652a4
first steps for recording
NeoCoderMatrix86 Aug 24, 2026
3798ce0
Update CuesheetManager.cs
NeoCoderMatrix86 Aug 24, 2026
1885792
Update AudiofileManager.cs
NeoCoderMatrix86 Aug 24, 2026
e2d064d
add tests
NeoCoderMatrix86 Aug 24, 2026
60a99eb
fix tests
NeoCoderMatrix86 Aug 26, 2026
a45a55b
Update CuesheetManager.cs
NeoCoderMatrix86 Aug 26, 2026
7c39126
prepare exportprofile for audiofiles
NeoCoderMatrix86 Aug 26, 2026
c8ae9b4
add audiofile scheme to export dialog
NeoCoderMatrix86 Aug 26, 2026
12ff6f6
Update GenerateExportDialog.razor
NeoCoderMatrix86 Aug 26, 2026
c7b3d68
Update ExportfileGeneratorTests.cs
NeoCoderMatrix86 Aug 26, 2026
488e8bf
Update ExportfileGeneratorTests.cs
NeoCoderMatrix86 Aug 26, 2026
7144833
fix export file generation
NeoCoderMatrix86 Aug 26, 2026
0cef952
add localizations
NeoCoderMatrix86 Aug 27, 2026
3be8cb1
revoke object url if deleting audiofiles
NeoCoderMatrix86 Aug 27, 2026
3a48d32
Update AudiofileManager.cs
NeoCoderMatrix86 Aug 27, 2026
e351d1b
Update CuesheetManager.cs
NeoCoderMatrix86 Aug 27, 2026
5168d49
Update AudiofileManager.cs
NeoCoderMatrix86 Aug 27, 2026
cda1a69
set duration calculation
NeoCoderMatrix86 Aug 27, 2026
eb2468a
add audiofilemanager tests
NeoCoderMatrix86 Sep 2, 2026
4138415
Update CuesheetImportServiceTests.cs
NeoCoderMatrix86 Sep 2, 2026
61b5d7b
Update CuesheetImportServiceTests.cs
NeoCoderMatrix86 Sep 2, 2026
aa955d8
fix import audiofile upload
NeoCoderMatrix86 Sep 2, 2026
de85e7b
Update ImportManagerTests.cs
NeoCoderMatrix86 Sep 2, 2026
a295c77
fix import bug
NeoCoderMatrix86 Sep 2, 2026
03d0a19
Update Audiofiles.razor
NeoCoderMatrix86 Sep 2, 2026
4ce6335
Update TrackListControlButtons.razor
NeoCoderMatrix86 Sep 3, 2026
9b2457d
rename methods for moving
NeoCoderMatrix86 Sep 3, 2026
bf34461
Update CuesheetManagerTests.cs
NeoCoderMatrix86 Sep 3, 2026
b7e4a25
Update TrackList.razor
NeoCoderMatrix86 Sep 3, 2026
cdce62e
Update Index.razor
NeoCoderMatrix86 Sep 3, 2026
bd9560a
add moving files up
NeoCoderMatrix86 Sep 4, 2026
499ca34
add moving down audiofiles
NeoCoderMatrix86 Sep 7, 2026
bdb1cb8
bugfix undo after moving files
NeoCoderMatrix86 Sep 7, 2026
34eeaf1
Update AudiofileManager.cs
NeoCoderMatrix86 Sep 7, 2026
fb53bf7
Update CuesheetManager.cs
NeoCoderMatrix86 Sep 7, 2026
ded50eb
Update TrackList.razor
NeoCoderMatrix86 Sep 7, 2026
18ff0e9
set fixed header per audiofile
NeoCoderMatrix86 Sep 7, 2026
c8f9821
Update CuesheetManagerTests.cs
NeoCoderMatrix86 Sep 7, 2026
4aab048
fix add track end calculation
NeoCoderMatrix86 Sep 7, 2026
bf9d4b0
fix track moving
NeoCoderMatrix86 Sep 9, 2026
4458120
Update CuesheetManager.cs
NeoCoderMatrix86 Sep 9, 2026
557b14d
add localizations
NeoCoderMatrix86 Sep 9, 2026
f40b39b
fix localization
NeoCoderMatrix86 Sep 9, 2026
81fe75d
integration end2end tests
NeoCoderMatrix86 Sep 9, 2026
1c04ea9
end2end tests fixes
NeoCoderMatrix86 Sep 9, 2026
828839a
fix export tests
NeoCoderMatrix86 Sep 9, 2026
817e8c0
rename tests
NeoCoderMatrix86 Sep 9, 2026
ef56d5e
fix TODOs
NeoCoderMatrix86 Sep 9, 2026
b7a0834
import fixes
NeoCoderMatrix86 Sep 10, 2026
216c62a
fix import tests
NeoCoderMatrix86 Sep 10, 2026
8979ddc
fix tracing tests
NeoCoderMatrix86 Sep 10, 2026
b1999d6
fix import
NeoCoderMatrix86 Sep 10, 2026
ec539ea
update libraries
NeoCoderMatrix86 Sep 10, 2026
2ca83bd
fix tests
NeoCoderMatrix86 Sep 10, 2026
dd5daad
layout fixes
NeoCoderMatrix86 Sep 10, 2026
3941ecc
fix tests
NeoCoderMatrix86 Sep 10, 2026
cd07666
Update DetailView.cs
NeoCoderMatrix86 Sep 10, 2026
ea98614
fix tests
NeoCoderMatrix86 Sep 10, 2026
b8b3cfe
fix tests
NeoCoderMatrix86 Sep 10, 2026
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
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Playwright.MSTest.v4" Version="1.59.0" />
<PackageReference Include="MSTest" Version="4.2.3" />
<PackageReference Include="Microsoft.Playwright.MSTest.v4" Version="1.62.0" />
<PackageReference Include="MSTest" Version="4.4.0" />
</ItemGroup>

<ItemGroup>
Expand Down
30 changes: 16 additions & 14 deletions AudioCuesheetEditor.End2EndTests/Models/DetailView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ internal class DetailView(IPage page)

private readonly IPage _page = page;

internal ILocator AudiofileInput => _page.GetByRole(AriaRole.Group).Filter(new() { HasText = "AudiofileAudiofile" }).Locator("input[type=\"file\"]");

internal ILocator CuesheetArtistInput => _page.GetByRole(AriaRole.Textbox, new() { Name = "Cuesheet artist" });

internal ILocator CuesheetTitleInput => _page.GetByRole(AriaRole.Textbox, new() { Name = "Cuesheet title" });
Expand All @@ -39,9 +37,19 @@ internal async Task GotoAsync()
await _page.WaitForFunctionAsync(@"() => window.Blazor !== undefined");
}

internal async Task AddTrackAsync()
internal async Task AddAudiofileAsync()
{
await _page.GetByRole(AriaRole.Button, new() { Name = "Add file" }).ClickAsync();
}

internal async Task SetAudiofileInputFileAsync(int audiofileIndex, string file)
{
await _page.GetByRole(AriaRole.Group).Filter(new() { HasText = "AudiofileAudiofile" }).Nth(audiofileIndex).Locator("input[type=\"file\"]").SetInputFilesAsync(file);
}

internal async Task AddTrackAsync(int audiofileIndex)
{
await _page.GetByRole(AriaRole.Button, new() { Name = "Add new track" }).ClickAsync();
await _page.GetByRole(AriaRole.Button, new() { Name = "Add new track" }).Nth(audiofileIndex).ClickAsync();
}

internal async Task EditTrackAsync(string? artist = null, string? title = null)
Expand All @@ -50,9 +58,6 @@ internal async Task EditTrackAsync(string? artist = null, string? title = null)
{
await _page.Locator("td:nth-child(3)").ClickAsync();
await _page.Locator("td:nth-child(3)").Last.GetByRole(AriaRole.Textbox).FillAsync(artist);
// Autocomplete overlay will pop up, so we close it
await _page.Locator(".mud-popover-open").WaitForAsync(new() { State = WaitForSelectorState.Visible });
await _page.Keyboard.PressAsync("Escape");
// Click outside the autocomplete to have an focus lost event for getting the value written to model
await _page.GetByRole(AriaRole.Heading, new() { Name = "Playback" }).ClickAsync(new() { Force = true });
await _page.WaitForTimeoutAsync(100);
Expand All @@ -61,9 +66,6 @@ internal async Task EditTrackAsync(string? artist = null, string? title = null)
{
await _page.Locator("td:nth-child(4)").ClickAsync();
await _page.Locator("td:nth-child(4)").Last.GetByRole(AriaRole.Textbox).FillAsync(title);
// Autocomplete overlay will pop up, so we close it
await _page.Locator(".mud-popover-open").WaitForAsync(new() { State = WaitForSelectorState.Visible });
await _page.Keyboard.PressAsync("Escape");
// Click outside the autocomplete to have an focus lost event for getting the value written to model
await _page.GetByRole(AriaRole.Heading, new() { Name = "Playback" }).ClickAsync(new() { Force = true });
await _page.WaitForTimeoutAsync(100);
Expand Down Expand Up @@ -105,16 +107,16 @@ internal async Task EditTracksModalAsync(string artist, string title, string end
await _page.GetByRole(AriaRole.Button, new() { Name = "Save changes" }).ClickAsync();
}

internal async Task RenameAudiofileAsync(string filename)
internal async Task RenameAudiofileAsync(int audiofileIndex, string filename)
{
await OpenRenameAudiofileDialogAsync();
await OpenRenameAudiofileDialogAsync(audiofileIndex);
await NewFileNameInput.FillAsync(filename);
await _page.GetByRole(AriaRole.Button, new() { Name = "Ok" }).ClickAsync();
}

internal async Task OpenRenameAudiofileDialogAsync()
internal async Task OpenRenameAudiofileDialogAsync(int audiofileIndex)
{
await _page.GetByRole(AriaRole.Group).Filter(new() { HasText = "AudiofileAudiofile" }).GetByLabel("More").ClickAsync();
await _page.GetByRole(AriaRole.Group).Filter(new() { HasText = "AudiofileAudiofile" }).Nth(audiofileIndex).GetByLabel("More").ClickAsync();
await _page.GetByText("Rename file").ClickAsync();
}
}
Expand Down
8 changes: 8 additions & 0 deletions AudioCuesheetEditor.End2EndTests/Models/ImportView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ partial class ImportView(IPage page, bool mobile)
[GeneratedRegex("^Scheme common data$")]
private static partial Regex SchemeCommonData();

[GeneratedRegex("^Scheme audiofiles$")]
private static partial Regex SchemeAudiofiles();

internal const string BaseUrl = "http://localhost:5132/";

private readonly IPage _page = page;
Expand Down Expand Up @@ -105,6 +108,11 @@ internal async Task ClearSchemeCommonDataAsync()
await _page.Locator("div").Filter(new() { HasTextRegex = SchemeCommonData() }).GetByLabel("Clear").ClickAsync();
}

internal async Task ClearSchemeAudiofilesAsync()
{
await _page.Locator("div").Filter(new() { HasTextRegex = SchemeAudiofiles() }).GetByLabel("Clear").ClickAsync();
}

internal async Task SetSchemeCommonDataAsync(string schemeCommonData)
{
await _page.GetByRole(AriaRole.Textbox, new() { Name = "Scheme common data" }).FillAsync(schemeCommonData);
Expand Down
3 changes: 2 additions & 1 deletion AudioCuesheetEditor.End2EndTests/Sample_Inputfile.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
CuesheetArtist - CuesheetTitle c:\AudioFile.mp3
CuesheetArtist - CuesheetTitle
- c:\AudioFile.mp3
Sample Artist 1 - Sample Title 1 00:05:00
Sample Artist 2 - Sample Title 2 00:09:23
Sample Artist 3 - Sample Title 3 00:15:54
Expand Down
2 changes: 1 addition & 1 deletion AudioCuesheetEditor.End2EndTests/Sample_Project.ace
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"Tracks":[{"Position":1,"Artist":"Sample Artist 1","Title":"Sample Title 1","Begin":"00:00:00","End":"00:05:00","Flags":[],"IsLinkedToPreviousTrack":false},{"Position":2,"Artist":"Sample Artist 2","Title":"Sample Title 2","Begin":"00:05:00","End":"00:09:23","Flags":[],"IsLinkedToPreviousTrack":false},{"Position":3,"Artist":"Sample Artist 3","Title":"Sample Title 3","Begin":"00:09:23","End":"00:15:54","Flags":[],"IsLinkedToPreviousTrack":false},{"Position":4,"Artist":"Sample Artist 4","Title":"Sample Title 4","Begin":"00:15:54","End":"00:20:13","Flags":[],"IsLinkedToPreviousTrack":false},{"Position":5,"Artist":"Sample Artist 5","Title":"Sample Title 5","Begin":"00:20:13","End":"00:24:54","Flags":[],"IsLinkedToPreviousTrack":false},{"Position":6,"Artist":"Sample Artist 6","Title":"Sample Title 6","Begin":"00:24:54","End":"00:31:54","Flags":[],"IsLinkedToPreviousTrack":false},{"Position":7,"Artist":"Sample Artist 7","Title":"Sample Title 7","Begin":"00:31:54","End":"00:45:54","Flags":[],"IsLinkedToPreviousTrack":false},{"Position":8,"Artist":"Sample Artist 8","Title":"Sample Title 8","Begin":"00:45:54","Flags":[],"IsLinkedToPreviousTrack":false}],"Artist":"Sample CD Artist","Title":"Sample CD Title","Audiofile":{"Name":"Sample.mp3"},"Sections":[]}
{"Artist":"Sample CD Artist","Title":"Sample CD Title","Audiofiles":[{"Tracks":[{"Position":1,"Artist":"Sample Artist 1","Title":"Sample Title 1","Begin":"00:00:00","End":"00:05:00","Flags":[],"IsLinkedToPreviousTrack":true},{"Position":2,"Artist":"Sample Artist 2","Title":"Sample Title 2","Begin":"00:05:00","End":"00:09:23","Flags":[],"IsLinkedToPreviousTrack":true},{"Position":3,"Artist":"Sample Artist 3","Title":"Sample Title 3","Begin":"00:09:23","End":"00:15:54","Flags":[],"IsLinkedToPreviousTrack":true},{"Position":4,"Artist":"Sample Artist 4","Title":"Sample Title 4","Begin":"00:15:54","End":"00:20:13","Flags":[],"IsLinkedToPreviousTrack":true},{"Position":5,"Artist":"Sample Artist 5","Title":"Sample Title 5","Begin":"00:20:13","End":"00:24:54","Flags":[],"IsLinkedToPreviousTrack":true},{"Position":6,"Artist":"Sample Artist 6","Title":"Sample Title 6","Begin":"00:24:54","End":"00:31:54","Flags":[],"IsLinkedToPreviousTrack":true},{"Position":7,"Artist":"Sample Artist 7","Title":"Sample Title 7","Begin":"00:31:54","End":"00:45:54","Flags":[],"IsLinkedToPreviousTrack":true},{"Position":8,"Artist":"Sample Artist 8","Title":"Sample Title 8","Begin":"00:45:54","End":"01:15:54","Flags":[],"IsLinkedToPreviousTrack":true}]}]}
98 changes: 79 additions & 19 deletions AudioCuesheetEditor.End2EndTests/Tests/Desktop/BasicTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,9 @@ public async Task Audiofile_ShouldBeRenamed_WhenEditingFilename()
{
var detailView = new DetailView(TestPage);
await detailView.GotoAsync();
await detailView.AudiofileInput.SetInputFilesAsync("Kalimba.mp3");
await detailView.RenameAudiofileAsync("Kalimba test 123.mp3");
await detailView.AddAudiofileAsync();
await detailView.SetAudiofileInputFileAsync(0, "Kalimba.mp3");
await detailView.RenameAudiofileAsync(0, "Kalimba test 123.mp3");
await Expect(TestPage.GetByRole(AriaRole.Textbox, new() { Name = "Audiofile" })).ToMatchAriaSnapshotAsync("- textbox \"Audiofile\": Kalimba test 123.mp3");
}

Expand All @@ -70,12 +71,65 @@ public async Task ChangeLanguage_ShouldSwitchLanguage_WhenGermanIsSelected()
await bar.ChangeLanguageAsync("German (Germany)");
await Expect(TestPage.GetByRole(AriaRole.Heading, new() { Name = "Allgemeine Informationen" })).ToBeVisibleAsync();
await Expect(TestPage.GetByText("Aufnahmeansicht")).ToBeVisibleAsync();
await Expect(TestPage.GetByRole(AriaRole.Heading, new() { Name = "Titel" })).ToBeVisibleAsync();
await Expect(TestPage.GetByRole(AriaRole.Heading, new() { Name = "Dateien" })).ToBeVisibleAsync();
await Expect(TestPage.GetByRole(AriaRole.Heading, new() { Name = "Wiedergabe" })).ToBeVisibleAsync();
await bar.OpenExportDialogAsync("Textdatei", "Datei");
await Expect(TestPage.GetByRole(AriaRole.Dialog)).ToMatchAriaSnapshotAsync("- tabpanel:\n - text: \"Export ist derzeit nicht möglich: Titel hat ungültige Anzahl (0)! Künstler hat keinen Wert! Titel hat keinen Wert! Audiodatei hat keinen Wert! YouTube\"\n - group \"Exportprofil auswählen\"\n - text: Exportprofil auswählen\n - group:\n - button \"Neues Exportprofil hinzufügen\"\n - button \"Ausgewähltes Exportprofil löschen\"\n - separator\n - textbox \"Name\": YouTube\n - group \"Name\"\n - text: Name\n - textbox \"Dateiname\": YouTube.txt\n - group \"Dateiname\"\n - text: Dateiname\n - textbox \"Schema Kopf\": \"%Cuesheet.Artist% - %Cuesheet.Title%\"\n - button \"Clear\"\n - button\n - group \"Schema Kopf\"\n - text: Schema Kopf\n - textbox \"Schema Titel\": \"%Track.Artist% - %Track.Title% %Track.Begin%\"\n - button \"Clear\"\n - button\n - group \"Schema Titel\"\n - text: Schema Titel\n - textbox \"Schema Fuß\"\n - button\n - group \"Schema Fuß\"\n - text: Schema Fuß");
await Expect(TestPage.GetByRole(AriaRole.Dialog)).ToMatchAriaSnapshotAsync(@"- dialog ""Exportprofile Close"":
- heading ""Exportprofile"" [level=6]
- button ""Close""
- tablist:
- tab ""Export konfigurieren"" [selected]:
- paragraph: Export konfigurieren
- tab ""2 Export herunterladen"" [disabled]:
- text: ""2""
- paragraph: Export herunterladen
- tabpanel ""Export konfigurieren"":
- text: ""Export ist derzeit nicht möglich: Künstler hat keinen Wert! Titel hat keinen Wert! Audiodateien hat ungültige Anzahl (0)!""
- combobox ""Exportprofil auswählen"": YouTube
- group ""Exportprofil auswählen""
- text: Exportprofil auswählen
- group:
- button ""Neues Exportprofil hinzufügen""
- button ""Ausgewähltes Exportprofil löschen""
- separator
- textbox ""Name"":
- /placeholder: Geben Sie hier den Namen für dieses Profil ein
- text: YouTube
- group ""Name""
- text: Name
- textbox ""Dateiname"":
- /placeholder: Geben Sie hier den Dateinamen für dieses Profil ein
- text: YouTube.txt
- group ""Dateiname""
- text: Dateiname
- textbox ""Schema Kopf"":
- /placeholder: Geben Sie hier das Kopf-Schema für dieses Profil ein
- text: ""%Cuesheet.Artist% - %Cuesheet.Title%""
- button ""Clear""
- button
- group ""Schema Kopf""
- text: Schema Kopf
- textbox ""Schema Audiodateien"":
- /placeholder: Geben Sie hier das Audiodatei-Schema für dieses Profil ein
- button
- group ""Schema Audiodateien""
- text: Schema Audiodateien
- textbox ""Schema Titel"":
- /placeholder: Geben Sie hier das Titel-Schema für dieses Profil ein
- text: ""%Track.Artist% - %Track.Title% %Track.Begin%""
- button ""Clear""
- button
- group ""Schema Titel""
- text: Schema Titel
- textbox ""Schema Fuß"":
- /placeholder: Geben Sie hier das Fuß-Schema für dieses Profil ein
- button
- group ""Schema Fuß""
- text: Schema Fuß
- button ""Previous"" [disabled]
- button ""Next"" [disabled]");
await exportDialog.OpenSchemeMenuAsync("Schema Kopf");
await Expect(TestPage.Locator("#app")).ToMatchAriaSnapshotAsync("- paragraph: Künstler\n- paragraph: Titel\n- paragraph: Audiodatei\n- paragraph: CDTextdatei\n- paragraph: Katalognummer\n- paragraph: Datum\n- paragraph: Datum & Uhrzeit\n- paragraph: Uhrzeit");
await Expect(TestPage.Locator("#app")).ToMatchAriaSnapshotAsync("- paragraph: Künstler\n- paragraph: Titel\n- paragraph: CDTextdatei\n- paragraph: Katalognummer\n- paragraph: Datum\n- paragraph: Datum & Uhrzeit\n- paragraph: Uhrzeit");
await TestPage.GetByText("CDTextdatei").ClickAsync();
await exportDialog.OpenSchemeMenuAsync("Schema Titel");
await Expect(TestPage.GetByTestId("menu-wrapper")).ToMatchAriaSnapshotAsync("- paragraph: Position\n- paragraph: Künstler\n- paragraph: Titel\n- paragraph: Begin\n- paragraph: End\n- paragraph: Länge\n- paragraph: Markierungen\n- paragraph: Vorlücke\n- paragraph: Nachlücke");
Expand All @@ -84,23 +138,23 @@ public async Task ChangeLanguage_ShouldSwitchLanguage_WhenGermanIsSelected()
[TestMethod]
public async Task TrackTableControls_ShouldBeEnabled_WhenSelectingFirstTrackAsync()
{
var bar = new AppBar(TestPage);
var detailView = new DetailView(TestPage);
await detailView.GotoAsync();
await detailView.AddTrackAsync();
await detailView.AddTrackAsync();
await detailView.AddAudiofileAsync();
await detailView.AddTrackAsync(0);
await detailView.AddTrackAsync(0);
await detailView.SelectTracksAsync([1]);
await bar.ChangeLanguageAsync("German (Germany)");
await Expect(TestPage.GetByLabel("Track table controls")).ToMatchAriaSnapshotAsync(@"- group:
- button ""Neuen Titel hinzufügen""
- button ""Ausgewählte Titel bearbeiten""
- button ""Ausgewählten Titel kopieren""
- button ""Ausgewählte Titel löschen""
- button ""Alle Titel löschen""
- button ""Add new track""
- button ""Edit selected tracks""
- button ""Copy selected tracks""
- button ""Delete selected tracks""
- button ""Delete all tracks""
- group:
- button ""Move selected tracks up"" [disabled]
- button ""Move selected tracks down""
- group:
- button ""Ausgewählte Titel nach oben bewegen"" [disabled]
- button ""Ausgewählte Titel nach unten bewegen""
- button ""Fester Tabellenkopf""");
- button ""Fixed table header""");
}

[TestMethod]
Expand All @@ -112,26 +166,32 @@ public async Task KeyboardCommands_ShouldControlDialogs_WhenUsingEnterOrEscapeAs
await TestPage.GetByRole(AriaRole.Dialog).WaitForAsync(new() { State = WaitForSelectorState.Detached });
await bar.OpenExportDialogAsync("Cuesheet");
await Expect(TestPage.GetByRole(AriaRole.Dialog)).ToBeVisibleAsync();
await TestPage.GetByRole(AriaRole.Dialog).FocusAsync();
await TestPage.Keyboard.PressAsync("Escape");
await TestPage.GetByRole(AriaRole.Dialog).WaitForAsync(new() { State = WaitForSelectorState.Detached });
await bar.OpenExportDialogAsync("Projectfile");
await Expect(TestPage.GetByRole(AriaRole.Dialog)).ToBeVisibleAsync();
await TestPage.GetByRole(AriaRole.Dialog).FocusAsync();
await TestPage.Keyboard.PressAsync("Escape");
await TestPage.GetByRole(AriaRole.Dialog).WaitForAsync(new() { State = WaitForSelectorState.Detached });
await bar.OpenExportDialogAsync("Textfile");
await Expect(TestPage.GetByRole(AriaRole.Dialog)).ToBeVisibleAsync();
await TestPage.GetByRole(AriaRole.Dialog).FocusAsync();
await TestPage.Keyboard.PressAsync("Escape");
await TestPage.GetByRole(AriaRole.Dialog).WaitForAsync(new() { State = WaitForSelectorState.Detached });
await bar.OpenSettingsAsync();
await Expect(TestPage.GetByRole(AriaRole.Dialog)).ToBeVisibleAsync();
await TestPage.GetByRole(AriaRole.Dialog).FocusAsync();
await TestPage.Keyboard.PressAsync("Escape");
await TestPage.GetByRole(AriaRole.Dialog).WaitForAsync(new() { State = WaitForSelectorState.Detached });
await bar.OpenDisplayHotkeysAsync();
await Expect(TestPage.GetByRole(AriaRole.Dialog)).ToBeVisibleAsync();
await TestPage.GetByRole(AriaRole.Dialog).FocusAsync();
await TestPage.Keyboard.PressAsync("Escape");
await TestPage.GetByRole(AriaRole.Dialog).WaitForAsync(new() { State = WaitForSelectorState.Detached });
await detailView.AudiofileInput.SetInputFilesAsync("Kalimba.mp3");
await detailView.OpenRenameAudiofileDialogAsync();
await detailView.AddAudiofileAsync();
await detailView.SetAudiofileInputFileAsync(0, "Kalimba.mp3");
await detailView.OpenRenameAudiofileDialogAsync(0);
await Expect(TestPage.GetByRole(AriaRole.Dialog)).ToBeVisibleAsync();
await detailView.NewFileNameInput.FillAsync("Test 123");
await TestPage.Keyboard.PressAsync("Enter");
Expand Down
Loading