public void TestBasicSelect() { var addedObject = new HitCircle { StartTime = 500 }; AddStep("add hitobject", () => EditorBeatmap.Add(addedObject)); moveMouseToObject(() => addedObject); AddStep("left click", () => InputManager.Click(MouseButton.Left)); AddAssert("hitobject selected", () => EditorBeatmap.SelectedHitObjects.Single() == addedObject); var addedObject2 = new HitCircle { StartTime = 1000, Position = new Vector2(100), }; AddStep("add one more hitobject", () => EditorBeatmap.Add(addedObject2)); AddAssert("selection unchanged", () => EditorBeatmap.SelectedHitObjects.Single() == addedObject); moveMouseToObject(() => addedObject2); AddStep("left click", () => InputManager.Click(MouseButton.Left)); AddAssert("hitobject selected", () => EditorBeatmap.SelectedHitObjects.Single() == addedObject2); }
public void TestDebouncedUpdate() { var updatedObjects = new List <HitObject>(); EditorBeatmap editorBeatmap = null; AddStep("add beatmap", () => { updatedObjects.Clear(); Child = editorBeatmap = new EditorBeatmap(new OsuBeatmap { BeatmapInfo = { Ruleset = new OsuRuleset().RulesetInfo, }, }); editorBeatmap.Add(new HitCircle()); }); AddStep("change start time twice", () => { editorBeatmap.HitObjectUpdated += h => updatedObjects.Add(h); editorBeatmap.HitObjects[0].StartTime = 10; editorBeatmap.HitObjects[0].StartTime = 20; }); AddAssert("only updated once", () => updatedObjects.Count == 1); }
public override void SetUpSteps() { base.SetUpSteps(); AddStep("add test objects", () => { EditorBeatmap.Add(new HitCircle { StartTime = 0, Position = (OsuPlayfield.BASE_SIZE - new Vector2(100, 0)) / 2, SampleControlPoint = new SampleControlPoint { SampleBank = "normal", SampleVolume = 80 } }); EditorBeatmap.Add(new HitCircle { StartTime = 500, Position = (OsuPlayfield.BASE_SIZE + new Vector2(100, 0)) / 2, SampleControlPoint = new SampleControlPoint { SampleBank = "soft", SampleVolume = 60 } }); }); }
public void TestMultipleHitObjectUpdate() { var updatedObjects = new List <HitObject>(); var allHitObjects = new List <HitObject>(); EditorBeatmap editorBeatmap = null; AddStep("add beatmap", () => { updatedObjects.Clear(); Child = editorBeatmap = new EditorBeatmap(new OsuBeatmap()); for (int i = 0; i < 10; i++) { var h = new HitCircle(); editorBeatmap.Add(h); allHitObjects.Add(h); } }); AddStep("change all start times", () => { editorBeatmap.HitObjectUpdated += h => updatedObjects.Add(h); for (int i = 0; i < 10; i++) { allHitObjects[i].StartTime += 10; } }); // Distinct ensures that all hitobjects have been updated once, debounce is tested below. AddAssert("all hitobjects updated", () => updatedObjects.Distinct().Count() == 10); }
public void TestAddHitObjectInMiddle() { var editorBeatmap = new EditorBeatmap(new OsuBeatmap { HitObjects = { new HitCircle(), new HitCircle { StartTime = 1000 }, new HitCircle { StartTime = 1000 }, new HitCircle { StartTime = 2000 }, } }); var hitCircle = new HitCircle { StartTime = 1000 }; editorBeatmap.Add(hitCircle); Assert.That(editorBeatmap.HitObjects.Count(h => h == hitCircle), Is.EqualTo(1)); Assert.That(Array.IndexOf(editorBeatmap.HitObjects.ToArray(), hitCircle), Is.EqualTo(3)); }
public void TestCopyPaste(bool deselectAfterCopy) { var addedObject = new HitCircle { StartTime = 1000 }; AddStep("add hitobject", () => EditorBeatmap.Add(addedObject)); AddStep("select added object", () => EditorBeatmap.SelectedHitObjects.Add(addedObject)); AddStep("copy hitobject", () => Editor.Copy()); AddStep("move forward in time", () => EditorClock.Seek(2000)); if (deselectAfterCopy) { AddStep("deselect", () => EditorBeatmap.SelectedHitObjects.Clear()); AddUntilStep("timeline selection box is not visible", () => Editor.ChildrenOfType<Timeline>().First().ChildrenOfType<SelectionHandler>().First().Alpha == 0); AddUntilStep("composer selection box is not visible", () => Editor.ChildrenOfType<HitObjectComposer>().First().ChildrenOfType<SelectionHandler>().First().Alpha == 0); } AddStep("paste hitobject", () => Editor.Paste()); AddAssert("are two objects", () => EditorBeatmap.HitObjects.Count == 2); AddAssert("new object selected", () => EditorBeatmap.SelectedHitObjects.Single().StartTime == 2000); AddUntilStep("timeline selection box is visible", () => Editor.ChildrenOfType<Timeline>().First().ChildrenOfType<SelectionHandler>().First().Alpha > 0); AddUntilStep("composer selection box is visible", () => Editor.ChildrenOfType<HitObjectComposer>().First().ChildrenOfType<SelectionHandler>().First().Alpha > 0); }
public void TestDisallowZeroDurationObjects() { DragArea dragArea; AddStep("add spinner", () => { EditorBeatmap.Clear(); EditorBeatmap.Add(new Spinner { Position = new Vector2(256, 256), StartTime = 2700, Duration = 500 }); }); AddStep("hold down drag bar", () => { // distinguishes between the actual drag bar and its "underlay shadow". dragArea = this.ChildrenOfType <DragArea>().Single(bar => bar.HandlePositionalInput); InputManager.MoveMouseTo(dragArea); InputManager.PressButton(MouseButton.Left); }); AddStep("try to drag bar past start", () => { var blueprint = this.ChildrenOfType <TimelineHitObjectBlueprint>().Single(); InputManager.MoveMouseTo(blueprint.SelectionQuad.TopLeft - new Vector2(100, 0)); InputManager.ReleaseButton(MouseButton.Left); }); AddAssert("object has non-zero duration", () => EditorBeatmap.HitObjects.OfType <IHasDuration>().Single().Duration > 0); }
public void TestCutPasteSlider() { var addedObject = new Slider { StartTime = 1000, Path = new SliderPath { ControlPoints = { new PathControlPoint(), new PathControlPoint(new Vector2(100, 0), PathType.Bezier) } } }; AddStep("add hitobject", () => EditorBeatmap.Add(addedObject)); AddStep("select added object", () => EditorBeatmap.SelectedHitObjects.Add(addedObject)); AddStep("cut hitobject", () => Editor.Cut()); AddStep("paste hitobject", () => Editor.Paste()); AddAssert("is one object", () => EditorBeatmap.HitObjects.Count == 1); AddAssert("path matches", () => { var path = ((Slider)EditorBeatmap.HitObjects.Single()).Path; return(path.ControlPoints.Count == 2 && path.ControlPoints.SequenceEqual(addedObject.Path.ControlPoints)); }); }
public void TestSelectDoesNotModify() { Slider slider = new Slider { StartTime = 0, Position = new Vector2(320, 40) }; PathControlPoint[] points = { new PathControlPoint(new Vector2(0), PathType.PerfectCurve), new PathControlPoint(new Vector2(-100, 0)), new PathControlPoint(new Vector2(100, 20)) }; int preSelectVersion = -1; AddStep("add slider", () => { slider.Path = new SliderPath(points); EditorBeatmap.Add(slider); preSelectVersion = slider.Path.Version.Value; }); AddStep("select added slider", () => EditorBeatmap.SelectedHitObjects.Add(slider)); AddAssert("slider same path", () => slider.Path.Version.Value == preSelectVersion); }
public void TestDeletingPointCausesSliderDeletion() { AddStep("Add slider", () => { Slider slider = new Slider { StartTime = EditorClock.CurrentTime, Position = new Vector2(300) }; PathControlPoint[] points = { new PathControlPoint(new Vector2(0), PathType.PerfectCurve), new PathControlPoint(new Vector2(100, 0)), new PathControlPoint(new Vector2(0, 10)) }; slider.Path = new SliderPath(points); EditorBeatmap.Add(slider); }); AddAssert("ensure object placed", () => EditorBeatmap.HitObjects.Count == 1); AddStep("select slider", () => InputManager.Click(MouseButton.Left)); moveMouse(new Vector2(400, 300)); AddStep("delete second point", () => { InputManager.PressKey(Key.ShiftLeft); InputManager.Click(MouseButton.Right); InputManager.ReleaseKey(Key.ShiftLeft); }); AddAssert("ensure object deleted", () => EditorBeatmap.HitObjects.Count == 0); }
public void TestRemoveObjectThenUndoThenRedo() { HitObject addedObject = null; HitObject removedObject = null; HitObject expectedObject = null; AddStep("bind removal", () => { EditorBeatmap.HitObjectAdded += h => addedObject = h; EditorBeatmap.HitObjectRemoved += h => removedObject = h; }); AddStep("add hitobject", () => EditorBeatmap.Add(expectedObject = new HitCircle { StartTime = 1000 })); AddStep("remove object", () => EditorBeatmap.Remove(expectedObject)); addUndoSteps(); AddStep("reset variables", () => { addedObject = null; removedObject = null; }); addRedoSteps(); AddAssert("hitobject removed", () => removedObject.StartTime == expectedObject.StartTime); // Can't compare via equality (new hitobject instance after undo) AddAssert("no hitobject added", () => addedObject == null); AddAssert("no changes", () => !Editor.HasUnsavedChanges); // end result is empty beatmap, matching original state }
public void TestAddObjectThenUndoThenRedo() { HitObject addedObject = null; HitObject removedObject = null; HitObject expectedObject = null; AddStep("bind removal", () => { EditorBeatmap.HitObjectAdded += h => addedObject = h; EditorBeatmap.HitObjectRemoved += h => removedObject = h; }); AddStep("add hitobject", () => EditorBeatmap.Add(expectedObject = new HitCircle { StartTime = 1000 })); addUndoSteps(); AddStep("reset variables", () => { addedObject = null; removedObject = null; }); addRedoSteps(); AddAssert("hitobject added", () => addedObject.StartTime == expectedObject.StartTime); // Can't compare via equality (new hitobject instance) AddAssert("no hitobject removed", () => removedObject == null); AddAssert("unsaved changes", () => Editor.HasUnsavedChanges); }
public void EndPlacement(HitObject hitObject) { EditorBeatmap.Add(hitObject); adjustableClock.Seek(hitObject.StartTime); showGridFor(Enumerable.Empty <HitObject>()); }
private void splitNote() { // TODO : percentage should be enter by dialog var splittedNote = HitObject.CopyByPercentage(0.5); EditorBeatmap?.Add(splittedNote); // Change object's duration HitObject.Duration = HitObject.Duration - splittedNote.Duration; }
public void TestAddObjectThenSaveHasNoUnsavedChanges() { AddStep("add hitobject", () => EditorBeatmap.Add(new HitCircle { StartTime = 1000 })); AddAssert("unsaved changes", () => Editor.HasUnsavedChanges); AddStep("save changes", () => Editor.Save()); AddAssert("no unsaved changes", () => !Editor.HasUnsavedChanges); }
public void TestAddObjectAndUndo() { HitObject addedObject = null; HitObject removedObject = null; HitObject expectedObject = null; AddStep("bind removal", () => { editorBeatmap.HitObjectAdded += h => addedObject = h; editorBeatmap.HitObjectRemoved += h => removedObject = h; }); AddStep("add hitobject", () => editorBeatmap.Add(expectedObject = new HitCircle { StartTime = 1000 })); AddAssert("hitobject added", () => addedObject == expectedObject); addUndoSteps(); AddAssert("hitobject removed", () => removedObject == expectedObject); }
public void TestCutRemovesObjects() { var addedObject = new HitCircle { StartTime = 1000 }; AddStep("add hitobject", () => EditorBeatmap.Add(addedObject)); AddStep("select added object", () => EditorBeatmap.SelectedHitObjects.Add(addedObject)); AddStep("cut hitobject", () => Editor.Cut()); AddAssert("no hitobjects in beatmap", () => EditorBeatmap.HitObjects.Count == 0); }
public void TestSelectedObjects() { HitCircle obj = null; AddStep("add hitobject", () => EditorBeatmap.Add(obj = new HitCircle { StartTime = 1000 })); AddStep("select hitobject", () => EditorBeatmap.SelectedHitObjects.Add(obj)); AddAssert("confirm 1 selected", () => EditorBeatmap.SelectedHitObjects.Count == 1); AddStep("deselect hitobject", () => EditorBeatmap.SelectedHitObjects.Remove(obj)); AddAssert("confirm 0 selected", () => EditorBeatmap.SelectedHitObjects.Count == 0); }
public void EndPlacement(HitObject hitObject, bool commit) { EditorBeatmap.PlacementObject.Value = null; if (commit) { EditorBeatmap.Add(hitObject); adjustableClock.Seek(hitObject.GetEndTime()); } showGridFor(Enumerable.Empty <HitObject>()); }
public void TestHitObjectAddEvent() { var editorBeatmap = new EditorBeatmap(new OsuBeatmap()); HitObject addedObject = null; editorBeatmap.HitObjectAdded += h => addedObject = h; var hitCircle = new HitCircle(); editorBeatmap.Add(hitCircle); Assert.That(addedObject, Is.EqualTo(hitCircle)); }
private void addBlueprintStep(double time, float x, SliderPath sliderPath, double velocity) => AddStep("add selection blueprint", () => { hitObject = new JuiceStream { StartTime = time, X = x, Path = sliderPath, }; EditorBeatmap.Difficulty.SliderMultiplier = velocity; EditorBeatmap.Add(hitObject); EditorBeatmap.Update(hitObject); Assert.That(hitObject.Velocity, Is.EqualTo(velocity)); AddBlueprint(new JuiceStreamSelectionBlueprint(hitObject)); });
public void EndPlacement(HitObject hitObject, bool commit) { EditorBeatmap.PlacementObject.Value = null; if (commit) { EditorBeatmap.Add(hitObject); if (EditorClock.CurrentTime < hitObject.StartTime) { EditorClock.SeekSmoothlyTo(hitObject.StartTime); } } }
public void TestSelectAndShowContextMenu() { var addedObject = new HitCircle { StartTime = 100, Position = new Vector2(100, 100) }; AddStep("add hitobject", () => EditorBeatmap.Add(addedObject)); moveMouseToObject(() => addedObject); AddStep("right click", () => InputManager.Click(MouseButton.Right)); AddUntilStep("hitobject selected", () => EditorBeatmap.SelectedHitObjects.Single() == addedObject); AddUntilStep("context menu is visible", () => contextMenuContainer.ChildrenOfType <OsuContextMenu>().Single().State == MenuState.Open); }
public void TestAddedHitObjectStartTimeChangeEvent() { var editorBeatmap = new EditorBeatmap(new OsuBeatmap()); HitObject changedObject = null; editorBeatmap.StartTimeChanged += h => changedObject = h; var hitCircle = new HitCircle(); editorBeatmap.Add(hitCircle); Assert.That(changedObject, Is.Null); hitCircle.StartTime = 1000; Assert.That(changedObject, Is.EqualTo(hitCircle)); }
public void TestSelectAndShowContextMenuOutsideBounds() { var addedObject = new HitCircle { StartTime = 100, Position = OsuPlayfield.BASE_SIZE }; AddStep("add hitobject", () => EditorBeatmap.Add(addedObject)); AddStep("descale blueprint container", () => this.ChildrenOfType <HitObjectComposer>().Single().Scale = new Vector2(0.5f)); AddStep("move mouse to bottom-right", () => InputManager.MoveMouseTo(blueprintContainer.ToScreenSpace(blueprintContainer.LayoutRectangle.BottomRight + new Vector2(10)))); AddStep("right click", () => InputManager.Click(MouseButton.Right)); AddUntilStep("hitobject selected", () => EditorBeatmap.SelectedHitObjects.Single() == addedObject); AddUntilStep("context menu is visible", () => contextMenuContainer.ChildrenOfType <OsuContextMenu>().Single().State == MenuState.Open); }
public void EndPlacement(HitObject hitObject, bool commit) { EditorBeatmap.PlacementObject.Value = null; if (commit) { EditorBeatmap.Add(hitObject); if (adjustableClock.CurrentTime < hitObject.StartTime) { adjustableClock.Seek(hitObject.StartTime); } } showGridFor(Enumerable.Empty <HitObject>()); }
public void TestQuickDelete() { var addedObject = new HitCircle { StartTime = 0, }; AddStep("add hitobject", () => EditorBeatmap.Add(addedObject)); moveMouseToObject(() => addedObject); AddStep("hold shift", () => InputManager.PressKey(Key.ShiftLeft)); AddStep("right click", () => InputManager.Click(MouseButton.Right)); AddStep("release shift", () => InputManager.ReleaseKey(Key.ShiftLeft)); AddAssert("no hitobjects in beatmap", () => EditorBeatmap.HitObjects.Count == 0); }
public TestComposer() { InternalChildren = new Drawable[] { EditorBeatmap = new EditorBeatmap(new TaikoBeatmap()) { BeatmapInfo = { Ruleset = new TaikoRuleset().RulesetInfo } }, new TaikoHitObjectComposer(new TaikoRuleset()) }; for (int i = 0; i < 10; i++) { EditorBeatmap.Add(new Hit { StartTime = 125 * i }); } }
public void TestCutPaste(double newTime) { var addedObject = new HitCircle { StartTime = 1000 }; AddStep("add hitobject", () => EditorBeatmap.Add(addedObject)); AddStep("select added object", () => EditorBeatmap.SelectedHitObjects.Add(addedObject)); AddStep("cut hitobject", () => Editor.Cut()); AddStep("move forward in time", () => EditorClock.Seek(newTime)); AddStep("paste hitobject", () => Editor.Paste()); AddAssert("is one object", () => EditorBeatmap.HitObjects.Count == 1); AddAssert("new object selected", () => EditorBeatmap.SelectedHitObjects.Single().StartTime == newTime); }
public void TestCutPasteSpinner() { var addedObject = new Spinner { StartTime = 1000, Duration = 5000 }; AddStep("add hitobject", () => EditorBeatmap.Add(addedObject)); AddStep("select added object", () => EditorBeatmap.SelectedHitObjects.Add(addedObject)); AddStep("cut hitobject", () => Editor.Cut()); AddStep("paste hitobject", () => Editor.Paste()); AddAssert("is one object", () => EditorBeatmap.HitObjects.Count == 1); AddAssert("duration matches", () => ((Spinner)EditorBeatmap.HitObjects.Single()).Duration == 5000); }