예제 #1
0
        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);
        }
예제 #2
0
        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
                    }
                });
            });
        }
예제 #4
0
        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);
        }
예제 #5
0
        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));
        }
예제 #6
0
        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));
            });
        }
예제 #9
0
        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);
        }
예제 #10
0
        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);
        }
예제 #13
0
        public void EndPlacement(HitObject hitObject)
        {
            EditorBeatmap.Add(hitObject);

            adjustableClock.Seek(hitObject.StartTime);

            showGridFor(Enumerable.Empty <HitObject>());
        }
예제 #14
0
        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);
        }
예제 #16
0
        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);
        }
예제 #17
0
        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);
        }
예제 #19
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>());
        }
예제 #20
0
        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));
 });
예제 #22
0
        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);
                }
            }
        }
예제 #23
0
        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);
        }
예제 #24
0
        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));
        }
예제 #25
0
        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);
        }
예제 #26
0
        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>());
        }
예제 #27
0
        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);
        }
예제 #28
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
                    });
                }
            }
예제 #29
0
        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);
        }