示例#1
0
        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);
            });
        }
示例#2
0
        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);
            }
        }
示例#3
0
        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");
            }
        }
示例#4
0
        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();
        }