Esempio n. 1
0
        public void TestAccessAfterStorageMigrate()
        {
            RunTestWithRealm((realmFactory, storage) =>
            {
                var beatmap = new RealmBeatmap(CreateRuleset(), new RealmBeatmapDifficulty(), new RealmBeatmapMetadata());

                ILive <RealmBeatmap> liveBeatmap;

                using (var context = realmFactory.CreateContext())
                {
                    context.Write(r => r.Add(beatmap));

                    liveBeatmap = beatmap.ToLive(realmFactory);
                }

                using (var migratedStorage = new TemporaryNativeStorage("realm-test-migration-target"))
                {
                    migratedStorage.DeleteDirectory(string.Empty);

                    storage.Migrate(migratedStorage);

                    Assert.IsFalse(liveBeatmap.PerformRead(l => l.Hidden));
                }
            });
        }
Esempio n. 2
0
        private void updateBeatmapStatistics(RealmBeatmap beatmap, IBeatmap decoded)
        {
            var rulesetInstance = ((IRulesetInfo)beatmap.Ruleset).CreateInstance();

            decoded.BeatmapInfo.Ruleset = rulesetInstance.RulesetInfo;

            // TODO: this should be done in a better place once we actually need to dynamically update it.
            beatmap.StarRating = rulesetInstance.CreateDifficultyCalculator(new DummyConversionBeatmap(decoded)).Calculate().StarRating;
            beatmap.Length     = calculateLength(decoded);
            beatmap.BPM        = 60000 / decoded.GetMostCommonBeatLength();
        }
Esempio n. 3
0
        private static Task createScoreForBeatmap(Realm realm, RealmBeatmap beatmap)
        {
            // TODO: reimplement when we have score support in realm.
            // return ImportScoreTest.LoadScoreIntoOsu(osu, new ScoreInfo
            // {
            //     OnlineScoreID = 2,
            //     Beatmap = beatmap,
            //     BeatmapInfoID = beatmap.ID
            // }, new ImportScoreTest.TestArchiveReader());

            return(Task.CompletedTask);
        }
Esempio n. 4
0
        public void TestValueAccessNonManaged()
        {
            RunTestWithRealm((realmFactory, _) =>
            {
                var beatmap     = new RealmBeatmap(CreateRuleset(), new RealmBeatmapDifficulty(), new RealmBeatmapMetadata());
                var liveBeatmap = beatmap.ToLive(realmFactory);

                Assert.DoesNotThrow(() =>
                {
                    var __ = liveBeatmap.Value;
                });
            });
        }
Esempio n. 5
0
        public void TestAccessAfterAttach()
        {
            RunTestWithRealm((realmFactory, _) =>
            {
                var beatmap = new RealmBeatmap(CreateRuleset(), new RealmBeatmapDifficulty(), new RealmBeatmapMetadata());

                var liveBeatmap = beatmap.ToLive(realmFactory);

                using (var context = realmFactory.CreateContext())
                    context.Write(r => r.Add(beatmap));

                Assert.IsFalse(liveBeatmap.PerformRead(l => l.Hidden));
            });
        }
Esempio n. 6
0
        public void TestAccessNonManaged()
        {
            var beatmap     = new RealmBeatmap(CreateRuleset(), new RealmBeatmapDifficulty(), new RealmBeatmapMetadata());
            var liveBeatmap = beatmap.ToLiveUnmanaged();

            Assert.IsFalse(beatmap.Hidden);
            Assert.IsFalse(liveBeatmap.Value.Hidden);
            Assert.IsFalse(liveBeatmap.PerformRead(l => l.Hidden));

            Assert.Throws <InvalidOperationException>(() => liveBeatmap.PerformWrite(l => l.Hidden = true));

            Assert.IsFalse(beatmap.Hidden);
            Assert.IsFalse(liveBeatmap.Value.Hidden);
            Assert.IsFalse(liveBeatmap.PerformRead(l => l.Hidden));
        }
Esempio n. 7
0
        public void TestUpdateBeatmapInfo()
        {
            RunTestWithRealmAsync(async(realmFactory, storage) =>
            {
                using var importer = new BeatmapImporter(realmFactory, storage);
                using var store    = new RealmRulesetStore(realmFactory, storage);

                string?temp = TestResources.GetTestBeatmapForImport();
                await importer.Import(temp);

                // Update via the beatmap, not the beatmap info, to ensure correct linking
                RealmBeatmapSet setToUpdate = realmFactory.Context.All <RealmBeatmapSet>().First();

                var beatmapToUpdate = setToUpdate.Beatmaps.First();

                realmFactory.Context.Write(() => beatmapToUpdate.DifficultyName = "updated");

                RealmBeatmap updatedInfo = realmFactory.Context.All <RealmBeatmap>().First(b => b.ID == beatmapToUpdate.ID);
                Assert.That(updatedInfo.DifficultyName, Is.EqualTo("updated"));
            });
        }
Esempio n. 8
0
        private List <RealmBeatmap> createBeatmapDifficulties(IList <RealmNamedFileUsage> files, Realm realm)
        {
            var beatmaps = new List <RealmBeatmap>();

            foreach (var file in files.Where(f => f.Filename.EndsWith(".osu", StringComparison.OrdinalIgnoreCase)))
            {
                using (var memoryStream = new MemoryStream(Files.Store.Get(file.File.StoragePath))) // we need a memory stream so we can seek
                {
                    IBeatmap decoded;
                    using (var lineReader = new LineBufferedReader(memoryStream, true))
                        decoded = Decoder.GetDecoder <Beatmap>(lineReader).Decode(lineReader);

                    string hash = memoryStream.ComputeSHA2Hash();

                    if (beatmaps.Any(b => b.Hash == hash))
                    {
                        Logger.Log($"Skipping import of {file.Filename} due to duplicate file content.", LoggingTarget.Database);
                        continue;
                    }

                    var decodedInfo       = decoded.BeatmapInfo;
                    var decodedDifficulty = decodedInfo.BaseDifficulty;

                    var ruleset = realm.All <RealmRuleset>().FirstOrDefault(r => r.OnlineID == decodedInfo.RulesetID);

                    if (ruleset?.Available != true)
                    {
                        Logger.Log($"Skipping import of {file.Filename} due to missing local ruleset {decodedInfo.RulesetID}.", LoggingTarget.Database);
                        continue;
                    }

                    var difficulty = new RealmBeatmapDifficulty
                    {
                        DrainRate         = decodedDifficulty.DrainRate,
                        CircleSize        = decodedDifficulty.CircleSize,
                        OverallDifficulty = decodedDifficulty.OverallDifficulty,
                        ApproachRate      = decodedDifficulty.ApproachRate,
                        SliderMultiplier  = decodedDifficulty.SliderMultiplier,
                        SliderTickRate    = decodedDifficulty.SliderTickRate,
                    };

                    var metadata = new RealmBeatmapMetadata
                    {
                        Title         = decoded.Metadata.Title,
                        TitleUnicode  = decoded.Metadata.TitleUnicode,
                        Artist        = decoded.Metadata.Artist,
                        ArtistUnicode = decoded.Metadata.ArtistUnicode,
                        Author        =
                        {
                            OnlineID = decoded.Metadata.Author.Id,
                            Username = decoded.Metadata.Author.Username
                        },
                        Source         = decoded.Metadata.Source,
                        Tags           = decoded.Metadata.Tags,
                        PreviewTime    = decoded.Metadata.PreviewTime,
                        AudioFile      = decoded.Metadata.AudioFile,
                        BackgroundFile = decoded.Metadata.BackgroundFile,
                    };

                    var beatmap = new RealmBeatmap(ruleset, difficulty, metadata)
                    {
                        Hash                     = hash,
                        DifficultyName           = decodedInfo.Version,
                        OnlineID                 = decodedInfo.OnlineBeatmapID ?? -1,
                        AudioLeadIn              = decodedInfo.AudioLeadIn,
                        StackLeniency            = decodedInfo.StackLeniency,
                        SpecialStyle             = decodedInfo.SpecialStyle,
                        LetterboxInBreaks        = decodedInfo.LetterboxInBreaks,
                        WidescreenStoryboard     = decodedInfo.WidescreenStoryboard,
                        EpilepsyWarning          = decodedInfo.EpilepsyWarning,
                        SamplesMatchPlaybackRate = decodedInfo.SamplesMatchPlaybackRate,
                        DistanceSpacing          = decodedInfo.DistanceSpacing,
                        BeatDivisor              = decodedInfo.BeatDivisor,
                        GridSize                 = decodedInfo.GridSize,
                        TimelineZoom             = decodedInfo.TimelineZoom,
                        MD5Hash                  = memoryStream.ComputeMD5Hash(),
                    };

                    updateBeatmapStatistics(beatmap, decoded);

                    beatmaps.Add(beatmap);
                }
            }

            return(beatmaps);
        }