From 8b36697e59288b07d1b91dd6ee0f3f4197579bcd Mon Sep 17 00:00:00 2001 From: andy840119 Date: Tue, 8 Mar 2022 21:27:29 +0800 Subject: [PATCH 1/4] should return enumerable instead for return list. --- .../Utils/TimeTagsUtilsTest.cs | 2 +- osu.Game.Rulesets.Karaoke/Utils/TimeTagsUtils.cs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/osu.Game.Rulesets.Karaoke.Tests/Utils/TimeTagsUtilsTest.cs b/osu.Game.Rulesets.Karaoke.Tests/Utils/TimeTagsUtilsTest.cs index d48555780..dacc6f486 100644 --- a/osu.Game.Rulesets.Karaoke.Tests/Utils/TimeTagsUtilsTest.cs +++ b/osu.Game.Rulesets.Karaoke.Tests/Utils/TimeTagsUtilsTest.cs @@ -52,7 +52,7 @@ public void TestSort(string[] timeTagTexts, string[] expectedTimeTags) var timeTags = TestCaseTagHelper.ParseTimeTags(timeTagTexts); var expected = TestCaseTagHelper.ParseTimeTags(expectedTimeTags); - var actual = TimeTagsUtils.Sort(timeTags); + var actual = TimeTagsUtils.Sort(timeTags).ToArray(); TimeTagAssert.ArePropertyEqual(expected, actual); } diff --git a/osu.Game.Rulesets.Karaoke/Utils/TimeTagsUtils.cs b/osu.Game.Rulesets.Karaoke/Utils/TimeTagsUtils.cs index 6bc286efb..a7a1fd510 100644 --- a/osu.Game.Rulesets.Karaoke/Utils/TimeTagsUtils.cs +++ b/osu.Game.Rulesets.Karaoke/Utils/TimeTagsUtils.cs @@ -60,10 +60,10 @@ public static TimeTag GenerateCenterTimeTag(TimeTag startTimeTag, TimeTag endTim /// /// Time tags /// Sorted time tags - public static IList Sort(IEnumerable timeTags) + public static IEnumerable Sort(IEnumerable timeTags) { return timeTags.OrderBy(x => x.Index) - .ThenBy(x => x.Time).ToArray(); + .ThenBy(x => x.Time); } /// @@ -177,7 +177,7 @@ IEnumerable findSelfOverlapping() } } - return Sort(overlappingTimeTagList.Distinct()); + return Sort(overlappingTimeTagList.Distinct()).ToArray(); } /// @@ -192,7 +192,7 @@ public static IList FixOverlapping(IList timeTags, GroupCheck if (!timeTags.Any()) return timeTags; - var sortedTimeTags = Sort(timeTags); + var sortedTimeTags = Sort(timeTags).ToArray(); var groupedTimeTags = sortedTimeTags.GroupBy(x => x.Index.Index).ToArray(); var overlappingTimeTags = FindOverlapping(timeTags, other, self); @@ -200,7 +200,7 @@ public static IList FixOverlapping(IList timeTags, GroupCheck foreach (var overlappingTimeTag in overlappingTimeTags) { - int listIndex = sortedTimeTags.IndexOf(overlappingTimeTag); + int listIndex = Array.IndexOf(sortedTimeTags, overlappingTimeTag); var timeTag = overlappingTimeTag.Index; // fix self-overlapping From be35dc6132b17b0b5508868766d9c514427a4d16 Mon Sep 17 00:00:00 2001 From: andy840119 Date: Tue, 8 Mar 2022 21:11:41 +0800 Subject: [PATCH 2/4] add test case list helper for testing time-tag with random state. --- .../Helper/TestCaseListHelper.cs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 osu.Game.Rulesets.Karaoke.Tests/Helper/TestCaseListHelper.cs diff --git a/osu.Game.Rulesets.Karaoke.Tests/Helper/TestCaseListHelper.cs b/osu.Game.Rulesets.Karaoke.Tests/Helper/TestCaseListHelper.cs new file mode 100644 index 000000000..b617fccad --- /dev/null +++ b/osu.Game.Rulesets.Karaoke.Tests/Helper/TestCaseListHelper.cs @@ -0,0 +1,26 @@ +// Copyright (c) andy840119 . Licensed under the GPL Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace osu.Game.Rulesets.Karaoke.Tests.Helper +{ + public static class TestCaseListHelper + { + private static readonly Random rng = new(); + + /// + /// Random the order of the list. + /// + /// + /// + /// + public static IList Shuffle(IList list) + { + // see: https://stackoverflow.com/a/4262134 + return list.OrderBy(_ => rng.Next()).ToList(); + } + } +} From cef77ba43428b634d097386a06dbd0dfde7f93b4 Mon Sep 17 00:00:00 2001 From: andy840119 Date: Tue, 8 Mar 2022 21:41:32 +0800 Subject: [PATCH 3/4] temp. --- .../BaseCaretPositionAlgorithmTest.cs | 13 ++++++++++++ .../TimeTagCaretPositionAlgorithm.cs | 20 +++++++++++++------ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/osu.Game.Rulesets.Karaoke.Tests/Editor/Lyrics/CaretPosition/Algorithms/BaseCaretPositionAlgorithmTest.cs b/osu.Game.Rulesets.Karaoke.Tests/Editor/Lyrics/CaretPosition/Algorithms/BaseCaretPositionAlgorithmTest.cs index 0f2c45bc7..8c62ecd41 100644 --- a/osu.Game.Rulesets.Karaoke.Tests/Editor/Lyrics/CaretPosition/Algorithms/BaseCaretPositionAlgorithmTest.cs +++ b/osu.Game.Rulesets.Karaoke.Tests/Editor/Lyrics/CaretPosition/Algorithms/BaseCaretPositionAlgorithmTest.cs @@ -7,6 +7,7 @@ using osu.Game.Rulesets.Karaoke.Edit.Lyrics.CaretPosition; using osu.Game.Rulesets.Karaoke.Edit.Lyrics.CaretPosition.Algorithms; using osu.Game.Rulesets.Karaoke.Objects; +using osu.Game.Rulesets.Karaoke.Tests.Helper; namespace osu.Game.Rulesets.Karaoke.Tests.Editor.Lyrics.CaretPosition.Algorithms { @@ -115,6 +116,18 @@ protected Lyric[] GetLyricsByMethodName(string methodName) throw new MissingMethodException("Test method is not exist."); return (Lyric[])theMethod.GetValue(this)!; + + /* + var lyrics = theMethod.GetValue(this) as Lyric[] ?? Array.Empty(); + + foreach (var lyric in lyrics) + { + // because time-tag will not always sort by order, so we need to shuffle the time-tag in the list for testing. + lyric.TimeTags = TestCaseListHelper.Shuffle(lyric.TimeTags); + } + + return lyrics; + */ } } } diff --git a/osu.Game.Rulesets.Karaoke/Edit/Lyrics/CaretPosition/Algorithms/TimeTagCaretPositionAlgorithm.cs b/osu.Game.Rulesets.Karaoke/Edit/Lyrics/CaretPosition/Algorithms/TimeTagCaretPositionAlgorithm.cs index 81c851e4e..ede6640ce 100644 --- a/osu.Game.Rulesets.Karaoke/Edit/Lyrics/CaretPosition/Algorithms/TimeTagCaretPositionAlgorithm.cs +++ b/osu.Game.Rulesets.Karaoke/Edit/Lyrics/CaretPosition/Algorithms/TimeTagCaretPositionAlgorithm.cs @@ -2,10 +2,12 @@ // See the LICENCE file in the repository root for full licence text. using System; +using System.Collections.Generic; using System.Linq; using osu.Framework.Graphics.Sprites; using osu.Game.Rulesets.Karaoke.Extensions; using osu.Game.Rulesets.Karaoke.Objects; +using osu.Game.Rulesets.Karaoke.Utils; namespace osu.Game.Rulesets.Karaoke.Edit.Lyrics.CaretPosition.Algorithms { @@ -41,7 +43,7 @@ public override bool PositionMovable(TimeTagCaretPosition position) if (previousLyric == null) return null; - var timeTags = previousLyric.TimeTags.Where(timeTagMovable).ToArray(); + var timeTags = sortTimeTag(previousLyric.TimeTags.Where(timeTagMovable)).ToArray(); var upTimeTag = timeTags.FirstOrDefault(x => x.Index >= currentTimeTag.Index) ?? timeTags.LastOrDefault(); @@ -65,7 +67,7 @@ public override bool PositionMovable(TimeTagCaretPosition position) if (nextLyric == null) return null; - var timeTags = nextLyric.TimeTags.Where(timeTagMovable).ToArray(); + var timeTags = sortTimeTag(nextLyric.TimeTags.Where(timeTagMovable)).ToArray(); var downTimeTag = timeTags.FirstOrDefault(x => x.Index >= currentTimeTag.Index) ?? timeTags.LastOrDefault(); @@ -77,7 +79,7 @@ public override bool PositionMovable(TimeTagCaretPosition position) public override TimeTagCaretPosition? MoveLeft(TimeTagCaretPosition currentPosition) { - var timeTags = Lyrics.SelectMany(x => x.TimeTags).ToArray(); + var timeTags = getAllSortedTimeTag(); var previousTimeTag = timeTags.GetPreviousMatch(currentPosition.TimeTag, timeTagMovable); if (previousTimeTag == null) return null; @@ -87,7 +89,7 @@ public override bool PositionMovable(TimeTagCaretPosition position) public override TimeTagCaretPosition? MoveRight(TimeTagCaretPosition currentPosition) { - var timeTags = Lyrics.SelectMany(x => x.TimeTags).ToArray(); + var timeTags = getAllSortedTimeTag(); var nextTimeTag = timeTags.GetNextMatch(currentPosition.TimeTag, timeTagMovable); if (nextTimeTag == null) return null; @@ -97,7 +99,7 @@ public override bool PositionMovable(TimeTagCaretPosition position) public override TimeTagCaretPosition? MoveToFirst() { - var timeTags = Lyrics.SelectMany(x => x.TimeTags).ToArray(); + var timeTags = getAllSortedTimeTag(); var firstTimeTag = timeTags.FirstOrDefault(timeTagMovable); if (firstTimeTag == null) return null; @@ -107,7 +109,7 @@ public override bool PositionMovable(TimeTagCaretPosition position) public override TimeTagCaretPosition? MoveToLast() { - var timeTags = Lyrics.SelectMany(x => x.TimeTags).ToArray(); + var timeTags = getAllSortedTimeTag(); var lastTimeTag = timeTags.LastOrDefault(timeTagMovable); if (lastTimeTag == null) return null; @@ -123,6 +125,12 @@ public override bool PositionMovable(TimeTagCaretPosition position) return targetTimeTag == null ? null : new TimeTagCaretPosition(lyric, targetTimeTag); } + private IEnumerable sortTimeTag(IEnumerable timeTags) + => TimeTagsUtils.Sort(timeTags); + + private IEnumerable getAllSortedTimeTag() + => sortTimeTag(Lyrics.SelectMany(x => x.TimeTags)); + private TimeTagCaretPosition? timeTagToPosition(TimeTag timeTag) { var lyric = timeTagInLyric(timeTag); From 344eb05e82388cc4ad237ea13ee98e3d016c484d Mon Sep 17 00:00:00 2001 From: andy840119 Date: Sat, 12 Mar 2022 11:25:14 +0800 Subject: [PATCH 4/4] temp. --- .../CaretPosition/Algorithms/BaseCaretPositionAlgorithmTest.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game.Rulesets.Karaoke.Tests/Editor/Lyrics/CaretPosition/Algorithms/BaseCaretPositionAlgorithmTest.cs b/osu.Game.Rulesets.Karaoke.Tests/Editor/Lyrics/CaretPosition/Algorithms/BaseCaretPositionAlgorithmTest.cs index 8c62ecd41..f5cc54267 100644 --- a/osu.Game.Rulesets.Karaoke.Tests/Editor/Lyrics/CaretPosition/Algorithms/BaseCaretPositionAlgorithmTest.cs +++ b/osu.Game.Rulesets.Karaoke.Tests/Editor/Lyrics/CaretPosition/Algorithms/BaseCaretPositionAlgorithmTest.cs @@ -7,7 +7,6 @@ using osu.Game.Rulesets.Karaoke.Edit.Lyrics.CaretPosition; using osu.Game.Rulesets.Karaoke.Edit.Lyrics.CaretPosition.Algorithms; using osu.Game.Rulesets.Karaoke.Objects; -using osu.Game.Rulesets.Karaoke.Tests.Helper; namespace osu.Game.Rulesets.Karaoke.Tests.Editor.Lyrics.CaretPosition.Algorithms {