private void Init(TestContext testContext, bool keyframeMode = false) { this.testContext = testContext; if (!Directory.Exists(CurrentTestLKGPath)) { Directory.CreateDirectory(CurrentTestLKGPath); } if (!Directory.Exists(CurrentTestTempPath)) { Directory.CreateDirectory(CurrentTestTempPath); } if (keyframeMode) { this.keyFrameRecorder = new ConsoleBitmapStreamWriter(File.OpenWrite(CurrentTestRecordingFilePath)); } else { this.Recorder = new ConsoleBitmapStreamWriter(File.OpenWrite(CurrentTestRecordingFilePath)); } this.Stopped.SubscribeOnce(() => { var metadata = new CliLKGTestMetadata() { Paints = this.TotalPaints, }; Console.WriteLine("Total paints: " + metadata.Paints); var json = JsonConvert.SerializeObject(metadata); File.WriteAllText(CurrentTestMetadataFilePath, json); }); }
public void TestRecordVideoBasic() { ConsoleBitmap bitmap = new ConsoleBitmap(4, 2), redBitmap = null, greenBitmap = null, magentaPixelBitmap = null; using (var sharedStream = new MemoryStream()) { using (var bitmapVideoWriter = new ConsoleBitmapStreamWriter(sharedStream) { CloseInnerStream = false }) { bitmap = new ConsoleBitmap(4, 2); redBitmap = bitmapVideoWriter.WriteFrame(bitmap.FillRect(ConsoleCharacter.RedBG())).Clone(); greenBitmap = bitmapVideoWriter.WriteFrame(bitmap.FillRect(ConsoleCharacter.GreenBG())).Clone(); magentaPixelBitmap = bitmapVideoWriter.WriteFrame(bitmap.DrawPoint(ConsoleCharacter.MagentaBG(), 0, 0)).Clone(); } sharedStream.Position = 0; // rewind the stream to the beginning to read it back // create a reader and make sure we can read each frame back exactly as they were written var bitmapVideoReader = new ConsoleBitmapStreamReader(sharedStream); Assert.AreEqual(redBitmap, bitmapVideoReader.ReadFrame().CurrentBitmap); Assert.AreEqual(greenBitmap, bitmapVideoReader.ReadFrame().CurrentBitmap); Assert.AreEqual(magentaPixelBitmap, bitmapVideoReader.ReadFrame().CurrentBitmap); Assert.IsNull(bitmapVideoReader.ReadFrame().CurrentFrame); } }
public void TestRecordVideoLargeVideo() { ConsoleBitmap bitmap = new ConsoleBitmap(1, 1); var numFrames = 10000; using (var sharedStream = new MemoryStream()) { var bitmapVideoWriter = new ConsoleBitmapStreamWriter(sharedStream) { CloseInnerStream = false }; for (var i = 0; i < numFrames; i++) { bitmapVideoWriter.WriteFrame(bitmap, true, TimeSpan.FromMilliseconds(i)); } bitmapVideoWriter.Dispose(); sharedStream.Position = 0; // rewind the stream to the beginning to read it back var destination = TimeSpan.Zero; var reader = new ConsoleBitmapStreamReader(sharedStream); var video = reader.ReadToEnd(); var lastFrameIndex = 0; var sw = Stopwatch.StartNew(); while ((lastFrameIndex = video.Seek(destination, out bitmap, lastFrameIndex >= 0 ? lastFrameIndex : 0)) != numFrames - 1) { destination = destination.Add(TimeSpan.FromMilliseconds(1)); } sw.Stop(); Assert.IsTrue(sw.ElapsedMilliseconds < 10); Console.WriteLine($"Playback took {sw.ElapsedMilliseconds} ms"); } }
public void TestPlaybackEndToEnd() { int w = 10, h = 1; var temp = Path.GetTempFileName(); using (var stream = File.OpenWrite(temp)) { var writer = new ConsoleBitmapStreamWriter(stream) { CloseInnerStream = false }; var bitmap = new ConsoleBitmap(w, h); for (var i = 0; i < bitmap.Width; i++) { bitmap.Pen = new ConsoleCharacter(' '); bitmap.FillRect(0, 0, bitmap.Width, bitmap.Height); bitmap.Pen = new ConsoleCharacter(' ', backgroundColor: ConsoleColor.Red); bitmap.DrawPoint(i, 0); writer.WriteFrame(bitmap, true, TimeSpan.FromSeconds(.5 * i)); } writer.Dispose(); } var app = new CliTestHarness(this.TestContext, 80, 30); app.QueueAction(() => { var player = app.LayoutRoot.Add(new ConsoleBitmapPlayer()).Fill(); player.Load(File.OpenRead(temp)); app.SetTimeout(() => app.SendKey(new ConsoleKeyInfo('p', ConsoleKey.P, false, false, false)), TimeSpan.FromMilliseconds(100)); var playStarted = false; player.SubscribeForLifetime(nameof(player.State), () => { if (player.State == PlayerState.Playing) { playStarted = true; } else if (player.State == PlayerState.Stopped && playStarted) { app.Stop(); } }, app); }); app.Start().Wait(); Thread.Sleep(100); app.AssertThisTestMatchesLKGFirstAndLastFrame(); }