diff --git a/osu.Desktop/Updater/SquirrelUpdateManager.cs b/osu.Desktop/Updater/SquirrelUpdateManager.cs index d48c9e9661..7b60bc03e4 100644 --- a/osu.Desktop/Updater/SquirrelUpdateManager.cs +++ b/osu.Desktop/Updater/SquirrelUpdateManager.cs @@ -103,7 +103,10 @@ namespace osu.Desktop.Updater } else { + // In the case of an error, a separate notification will be displayed. notification.State = ProgressNotificationState.Cancelled; + notification.Close(); + Logger.Error(e, @"update failed!"); } } diff --git a/osu.Game.Tests/Resources/TestResources.cs b/osu.Game.Tests/Resources/TestResources.cs index dff9478852..440d5e701f 100644 --- a/osu.Game.Tests/Resources/TestResources.cs +++ b/osu.Game.Tests/Resources/TestResources.cs @@ -2,10 +2,18 @@ // See the LICENCE file in the repository root for full licence text. using System; +using System.Collections.Generic; using System.IO; +using System.Text; +using System.Threading; using NUnit.Framework; +using osu.Framework.Extensions; using osu.Framework.IO.Stores; using osu.Framework.Testing; +using osu.Framework.Utils; +using osu.Game.Beatmaps; +using osu.Game.Rulesets; +using osu.Game.Rulesets.Osu; namespace osu.Game.Tests.Resources { @@ -56,5 +64,78 @@ namespace osu.Game.Tests.Resources } private static string getTempFilename() => temp_storage.GetFullPath(Guid.NewGuid() + ".osz"); + + private static int importId; + + /// + /// Create a test beatmap set model. + /// + /// Number of difficulties. If null, a random number between 1 and 20 will be used. + /// Rulesets to cycle through when creating difficulties. If null, osu! ruleset will be used. + public static BeatmapSetInfo CreateTestBeatmapSetInfo(int? difficultyCount = null, RulesetInfo[] rulesets = null) + { + int j = 0; + RulesetInfo getRuleset() => rulesets?[j++ % rulesets.Length] ?? new OsuRuleset().RulesetInfo; + + int setId = Interlocked.Increment(ref importId); + + var metadata = new BeatmapMetadata + { + // Create random metadata, then we can check if sorting works based on these + Artist = "Some Artist " + RNG.Next(0, 9), + Title = $"Some Song (set id {setId}) {Guid.NewGuid()}", + AuthorString = "Some Guy " + RNG.Next(0, 9), + }; + + var beatmapSet = new BeatmapSetInfo + { + OnlineID = setId, + Hash = new MemoryStream(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString())).ComputeMD5Hash(), + DateAdded = DateTimeOffset.UtcNow, + Metadata = metadata + }; + + foreach (var b in getBeatmaps(difficultyCount ?? RNG.Next(1, 20))) + beatmapSet.Beatmaps.Add(b); + + return beatmapSet; + + IEnumerable getBeatmaps(int count) + { + for (int i = 0; i < count; i++) + { + int beatmapId = setId * 1000 + i; + + int length = RNG.Next(30000, 200000); + double bpm = RNG.NextSingle(80, 200); + + float diff = (float)i / count * 10; + + string version = "Normal"; + if (diff > 6.6) + version = "Insane"; + else if (diff > 3.3) + version = "Hard"; + + var rulesetInfo = getRuleset(); + + yield return new BeatmapInfo + { + OnlineID = beatmapId, + DifficultyName = $"{version} {beatmapId} (length {TimeSpan.FromMilliseconds(length):m\\:ss}, bpm {bpm:0.#})", + StarRating = diff, + Length = length, + BPM = bpm, + Ruleset = rulesetInfo, + RulesetID = rulesetInfo.ID ?? -1, + Metadata = metadata, + BaseDifficulty = new BeatmapDifficulty + { + OverallDifficulty = diff, + } + }; + } + } + } } } diff --git a/osu.Game.Tests/Visual/Menus/TestSceneMusicActionHandling.cs b/osu.Game.Tests/Visual/Menus/TestSceneMusicActionHandling.cs index f429b5b2a8..55e453c3d3 100644 --- a/osu.Game.Tests/Visual/Menus/TestSceneMusicActionHandling.cs +++ b/osu.Game.Tests/Visual/Menus/TestSceneMusicActionHandling.cs @@ -30,25 +30,10 @@ namespace osu.Game.Tests.Visual.Menus [Test] public void TestMusicNavigationActions() { - int importId = 0; Queue<(IWorkingBeatmap working, TrackChangeDirection changeDirection)> trackChangeQueue = null; // ensure we have at least two beatmaps available to identify the direction the music controller navigated to. - AddRepeatStep("import beatmap", () => Game.BeatmapManager.Import(new BeatmapSetInfo - { - Beatmaps = - { - new BeatmapInfo - { - BaseDifficulty = new BeatmapDifficulty(), - } - }, - Metadata = new BeatmapMetadata - { - Artist = $"a test map {importId++}", - Title = "title", - } - }).Wait(), 5); + AddRepeatStep("import beatmap", () => Game.BeatmapManager.Import(TestResources.CreateTestBeatmapSetInfo()).Wait(), 5); AddStep("import beatmap with track", () => { diff --git a/osu.Game.Tests/Visual/Multiplayer/TestScenePlaylistsSongSelect.cs b/osu.Game.Tests/Visual/Multiplayer/TestScenePlaylistsSongSelect.cs index 3e24b7a1d0..6d761105c1 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestScenePlaylistsSongSelect.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestScenePlaylistsSongSelect.cs @@ -2,13 +2,10 @@ // See the LICENCE file in the repository root for full licence text. using System; -using System.IO; using System.Linq; -using System.Text; using NUnit.Framework; using osu.Framework.Allocation; using osu.Framework.Audio; -using osu.Framework.Extensions; using osu.Framework.Platform; using osu.Framework.Screens; using osu.Framework.Utils; @@ -20,6 +17,7 @@ using osu.Game.Rulesets.Osu; using osu.Game.Rulesets.Osu.Mods; using osu.Game.Screens.OnlinePlay.Components; using osu.Game.Screens.OnlinePlay.Playlists; +using osu.Game.Tests.Resources; using osu.Game.Tests.Visual.OnlinePlay; namespace osu.Game.Tests.Visual.Multiplayer @@ -41,43 +39,7 @@ namespace osu.Game.Tests.Visual.Multiplayer Dependencies.Cache(rulesets = new RulesetStore(ContextFactory)); Dependencies.Cache(manager = new BeatmapManager(LocalStorage, ContextFactory, rulesets, null, audio, Resources, host, Beatmap.Default)); - var metadata = new BeatmapMetadata - { - // Create random metadata, then we can check if sorting works based on these - Artist = "Some Artist " + RNG.Next(0, 9), - Title = "Some Song (set id 10)", - AuthorString = "Some Guy " + RNG.Next(0, 9), - }; - - var beatmapSet = new BeatmapSetInfo - { - OnlineID = 10, - Hash = new MemoryStream(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString())).ComputeMD5Hash(), - Metadata = metadata, - DateAdded = DateTimeOffset.UtcNow, - }; - - for (int i = 0; i < 6; i++) - { - int beatmapId = 10 * 10 + i; - - int length = RNG.Next(30000, 200000); - double bpm = RNG.NextSingle(80, 200); - - beatmapSet.Beatmaps.Add(new BeatmapInfo - { - Ruleset = new OsuRuleset().RulesetInfo, - OnlineID = beatmapId, - DifficultyName = $"{beatmapId} (length {TimeSpan.FromMilliseconds(length):m\\:ss}, bpm {bpm:0.#})", - Length = length, - Metadata = metadata, - BPM = bpm, - BaseDifficulty = new BeatmapDifficulty - { - OverallDifficulty = 3.5f, - }, - }); - } + var beatmapSet = TestResources.CreateTestBeatmapSetInfo(); manager.Import(beatmapSet).Wait(); } diff --git a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapCarousel.cs b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapCarousel.cs index 1808f98c23..5906979bc4 100644 --- a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapCarousel.cs +++ b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapCarousel.cs @@ -3,15 +3,11 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; -using System.Text; using NUnit.Framework; using osu.Framework.Allocation; -using osu.Framework.Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Utils; using osu.Game.Beatmaps; using osu.Game.Configuration; using osu.Game.Rulesets; @@ -19,6 +15,7 @@ using osu.Game.Rulesets.Osu; using osu.Game.Screens.Select; using osu.Game.Screens.Select.Carousel; using osu.Game.Screens.Select.Filter; +using osu.Game.Tests.Resources; using osuTK.Input; namespace osu.Game.Tests.Visual.SongSelect @@ -152,7 +149,7 @@ namespace osu.Game.Tests.Visual.SongSelect const int total_set_count = 200; for (int i = 0; i < total_set_count; i++) - sets.Add(createTestBeatmapSet(i + 1)); + sets.Add(TestResources.CreateTestBeatmapSetInfo()); loadBeatmaps(sets); @@ -183,7 +180,7 @@ namespace osu.Game.Tests.Visual.SongSelect const int total_set_count = 20; for (int i = 0; i < total_set_count; i++) - sets.Add(createTestBeatmapSet(i + 1)); + sets.Add(TestResources.CreateTestBeatmapSetInfo(3)); loadBeatmaps(sets); @@ -228,10 +225,9 @@ namespace osu.Game.Tests.Visual.SongSelect loadBeatmaps(); // basic filtering - setSelected(1, 1); - AddStep("Filter", () => carousel.Filter(new FilterCriteria { SearchText = "set #3!" }, false)); + AddStep("Filter", () => carousel.Filter(new FilterCriteria { SearchText = carousel.BeatmapSets.ElementAt(2).Metadata.Title }, false)); checkVisibleItemCount(diff: false, count: 1); checkVisibleItemCount(diff: true, count: 3); waitForSelection(3, 1); @@ -275,16 +271,20 @@ namespace osu.Game.Tests.Visual.SongSelect [Test] public void TestFilterRange() { + string searchText = null; + loadBeatmaps(); // buffer the selection setSelected(3, 2); + AddStep("get search text", () => searchText = carousel.SelectedBeatmapSet.Metadata.Title); + setSelected(1, 3); AddStep("Apply a range filter", () => carousel.Filter(new FilterCriteria { - SearchText = "#3", + SearchText = searchText, StarDifficulty = new FilterCriteria.OptionalRange { Min = 2, @@ -327,7 +327,7 @@ namespace osu.Game.Tests.Visual.SongSelect nextRandom(); AddAssert("ensure repeat", () => selectedSets.Contains(carousel.SelectedBeatmapSet)); - AddStep("Add set with 100 difficulties", () => carousel.UpdateBeatmapSet(createTestBeatmapSetWithManyDifficulties(set_count + 1))); + AddStep("Add set with 100 difficulties", () => carousel.UpdateBeatmapSet(TestResources.CreateTestBeatmapSetInfo(100, rulesets.AvailableRulesets.ToArray()))); AddStep("Filter Extra", () => carousel.Filter(new FilterCriteria { SearchText = "Extra 10" }, false)); checkInvisibleDifficultiesUnselectable(); checkInvisibleDifficultiesUnselectable(); @@ -345,18 +345,21 @@ namespace osu.Game.Tests.Visual.SongSelect { loadBeatmaps(); - AddStep("Add new set", () => carousel.UpdateBeatmapSet(createTestBeatmapSet(set_count + 1))); - AddStep("Add new set", () => carousel.UpdateBeatmapSet(createTestBeatmapSet(set_count + 2))); + var firstAdded = TestResources.CreateTestBeatmapSetInfo(); + var secondAdded = TestResources.CreateTestBeatmapSetInfo(); + + AddStep("Add new set", () => carousel.UpdateBeatmapSet(firstAdded)); + AddStep("Add new set", () => carousel.UpdateBeatmapSet(secondAdded)); checkVisibleItemCount(false, set_count + 2); - AddStep("Remove set", () => carousel.RemoveBeatmapSet(createTestBeatmapSet(set_count + 2))); + AddStep("Remove set", () => carousel.RemoveBeatmapSet(firstAdded)); checkVisibleItemCount(false, set_count + 1); setSelected(set_count + 1, 1); - AddStep("Remove set", () => carousel.RemoveBeatmapSet(createTestBeatmapSet(set_count + 1))); + AddStep("Remove set", () => carousel.RemoveBeatmapSet(secondAdded)); checkVisibleItemCount(false, set_count); @@ -372,7 +375,7 @@ namespace osu.Game.Tests.Visual.SongSelect { sets.Clear(); - var rulesetBeatmapSet = createTestBeatmapSet(1); + var rulesetBeatmapSet = TestResources.CreateTestBeatmapSetInfo(1); var taikoRuleset = rulesets.AvailableRulesets.ElementAt(1); rulesetBeatmapSet.Beatmaps.ForEach(b => { @@ -397,12 +400,29 @@ namespace osu.Game.Tests.Visual.SongSelect [Test] public void TestSorting() { - loadBeatmaps(); + var sets = new List(); + + const string zzz_string = "zzzzz"; + + for (int i = 0; i < 20; i++) + { + var set = TestResources.CreateTestBeatmapSetInfo(); + + if (i == 4) + set.Metadata.Artist = zzz_string; + + if (i == 16) + set.Metadata.AuthorString = zzz_string; + + sets.Add(set); + } + + loadBeatmaps(sets); AddStep("Sort by author", () => carousel.Filter(new FilterCriteria { Sort = SortMode.Author }, false)); - AddAssert("Check zzzzz is at bottom", () => carousel.BeatmapSets.Last().Metadata.Author.Username == "zzzzz"); + AddAssert($"Check {zzz_string} is at bottom", () => carousel.BeatmapSets.Last().Metadata.Author.Username == zzz_string); AddStep("Sort by artist", () => carousel.Filter(new FilterCriteria { Sort = SortMode.Artist }, false)); - AddAssert($"Check #{set_count} is at bottom", () => carousel.BeatmapSets.Last().Metadata.Title.EndsWith($"#{set_count}!", StringComparison.Ordinal)); + AddAssert($"Check {zzz_string} is at bottom", () => carousel.BeatmapSets.Last().Metadata.Artist == zzz_string); } [Test] @@ -412,20 +432,21 @@ namespace osu.Game.Tests.Visual.SongSelect for (int i = 0; i < 20; i++) { - // index + 1 because we are using OnlineID which should never be zero. - var set = createTestBeatmapSet(i + 1); + var set = TestResources.CreateTestBeatmapSetInfo(); set.Metadata.Artist = "same artist"; set.Metadata.Title = "same title"; sets.Add(set); } + int idOffset = sets.First().OnlineID ?? 0; + loadBeatmaps(sets); AddStep("Sort by artist", () => carousel.Filter(new FilterCriteria { Sort = SortMode.Artist }, false)); - AddAssert("Items remain in original order", () => carousel.BeatmapSets.Select((set, index) => set.OnlineID == index + 1).All(b => b)); + AddAssert("Items remain in original order", () => carousel.BeatmapSets.Select((set, index) => set.OnlineID == index + idOffset).All(b => b)); AddStep("Sort by title", () => carousel.Filter(new FilterCriteria { Sort = SortMode.Title }, false)); - AddAssert("Items remain in original order", () => carousel.BeatmapSets.Select((set, index) => set.OnlineID == index + 1).All(b => b)); + AddAssert("Items remain in original order", () => carousel.BeatmapSets.Select((set, index) => set.OnlineID == index + idOffset).All(b => b)); } [Test] @@ -435,7 +456,7 @@ namespace osu.Game.Tests.Visual.SongSelect for (int i = 0; i < 3; i++) { - var set = createTestBeatmapSet(i); + var set = TestResources.CreateTestBeatmapSetInfo(3); set.Beatmaps[0].StarRating = 3 - i; set.Beatmaps[2].StarRating = 6 + i; sets.Add(set); @@ -504,7 +525,7 @@ namespace osu.Game.Tests.Visual.SongSelect AddStep("create hidden set", () => { - hidingSet = createTestBeatmapSet(1); + hidingSet = TestResources.CreateTestBeatmapSetInfo(3); hidingSet.Beatmaps[1].Hidden = true; hiddenList.Clear(); @@ -551,7 +572,7 @@ namespace osu.Game.Tests.Visual.SongSelect AddStep("add mixed ruleset beatmapset", () => { - testMixed = createTestBeatmapSet(set_count + 1); + testMixed = TestResources.CreateTestBeatmapSetInfo(); for (int i = 0; i <= 2; i++) { @@ -574,7 +595,7 @@ namespace osu.Game.Tests.Visual.SongSelect BeatmapSetInfo testSingle = null; AddStep("add single ruleset beatmapset", () => { - testSingle = createTestBeatmapSet(set_count + 2); + testSingle = TestResources.CreateTestBeatmapSetInfo(); testSingle.Beatmaps.ForEach(b => { b.Ruleset = rulesets.AvailableRulesets.ElementAt(1); @@ -594,7 +615,7 @@ namespace osu.Game.Tests.Visual.SongSelect List manySets = new List(); for (int i = 1; i <= 50; i++) - manySets.Add(createTestBeatmapSet(i)); + manySets.Add(TestResources.CreateTestBeatmapSetInfo(i)); loadBeatmaps(manySets); @@ -627,18 +648,11 @@ namespace osu.Game.Tests.Visual.SongSelect { for (int i = 0; i < 10; i++) { - var set = createTestBeatmapSet(i); - - foreach (var b in set.Beatmaps) + manySets.Add(TestResources.CreateTestBeatmapSetInfo(3, new[] { // all taiko except for first - int ruleset = i > 0 ? 1 : 0; - - b.Ruleset = rulesets.GetRuleset(ruleset); - b.RulesetID = ruleset; - } - - manySets.Add(set); + rulesets.GetRuleset(i > 0 ? 1 : 0) + })); } }); @@ -660,7 +674,7 @@ namespace osu.Game.Tests.Visual.SongSelect AddStep("Restore different ruleset filter", () => { carousel.Filter(new FilterCriteria { Ruleset = rulesets.GetRuleset(1) }, false); - eagerSelectedIDs.Add(carousel.SelectedBeatmapSet.ID); + eagerSelectedIDs.Add(carousel.SelectedBeatmapSet.OnlineID ?? -1); }); AddAssert("selection changed", () => !carousel.SelectedBeatmapInfo.Equals(manySets.First().Beatmaps.First())); @@ -678,7 +692,7 @@ namespace osu.Game.Tests.Visual.SongSelect AddStep("add mixed difficulty set", () => { - set = createTestBeatmapSet(1); + set = TestResources.CreateTestBeatmapSetInfo(1); set.Beatmaps.Clear(); for (int i = 1; i <= 15; i++) @@ -730,7 +744,11 @@ namespace osu.Game.Tests.Visual.SongSelect beatmapSets = new List(); for (int i = 1; i <= (count ?? set_count); i++) - beatmapSets.Add(createTestBeatmapSet(i, randomDifficulties)); + { + beatmapSets.Add(randomDifficulties + ? TestResources.CreateTestBeatmapSetInfo() + : TestResources.CreateTestBeatmapSetInfo(3)); + } } carousel.Filter(initialCriteria?.Invoke() ?? new FilterCriteria()); @@ -766,7 +784,7 @@ namespace osu.Game.Tests.Visual.SongSelect AddUntilStep($"selected is set{set}{(diff.HasValue ? $" diff{diff.Value}" : "")}", () => { if (diff != null) - return carousel.SelectedBeatmapInfo.Equals(carousel.BeatmapSets.Skip(set - 1).First().Beatmaps.Skip(diff.Value - 1).First()); + return carousel.SelectedBeatmapInfo?.Equals(carousel.BeatmapSets.Skip(set - 1).First().Beatmaps.Skip(diff.Value - 1).First()) == true; return carousel.BeatmapSets.Skip(set - 1).First().Beatmaps.Contains(carousel.SelectedBeatmapInfo); }); @@ -834,95 +852,6 @@ namespace osu.Game.Tests.Visual.SongSelect AddAssert("Selection is visible", selectedBeatmapVisible); } - private BeatmapSetInfo createTestBeatmapSet(int id, bool randomDifficultyCount = false) - { - var metadata = new BeatmapMetadata - { - // Create random metadata, then we can check if sorting works based on these - Artist = $"peppy{id.ToString().PadLeft(6, '0')}", - Title = $"test set #{id}!", - AuthorString = string.Concat(Enumerable.Repeat((char)('z' - Math.Min(25, id - 1)), 5)) - }; - - var beatmapSet = new BeatmapSetInfo - { - ID = id, - OnlineID = id, - Hash = new MemoryStream(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString())).ComputeMD5Hash(), - Metadata = metadata, - }; - - foreach (var b in getBeatmaps(randomDifficultyCount ? RNG.Next(1, 20) : 3, metadata)) - beatmapSet.Beatmaps.Add(b); - - return beatmapSet; - } - - private IEnumerable getBeatmaps(int count, BeatmapMetadata metadata) - { - int id = 0; - - for (int i = 0; i < count; i++) - { - float diff = (float)i / count * 10; - - string version = "Normal"; - if (diff > 6.6) - version = "Insane"; - else if (diff > 3.3) - version = "Hard"; - - yield return new BeatmapInfo - { - OnlineID = id++ * 10, - DifficultyName = version, - StarRating = diff, - Ruleset = new OsuRuleset().RulesetInfo, - Metadata = metadata, - BaseDifficulty = new BeatmapDifficulty - { - OverallDifficulty = diff, - } - }; - } - } - - private BeatmapSetInfo createTestBeatmapSetWithManyDifficulties(int id) - { - var metadata = new BeatmapMetadata - { - // Create random metadata, then we can check if sorting works based on these - Artist = $"peppy{id.ToString().PadLeft(6, '0')}", - Title = $"test set #{id}!", - AuthorString = string.Concat(Enumerable.Repeat((char)('z' - Math.Min(25, id - 1)), 5)) - }; - - var toReturn = new BeatmapSetInfo - { - OnlineID = id, - Hash = new MemoryStream(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString())).ComputeMD5Hash(), - Metadata = metadata, - }; - - for (int b = 1; b < 101; b++) - { - toReturn.Beatmaps.Add(new BeatmapInfo - { - OnlineID = b * 10, - DifficultyName = $"Extra {b}", - Ruleset = rulesets.GetRuleset((b - 1) % 4), - StarRating = 2, - Metadata = metadata, - BaseDifficulty = new BeatmapDifficulty - { - OverallDifficulty = 3.5f, - } - }); - } - - return toReturn; - } - private class TestBeatmapCarousel : BeatmapCarousel { public bool PendingFilterTask => PendingFilter != null; diff --git a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapRecommendations.cs b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapRecommendations.cs index 60b6fd81a2..ef11ad4153 100644 --- a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapRecommendations.cs +++ b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapRecommendations.cs @@ -16,6 +16,7 @@ using osu.Game.Rulesets.Catch; using osu.Game.Rulesets.Mania; using osu.Game.Rulesets.Osu; using osu.Game.Rulesets.Taiko; +using osu.Game.Tests.Resources; using osu.Game.Users; namespace osu.Game.Tests.Visual.SongSelect @@ -89,7 +90,7 @@ namespace osu.Game.Tests.Visual.SongSelect for (int i = 0; i < import_count; ++i) { - beatmapSets.Add(importBeatmapSet(i, Enumerable.Repeat(new OsuRuleset().RulesetInfo, 5))); + beatmapSets.Add(importBeatmapSet(Enumerable.Repeat(new OsuRuleset().RulesetInfo, 5))); } }); @@ -103,9 +104,8 @@ namespace osu.Game.Tests.Visual.SongSelect { BeatmapSetInfo catchSet = null, mixedSet = null; - AddStep("create catch beatmapset", () => catchSet = importBeatmapSet(1, new[] { new CatchRuleset().RulesetInfo })); - AddStep("create mixed beatmapset", () => mixedSet = importBeatmapSet(2, - new[] { new TaikoRuleset().RulesetInfo, new CatchRuleset().RulesetInfo, new ManiaRuleset().RulesetInfo })); + AddStep("create catch beatmapset", () => catchSet = importBeatmapSet(new[] { new CatchRuleset().RulesetInfo })); + AddStep("create mixed beatmapset", () => mixedSet = importBeatmapSet(new[] { new TaikoRuleset().RulesetInfo, new CatchRuleset().RulesetInfo, new ManiaRuleset().RulesetInfo })); AddAssert("all sets imported", () => ensureAllBeatmapSetsImported(new[] { catchSet, mixedSet })); @@ -121,9 +121,8 @@ namespace osu.Game.Tests.Visual.SongSelect { BeatmapSetInfo osuSet = null, mixedSet = null; - AddStep("create osu! beatmapset", () => osuSet = importBeatmapSet(1, new[] { new OsuRuleset().RulesetInfo })); - AddStep("create mixed beatmapset", () => mixedSet = importBeatmapSet(2, - new[] { new TaikoRuleset().RulesetInfo, new CatchRuleset().RulesetInfo, new ManiaRuleset().RulesetInfo })); + AddStep("create osu! beatmapset", () => osuSet = importBeatmapSet(new[] { new OsuRuleset().RulesetInfo })); + AddStep("create mixed beatmapset", () => mixedSet = importBeatmapSet(new[] { new TaikoRuleset().RulesetInfo, new CatchRuleset().RulesetInfo, new ManiaRuleset().RulesetInfo })); AddAssert("all sets imported", () => ensureAllBeatmapSetsImported(new[] { osuSet, mixedSet })); @@ -139,9 +138,8 @@ namespace osu.Game.Tests.Visual.SongSelect { BeatmapSetInfo osuSet = null, mixedSet = null; - AddStep("create osu! beatmapset", () => osuSet = importBeatmapSet(1, new[] { new OsuRuleset().RulesetInfo })); - AddStep("create mixed beatmapset", () => mixedSet = importBeatmapSet(2, - new[] { new TaikoRuleset().RulesetInfo, new CatchRuleset().RulesetInfo, new TaikoRuleset().RulesetInfo })); + AddStep("create osu! beatmapset", () => osuSet = importBeatmapSet(new[] { new OsuRuleset().RulesetInfo })); + AddStep("create mixed beatmapset", () => mixedSet = importBeatmapSet(new[] { new TaikoRuleset().RulesetInfo, new CatchRuleset().RulesetInfo, new TaikoRuleset().RulesetInfo })); AddAssert("all sets imported", () => ensureAllBeatmapSetsImported(new[] { osuSet, mixedSet })); @@ -157,8 +155,8 @@ namespace osu.Game.Tests.Visual.SongSelect { BeatmapSetInfo osuSet = null, maniaSet = null; - AddStep("create osu! beatmapset", () => osuSet = importBeatmapSet(1, new[] { new OsuRuleset().RulesetInfo })); - AddStep("create mania beatmapset", () => maniaSet = importBeatmapSet(2, Enumerable.Repeat(new ManiaRuleset().RulesetInfo, 10))); + AddStep("create osu! beatmapset", () => osuSet = importBeatmapSet(new[] { new OsuRuleset().RulesetInfo })); + AddStep("create mania beatmapset", () => maniaSet = importBeatmapSet(Enumerable.Repeat(new ManiaRuleset().RulesetInfo, 10))); AddAssert("all sets imported", () => ensureAllBeatmapSetsImported(new[] { osuSet, maniaSet })); @@ -169,31 +167,19 @@ namespace osu.Game.Tests.Visual.SongSelect presentAndConfirm(() => maniaSet, 5); } - private BeatmapSetInfo importBeatmapSet(int importID, IEnumerable difficultyRulesets) + private BeatmapSetInfo importBeatmapSet(IEnumerable difficultyRulesets) { - var metadata = new BeatmapMetadata - { - Artist = "SomeArtist", - AuthorString = "SomeAuthor", - Title = $"import {importID}" - }; + var rulesets = difficultyRulesets.ToArray(); - var beatmapSet = new BeatmapSetInfo - { - Hash = Guid.NewGuid().ToString(), - OnlineID = importID, - Metadata = metadata, - }; + var beatmapSet = TestResources.CreateTestBeatmapSetInfo(rulesets.Length, rulesets); - beatmapSet.Beatmaps.AddRange(difficultyRulesets.Select((ruleset, difficultyIndex) => new BeatmapInfo + for (int i = 0; i < rulesets.Length; i++) { - OnlineID = importID * 1024 + difficultyIndex, - Metadata = metadata, - BaseDifficulty = new BeatmapDifficulty(), - Ruleset = ruleset, - StarRating = difficultyIndex + 1, - DifficultyName = $"SR{difficultyIndex + 1}" - })); + var beatmap = beatmapSet.Beatmaps[i]; + + beatmap.StarRating = i + 1; + beatmap.DifficultyName = $"SR{i + 1}"; + } return Game.BeatmapManager.Import(beatmapSet).Result.Value; } diff --git a/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs b/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs index 5a9a377605..0494d1de3c 100644 --- a/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs +++ b/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs @@ -3,15 +3,11 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; -using System.Text; using NUnit.Framework; using osu.Framework.Allocation; using osu.Framework.Audio; using osu.Framework.Bindables; -using osu.Framework.Extensions; -using osu.Framework.Utils; using osu.Framework.Platform; using osu.Framework.Screens; using osu.Framework.Testing; @@ -31,6 +27,7 @@ using osu.Game.Screens.Play; using osu.Game.Screens.Select; using osu.Game.Screens.Select.Carousel; using osu.Game.Screens.Select.Filter; +using osu.Game.Tests.Resources; using osuTK.Input; namespace osu.Game.Tests.Visual.SongSelect @@ -259,7 +256,7 @@ namespace osu.Game.Tests.Visual.SongSelect AddStep("import multi-ruleset map", () => { var usableRulesets = rulesets.AvailableRulesets.Where(r => r.OnlineID != 2).ToArray(); - manager.Import(createTestBeatmapSet(usableRulesets)).Wait(); + manager.Import(TestResources.CreateTestBeatmapSetInfo(rulesets: usableRulesets)).Wait(); }); } else @@ -666,7 +663,7 @@ namespace osu.Game.Tests.Visual.SongSelect AddStep("import multi-ruleset map", () => { var usableRulesets = rulesets.AvailableRulesets.Where(r => r.OnlineID != 2).ToArray(); - manager.Import(createTestBeatmapSet(usableRulesets)).Wait(); + manager.Import(TestResources.CreateTestBeatmapSetInfo(3, usableRulesets)).Wait(); }); int previousSetID = 0; @@ -706,7 +703,7 @@ namespace osu.Game.Tests.Visual.SongSelect AddStep("import multi-ruleset map", () => { var usableRulesets = rulesets.AvailableRulesets.Where(r => r.OnlineID != 2).ToArray(); - manager.Import(createTestBeatmapSet(usableRulesets)).Wait(); + manager.Import(TestResources.CreateTestBeatmapSetInfo(3, usableRulesets)).Wait(); }); DrawableCarouselBeatmapSet set = null; @@ -755,7 +752,7 @@ namespace osu.Game.Tests.Visual.SongSelect AddStep("import huge difficulty count map", () => { var usableRulesets = rulesets.AvailableRulesets.Where(r => r.OnlineID != 2).ToArray(); - imported = manager.Import(createTestBeatmapSet(usableRulesets, 50)).Result.Value; + imported = manager.Import(TestResources.CreateTestBeatmapSetInfo(50, usableRulesets)).Result.Value; }); AddStep("select the first beatmap of import", () => Beatmap.Value = manager.GetWorkingBeatmap(imported.Beatmaps.First())); @@ -869,11 +866,7 @@ namespace osu.Game.Tests.Visual.SongSelect private void addRulesetImportStep(int id) => AddStep($"import test map for ruleset {id}", () => importForRuleset(id)); - private void importForRuleset(int id) => manager.Import(createTestBeatmapSet(rulesets.AvailableRulesets.Where(r => r.OnlineID == id).ToArray())).Wait(); - - private static int importId; - - private int getImportId() => ++importId; + private void importForRuleset(int id) => manager.Import(TestResources.CreateTestBeatmapSetInfo(3, rulesets.AvailableRulesets.Where(r => r.OnlineID == id).ToArray())).Wait(); private void checkMusicPlaying(bool playing) => AddUntilStep($"music {(playing ? "" : "not ")}playing", () => music.IsPlaying == playing); @@ -896,58 +889,10 @@ namespace osu.Game.Tests.Visual.SongSelect var usableRulesets = rulesets.AvailableRulesets.Where(r => r.OnlineID != 2).ToArray(); for (int i = 0; i < 100; i += 10) - manager.Import(createTestBeatmapSet(usableRulesets)).Wait(); + manager.Import(TestResources.CreateTestBeatmapSetInfo(rulesets: usableRulesets)).Wait(); }); } - private BeatmapSetInfo createTestBeatmapSet(RulesetInfo[] rulesets, int countPerRuleset = 6) - { - int j = 0; - RulesetInfo getRuleset() => rulesets[j++ % rulesets.Length]; - - int setId = getImportId(); - - var metadata = new BeatmapMetadata - { - // Create random metadata, then we can check if sorting works based on these - Artist = "Some Artist " + RNG.Next(0, 9), - Title = $"Some Song (set id {setId})", - AuthorString = "Some Guy " + RNG.Next(0, 9), - }; - - var beatmapSet = new BeatmapSetInfo - { - OnlineID = setId, - Hash = new MemoryStream(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString())).ComputeMD5Hash(), - DateAdded = DateTimeOffset.UtcNow, - Metadata = metadata - }; - - for (int i = 0; i < countPerRuleset; i++) - { - int beatmapId = setId * 1000 + i; - - int length = RNG.Next(30000, 200000); - double bpm = RNG.NextSingle(80, 200); - - beatmapSet.Beatmaps.Add(new BeatmapInfo - { - Ruleset = getRuleset(), - OnlineID = beatmapId, - DifficultyName = $"{beatmapId} (length {TimeSpan.FromMilliseconds(length):m\\:ss}, bpm {bpm:0.#})", - Length = length, - Metadata = metadata, - BPM = bpm, - BaseDifficulty = new BeatmapDifficulty - { - OverallDifficulty = 3.5f, - }, - }); - } - - return beatmapSet; - } - protected override void Dispose(bool isDisposing) { base.Dispose(isDisposing); diff --git a/osu.Game.Tests/Visual/UserInterface/TestScenePlaylistOverlay.cs b/osu.Game.Tests/Visual/UserInterface/TestScenePlaylistOverlay.cs index 52141dea1a..39146d584c 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestScenePlaylistOverlay.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestScenePlaylistOverlay.cs @@ -1,16 +1,16 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using System; using System.Linq; using NUnit.Framework; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Testing; -using osu.Framework.Utils; using osu.Game.Beatmaps; +using osu.Game.Graphics.Containers; using osu.Game.Overlays.Music; +using osu.Game.Tests.Resources; using osuTK; using osuTK.Input; @@ -22,6 +22,8 @@ namespace osu.Game.Tests.Visual.UserInterface private PlaylistOverlay playlistOverlay; + private BeatmapSetInfo first; + [SetUp] public void Setup() => Schedule(() => { @@ -43,19 +45,11 @@ namespace osu.Game.Tests.Visual.UserInterface for (int i = 0; i < 100; i++) { - beatmapSets.Add(new BeatmapSetInfo - { - Metadata = new BeatmapMetadata - { - // Create random metadata, then we can check if sorting works based on these - Artist = "Some Artist " + RNG.Next(0, 9), - Title = $"Some Song {i + 1}", - AuthorString = "Some Guy " + RNG.Next(0, 9), - }, - DateAdded = DateTimeOffset.UtcNow, - }); + beatmapSets.Add(TestResources.CreateTestBeatmapSetInfo()); } + first = beatmapSets.First(); + playlistOverlay.BeatmapSets.BindTo(beatmapSets); }); @@ -66,7 +60,7 @@ namespace osu.Game.Tests.Visual.UserInterface AddStep("hold 1st item handle", () => { - var handle = this.ChildrenOfType().First(); + var handle = this.ChildrenOfType.PlaylistItemHandle>().First(); InputManager.MoveMouseTo(handle.ScreenSpaceDrawQuad.Centre); InputManager.PressButton(MouseButton.Left); }); @@ -77,7 +71,7 @@ namespace osu.Game.Tests.Visual.UserInterface InputManager.MoveMouseTo(item.ScreenSpaceDrawQuad.Centre); }); - AddAssert("song 1 is 5th", () => beatmapSets[4].Metadata.Title == "Some Song 1"); + AddAssert("song 1 is 5th", () => beatmapSets[4] == first); AddStep("release handle", () => InputManager.ReleaseButton(MouseButton.Left)); }