public async Task SetRemoveMetadataAsync_Test()
        {
            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");

            var lib    = new GameRecordLibrary(optionsBuilder);
            var record = await lib.CreateRecordAsync("NINTENDO_NES");

            var guid = record.RecordID;

            record.Metadata.Add("is_test", "true");

            await lib.UpdateRecordAsync(record);

            var newRecord = await lib.GetAllRecordsAsync().FirstAsync();

            Assert.Equal(guid, newRecord.RecordID);
            Assert.Equal(record.PlatformID, newRecord.PlatformID);
            Assert.Contains("is_test", newRecord.Metadata.Keys);
            Assert.Equal("true", newRecord.Metadata["is_test"]);

            newRecord.Metadata.Remove("is_test");
            await lib.UpdateRecordAsync(newRecord);

            var newNewRecord = await lib.GetAllRecordsAsync().FirstAsync();

            Assert.Equal(guid, newNewRecord.RecordID);
            Assert.Equal(record.PlatformID, newNewRecord.PlatformID);
            Assert.DoesNotContain("is_test", newNewRecord.Metadata.Keys);
        }
Beispiel #2
0
        public void SetWithMetadata_Test()
        {
            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}")
            .ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));

            var lib    = new GameRecordLibrary(optionsBuilder);
            var record = lib.CreateRecord("NINTENDO_NES");
            var guid   = record.RecordId;

            record.Metadata.Add("is_test", "true");
            lib.UpdateRecord(record);
            var newRecord = lib.GetAllRecords().First();

            Assert.Equal(guid, newRecord.RecordId);
            Assert.Equal(record.PlatformId, newRecord.PlatformId);
            Assert.Contains("is_test", newRecord.Metadata.Keys);
            Assert.Equal("true", newRecord.Metadata["is_test"]);

            newRecord.Metadata.Add("is_test_two", "true");
            lib.UpdateRecord(newRecord);

            var newNewRecord = lib.GetAllRecords().First();

            Assert.Equal(guid, newNewRecord.RecordId);
            Assert.Equal(record.PlatformId, newNewRecord.PlatformId);
            Assert.Contains("is_test", newNewRecord.Metadata.Keys);
            Assert.Equal("true", newNewRecord.Metadata["is_test"]);
            Assert.Contains("is_test_two", newNewRecord.Metadata.Keys);
            Assert.Equal("true", newNewRecord.Metadata["is_test_two"]);
        }
        public void SetWithMetadata_Test()
        {
            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");

            var lib    = new GameRecordLibrary(optionsBuilder);
            var record = lib.CreateRecord("NINTENDO_NES");
            var guid   = record.RecordID;

            record.Metadata.Add("is_test", "true");
            lib.UpdateRecord(record);
            var newRecord = lib.GetAllRecords().First();

            Assert.Equal(guid, newRecord.RecordID);
            Assert.Equal(record.PlatformID, newRecord.PlatformID);
            Assert.Contains("is_test", newRecord.Metadata.Keys);
            Assert.Equal("true", newRecord.Metadata["is_test"]);

            newRecord.Metadata.Add("is_test_two", "true");
            lib.UpdateRecord(newRecord);

            var newNewRecord = lib.GetAllRecords().First();

            Assert.Equal(guid, newNewRecord.RecordID);
            Assert.Equal(record.PlatformID, newNewRecord.PlatformID);
            Assert.Contains("is_test", newNewRecord.Metadata.Keys);
            Assert.Equal("true", newNewRecord.Metadata["is_test"]);
            Assert.Contains("is_test_two", newNewRecord.Metadata.Keys);
            Assert.Equal("true", newNewRecord.Metadata["is_test_two"]);
        }
        public void Compose(IModule module, Loader.IServiceRepository serviceContainer)
        {
            var    physicalFs       = serviceContainer.Get <IFileSystem>();
            var    contentDirectory = serviceContainer.Get <IContentDirectoryProvider>();
            string sqlitePath       = Path.Combine(contentDirectory.ApplicationData.FullName, "library.db");
            var    optionsBuilder   = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder
            .UseSqlite($"Data Source={sqlitePath}");

            using (var context = new DatabaseContext(optionsBuilder.Options))
            {
                var connection = context.Database.GetDbConnection();
                connection.Open();
                using (var command = connection.CreateCommand())
                {
                    command.CommandText = "PRAGMA journal_mode=WAL;";
                    command.ExecuteNonQuery();
                }
            }

            // game library dependency tree

            var gameRecordLibrary = new GameRecordLibrary(optionsBuilder);
            var gameLibrary       = new GameLibrary(gameRecordLibrary);
            var configStore       = new ConfigurationCollectionStore(optionsBuilder);

            var fileLibrary = new FileRecordLibrary(optionsBuilder);

            var appDataPath = physicalFs.ConvertPathFromInternal(contentDirectory.ApplicationData.FullName);
            var gameFs      = physicalFs.GetOrCreateSubFileSystem(appDataPath / "games");

            // Add default extensions
            gameLibrary.AddExtension <IGameFileExtensionProvider,
                                      IGameFileExtension>(new GameFileExtensionProvider(fileLibrary, gameFs));

            gameLibrary.AddExtension <IGameConfigurationExtensionProvider,
                                      IGameConfigurationExtension>(new GameConfigurationExtensionProvider(configStore));

            // register game library.
            serviceContainer.Get <IServiceRegistrationProvider>()
            .RegisterService <IGameLibrary>(gameLibrary);

            var pluginLibrary = new PluginConfigurationStore(optionsBuilder);

            // plugin config store

            serviceContainer.Get <IServiceRegistrationProvider>()
            .RegisterService <IPluginConfigurationStore>(pluginLibrary);

            // controller elements

            var inputStore = new ControllerElementMappingsStore(optionsBuilder);

            serviceContainer.Get <IServiceRegistrationProvider>()
            .RegisterService <IControllerElementMappingsStore>(inputStore);
        }
        public async Task QueryGamesByPlatformsAsync_Test()
        {
            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var lib = new GameRecordLibrary(optionsBuilder);

            var record = lib.CreateRecord("TEST_PLATFORM");

            Assert.False(await lib.QueryRecordsAsync(r => r.PlatformID == "TEST_PLATFORM").IsEmptyAsync());
        }
        public async Task GetGameByGuidAsync_Test()
        {
            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var lib = new GameRecordLibrary(optionsBuilder);

            var record = await lib.CreateRecordAsync("TEST_PLATFORM");

            Assert.NotNull(lib.GetRecord(record.RecordID));
        }
        public async Task GetGameByPlatformsAsync_Test()
        {
            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var lib = new GameRecordLibrary(optionsBuilder);

            await lib.CreateRecordAsync("TEST_PLATFORM");

            Assert.NotEmpty(lib.GetRecords(r => r.PlatformID == "TEST_PLATFORM"));
        }
        public async Task GetAllRecordsAsync_Test()
        {
            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var lib = new GameRecordLibrary(optionsBuilder);

            await lib.CreateRecordAsync("TEST_PLATFORM");

            Assert.False(await lib.GetAllRecordsAsync().IsEmptyAsync());
        }
        public void GetAllRecords_Test()
        {
            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var lib = new GameRecordLibrary(optionsBuilder);

            var record = lib.CreateRecord("TEST_PLATFORM");

            Assert.NotEmpty(lib.GetAllRecords());
        }
        public void Set_Test()
        {
            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var lib       = new GameRecordLibrary(optionsBuilder);
            var record    = lib.CreateRecord("NINTENDO_NES");
            var guid      = record.RecordID;
            var newRecord = lib.GetAllRecords().First();

            Assert.Equal(guid, newRecord.RecordID);
            Assert.Equal(record.PlatformID, newRecord.PlatformID);
        }
        public void Remove_Test()
        {
            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var lib = new GameRecordLibrary(optionsBuilder);

            var record = lib.CreateRecord("TEST_PLATFORM");

            Assert.NotNull(lib.GetRecord(record.RecordID));
            lib.DeleteRecord(record);
            Assert.Null(lib.GetRecord(record.RecordID));
        }
        public void GetGamesByTitle_Test()
        {
            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var lib = new GameRecordLibrary(optionsBuilder);

            var record = lib.CreateRecord("TEST_PLATFORM");

            record.Title = "Test";
            lib.UpdateRecord(record);

            Assert.NotEmpty(lib.GetRecords(g => g.Metadata[GameMetadataKeys.Title] == "Test"));
        }
        public async Task QueryGamesByTitleAsync_Test()
        {
            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var lib = new GameRecordLibrary(optionsBuilder);

            var record = lib.CreateRecord("TEST_PLATFORM");

            record.Title = "Test";
            lib.UpdateRecord(record);

            Assert.False(await lib.QueryRecordsAsync(g => g.Metadata.First(m => m.MetadataKey == GameMetadataKeys.Title).MetadataValue == "Test").IsEmptyAsync());
        }
Beispiel #14
0
        public void GameLibraryIntegrationCreate_Test()
        {
            var path = new DirectoryInfo(Path.GetTempPath())
                       .CreateSubdirectory(Path.GetFileNameWithoutExtension(Path.GetTempFileName()));
            var fs  = new PhysicalFileSystem();
            var gfs = fs.GetOrCreateSubFileSystem(fs.ConvertPathFromInternal(path.FullName));

            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var glib = new GameRecordLibrary(optionsBuilder);
            var gl   = new GameLibrary(glib);
            var game = gl.CreateGame("NINTENDO_NES");
        }
        public void SetMultiple_Test()
        {
            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var lib     = new GameRecordLibrary(optionsBuilder);
            var record  = lib.CreateRecord("NINTENDO_NES");
            var record2 = lib.CreateRecord("NINTENDO_NES");

            record.Title  = "Test Game";
            record2.Title = "Test Game 2";

            lib.UpdateRecord(record);
            lib.UpdateRecord(record2);
        }
        public async Task TestCopyInstaller_IntegrationTest()
        {
            using var testStream = TestUtilities.GetResource("TestRoms.test.nes");
            using var fileStream = File.Create(Path.GetTempFileName() + ".nes");
            await testStream.CopyToAsync(fileStream);

            string fname = fileStream.Name;

            fileStream.Dispose();

            var path = new DirectoryInfo(Path.GetTempPath())
                       .CreateSubdirectory(Path.GetFileNameWithoutExtension(Path.GetTempFileName()));
            var fs  = new PhysicalFileSystem();
            var gfs = fs.GetOrCreateSubFileSystem(fs.ConvertPathFromInternal(path.FullName));

            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var glib = new GameRecordLibrary(optionsBuilder);
            var flib = new FileRecordLibrary(optionsBuilder);

            var gl = new GameLibrary(glib);

            gl.AddExtension <GameFileExtensionProvider, IGameFileExtension
                             >(new GameFileExtensionProvider(flib, gfs));

            var game = gl.CreateGame("NINTENDO_NES");

            var stone   = new StoneProvider();
            var install = new SingleFileCopyInstaller(stone);

            var installables = install.GetInstallables("NINTENDO_NES", new List <FileSystemInfo>()
            {
                new FileInfo(fname)
            });

            Assert.True(installables.Select(i => i.Source).All(i => i == install.Name));

            foreach (var i in installables)
            {
                await foreach (var res in install.Install(game, i.Artifacts))
                {
                }
            }

            Assert.NotEmpty(game.WithFiles().GetFileRecords());
        }
Beispiel #17
0
        public async Task GameLibraryIntegrationQueryAsync_Test()
        {
            var path = new DirectoryInfo(Path.GetTempPath())
                       .CreateSubdirectory(Path.GetFileNameWithoutExtension(Path.GetTempFileName()));
            var fs  = new PhysicalFileSystem();
            var gfs = fs.GetOrCreateSubFileSystem(fs.ConvertPathFromInternal(path.FullName));

            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var glib = new GameRecordLibrary(optionsBuilder);
            var gl   = new GameLibrary(glib);
            var game = await gl.CreateGameAsync("NINTENDO_NES");

            Assert.False(await gl.QueryGamesAsync(g => g.PlatformID == "NINTENDO_NES").IsEmptyAsync());
            Assert.False(await gl.GetAllGamesAsync().IsEmptyAsync());
            Assert.NotNull(await gl.GetGameAsync(game.Record.RecordID));
        }
Beispiel #18
0
        public async Task GameLibraryIntegrationConfigAsync_Test()
        {
            var path = new DirectoryInfo(Path.GetTempPath())
                       .CreateSubdirectory(Path.GetFileNameWithoutExtension(Path.GetTempFileName()));
            var fs  = new PhysicalFileSystem();
            var gfs = fs.GetOrCreateSubFileSystem(fs.ConvertPathFromInternal(path.FullName));

            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var glib = new GameRecordLibrary(optionsBuilder);
            var ccs  = new ConfigurationCollectionStore(optionsBuilder);

            var gl = new GameLibrary(glib);

            gl.AddExtension <IGameConfigurationExtensionProvider, IGameConfigurationExtension>
                (new GameConfigurationExtensionProvider(ccs));
            var game = await gl.CreateGameAsync("NINTENDO_NES");

            var profile = await game.WithConfigurations()
                          .CreateNewProfileAsync <ExampleConfigurationCollection>("TestConfiguration", "test");

            var profileGuid = profile.CollectionGuid;

            Assert.NotNull(await game.WithConfigurations()
                           .GetProfileAsync <ExampleConfigurationCollection>("TestConfiguration", profileGuid));

            Assert.NotEmpty(game.WithConfigurations().GetProfileNames());

            profile.Configuration.ExampleConfiguration.FullscreenResolution =
                Configuration.FullscreenResolution.Resolution1600X1050;
            await gl.WithConfigurationLibrary().UpdateProfileAsync(profile);

            var newProfile = await game.WithConfigurations()
                             .GetProfileAsync <ExampleConfigurationCollection>("TestConfiguration", profileGuid);

            Assert.Equal(Configuration.FullscreenResolution.Resolution1600X1050,
                         newProfile.Configuration.ExampleConfiguration.FullscreenResolution);

            await game.WithConfigurations().DeleteProfileAsync("TestConfiguration", profileGuid);

            Assert.Empty(game.WithConfigurations().GetProfileNames());
        }
Beispiel #19
0
        public async Task GameLibraryUnknownExtensionAsync_Test()
        {
            var path = new DirectoryInfo(Path.GetTempPath())
                       .CreateSubdirectory(Path.GetFileNameWithoutExtension(Path.GetTempFileName()));
            var fs  = new PhysicalFileSystem();
            var gfs = fs.GetOrCreateSubFileSystem(fs.ConvertPathFromInternal(path.FullName));

            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var glib = new GameRecordLibrary(optionsBuilder);
            var ccs  = new ConfigurationCollectionStore(optionsBuilder);

            var gl = new GameLibrary(glib);

            Assert.Throws <KeyNotFoundException>(() => gl.GetExtension <IGameConfigurationExtensionProvider>());
            var game = await gl.CreateGameAsync("NINTENDO_NES");

            Assert.Throws <KeyNotFoundException>(() => game.GetExtension <IGameConfigurationExtension>());
        }
Beispiel #20
0
        public async Task GameLibraryIntegrationUpdateAsync_Test()
        {
            var path = new DirectoryInfo(Path.GetTempPath())
                       .CreateSubdirectory(Path.GetFileNameWithoutExtension(Path.GetTempFileName()));
            var fs  = new PhysicalFileSystem();
            var gfs = fs.GetOrCreateSubFileSystem(fs.ConvertPathFromInternal(path.FullName));

            var optionsBuilder = new DbContextOptionsBuilder <DatabaseContext>();

            optionsBuilder.UseSqlite($"Data Source={Path.GetTempFileName()}");
            var glib = new GameRecordLibrary(optionsBuilder);
            var flib = new FileRecordLibrary(optionsBuilder);

            var gl = new GameLibrary(glib);

            gl.AddExtension <GameFileExtensionProvider, IGameFileExtension
                             >(new GameFileExtensionProvider(flib, gfs));

            var game = await gl.CreateGameAsync("NINTENDO_NES");

            game.Record.Title = "My Awesome Game";
            await gl.UpdateGameRecordAsync(game.Record);

            var file = game.WithFiles().MiscRoot.OpenFile("Test.txt");

            file.OpenStream().Close();
            await game.WithFiles().RegisterFileAsync(file, "application/text");

            var record = await game.WithFiles().GetFileInfoAsync(file);

            record.Metadata.Add("file_metadata", "test");
            await gl.GetExtension <GameFileExtensionProvider>().UpdateFileAsync(record);

            var newGame = await gl.GetGameAsync(game.Record.RecordID);

            Assert.False(await newGame.WithFiles().GetFileRecordsAsync().IsEmptyAsync());
        }