Asset_Create_Sprite_ShouldRecreateSpriteAssetFileWithTheSameAssetId_WhenSpriteAssetFileAlreadyExists_GivenTextureAssetFilePath_And_KeepAssetId()
        {
            // Arrange
            var pngFilePathToCopy    = Utils.GetPathUnderTestDirectory(@"Assets\TestTexture.png");
            var pngFilePathInTempDir = Path.Combine(_temporaryDirectory.Path, "TestTexture.png");

            File.Copy(pngFilePathToCopy, pngFilePathInTempDir);

            var textureAssetFilePathToCopy    = Utils.GetPathUnderTestDirectory(AssetFileUtils.AppendExtension(@"Assets\TestTexture"));
            var textureAssetFilePathInTempDir = Path.Combine(_temporaryDirectory.Path, AssetFileUtils.AppendExtension("TestTexture"));

            File.Copy(textureAssetFilePathToCopy, textureAssetFilePathInTempDir);

            var spriteAssetFilePath = Path.Combine(_temporaryDirectory.Path, AssetFileUtils.AppendExtension("TestTexture.sprite"));

            RunGeishaCli($"asset create sprite \"{textureAssetFilePathInTempDir}\"");

            var originalAssetData = AssetData.Load(spriteAssetFilePath);
            var modifiedAssetData = AssetData.CreateWithJsonContent(originalAssetData.AssetId, originalAssetData.AssetType, new SpriteAssetContent());

            modifiedAssetData.Save(spriteAssetFilePath);

            // Act
            RunGeishaCli($"asset create sprite \"{textureAssetFilePathInTempDir}\" --keep-asset-id");

            // Assert
            var actualAssetData = AssetData.Load(spriteAssetFilePath);

            Assert.That(actualAssetData.AssetId, Is.EqualTo(originalAssetData.AssetId));
            Assert.That(actualAssetData.ReadJsonContent <SpriteAssetContent>().TextureAssetId, Is.EqualTo(AssetsIds.TestTexture.Value));
        }
        public void Asset_Create_Sound_ShouldRecreateSoundAssetFileWithTheSameAssetId_WhenSoundAssetFileAlreadyExists_GivenKeepAssetId()
        {
            // Arrange
            var mp3FilePathToCopy    = Utils.GetPathUnderTestDirectory(@"Assets\TestSound.mp3");
            var mp3FilePathInTempDir = Path.Combine(_temporaryDirectory.Path, "TestSound.mp3");

            File.Copy(mp3FilePathToCopy, mp3FilePathInTempDir);

            var soundAssetFilePath = Path.Combine(_temporaryDirectory.Path, AssetFileUtils.AppendExtension("TestSound"));

            RunGeishaCli($"asset create sound \"{mp3FilePathInTempDir}\"");

            var originalAssetData = AssetData.Load(soundAssetFilePath);
            var modifiedAssetData = AssetData.CreateWithJsonContent(originalAssetData.AssetId, originalAssetData.AssetType, new SoundAssetContent());

            modifiedAssetData.Save(soundAssetFilePath);

            // Act
            RunGeishaCli($"asset create sound \"{mp3FilePathInTempDir}\" --keep-asset-id");

            // Assert
            var actualAssetData = AssetData.Load(soundAssetFilePath);

            Assert.That(actualAssetData.AssetId, Is.EqualTo(originalAssetData.AssetId));
            Assert.That(actualAssetData.ReadJsonContent <SoundAssetContent>().SoundFilePath, Is.EqualTo("TestSound.mp3"));
        }
Exemplo n.º 3
0
        public static string CreateSoundAsset(string soundFilePath, bool keepAssetId = false)
        {
            var soundFileExtension = Path.GetExtension(soundFilePath);

            if (!IsSupportedSoundFileFormat(soundFileExtension))
            {
                throw new ArgumentException($"Sound file format {soundFileExtension} is not supported.", nameof(soundFilePath));
            }

            var directoryPath = Path.GetDirectoryName(soundFilePath) ??
                                throw new ArgumentException("The path does not point to any file.", nameof(soundFilePath));

            var soundAssetFileName = AssetFileUtils.AppendExtension(Path.GetFileNameWithoutExtension(soundFilePath));
            var soundAssetFilePath = Path.Combine(directoryPath, soundAssetFileName);

            var soundAssetContent = new SoundAssetContent
            {
                SoundFilePath = Path.GetFileName(soundFilePath)
            };

            var assetId   = GetAssetId(keepAssetId, soundAssetFilePath);
            var assetData = AssetData.CreateWithJsonContent(assetId, AudioAssetTypes.Sound, soundAssetContent);

            assetData.Save(soundAssetFilePath);

            return(soundAssetFilePath);
        }
Exemplo n.º 4
0
        public void Load_ShouldLoadInputMappingFromFile(LoadTestCase testCase)
        {
            // Arrange
            const string filePath = "input mapping file path";

            var assetInfo = new AssetInfo(AssetId.CreateUnique(), InputAssetTypes.InputMapping, filePath);
            var assetData = AssetData.CreateWithJsonContent(assetInfo.AssetId, assetInfo.AssetType, testCase.InputMappingAssetContent);

            using var memoryStream = new MemoryStream();
            assetData.Save(memoryStream);
            memoryStream.Position = 0;

            var file = Substitute.For <IFile>();

            file.OpenRead().Returns(memoryStream);
            _fileSystem.GetFile(filePath).Returns(file);

            var inputMappingAssetLoader = new InputMappingAssetLoader(_fileSystem);

            // Act
            var actual = (InputMapping)inputMappingAssetLoader.LoadAsset(assetInfo, _assetStore);

            // Assert
            testCase.Assert(actual);
        }
Exemplo n.º 5
0
        public void ReadStringContent_ShouldThrowException_WhenContentIsJson()
        {
            // Arrange
            // Act
            var assetData = AssetData.CreateWithJsonContent(_assetId, _assetType, _jsonContent);

            // Assert
            Assert.That(() => assetData.ReadStringContent(), Throws.InvalidOperationException);
        }
Exemplo n.º 6
0
        public void LoadAsset_ShouldLoadSpriteFromFile()
        {
            // Arrange
            const string assetFilePath  = @"some_directory\sprite_file_path";
            var          textureAssetId = AssetId.CreateUnique();

            var spriteAssetContent = new SpriteAssetContent
            {
                TextureAssetId = textureAssetId.Value,
                SourceUV       = new SerializableVector2 {
                    X = 123.456, Y = 234.567
                },
                SourceDimensions = new SerializableVector2 {
                    X = 345.456, Y = 456.567
                },
                Pivot = new SerializableVector2 {
                    X = 567.678, Y = 678.789
                },
                PixelsPerUnit = 123.456
            };

            var assetInfo = new AssetInfo(AssetId.CreateUnique(), RenderingAssetTypes.Sprite, assetFilePath);
            var assetData = AssetData.CreateWithJsonContent(assetInfo.AssetId, assetInfo.AssetType, spriteAssetContent);

            using var memoryStream = new MemoryStream();
            assetData.Save(memoryStream);
            memoryStream.Position = 0;

            var assetFile = Substitute.For <IFile>();

            assetFile.OpenRead().Returns(memoryStream);
            var fileSystem = Substitute.For <IFileSystem>();

            fileSystem.GetFile(assetFilePath).Returns(assetFile);

            var assetStore = Substitute.For <IAssetStore>();
            var texture    = Substitute.For <ITexture>();

            assetStore.GetAsset <ITexture>(textureAssetId).Returns(texture);

            var spriteAssetLoader = new SpriteAssetLoader(fileSystem);

            // Act
            var actual = (Sprite)spriteAssetLoader.LoadAsset(assetInfo, assetStore);

            // Assert
            Assert.That(actual.SourceTexture, Is.EqualTo(texture));
            Assert.That(actual.SourceUV.X, Is.EqualTo(spriteAssetContent.SourceUV.X));
            Assert.That(actual.SourceUV.Y, Is.EqualTo(spriteAssetContent.SourceUV.Y));
            Assert.That(actual.SourceDimensions.X, Is.EqualTo(spriteAssetContent.SourceDimensions.X));
            Assert.That(actual.SourceDimensions.Y, Is.EqualTo(spriteAssetContent.SourceDimensions.Y));
            Assert.That(actual.Pivot.X, Is.EqualTo(spriteAssetContent.Pivot.X));
            Assert.That(actual.Pivot.Y, Is.EqualTo(spriteAssetContent.Pivot.Y));
            Assert.That(actual.PixelsPerUnit, Is.EqualTo(spriteAssetContent.PixelsPerUnit));
        }
Exemplo n.º 7
0
        public void Create_AssetData_WithJsonContent()
        {
            // Arrange
            // Act
            var assetData = AssetData.CreateWithJsonContent(_assetId, _assetType, _jsonContent);

            // Assert
            Assert.That(assetData.AssetId, Is.EqualTo(_assetId));
            Assert.That(assetData.AssetType, Is.EqualTo(_assetType));
            Assert.That(assetData.ContentFormat, Is.EqualTo(AssetData.AssetContentFormat.Json));
            var actualJsonContent = assetData.ReadJsonContent <JsonContent>();

            Assert.That(actualJsonContent.IntProperty, Is.EqualTo(_jsonContent.IntProperty));
            Assert.That(actualJsonContent.DoubleProperty, Is.EqualTo(_jsonContent.DoubleProperty));
            Assert.That(actualJsonContent.StringProperty, Is.EqualTo(_jsonContent.StringProperty));
        }
Exemplo n.º 8
0
        public void SetUp()
        {
            var renderingBackend = Substitute.For <IRenderingBackend>();
            var renderer2D       = Substitute.For <IRenderer2D>();
            var fileSystem       = Substitute.For <IFileSystem>();

            _assetStore = Substitute.For <IAssetStore>();

            renderingBackend.Renderer2D.Returns(renderer2D);

            const string assetFilePath   = @"some_directory\texture_file_path";
            const string textureFilePath = @"some_directory\actual_texture_file_path";

            var textureAssetContent = new TextureAssetContent
            {
                TextureFilePath = "actual_texture_file_path"
            };

            _assetInfo = new AssetInfo(AssetId.CreateUnique(), RenderingAssetTypes.Texture, assetFilePath);
            var assetData    = AssetData.CreateWithJsonContent(_assetInfo.AssetId, _assetInfo.AssetType, textureAssetContent);
            var memoryStream = new MemoryStream();

            assetData.Save(memoryStream);
            memoryStream.Position = 0;

            var assetFile = Substitute.For <IFile>();

            assetFile.OpenRead().Returns(memoryStream);
            fileSystem.GetFile(assetFilePath).Returns(assetFile);

            var stream      = Substitute.For <Stream>();
            var textureFile = Substitute.For <IFile>();

            textureFile.OpenRead().Returns(stream);
            fileSystem.GetFile(textureFilePath).Returns(textureFile);

            _texture = Substitute.For <ITexture>();
            renderer2D.CreateTexture(stream).Returns(_texture);

            _textureAssetLoader = new TextureAssetLoader(renderingBackend, fileSystem);
        }
        Asset_Create_InputMapping_ShouldRecreateDefaultInputMappingAssetFileWithTheSameAssetId_WhenInputMappingAssetFileAlreadyExists_GivenKeepAssetId()
        {
            // Arrange
            var inputMappingAssetFilePath = Path.Combine(_temporaryDirectory.Path, AssetFileUtils.AppendExtension("DefaultInputMapping"));

            RunGeishaCli("asset create input-mapping", _temporaryDirectory.Path);

            var originalAssetData = AssetData.Load(inputMappingAssetFilePath);
            var modifiedAssetData = AssetData.CreateWithJsonContent(originalAssetData.AssetId, originalAssetData.AssetType, new InputMappingAssetContent());

            modifiedAssetData.Save(inputMappingAssetFilePath);

            // Act
            RunGeishaCli("asset create input-mapping --keep-asset-id", _temporaryDirectory.Path);

            // Assert
            var actualAssetData = AssetData.Load(inputMappingAssetFilePath);

            Assert.That(actualAssetData.AssetId, Is.EqualTo(originalAssetData.AssetId));
            Assert.That(actualAssetData.ReadJsonContent <InputMappingAssetContent>().ActionMappings, Contains.Key("Jump"));
        }
        public void SaveToFileAndLoadFromFile_AssetData_WithJsonContent()
        {
            // Arrange
            var assetData = AssetData.CreateWithJsonContent(_assetId, _assetType, _jsonContent);

            // Act
            var filePath = _temporaryDirectory.GetRandomFilePath();

            assetData.Save(filePath);
            var actual = AssetData.Load(filePath);

            // Assert
            Assert.That(actual.AssetId, Is.EqualTo(_assetId));
            Assert.That(actual.AssetType, Is.EqualTo(_assetType));
            Assert.That(assetData.ContentFormat, Is.EqualTo(AssetData.AssetContentFormat.Json));
            var actualJsonContent = actual.ReadJsonContent <JsonContent>();

            Assert.That(actualJsonContent.IntProperty, Is.EqualTo(_jsonContent.IntProperty));
            Assert.That(actualJsonContent.DoubleProperty, Is.EqualTo(_jsonContent.DoubleProperty));
            Assert.That(actualJsonContent.StringProperty, Is.EqualTo(_jsonContent.StringProperty));
        }
Exemplo n.º 11
0
        public void SaveToStreamAndLoadFromStream_AssetData_WithJsonContent()
        {
            // Arrange
            var assetData = AssetData.CreateWithJsonContent(_assetId, _assetType, _jsonContent);

            // Act
            using var memoryStream = new MemoryStream();
            assetData.Save(memoryStream);
            memoryStream.Position = 0;
            var actual = AssetData.Load(memoryStream);

            // Assert
            Assert.That(actual.AssetId, Is.EqualTo(_assetId));
            Assert.That(actual.AssetType, Is.EqualTo(_assetType));
            Assert.That(assetData.ContentFormat, Is.EqualTo(AssetData.AssetContentFormat.Json));
            var actualJsonContent = actual.ReadJsonContent <JsonContent>();

            Assert.That(actualJsonContent.IntProperty, Is.EqualTo(_jsonContent.IntProperty));
            Assert.That(actualJsonContent.DoubleProperty, Is.EqualTo(_jsonContent.DoubleProperty));
            Assert.That(actualJsonContent.StringProperty, Is.EqualTo(_jsonContent.StringProperty));
        }
Exemplo n.º 12
0
        public void SetUp()
        {
            _audioBackend = Substitute.For <IAudioBackend>();
            _fileSystem   = Substitute.For <IFileSystem>();
            _assetStore   = Substitute.For <IAssetStore>();

            const string      soundFilePath = "sound.wav";
            const SoundFormat soundFormat   = SoundFormat.Wav;

            const string assetFilePath     = "sound-asset-path";
            var          soundAssetContent = new SoundAssetContent
            {
                SoundFilePath = soundFilePath
            };

            _assetInfo = new AssetInfo(AssetId.CreateUnique(), AudioAssetTypes.Sound, assetFilePath);
            var assetData    = AssetData.CreateWithJsonContent(_assetInfo.AssetId, _assetInfo.AssetType, soundAssetContent);
            var memoryStream = new MemoryStream();

            assetData.Save(memoryStream);
            memoryStream.Position = 0;

            var assetFile = Substitute.For <IFile>();

            assetFile.OpenRead().Returns(memoryStream);
            _fileSystem.GetFile(assetFilePath).Returns(assetFile);

            var soundFile = Substitute.For <IFile>();
            var stream    = Substitute.For <Stream>();

            soundFile.OpenRead().Returns(stream);
            _fileSystem.GetFile(soundFilePath).Returns(soundFile);

            _sound = Substitute.For <ISound>();
            _audioBackend.CreateSound(stream, soundFormat).Returns(_sound);

            _soundAssetLoader = new SoundAssetLoader(_audioBackend, _fileSystem);
        }
Exemplo n.º 13
0
        public void LoadAsset_ThrowsException_WhenFileContentIsInvalid(LoadThrowsExceptionTestCase testCase)
        {
            // Arrange
            const string assetFilePath = "input mapping file path";

            var assetInfo = new AssetInfo(AssetId.CreateUnique(), InputAssetTypes.InputMapping, assetFilePath);
            var assetData = AssetData.CreateWithJsonContent(assetInfo.AssetId, assetInfo.AssetType, testCase.InputMappingAssetContent);

            using var memoryStream = new MemoryStream();
            assetData.Save(memoryStream);
            memoryStream.Position = 0;

            var file = Substitute.For <IFile>();

            file.OpenRead().Returns(memoryStream);
            _fileSystem.GetFile(assetFilePath).Returns(file);

            var inputMappingAssetLoader = new InputMappingAssetLoader(_fileSystem);

            // Act
            // Assert
            Assert.That(() => inputMappingAssetLoader.LoadAsset(assetInfo, _assetStore), Throws.TypeOf <InvalidInputMappingAssetContentException>());
        }
        Asset_Create_SpriteAnimation_ShouldRecreateSpriteAnimationAssetFileWithTheSameAssetId_WhenSpriteAnimationAssetFileAlreadyExists_GivenKeepAssetId()
        {
            // Arrange
            CopyAnimationFiles();

            var spriteAnimationAssetFilePath =
                Path.Combine(_temporaryDirectory.Path, AssetFileUtils.AppendExtension(new DirectoryInfo(_temporaryDirectory.Path).Name));

            RunGeishaCli($"asset create sprite-animation \"{_temporaryDirectory.Path}\"");

            var originalAssetData = AssetData.Load(spriteAnimationAssetFilePath);
            var modifiedAssetData = AssetData.CreateWithJsonContent(originalAssetData.AssetId, originalAssetData.AssetType, new SpriteAnimationAssetContent());

            modifiedAssetData.Save(spriteAnimationAssetFilePath);

            // Act
            RunGeishaCli($"asset create sprite-animation \"{_temporaryDirectory.Path}\" --keep-asset-id");

            // Assert
            var actualAssetData = AssetData.Load(spriteAnimationAssetFilePath);

            Assert.That(actualAssetData.AssetId, Is.EqualTo(originalAssetData.AssetId));
            Assert.That(actualAssetData.ReadJsonContent <SpriteAnimationAssetContent>().DurationTicks, Is.EqualTo(TimeSpan.FromSeconds(1).Ticks));
        }
Exemplo n.º 15
0
        public void LoadAsset_ShouldLoadSpriteAnimationFromFile()
        {
            // Arrange
            const string assetFilePath  = @"some_directory\sprite_animation_file_path";
            const int    duration       = 123;
            var          sprite1AssetId = AssetId.CreateUnique();
            var          sprite2AssetId = AssetId.CreateUnique();
            var          sprite3AssetId = AssetId.CreateUnique();

            var spriteAnimationAssetContent = new SpriteAnimationAssetContent
            {
                DurationTicks = TimeSpan.FromSeconds(duration).Ticks,
                Frames        = new[]
                {
                    new SpriteAnimationAssetContent.Frame
                    {
                        Duration      = 1,
                        SpriteAssetId = sprite1AssetId.Value
                    },
                    new SpriteAnimationAssetContent.Frame
                    {
                        Duration      = 1.5,
                        SpriteAssetId = sprite2AssetId.Value
                    },
                    new SpriteAnimationAssetContent.Frame
                    {
                        Duration      = 0.5,
                        SpriteAssetId = sprite3AssetId.Value
                    }
                }
            };

            var assetInfo = new AssetInfo(AssetId.CreateUnique(), AnimationAssetTypes.SpriteAnimation, assetFilePath);
            var assetData = AssetData.CreateWithJsonContent(assetInfo.AssetId, assetInfo.AssetType, spriteAnimationAssetContent);

            using var memoryStream = new MemoryStream();
            assetData.Save(memoryStream);
            memoryStream.Position = 0;

            var sprite1 = new Sprite(Substitute.For <ITexture>(), Vector2.Zero, Vector2.Zero, Vector2.Zero, 0);
            var sprite2 = new Sprite(Substitute.For <ITexture>(), Vector2.Zero, Vector2.Zero, Vector2.Zero, 0);
            var sprite3 = new Sprite(Substitute.For <ITexture>(), Vector2.Zero, Vector2.Zero, Vector2.Zero, 0);

            var assetFile = Substitute.For <IFile>();

            assetFile.OpenRead().Returns(memoryStream);
            var fileSystem = Substitute.For <IFileSystem>();

            fileSystem.GetFile(assetFilePath).Returns(assetFile);
            var assetStore = Substitute.For <IAssetStore>();

            assetStore.GetAsset <Sprite>(sprite1AssetId).Returns(sprite1);
            assetStore.GetAsset <Sprite>(sprite2AssetId).Returns(sprite2);
            assetStore.GetAsset <Sprite>(sprite3AssetId).Returns(sprite3);

            var spriteAnimationManagedAsset = new SpriteAnimationAssetLoader(fileSystem);

            // Act
            var actual = (SpriteAnimation)spriteAnimationManagedAsset.LoadAsset(assetInfo, assetStore);

            // Assert
            Assert.That(actual.Duration, Is.EqualTo(TimeSpan.FromSeconds(duration)));
            Assert.That(actual.Frames, Has.Count.EqualTo(3));
            Assert.That(actual.Frames[0].Duration, Is.EqualTo(1));
            Assert.That(actual.Frames[0].Sprite, Is.EqualTo(sprite1));
            Assert.That(actual.Frames[1].Duration, Is.EqualTo(1.5));
            Assert.That(actual.Frames[1].Sprite, Is.EqualTo(sprite2));
            Assert.That(actual.Frames[2].Duration, Is.EqualTo(0.5));
            Assert.That(actual.Frames[2].Sprite, Is.EqualTo(sprite3));
        }