UnitTests/Transform.cs
using Editor.MovieMaker;

namespace Sandbox.MovieMaker.Test;

[TestClass]
public sealed class TransformTests
{
	[TestMethod]
	[DataRow( 0, 1.0, 1.0 )]
	[DataRow( 0, 2.0, 2.0 )]
	[DataRow( 1200, 1.0, 0.5 )]
	[DataRow( 1200, 2.0, 1.0 )]
	[DataRow( -1200, 1.0, 2.0 )]
	[DataRow( -1200, 2.0, 4.0 )]
	public void TimeScale( int cents, double time, double expected )
	{
		var scale = MovieTimeScale.FromCents( cents );
		var scaled = scale * MovieTime.FromSeconds( time );

		Assert.AreEqual( expected, scaled );
	}

	[TestMethod]
	[DataRow( 0.0, 0 )]
	[DataRow( 1.0, 0 )]
	[DataRow( -1.0, 0 )]
	[DataRow( 0.0, 1200 )]
	[DataRow( 0.0, -1200 )]
	[DataRow( 1.0, 1200 )]
	[DataRow( 1.0, -1200 )]
	[DataRow( -1.0, 1200 )]
	[DataRow( -1.0, -1200 )]
	public void Inverse( double translation, int cents )
	{
		var transform = new MovieTransform( translation, MovieTimeScale.FromCents( cents ) );
		var inverse = transform.Inverse;

		Assert.AreEqual( MovieTransform.Identity, inverse * transform );
		Assert.AreEqual( MovieTransform.Identity, transform * inverse );
	}

	[TestMethod]
	[DataRow( 0.0, 0, 0.0, 0.0 )]
	[DataRow( 1.0, 0, 0.0, 1.0 )]
	[DataRow( 1.0, 0, 1.0, 2.0 )]
	[DataRow( 0.0, 1200, 0.0, 0.0 )]
	[DataRow( 0.0, 1200, 1.0, 0.5 )]
	[DataRow( 1.0, 1200, 0.0, 1.0 )]
	[DataRow( 1.0, 1200, 1.0, 1.5 )]
	public void Transform( double translation, int cents, double time, double expected )
	{
		var transform = new MovieTransform( translation, MovieTimeScale.FromCents( cents ) );

		Assert.AreEqual( expected, transform * time );
	}
}