using System; using System.IO; using System.Xml; using Microsoft.Xna.Framework; using MonoGame.Extended.Particles; using MonoGame.Extended.Particles.Modifiers; using MonoGame.Extended.Particles.Modifiers.Containers; using MonoGame.Extended.Particles.Modifiers.Interpolators; using MonoGame.Extended.Particles.Profiles; namespace MonoGame.Extended.Tests.Particles; public sealed class ParticleEffectSerializerTests { private readonly MockContentManager _mockContentManager; public ParticleEffectSerializerTests() { _mockContentManager = new MockContentManager(); } private ParticleEffect ReadParticleEffectFromXml(string xml) { using MemoryStream stream = new MemoryStream(); using StreamWriter writer = new StreamWriter(stream); writer.Write(xml); writer.Flush(); stream.Position = 0; return ParticleEffectSerializer.Deserialize(stream, _mockContentManager); } [Fact] public void Deserialize_NullStream_ThrowsArgumentNullException() { Assert.Throws(() => ParticleEffectSerializer.Deserialize((Stream)null!, _mockContentManager)); } [Fact] public void Deserialize_NullContentManager_ThrowsArgumentNullException() { using MemoryStream stream = new MemoryStream(); Assert.Throws(() => ParticleEffectSerializer.Deserialize(stream, null)); } [Fact] public void Deserialize_InvalidXmlRoot_ThrowsXmlException() { string xml = ""; Assert.Throws(() => ReadParticleEffectFromXml(xml)); } [Fact] public void Deserialize_EmptyEffect_ReturnsExpected() { string xml = """ """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Equal("EmptyEffect", effect.Name); Assert.Equal(Vector2.Zero, effect.Position); Assert.Equal(0.0f, effect.Rotation); Assert.Equal(Vector2.One, effect.Scale); Assert.Empty(effect.Emitters); Assert.True(effect.AutoTrigger); Assert.Equal(1.0f, effect.AutoTriggerFrequency); } [Fact] public void Deserialize_EmptyModifiers_ReturnsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Empty(emitter.Modifiers); } [Fact] public void Deserialize_BoxFillProfile_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; BoxFillProfile profile = Assert.IsType(emitter.Profile); Assert.Equal(1.0f, profile.Height); Assert.Equal(1.0f, profile.Height); } [Fact] public void Deserialize_BoxProfile_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; BoxProfile profile = Assert.IsType(emitter.Profile); Assert.Equal(1.0f, profile.Height); Assert.Equal(1.0f, profile.Height); } [Fact] public void DeserializeBoxUniformProfile_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; BoxUniformProfile profile = Assert.IsType(emitter.Profile); Assert.Equal(1.0f, profile.Height); Assert.Equal(1.0f, profile.Height); } [Fact] public void DeserializeCircleProfile_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; CircleProfile profile = Assert.IsType(emitter.Profile); Assert.Equal(1.0f, profile.Radius); Assert.Equal(CircleRadiation.Out, profile.Radiate); } [Fact] public void DeserializeLineProfile_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; LineProfile profile = Assert.IsType(emitter.Profile); Assert.Equal(Vector2.One, profile.Axis); Assert.Equal(1.0f, profile.Length); } [Fact] public void DeserializePointProfile_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.IsType(emitter.Profile); } [Fact] public void DeserializeRingProfile_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; RingProfile profile = Assert.IsType(emitter.Profile); Assert.Equal(1.0f, profile.Radius); Assert.Equal(CircleRadiation.In, profile.Radiate); } [Fact] public void DeserializeSprayProfile_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; SprayProfile profile = Assert.IsType(emitter.Profile); Assert.Equal(Vector2.One, profile.Direction); Assert.Equal(1.0f, profile.Spread); } [Fact] public void DeserializeAgeModifier_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); AgeModifier modifier = Assert.IsType(effect.Emitters[0].Modifiers[0]); Assert.True(modifier.Enabled); Assert.Equal(60.0f, modifier.Frequency); Assert.Equal(nameof(AgeModifier), modifier.Name); } [Fact] public void DeserializeCircleContainerModifier_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); CircleContainerModifier modifier = Assert.IsType(effect.Emitters[0].Modifiers[0]); Assert.Equal(60.0f, modifier.Frequency); Assert.True(modifier.Enabled); Assert.Equal(nameof(CircleContainerModifier), modifier.Name); Assert.Equal(0.0f, modifier.Radius); Assert.True(modifier.Inside); Assert.Equal(1.0f, modifier.RestitutionCoefficient); } [Fact] public void DeserializeDragModifier_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); DragModifier modifier = Assert.IsType(effect.Emitters[0].Modifiers[0]); Assert.Equal(60.0f, modifier.Frequency); Assert.True(modifier.Enabled); Assert.Equal(nameof(DragModifier), modifier.Name); Assert.Equal(0.47f, modifier.DragCoefficient); Assert.Equal(0.5f, modifier.Density); } [Fact] public void DeserializeLinearGravityModifier_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); LinearGravityModifier modifier = Assert.IsType(effect.Emitters[0].Modifiers[0]); Assert.Equal(60.0f, modifier.Frequency); Assert.True(modifier.Enabled); Assert.Equal(nameof(LinearGravityModifier), modifier.Name); Assert.Equal(Vector2.Zero, modifier.Direction); Assert.Equal(0.0f, modifier.Strength); } [Fact] public void DeserializeOpacityFastFadeModifier_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); OpacityFastFadeModifier modifier = Assert.IsType(effect.Emitters[0].Modifiers[0]); Assert.Equal(60.0f, modifier.Frequency); Assert.True(modifier.Enabled); Assert.Equal(nameof(OpacityFastFadeModifier), modifier.Name); } [Fact] public void DeserializeRectangleContainerModifier_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); RectangleContainerModifier modifier = Assert.IsType(effect.Emitters[0].Modifiers[0]); Assert.Equal(60.0f, modifier.Frequency); Assert.True(modifier.Enabled); Assert.Equal(nameof(RectangleContainerModifier), modifier.Name); Assert.Equal(0.0f, modifier.Width); Assert.Equal(0.0f, modifier.Height); Assert.Equal(1.0f, modifier.RestitutionCoefficient); } [Fact] public void DeserializeRectangleLoopContainerModifier_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); RectangleLoopContainerModifier modifier = Assert.IsType(effect.Emitters[0].Modifiers[0]); Assert.Equal(60.0f, modifier.Frequency); Assert.True(modifier.Enabled); Assert.Equal(nameof(RectangleLoopContainerModifier), modifier.Name); Assert.Equal(0.0f, modifier.Width); Assert.Equal(0.0f, modifier.Height); } [Fact] public void DeserializeRotationModifier_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); RotationModifier modifier = Assert.IsType(effect.Emitters[0].Modifiers[0]); Assert.Equal(60.0f, modifier.Frequency); Assert.True(modifier.Enabled); Assert.Equal(nameof(RotationModifier), modifier.Name); Assert.Equal(0.0f, modifier.RotationRate); } [Fact] public void DeserializeVelocityColorModifier_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); VelocityColorModifier modifier = Assert.IsType(effect.Emitters[0].Modifiers[0]); Assert.Equal(60.0f, modifier.Frequency); Assert.True(modifier.Enabled); Assert.Equal(nameof(VelocityColorModifier), modifier.Name); Assert.Equal(new HslColor(0, 0, 0), modifier.StationaryColor); Assert.Equal(new HslColor(0, 0, 0), modifier.VelocityColor); Assert.Equal(0.0f, modifier.VelocityThreshold); } [Fact] public void DeserializeVelocityModifier_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); VelocityModifier modifier = Assert.IsType(effect.Emitters[0].Modifiers[0]); Assert.Equal(60.0f, modifier.Frequency); Assert.Equal(nameof(VelocityModifier), modifier.Name); Assert.Equal(0.0f, modifier.VelocityThreshold); } [Fact] public void DeserializeVortexModifier_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); VortexModifier modifier = Assert.IsType(effect.Emitters[0].Modifiers[0]); Assert.Equal(60.0f, modifier.Frequency); Assert.Equal(nameof(VortexModifier), modifier.Name); Assert.Equal(Vector2.Zero, modifier.Position); Assert.Equal(1.0f, modifier.Strength); Assert.Equal(2.0f, modifier.OuterRadius); Assert.Equal(3.0f, modifier.InnerRadius); Assert.Equal(4.0f, modifier.MaxVelocity); Assert.Equal(5.0f, modifier.RotationAngle); } [Fact] public void DeserializeColorInterpolator_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); AgeModifier modifier = Assert.IsType(emitter.Modifiers[0]); Assert.Single(modifier.Interpolators); ColorInterpolator interpolator = Assert.IsType(modifier.Interpolators[0]); Assert.True(interpolator.Enabled); Assert.Equal(new HslColor(0, 0, 0), interpolator.StartValue); Assert.Equal(new HslColor(0, 0, 0), interpolator.EndValue); } [Fact] public void DeserializeHueInterpolator_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); AgeModifier modifier = Assert.IsType(emitter.Modifiers[0]); Assert.Single(modifier.Interpolators); HueInterpolator interpolator = Assert.IsType(modifier.Interpolators[0]); Assert.True(interpolator.Enabled); Assert.Equal(0.0f, interpolator.StartValue); Assert.Equal(0.0f, interpolator.EndValue); } [Fact] public void DeserializeOpacityInterpolator_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); AgeModifier modifier = Assert.IsType(emitter.Modifiers[0]); Assert.Single(modifier.Interpolators); OpacityInterpolator interpolator = Assert.IsType(modifier.Interpolators[0]); Assert.True(interpolator.Enabled); Assert.Equal(0.0f, interpolator.StartValue); Assert.Equal(0.0f, interpolator.EndValue); } [Fact] public void DeserializeRotationInterpolator_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); AgeModifier modifier = Assert.IsType(emitter.Modifiers[0]); Assert.Single(modifier.Interpolators); RotationInterpolator interpolator = Assert.IsType(modifier.Interpolators[0]); Assert.True(interpolator.Enabled); Assert.Equal(0.0f, interpolator.StartValue); Assert.Equal(0.0f, interpolator.EndValue); } [Fact] public void DeserializeScaleInterpolator_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); AgeModifier modifier = Assert.IsType(emitter.Modifiers[0]); Assert.Single(modifier.Interpolators); ScaleInterpolator interpolator = Assert.IsType(modifier.Interpolators[0]); Assert.True(interpolator.Enabled); Assert.Equal(Vector2.Zero, interpolator.StartValue); Assert.Equal(Vector2.One, interpolator.EndValue); } [Fact] public void DeserializeVelocityInterpolator_ReadsExpected() { string xml = $""" """; ParticleEffect effect = ReadParticleEffectFromXml(xml); Assert.Single(effect.Emitters); ParticleEmitter emitter = effect.Emitters[0]; Assert.Single(emitter.Modifiers); AgeModifier modifier = Assert.IsType(emitter.Modifiers[0]); Assert.Single(modifier.Interpolators); VelocityInterpolator interpolator = Assert.IsType(modifier.Interpolators[0]); Assert.True(interpolator.Enabled); Assert.Equal(Vector2.Zero, interpolator.StartValue); Assert.Equal(Vector2.Zero, interpolator.EndValue); } [Fact] public void SerializeNulLEffect_ThrowsArgumentNullException() { using MemoryStream stream = new MemoryStream(); using ParticleEffectWriter writer = new ParticleEffectWriter(stream); Assert.Throws(() => writer.WriteParticleEffect(null)); } [Fact] public void SerializeEmptyEffect_WritesMinimalXml() { ParticleEffect effect = new ParticleEffect("EmptyEffect"); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeEmptyModifiers_WritesMinimalXml() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "EmptyModifiers"; effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeEmptyInterpolators_WritesMinimalXml() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; effect.Emitters.Add(emitter); AgeModifier ageModifier = new AgeModifier(); emitter.Modifiers.Add(ageModifier); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeBoxFillProfile_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.BoxFill(1.0f, 2.0f); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeBoxProfile_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Box(1.0f, 2.0f); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeBoxUniformProfile_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.BoxUniform(1.0f, 2.0f); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeCircleProfile_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Circle(1.0f, CircleRadiation.Out); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeLineProfile_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Line(Vector2.One, 1.0f); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializePointProfile_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeRingProfile_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Ring(1.0f, CircleRadiation.In); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeSprayProfile_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Spray(Vector2.One, 1.0f); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeAgeModifier_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); AgeModifier modifier = new AgeModifier(); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeCircleContainerModifier_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); CircleContainerModifier modifier = new CircleContainerModifier(); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeDragModifier_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); DragModifier modifier = new DragModifier(); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeLinearGravityModifier_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); LinearGravityModifier modifier = new LinearGravityModifier(); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeOpacityFastFadeModifier_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); OpacityFastFadeModifier modifier = new OpacityFastFadeModifier(); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeRectangleContainerModifier_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); RectangleContainerModifier modifier = new RectangleContainerModifier(); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeRectangleLoopContainerModifier_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); RectangleLoopContainerModifier modifier = new RectangleLoopContainerModifier(); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeRotationModifier_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); RotationModifier modifier = new RotationModifier(); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeVelocityColorModifier_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); VelocityColorModifier modifier = new VelocityColorModifier(); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeVelocityModifier_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); VelocityModifier modifier = new VelocityModifier(); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeVortexModifier_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); VortexModifier modifier = new VortexModifier(); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeColorInterpolator_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); AgeModifier modifier = new AgeModifier(); ColorInterpolator interpolator = new ColorInterpolator(); modifier.Interpolators.Add(interpolator); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeHueInterpolator_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); AgeModifier modifier = new AgeModifier(); HueInterpolator interpolator = new HueInterpolator(); modifier.Interpolators.Add(interpolator); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeOpacityInterpolator_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); AgeModifier modifier = new AgeModifier(); OpacityInterpolator interpolator = new OpacityInterpolator(); modifier.Interpolators.Add(interpolator); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeRotationInterpolator_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); AgeModifier modifier = new AgeModifier(); RotationInterpolator interpolator = new RotationInterpolator(); modifier.Interpolators.Add(interpolator); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeScaleInterpolator_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); AgeModifier modifier = new AgeModifier(); ScaleInterpolator interpolator = new ScaleInterpolator(); modifier.Interpolators.Add(interpolator); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } [Fact] public void SerializeVelocityInterpolator_WritesExpected() { ParticleEffect effect = new ParticleEffect("TestEffect"); ParticleEmitter emitter = new ParticleEmitter(1); emitter.Name = "TestEmitter"; emitter.Profile = Profile.Point(); AgeModifier modifier = new AgeModifier(); VelocityInterpolator interpolator = new VelocityInterpolator(); modifier.Interpolators.Add(interpolator); emitter.Modifiers.Add(modifier); effect.Emitters.Add(emitter); string expected = $""" """; AssertParticleEffect(effect, expected); } private static void AssertParticleEffect(ParticleEffect effect, string expected) { using MemoryStream stream = new MemoryStream(); ParticleEffectSerializer.Serialize(stream, effect); stream.Position = 0; using StreamReader reader = new StreamReader(stream); string actual = reader.ReadToEnd(); Assert.Equal(expected, actual); } }