public void OnPress_LongerNoteHalfwayHold_HasHalfScore() { AddStep("Add notes", () => Story.AddNote(new GameHoldNote { HitTime = 0, EndTime = 1000 })); AddStep("Move mouse to note", () => MoveMouseTo(Story.Notes.Children.First())); PressAndRelease(500, 500); AddAssert("Has half score", () => PlayScreen.ScoreProcessor.ScoreStatistics.Score == 500); }
public void OnPress_LongerNoteNoHold_HasFullScore() { AddStep("Add notes", () => Story.AddNote(new GameHoldNote { HitTime = 0, EndTime = 1000 })); AddStep("Move mouse to note", () => MoveMouseTo(Story.Notes.Children.First())); AddStep("Seek after EndTime", () => Stopwatch.Seek(1000)); AddAssert("Has full score", () => PlayScreen.ScoreProcessor.ScoreStatistics.Score == 1000); }
public void Undo() { Story.AddNote(Note); if (Editor.ToolState is SelectToolState selectTool) { selectTool.ClearNoteSelection(); selectTool.AddNoteSelection(Note); } }
public void OnPress_2ReleasesInDuringState_Plays2MissSounds() { AddStep("Add note", () => Story.AddNote(new GameHoldNote { HitTime = 0, EndTime = 1000 })); AddStep("Move mouse to note", () => MoveMouseTo(Story.Notes.Children.First())); PressAndRelease(50, 200); PressAndRelease(600, 100); AddAssert("Plays 2 miss sounds", () => PlayScreen.ScoreProcessor.Miss.PlayCount == 2); }
public void SetUpSteps() { AddStep("Pause editor", () => Editor.Play(false)); AddStep("Restart editor", () => Editor.Restart()); AddStep("Reset story", () => Story.Reset()); AddStep("Add note", () => Story.AddNote(NoteToTest = new EditorHoldNote { HitTime = Story.Notes.ShowTime + Story.Notes.FadeInTime + NoteAppearTime, EndTime = Story.Notes.ShowTime + Story.Notes.FadeInTime + NoteAppearTime + HoldDuration })); }
public void GetState_NotVisible() { GameHoldNote note = null; AddStep("Add note", () => Story.AddNote(note = new GameHoldNote { HitTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 50, EndTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 150 })); AddStep("Seek before note is visible", () => Stopwatch.Seek(25)); AddAssert("Note is in NotVisible state", () => note.State == HoldNoteState.NotVisible); }
public void GetState_VisibleBefore() { GameHoldNote note = null; AddStep("Add note", () => Story.AddNote(note = new GameHoldNote { HitTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 50, EndTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 150 })); AddStep("Seek before MissThreshold", () => Stopwatch.Seek(note.HitTime - Notes.MissThreshold - 50)); AddAssert("Note is in VisibleBefore state", () => note.State == HoldNoteState.VisibleBefore); }
public void GetState_HitWindow() { GameHoldNote note = null; AddStep("Add note", () => Story.AddNote(note = new GameHoldNote { HitTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 50, EndTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 150 })); AddStep("Seek within MissThreshold", () => Stopwatch.Seek(note.HitTime - Notes.MissThreshold / 2)); AddAssert("Note is in HitWindow state", () => note.State == HoldNoteState.HitWindow); }
public void GetState_VisibleAfter() { GameHoldNote note = null; AddStep("Add note", () => Story.AddNote(note = new GameHoldNote { HitTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 50, EndTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 150 })); AddStep("Seek after EndTime", () => Stopwatch.Seek(note.EndTime + Story.Notes.FadeOutTime / 2)); AddAssert("Note is in VisibleAfter state", () => note.State == HoldNoteState.VisibleAfter); }
public void GetState_During() { GameHoldNote note = null; AddStep("Add note", () => Story.AddNote(note = new GameHoldNote { HitTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 50, EndTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 150 })); AddStep("Seek between HitTime and EndTime", () => Stopwatch.Seek((note.HitTime + note.EndTime) / 2)); AddAssert("Note is in During state", () => note.State == HoldNoteState.During); }
public void OnPress_OutsideMissThreshold_DoesNothing() { AddStep("Add note", () => Story.AddNote(new GameNote { HitTime = Notes.MissThreshold + 50 })); AddStep("Move mouse to note", () => MoveMouseTo(Story.Notes.Children.First())); AddStep("Hold key", () => InputManager.PressKey(Key.Z)); AddStep("Release key", () => InputManager.ReleaseKey(Key.Z)); AddStep("Seek after post-threshold", () => Stopwatch.Seek(Notes.MissThreshold * 2 + 60)); AddAssert("Note was missed", () => PlayScreen.ScoreProcessor.ScoreStatistics.Score == Notes.MissThreshold); }
[TestCase(1260, 40)] // Press and Release entirely within VisibleAfter state public void Score_PressIgnored_IsFullDurationPlusEndPenalty(int timeToPress, int holdDuration) { GameHoldNote note = null; AddStep("Add note", () => Story.AddNote(note = new GameHoldNote { HitTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 50, EndTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 150 })); AddStep("Move mouse to note", () => MoveMouseTo(Story.Notes.Children.First())); PressAndRelease(timeToPress, holdDuration); AddStep("Seek after note is deleted", () => Stopwatch.Seek(note.EndTime + Story.Notes.FadeOutTime)); AddAssert("Score is note duration (full miss)", () => PlayScreen.ScoreProcessor.ScoreStatistics.Score == 100.0 + Notes.MissThreshold); }
public void UpdateColor_NotesAlphaCommand_IsHalf() { GameNote note = null; AddStep("Add a note", () => Story.AddNote(note = new GameNote { HitTime = Story.Notes.ShowTime - 100 })); AddStep("Apply half NotesAlphaCommand", () => Story.AddCommand(new NotesAlphaCommand { StartValue = 0.5f, EndValue = 0.5f })); AddAssert("Note is half alpha", () => Precision.AlmostEquals(note.Alpha, 0.5f)); }
public void UpdateColor_ApproachesColorCommand_IsGreen() { GameNote note = null; AddStep("Add a note", () => Story.AddNote(note = new GameNote { HitTime = 1000 })); AddStep("Apply Green ApproachesColorCommand", () => Story.AddCommand(new ApproachesColorCommand { StartValue = Color4.Green, EndValue = Color4.Green })); AddAssert("Approach is green", () => note.Approach.Colour == Color4.Green); }
public void UpdateColor_NotesOutlineThicknessCommand_IsTwoHundredths() { GameNote note = null; AddStep("Add a note", () => Story.AddNote(note = new GameNote { HitTime = Story.Notes.ShowTime - 100 })); AddStep("Apply 0.02 NotesOutlineThicknessCommand", () => Story.AddCommand(new NotesOutlineThicknessCommand { StartValue = 0.02f, EndValue = 0.02f })); AddAssert("Note outline is 0.02 thick", () => Precision.AlmostEquals(note.OutlineThickness, 0.02f)); }
public void UpdateColor_NotesOutlineColorCommand_IsGreen() { GameNote note = null; AddStep("Add a note", () => Story.AddNote(note = new GameNote { HitTime = Story.Notes.ShowTime - 100 })); AddStep("Apply green NotesOutlineColorCommand", () => Story.AddCommand(new NotesOutlineColorCommand { StartValue = Color4.Green, EndValue = Color4.Green })); AddAssert("Note outline is green", () => note.OutlineColor == Color4.Green); }
public void OnPress_WithinMissThreshold_RegistersHit() { GameNote note = null; AddStep("Add note", () => Story.AddNote(note = new GameNote { HitTime = Notes.MissThreshold + 50 })); AddStep("Seek between pre-threshold and HitTime", () => Stopwatch.Seek(note.HitTime - Notes.MissThreshold / 2)); AddStep("Move mouse to note", () => MoveMouseTo(Story.Notes.Children.First())); AddStep("Hold key", () => InputManager.PressKey(Key.Z)); AddStep("Release key", () => InputManager.ReleaseKey(Key.Z)); AddStep("Seek after post-threshold", () => Stopwatch.Seek(Notes.MissThreshold * 2 + 60)); AddAssert("Note was hit", () => PlayScreen.ScoreProcessor.ScoreStatistics.Score == Notes.MissThreshold / 2); }
public void UpdateColor_HoldNotesColorCommand_IsGreen() { GameHoldNote note = null; AddStep("Add a note", () => Story.AddNote(note = new GameHoldNote { HitTime = Story.Notes.ShowTime - 100, EndTime = Story.Notes.ShowTime + 100 })); AddStep("Apply green HoldNotesColorCommand", () => Story.AddCommand(new HoldNotesColorCommand { StartValue = Color4.Green, EndValue = Color4.Green })); AddAssert("Hold note is green", () => note.InnerColor == Color4.Green); }
public void UpdateColor_HoldApproachesColorCommand_IsGreen() { EditorHoldNote note = null; AddStep("Add a note", () => Story.AddNote(note = new EditorHoldNote { HitTime = Story.Notes.ShowTime - 100, EndTime = Story.Notes.ShowTime + 100 })); AddStep("Apply green HoldApproachesColorCommand", () => Story.AddCommand(new HoldApproachesColorCommand { StartValue = Color4.Green, EndValue = Color4.Green })); AddAssert("Hold approach is green", () => note.Approach.Colour == Color4.Green); }
public void UpdateSliderPath_HoldNotesOutlineColorCommand_IsGreen() { EditorHoldNote note = null; AddStep("Add a note", () => Story.AddNote(note = new EditorHoldNote { HitTime = Story.Notes.ShowTime - 100, EndTime = Story.Notes.ShowTime + 100 })); AddStep("Apply green HoldNotesOutlineColorCommand", () => Story.AddCommand(new HoldNotesOutlineColorCommand { StartValue = Color4.Green, EndValue = Color4.Green })); AddAssert("Hold note path is green", () => note.SliderPath.OutlineColor == Color4.Green); }
public void SetUpSteps() { AddStep("Pause editor", () => Editor.Play(false)); AddStep("Restart editor", () => Editor.Restart()); AddStep("Reset story", () => Story.Reset()); AddStep("Add note", () => Story.AddNote(NoteToTest = new EditorHoldNote { HitTime = Story.Notes.ShowTime + Story.Notes.FadeInTime + NoteAppearTime, EndTime = Story.Notes.ShowTime + Story.Notes.FadeInTime + NoteAppearTime + HoldDuration })); AddStep("Set max note alpha to 1", () => Story.AddCommand(new HoldNotesAlphaCommand { StartValue = 1.0f, EndValue = 1.0f })); }
[TestCase(1150, 200)] // Press exactly at HitTime, Release when note disappears public void Score_PressInHitWindowReleaseInVisibleAfter_IsOffsetFromHitTime(int timeToPress, int holdDuration) { GameHoldNote note = null; AddStep("Add note", () => Story.AddNote(note = new GameHoldNote { HitTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 50, EndTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 150 })); AddStep("Move mouse to note", () => MoveMouseTo(Story.Notes.Children.First())); PressAndRelease(timeToPress, holdDuration); AddStep("Seek after note is deleted", () => Stopwatch.Seek(note.EndTime + Story.Notes.FadeOutTime)); AddAssert("Score is offset from HitTime", () => PlayScreen.ScoreProcessor.ScoreStatistics.Score == Story.Notes.FadeInTime + Story.Notes.ShowTime + 50 // Expected HitTime - timeToPress); // Actual HitTime }
public void OnPress_MultipleHitsInMissThresholdBeforeHitTime_PlaysHitSoundOnce() { GameHoldNote note = null; AddStep("Add notes", () => Story.AddNote(note = new GameHoldNote { HitTime = 0, EndTime = 1000 })); AddStep("Move mouse to note", () => MoveMouseTo(Story.Notes.Children.First())); AddStep("Seek before HitTime", () => Stopwatch.Seek(note.HitTime - 1)); AddStep("Hold key", () => InputManager.PressKey(Key.Z)); AddStep("Release key", () => InputManager.ReleaseKey(Key.Z)); AddStep("Hold key", () => InputManager.PressKey(Key.Z)); AddStep("Release key", () => InputManager.ReleaseKey(Key.Z)); AddAssert("Plays hit sound once", () => PlayScreen.ScoreProcessor.Hit.PlayCount == 1); }
public void OnPress_NoteThenNote_HitsLaterNote() { AddStep("Add notes", () => { Story.AddNote(new GameNote { HitTime = 0 }); Story.AddNote(new GameNote { HitTime = 10, Coordinates = new Vector2(0, 1) }); }); AddStep("Seek clock", () => Stopwatch.Seek(10)); AddStep("Move mouse to second note", () => MoveMouseTo(Story.Notes.Children.First())); AddStep("Hold key", () => InputManager.PressKey(Key.Z)); AddStep("Release key", () => InputManager.ReleaseKey(Key.Z)); AddStep("Seek clock", () => Stopwatch.Seek(Notes.MissThreshold + 10)); AddAssert("Hit only top note", () => PlayScreen.ScoreProcessor.ScoreStatistics.Score == Notes.MissThreshold); }
public void OnPress_ConsecutiveHoldNotes_PlaysSecondNoteOutOfOrder() { GameHoldNote note = null; AddStep("Add notes", () => { Story.AddNote(new GameHoldNote { HitTime = 0, EndTime = 1000 }); Story.AddNote(note = new GameHoldNote { HitTime = 1001, EndTime = 2000, Coordinates = Vector2.One, EndCoordinates = Vector2.One }); }); AddStep("Move mouse to second note", () => MoveMouseTo(note)); PressAndRelease(1001, 2000); AddAssert("Plays second note out of order", () => PlayScreen.ScoreProcessor.ScoreStatistics.Score == 1000 + Notes.MissThreshold); }
public void Score_MultiplePressesInHitWindowOnly_IncludesFirstOffsetFromHitTime() { GameHoldNote note = null; AddStep("Add note", () => Story.AddNote(note = new GameHoldNote { HitTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 50, EndTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 150 })); AddStep("Move mouse to note", () => MoveMouseTo(Story.Notes.Children.First())); PressAndRelease(950, 50); PressAndRelease(1000, 50); PressAndRelease(1050, 50); PressAndRelease(1100, 50); AddStep("Seek after note is deleted", () => Stopwatch.Seek(note.EndTime + Story.Notes.FadeOutTime)); AddAssert("Score is first Press's offset from HitTime", () => PlayScreen.ScoreProcessor.ScoreStatistics.Score == Story.Notes.FadeInTime + Story.Notes.ShowTime + 50 // HitTime - 950 // First HitTime + 100.0); // Hold note duration }
public void Score_InvalidKeySwitch_IsFullDuration() { GameHoldNote note = null; AddStep("Add note", () => Story.AddNote(note = new GameHoldNote { HitTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 50, EndTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 150 })); AddStep("Move mouse to note", () => MoveMouseTo(Story.Notes.Children.First())); AddStep("Seek to 100", () => Stopwatch.Seek(100)); AddStep("Press Z", () => InputManager.PressKey(Key.Z)); AddStep("Seek to HitTime", () => Stopwatch.Seek(Story.Notes.FadeInTime + Story.Notes.ShowTime + 50)); AddStep("Press X", () => InputManager.PressKey(Key.X)); AddStep("Release X", () => InputManager.ReleaseKey(Key.X)); AddStep("Seek to EndTime", () => Stopwatch.Seek(note.EndTime)); AddStep("Release Z", () => InputManager.ReleaseKey(Key.Z)); AddStep("Seek after note is deleted", () => Stopwatch.Seek(note.EndTime + Story.Notes.FadeOutTime)); AddAssert("Score is 100", () => PlayScreen.ScoreProcessor.ScoreStatistics.Score == 100); }
public void Score_OverlappingPresses_HaveNoEffect() { GameHoldNote note = null; AddStep("Add note", () => Story.AddNote(note = new GameHoldNote { HitTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 50, EndTime = Story.Notes.FadeInTime + Story.Notes.ShowTime + 150 })); AddStep("Move mouse to note", () => MoveMouseTo(Story.Notes.Children.First())); AddStep("Seek to HitTime", () => Stopwatch.Seek(Story.Notes.FadeInTime + Story.Notes.ShowTime + 50)); AddStep("Press Z", () => InputManager.PressKey(Key.Z)); AddStep("Seek to HitTime + 5", () => Stopwatch.Seek(note.HitTime + 5)); AddStep("Press X", () => InputManager.PressKey(Key.X)); AddStep("Seek to HitTime + 10", () => Stopwatch.Seek(note.HitTime + 10)); AddStep("Release X", () => InputManager.ReleaseKey(Key.X)); AddStep("Seek to EndTime", () => Stopwatch.Seek(note.EndTime)); AddStep("Release Z", () => InputManager.ReleaseKey(Key.Z)); AddStep("Seek after note is deleted", () => Stopwatch.Seek(note.EndTime + Story.Notes.FadeOutTime)); AddAssert("Score is 0", () => PlayScreen.ScoreProcessor.ScoreStatistics.Score == 0); }
public void OnPress_HoldNoteOnTopOfNote_HitsHoldNote() { var holdNoteHitTime = 0; var holdNoteEndTime = 10; GameNote note = null; AddStep("Add notes", () => { Story.AddNote(new GameHoldNote { HitTime = holdNoteHitTime, EndTime = holdNoteEndTime }); Story.AddNote(note = new GameNote { HitTime = 100 }); }); AddStep("Move mouse to note", () => MoveMouseTo(Story.Notes.Children.First())); PressAndRelease(holdNoteHitTime, holdNoteEndTime - holdNoteHitTime); AddStep("Seek after last note is deleted", () => Stopwatch.Seek(note.HitTime + Notes.MissThreshold)); AddAssert("Hits only hold note", () => PlayScreen.ScoreProcessor.ScoreStatistics.Score == Notes.MissThreshold); }
public void OnPress_NoteOnTopOfHoldNote_HitsNote() { var holdNoteHitTime = 1; var holdNoteEndTime = 101; AddStep("Add notes", () => { Story.AddNote(new GameNote { HitTime = 0 }); Story.AddNote(new GameHoldNote { HitTime = holdNoteHitTime, EndTime = holdNoteEndTime }); }); AddStep("Move mouse to note", () => MoveMouseTo(Story.Notes.Children.First())); AddStep("Hold key", () => InputManager.PressKey(Key.Z)); AddStep("Release key", () => InputManager.ReleaseKey(Key.Z)); AddStep("Seek after last note is deleted", () => Stopwatch.Seek(holdNoteEndTime + Story.Notes.FadeOutTime)); AddAssert("Hits only top note", () => PlayScreen.ScoreProcessor.ScoreStatistics.Score == holdNoteEndTime - holdNoteHitTime); }