Beispiel #1
0
        public void ShowTextInput()
        {
            var app = new CliTestHarness(this.TestContext, 80, 20, true);

            app.QueueAction(async() =>
            {
                Promise <ConsoleString> dialogPromise;
                dialogPromise = Dialog.ShowRichTextInput(new RichTextDialogOptions()
                {
                    Message = "Rich text input prompt text".ToGreen(),
                });
                await app.PaintAndRecordKeyFrameAsync();
                Assert.IsFalse(dialogPromise.IsFulfilled);
                app.SendKey(new ConsoleKeyInfo('A', ConsoleKey.A, false, false, false));
                await app.PaintAndRecordKeyFrameAsync();
                app.SendKey(new ConsoleKeyInfo('d', ConsoleKey.D, false, false, false));
                await app.PaintAndRecordKeyFrameAsync();
                app.SendKey(new ConsoleKeyInfo('a', ConsoleKey.A, false, false, false));
                await app.PaintAndRecordKeyFrameAsync();
                app.SendKey(new ConsoleKeyInfo('m', ConsoleKey.M, false, false, false));
                await app.PaintAndRecordKeyFrameAsync();
                Assert.IsFalse(dialogPromise.IsFulfilled);
                app.SendKey(new ConsoleKeyInfo(' ', ConsoleKey.Enter, false, false, false));
                var stringVal = (await dialogPromise.AsAwaitable()).ToString();
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();
                Assert.AreEqual("Adam", stringVal);
                app.Stop();
            });

            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #2
0
        public void ShowMessageBasicString()
        {
            var app = new CliTestHarness(this.TestContext, 80, 20, true);

            app.QueueAction(async() =>
            {
                Promise dialogPromise;

                // show hello world message, wait for a paint, then take a keyframe of the screen, which
                // should have the dialog shown
                dialogPromise = Dialog.ShowMessage("Hello world");
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();
                Assert.IsFalse(dialogPromise.IsFulfilled);

                // simulate an enter keypress, which should clear the dialog
                app.SendKey(new ConsoleKeyInfo(' ', ConsoleKey.Enter, false, false, false));
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();
                Assert.IsTrue(dialogPromise.IsFulfilled);
                app.Stop();
            });

            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
        public void TestFixedAspectRatio()
        {
            var app = new CliTestHarness(this.TestContext, 130, 40, true);

            app.SecondsBetweenKeyframes = .05f;
            app.InvokeNextCycle(async() =>
            {
                var fixedPanel = app.LayoutRoot.Add(new FixedAspectRatioPanel(2, new ConsolePanel()
                {
                    Background = RGB.Green
                })).CenterBoth();
                app.LayoutRoot.Background = RGB.DarkYellow;
                fixedPanel.Background     = RGB.Red;
                fixedPanel.Width          = app.LayoutRoot.Width;
                fixedPanel.Height         = app.LayoutRoot.Height;
                await app.PaintAndRecordKeyFrameAsync();

                while (fixedPanel.Width > 2)
                {
                    fixedPanel.Width -= 2;
                    await app.PaintAndRecordKeyFrameAsync();
                }

                app.Stop();
            });
            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #4
0
        public void ShowEnumOptions()
        {
            var app = new CliTestHarness(this.TestContext, 80, 20, true);

            app.QueueAction(async() =>
            {
                Promise <ConsoleColor?> dialogPromise;
                dialogPromise = Dialog.ShowEnumOptions <ConsoleColor>("Enum option picker".ToGreen());
                await app.PaintAndRecordKeyFrameAsync();
                Assert.IsFalse(dialogPromise.IsFulfilled);

                for (var i = 0; i < 6; i++)
                {
                    app.SendKey(new ConsoleKeyInfo(' ', ConsoleKey.DownArrow, false, false, false));
                    await app.PaintAndRecordKeyFrameAsync();
                }

                app.SendKey(new ConsoleKeyInfo(' ', ConsoleKey.Enter, false, false, false));
                await app.PaintAndRecordKeyFrameAsync();

                var enumValue = (await dialogPromise.AsAwaitable());
                Assert.AreEqual(ConsoleColor.DarkGreen, enumValue);
                app.Stop();
            });

            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
        public void TestScrollableContentBasic()
        {
            var app = new CliTestHarness(this.TestContext, 80, 10, true);

            app.SecondsBetweenKeyframes = .1f;
            app.LayoutRoot.Background   = RGB.Red;
            app.InvokeNextCycle(async() =>
            {
                // We want to have a stack panel that can scroll if it gets too bit

                // Step 1 - Create a scroll panel and size it how you like
                var scrollPanel = app.LayoutRoot.Add(new ScrollablePanel()
                {
                    Background = RGB.DarkBlue
                }).Fill();

                // Step 2 - Add scrollable content to the ScrollableContent container
                var stack = scrollPanel.ScrollableContent.Add(new StackPanel()
                {
                    Background = RGB.Yellow, AutoSize = true
                });

                // IMPORTANT - The ScrollableContent container is the thing that will scroll if it's bigger than the view
                //             so make sure it's height gets bigger as its content grows.
                stack.SubscribeForLifetime(nameof(stack.Bounds), () => scrollPanel.ScrollableContent.Height = stack.Height, stack);

                // Step 3 - Add 100 focusable rows to the stack panel. Making the rows focusable is critical since
                //          the scroll panel will automatically take care of scrolling to the currently focused control
                //          if that control is within the ScrollableContent.
                var rows = 100;
                for (var i = 1; i <= rows; i++)
                {
                    var label = stack.Add(new Label()
                    {
                        CanFocus = true, Text = $"row {i} of {rows}".ToWhite()
                    });
                    label.Focused.SubscribeForLifetime(() => label.Text = label.Text.ToCyan(), label);
                    label.Focused.SubscribeForLifetime(() => label.Text = label.Text.ToWhite(), label);
                }

                // Step 4 - Tab through all the rows. The scrollbar and scrollable content should automatically
                //        - keep the focused row in view.
                for (var i = 0; i < rows; i++)
                {
                    app.SendKey(new ConsoleKeyInfo('\t', ConsoleKey.Tab, false, false, false));
                    await app.PaintAndRecordKeyFrameAsync();
                }
                app.Stop();
            });

            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #6
0
        public void TestTextBoxBlinkState()
        {
            var app = new CliTestHarness(this.TestContext, 9, 1);

            app.LayoutRoot.Add(new TextBox()
            {
                Value = "SomeText".ToWhite()
            }).Fill();
            app.SetTimeout(() => app.Stop(), TimeSpan.FromSeconds(1.2));
            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #7
0
        public void RenderChartTestCommon(XYChartOptions options, int w = 80, int h = 30)
        {
            var app = new CliTestHarness(this.TestContext, w, h, true);

            app.InvokeNextCycle(() => app.LayoutRoot.Add(new XYChart(options)).Fill());
            app.InvokeNextCycle(async() =>
            {
                await app.Paint();
                app.RecordKeyFrame();
                app.Stop();
            });
            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #8
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();
        }
Beispiel #9
0
        public void TestPlaybackEndToEnd()
        {
            var app = new CliTestHarness(this.TestContext, 80, 30);

            app.InvokeNextCycle(async() =>
            {
                int w    = 10, h = 1;
                var temp = Path.GetTempFileName();
                using (var stream = File.OpenWrite(temp))
                {
                    var writer = new ConsoleBitmapVideoWriter(s => stream.Write(Encoding.Default.GetBytes(s)));
                    var bitmap = new ConsoleBitmap(w, h);

                    for (var i = 0; i < bitmap.Width; i++)
                    {
                        bitmap.Fill(new ConsoleCharacter(' '));
                        bitmap.DrawPoint(new ConsoleCharacter(' ', backgroundColor: ConsoleColor.Red), i, 0);
                        writer.WriteFrame(bitmap, true, TimeSpan.FromSeconds(.1 * i));
                    }
                    writer.Finish();
                }

                var player = app.LayoutRoot.Add(new ConsoleBitmapPlayer()).Fill();
                Assert.IsFalse(player.Width == 0);
                Assert.IsFalse(player.Height == 0);
                player.Load(File.OpenRead(temp));

                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);

                await Task.Delay(100);
                await app.SendKey(new ConsoleKeyInfo('p', ConsoleKey.P, false, false, false));
            });

            app.Start().Wait();
            Thread.Sleep(100);
            app.AssertThisTestMatchesLKGFirstAndLastFrame();
        }
Beispiel #10
0
        public void ShowYesConfirmation()
        {
            var app = new CliTestHarness(this.TestContext, 80, 20, true);

            app.QueueAction(async() =>
            {
                Promise dialogPromise;

                dialogPromise = Dialog.ShowYesConfirmation("Yes or no, no will be clicked");
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();
                Assert.IsFalse(dialogPromise.IsFulfilled);

                var noRejected = false;
                dialogPromise.Fail((ex) => noRejected = true);

                // simulate an enter keypress, which should clear the dialog, but should not trigger
                // the promise to resolve since yes was not chosen
                app.SendKey(new ConsoleKeyInfo(' ', ConsoleKey.Enter, false, false, false));
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();
                Assert.IsTrue(dialogPromise.IsFulfilled);
                Assert.IsTrue(noRejected); // the promise should reject on no

                dialogPromise = Dialog.ShowYesConfirmation("Yes or no, yes will be clicked");
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();
                Assert.IsFalse(dialogPromise.IsFulfilled);



                // give focus to the yes option
                app.SendKey(new ConsoleKeyInfo('\t', ConsoleKey.Tab, true, false, false));
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                // dismiss the dialog
                app.SendKey(new ConsoleKeyInfo(' ', ConsoleKey.Enter, false, false, false));
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();
                Assert.IsTrue(dialogPromise.IsFulfilled);
                app.Stop();
            });

            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #11
0
        public void TestMonthCalendarBasicRender()
        {
            var app = new CliTestHarness(this.TestContext, MonthCalendar.MinWidth, MonthCalendar.MinHeight, true);

            app.InvokeNextCycle(() => app.LayoutRoot.Add(new MonthCalendar(new MonthCalendarOptions()
            {
                Year = 2000, Month = 1
            })).Fill());
            app.InvokeNextCycle(async() =>
            {
                await app.RequestPaintAsync();
                app.RecordKeyFrame();
                app.Stop();
            });
            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #12
0
        public void TestRenderTextBox()
        {
            var app = new CliTestHarness(this.TestContext, 9, 1);

            app.InvokeNextCycle(async() =>
            {
                app.LayoutRoot.Add(new TextBox()
                {
                    Value = "SomeText".ToWhite()
                }).Fill();
                await app.RequestPaintAsync();
                Assert.IsTrue(app.Find("SomeText".ToWhite()).HasValue);
                app.Stop();
            });

            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #13
0
        public void TestRenderTextBox()
        {
            var app = new CliTestHarness(this.TestContext, 8, 1);

            app.QueueAction(() =>
            {
                app.LayoutRoot.Add(new TextBox()
                {
                    Value = "SomeText".ToWhite()
                }).Fill();
                app.Stop();
            });

            app.Start().Wait();
            Assert.IsTrue(app.Find("SomeText".ToWhite()).HasValue);

            app.AssertThisTestMatchesLKG();
        }
Beispiel #14
0
        public void TestThreeMonthCalendarBasicRender()
        {
            var app = new CliTestHarness(this.TestContext, 120, 40);

            app.Invoke(async() =>
            {
                var carousel = new ThreeMonthCarousel(new ThreeMonthCarouselOptions()
                {
                    Month = 1, Year = 2000
                });
                var start = carousel.Options.Month + "/" + carousel.Options.Year;
                app.LayoutRoot.Add(new FixedAspectRatioPanel(4f / 1f, carousel)).Fill();
                Assert.IsTrue(await carousel.SeekAsync(true, carousel.Options.AnimationDuration));
                await Task.Delay(1000);
                Assert.IsTrue(await carousel.SeekAsync(true, carousel.Options.AnimationDuration));
                await Task.Delay(1000);
                Assert.IsTrue(await carousel.SeekAsync(true, carousel.Options.AnimationDuration));
                await Task.Delay(1000);
                Assert.IsTrue(await carousel.SeekAsync(true, carousel.Options.AnimationDuration));

                await Task.Delay(3000);

                var now = carousel.Options.Month + "/" + carousel.Options.Year;
                Assert.AreNotEqual(start, now);

                Assert.IsTrue(await carousel.SeekAsync(false, carousel.Options.AnimationDuration));
                await Task.Delay(1000);
                Assert.IsTrue(await carousel.SeekAsync(false, carousel.Options.AnimationDuration));
                await Task.Delay(1000);
                Assert.IsTrue(await carousel.SeekAsync(false, carousel.Options.AnimationDuration));
                await Task.Delay(1000);
                Assert.IsTrue(await carousel.SeekAsync(false, carousel.Options.AnimationDuration));
                await Task.Delay(1000);

                now = carousel.Options.Month + "/" + carousel.Options.Year;
                Assert.AreEqual(start, now);
                app.Stop();
            });
            app.Run();
            app.AssertThisTestMatchesLKGFirstAndLastFrame();
        }
Beispiel #15
0
        public void TestDrawRect()
        {
            var bitmap = new ConsoleBitmap(80, 30);
            var app    = new CliTestHarness(TestContext, bitmap.Width, bitmap.Height, true);

            app.InvokeNextCycle(async() =>
            {
                app.LayoutRoot.Add(new BitmapControl()
                {
                    Bitmap = bitmap
                }).Fill();
                var pen = new ConsoleCharacter('X', ConsoleColor.Green);
                for (var i = 0; i < 500000; i++)
                {
                    bitmap.DrawRect(pen, 0, 0, bitmap.Width, bitmap.Height);
                }
                await app.PaintAndRecordKeyFrameAsync();
                app.Stop();
            });

            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #16
0
        public void TestMonthCalendarFocusAndNav()
        {
            var app = new CliTestHarness(this.TestContext, MonthCalendar.MinWidth, MonthCalendar.MinHeight, true);

            app.InvokeNextCycle(async() =>
            {
                var calendar = app.LayoutRoot.Add(new MonthCalendar(new MonthCalendarOptions()
                {
                    Year = 2000, Month = 1
                })).Fill();
                await app.PaintAndRecordKeyFrameAsync();
                calendar.TryFocus();
                await app.PaintAndRecordKeyFrameAsync();
                var fwInfo   = new ConsoleKeyInfo('a', calendar.Options.AdvanceMonthForwardKey.Key, false, false, false);
                var backInfo = new ConsoleKeyInfo('b', calendar.Options.AdvanceMonthBackwardKey.Key, false, false, false);
                await app.SendKey(backInfo);
                await app.PaintAndRecordKeyFrameAsync();
                await app.SendKey(fwInfo);
                await app.PaintAndRecordKeyFrameAsync();
                app.Stop();
            });
            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #17
0
        public void ShowMessageBasicString()
        {
            var app = new CliTestHarness(this.TestContext, 80, 20, true);

            app.InvokeNextCycle(async() =>
            {
                Task dialogTask;

                // show hello world message, wait for a paint, then take a keyframe of the screen, which
                // should have the dialog shown
                dialogTask = Dialog.ShowMessage("Hello world");
                await app.PaintAndRecordKeyFrameAsync();
                Assert.IsFalse(dialogTask.IsFulfilled());

                // simulate an enter keypress, which should clear the dialog
                app.SendKey(new ConsoleKeyInfo(' ', ConsoleKey.Enter, false, false, false));
                await app.PaintAndRecordKeyFrameAsync();
                await dialogTask;
                app.Stop();
            });

            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #18
0
        public async Task TestNormalizedProximity()
        {
            var app = new CliTestHarness(TestContext, 40, 40, true);

            app.InvokeNextCycle(async() =>
            {
                var a = app.LayoutRoot.Add(new ConsoleControl()
                {
                    Background = ConsoleColor.Red, Width = 1, Height = 1, X = 0, Y = 0
                });
                var b = app.LayoutRoot.Add(new ConsoleControl()
                {
                    Background = ConsoleColor.Green, Width = 1, Height = 1, X = 39, Y = 39
                });
                var d = Geometry.CalculateNormalizedDistanceTo(a, b);
                Console.WriteLine(d);
                await app.PaintAndRecordKeyFrameAsync();
                app.Stop();
            });

            await app.Start();

            app.AssertThisTestMatchesLKG();
        }
Beispiel #19
0
        public void TestDataGridBasic()
        {
            var items = new List <Item>();

            for (var i = 0; i < 100; i++)
            {
                items.Add(new Item()
                {
                    Bar = "Bar" + i,
                    Foo = "Foo" + i,
                });
            }

            var app = new CliTestHarness(TestContext, 80, 20, true)
            {
                SecondsBetweenKeyframes = .05
            };

            var dataGrid = new ListGrid <Item>(new ListGridOptions <Item>()
            {
                DataSource = new SyncList <Item>(items),
                Columns    = new List <ListGridColumnDefinition <Item> >()
                {
                    new ListGridColumnDefinition <Item>()
                    {
                        Header    = "Foo".ToGreen(),
                        Width     = .5,
                        Type      = GridValueType.Percentage,
                        Formatter = (item) => new Label()
                        {
                            Text = item.Foo.ToConsoleString()
                        }
                    },
                    new ListGridColumnDefinition <Item>()
                    {
                        Header    = "Bar".ToRed(),
                        Width     = .5,
                        Type      = GridValueType.Percentage,
                        Formatter = (item) => new Label()
                        {
                            Text = item.Bar.ToConsoleString()
                        }
                    }
                }
            });

            app.InvokeNextCycle(async() =>
            {
                var selectionLabel = app.LayoutRoot.Add(new Label()
                {
                    Text = "DEFAULT".ToConsoleString(), Height = 1
                }).CenterHorizontally();
                selectionLabel.Text = $"SelectedRowIndex: {dataGrid.SelectedRowIndex}, SelectedCellIndex: {dataGrid.SelectedColumnIndex}".ToConsoleString();
                dataGrid.SelectionChanged.SubscribeForLifetime(() =>
                {
                    selectionLabel.Text = $"SelectedRowIndex: {dataGrid.SelectedRowIndex}, SelectedCellIndex: {dataGrid.SelectedColumnIndex}".ToConsoleString();
                }, dataGrid);
                app.LayoutRoot.Add(dataGrid).Fill(padding: new Thickness(0, 0, 1, 0));
                await app.PaintAndRecordKeyFrameAsync();

                for (var i = 0; i < items.Count - 1; i++)
                {
                    await app.SendKey(new ConsoleKeyInfo(' ', ConsoleKey.DownArrow, false, false, false));
                    await app.PaintAndRecordKeyFrameAsync();
                }

                for (var i = 0; i < items.Count - 1; i++)
                {
                    await app.SendKey(new ConsoleKeyInfo(' ', ConsoleKey.UpArrow, false, false, false));
                    await app.PaintAndRecordKeyFrameAsync();
                }
                app.Stop();
            });

            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #20
0
        public void DrawLines()
        {
            var bitmap  = new ConsoleBitmap(80, 30);
            var centerX = bitmap.Width / 2;
            var centerY = bitmap.Height / 2;

            var app = new CliTestHarness(TestContext, bitmap.Width, bitmap.Height, true);

            app.QueueAction(async() =>
            {
                app.LayoutRoot.Add(new BitmapControl()
                {
                    Bitmap = bitmap
                }).Fill();
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.Gray);
                bitmap.DrawLine(centerX, centerY, 0, centerY / 2);
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.Red);
                bitmap.DrawLine(centerX, centerY, 0, 0);
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.Yellow);
                bitmap.DrawLine(centerX, centerY, centerX / 2, 0);
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.Green);
                bitmap.DrawLine(centerX, centerY, centerX, 0);
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.Magenta);
                bitmap.DrawLine(centerX, centerY, (int)(bitmap.Width * .75), 0);
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.Cyan);
                bitmap.DrawLine(centerX, centerY, bitmap.Width - 1, 0);
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.Gray);
                bitmap.DrawLine(centerX, centerY, bitmap.Width - 1, centerY / 2);
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.White);
                bitmap.DrawLine(centerX, centerY, 0, bitmap.Height / 2);
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.Blue);
                bitmap.DrawLine(centerX, centerY, bitmap.Width - 1, bitmap.Height / 2);
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.Gray);
                bitmap.DrawLine(centerX, centerY, 0, (int)(bitmap.Height * .75));
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.Red);
                bitmap.DrawLine(centerX, centerY, 0, bitmap.Height - 1);
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.Yellow);
                bitmap.DrawLine(centerX, centerY, centerX / 2, bitmap.Height - 1);
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.Green);
                bitmap.DrawLine(centerX, centerY, centerX, bitmap.Height - 1);
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.Magenta);
                bitmap.DrawLine(centerX, centerY, (int)(bitmap.Width * .75), bitmap.Height - 1);
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.Cyan);
                bitmap.DrawLine(centerX, centerY, bitmap.Width - 1, bitmap.Height - 1);
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();

                bitmap.Pen = new ConsoleCharacter('X', ConsoleColor.Gray);
                bitmap.DrawLine(centerX, centerY, bitmap.Width - 1, (int)(bitmap.Height * .75));

                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();
                app.Stop();
            });

            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #21
0
        public static async Task Test(int w, int h, TestContext testContext, Func <CliTestHarness, SpaceTimePanel, Task> test)
        {
            Exception stEx = null;
            var       app  = new CliTestHarness(testContext, w, h, true);

            app.SecondsBetweenKeyframes = DefaultTimeIncrement.TotalSeconds;
            app.InvokeNextCycle(async() =>
            {
                var d = new TaskCompletionSource <bool>();
                var spaceTimePanel = app.LayoutRoot.Add(new SpaceTimePanel(app.LayoutRoot.Width, app.LayoutRoot.Height));
                spaceTimePanel.SpaceTime.Increment = DefaultTimeIncrement;
                var stTask = spaceTimePanel.SpaceTime.Start();


                var justUpdated = false;
                spaceTimePanel.AfterUpdate.SubscribeForLifetime(() => justUpdated = true, app);

                app.AfterPaint.SubscribeForLifetime(() =>
                {
                    if (justUpdated)
                    {
                        app.RecordKeyFrame();
                        justUpdated = false;
                    }
                }, app);

                spaceTimePanel.SpaceTime.InvokeNextCycle(async() =>
                {
                    spaceTimePanel.RealTimeViewing.Enabled = false;
                    try
                    {
                        await test(app, spaceTimePanel);
                    }
                    catch (Exception ex)
                    {
                        stEx = ex;
                    }

                    await app.Paint();
                    d.SetResult(true);
                });

                await d.Task;
                try
                {
                    await stTask;
                }catch (Exception exc)
                {
                    spaceTimePanel.SpaceTime.Stop();
                    d.SetResult(true);
                    stEx = exc;
                }
                await spaceTimePanel.SpaceTime.YieldAsync();
                await app.PaintAndRecordKeyFrameAsync();
                spaceTimePanel.SpaceTime.Stop();

                await app.PaintAndRecordKeyFrameAsync();
                app.Stop();
            });

            await app.Start();

            if (stEx != null)
            {
                app.Abandon();
                Assert.Fail(stEx.ToString());
            }
            else
            {
                app.PromoteToLKG();
            }
        }
Beispiel #22
0
        public void TestDataGridProgrammaticSelection()
        {
            var items = new List <Item>();

            for (var i = 0; i < 100; i++)
            {
                items.Add(new Item()
                {
                    Bar = "Bar" + i,
                    Foo = "Foo" + i,
                });
            }

            var app = new CliTestHarness(TestContext, 80, 20, true)
            {
            };

            var dataGrid = new ListGrid <Item>(new ListGridOptions <Item>()
            {
                DataSource = new SyncList <Item>(items),
                Columns    = new List <ListGridColumnDefinition <Item> >()
                {
                    new ListGridColumnDefinition <Item>()
                    {
                        Header    = "Foo".ToGreen(),
                        Width     = 20,
                        Type      = GridValueType.Pixels,
                        Formatter = (item) => new Label()
                        {
                            Text = item.Foo.ToConsoleString()
                        }
                    },
                    new ListGridColumnDefinition <Item>()
                    {
                        Header    = "Bar".ToRed(),
                        Width     = 20,
                        Type      = GridValueType.Pixels,
                        Formatter = (item) => new Label()
                        {
                            Text = item.Bar.ToConsoleString()
                        }
                    }
                },
            });

            app.QueueAction(async() =>
            {
                var selectionLabel = app.LayoutRoot.Add(new Label()
                {
                    Text = "DEFAULT".ToConsoleString(), Height = 1
                }).CenterHorizontally();
                selectionLabel.Text = $"SelectedRowIndex: {dataGrid.SelectedRowIndex}, SelectedCellIndex: {dataGrid.SelectedColumnIndex}".ToConsoleString();
                dataGrid.SelectionChanged.SubscribeForLifetime(() =>
                {
                    selectionLabel.Text = $"SelectedRowIndex: {dataGrid.SelectedRowIndex}, SelectedCellIndex: {dataGrid.SelectedColumnIndex}".ToConsoleString();
                }, dataGrid);
                app.LayoutRoot.Add(dataGrid).Fill(padding: new Thickness(0, 0, 1, 0));
                await app.PaintAndRecordKeyFrameAsync();

                dataGrid.SelectedRowIndex = 1;
                await app.PaintAndRecordKeyFrameAsync();
                app.Stop();
            });

            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #23
0
        public void GridLayoutEndToEnd()
        {
            var app = new CliTestHarness(this.TestContext, 80, 20, true);

            var gridLayout = app.LayoutRoot.Add(new GridLayout(new GridLayoutOptions()
            {
                Columns = new List <GridColumnDefinition>()
                {
                    new GridColumnDefinition()
                    {
                        Width = 5, Type = GridValueType.Pixels
                    },
                    new GridColumnDefinition()
                    {
                        Width = 2, Type = GridValueType.RemainderValue
                    },
                    new GridColumnDefinition()
                    {
                        Width = 2, Type = GridValueType.RemainderValue
                    },
                },
                Rows = new List <GridRowDefinition>()
                {
                    new GridRowDefinition()
                    {
                        Height = 1, Type = GridValueType.Pixels
                    },
                    new GridRowDefinition()
                    {
                        Height = 2, Type = GridValueType.RemainderValue
                    },
                    new GridRowDefinition()
                    {
                        Height = 1, Type = GridValueType.Pixels
                    },
                }
            })).Fill();

            var colorWheel = new List <ConsoleColor>()
            {
                ConsoleColor.Red, ConsoleColor.DarkRed, ConsoleColor.Red,
                ConsoleColor.Black, ConsoleColor.White, ConsoleColor.Black,
                ConsoleColor.Green, ConsoleColor.DarkGreen, ConsoleColor.Green
            };
            var colorIndex = 0;

            for (var y = 0; y < gridLayout.NumRows; y++)
            {
                for (var x = 0; x < gridLayout.NumColumns; x++)
                {
                    gridLayout.Add(new ConsoleControl()
                    {
                        Background = colorWheel[colorIndex],
                    }, x, y);
                    colorIndex = colorIndex == colorWheel.Count - 1 ? 0 : colorIndex + 1;
                }
            }

            app.QueueAction(async() =>
            {
                await app.Paint().AsAwaitable();
                app.RecordKeyFrame();
                app.Stop();
            });

            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #24
0
        public void DrawLinesReverse()
        {
            var bitmap  = new ConsoleBitmap(80, 30);
            var centerX = bitmap.Width / 2;
            var centerY = bitmap.Height / 2;

            var app = new CliTestHarness(TestContext, bitmap.Width, bitmap.Height, true);

            app.InvokeNextCycle(async() =>
            {
                app.LayoutRoot.Add(new BitmapControl()
                {
                    Bitmap = bitmap
                }).Fill();
                await app.RequestPaintAsync();
                app.RecordKeyFrame();

                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.Gray), 0, centerY / 2, centerX, centerY);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();
                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.Red), 0, 0, centerX, centerY);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();
                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.Yellow), centerX / 2, 0, centerX, centerY);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();
                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.Green), centerX, centerY, centerX, 0);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();
                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.Magenta), (int)(bitmap.Width * .75), 0, centerX, centerY);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();
                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.Cyan), bitmap.Width - 1, 0, centerX, centerY);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();
                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.Gray), bitmap.Width - 1, centerY / 2, centerX, centerY);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();

                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.White), 0, bitmap.Height / 2, centerX, centerY);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();

                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.Blue), bitmap.Width - 1, bitmap.Height / 2, centerX, centerY);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();

                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.Gray), 0, (int)(bitmap.Height * .75), centerX, centerY);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();
                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.Red), 0, bitmap.Height - 1, centerX, centerY);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();

                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.Yellow), centerX / 2, bitmap.Height - 1, centerX, centerY);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();

                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.Green), centerX, bitmap.Height - 1, centerX, centerY);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();

                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.Magenta), (int)(bitmap.Width * .75), bitmap.Height - 1, centerX, centerY);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();

                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.Cyan), bitmap.Width - 1, bitmap.Height - 1, centerX, centerY);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();

                bitmap.DrawLine(new ConsoleCharacter('X', ConsoleColor.Gray), bitmap.Width - 1, (int)(bitmap.Height * .75), centerX, centerY);
                await app.RequestPaintAsync();
                app.RecordKeyFrame();
                app.Stop();
            });

            app.Start().Wait();
            app.AssertThisTestMatchesLKG();
        }
Beispiel #25
0
        private async Task TestCantGoThroughWalls(Direction d, CliTestHarness app, SpaceTimePanel stPanel)
        {
            SpacialAwareness.OnNudge.SubscribeForLifetime((ev) => Assert.Fail("Nudging not allowed"), app);
            var st   = stPanel.SpaceTime;
            var wall = st.Add(new SpacialElement()
            {
                BackgroundColor = RGB.DarkRed
            });
            ILocationF movingObjectLocation;
            float      movementAngle;
            float      expected;
            Func <SpacialElement, float> actual;

            if (d == Direction.Right)
            {
                movingObjectLocation = LocationF.Create((int)(st.Width * .25f), st.Height * .5f - .5f);
                movementAngle        = 0;
                wall.ResizeTo(.1f, st.Height);
                wall.MoveTo((int)(st.Width * .75f), 0);

                expected = wall.Left;
                actual   = m => m.Right();
            }
            else if (d == Direction.Left)
            {
                movingObjectLocation = LocationF.Create((int)(st.Width * .75f), st.Height * .5f - .5f);
                movementAngle        = 180;
                wall.ResizeTo(.1f, st.Height);
                wall.MoveTo((int)(st.Width * .25f) - .1f, 0);

                expected = wall.Right();
                actual   = m => m.Left;
            }
            else if (d == Direction.Up)
            {
                movingObjectLocation = LocationF.Create(st.Width * .5f - .5f, (int)(st.Height * .75f));
                movementAngle        = 270;
                wall.ResizeTo(st.Width, .1f);
                wall.MoveTo(0, (int)(st.Height * .25f) - .1f);

                expected = wall.Bottom();
                actual   = m => m.Top;
            }
            else if (d == Direction.Down)
            {
                movingObjectLocation = LocationF.Create(st.Width * .5f - .5f, (int)(st.Height * .25f));
                movementAngle        = 90;
                wall.ResizeTo(st.Width, .1f);
                wall.MoveTo(0, (int)(st.Height * .75f));

                expected = wall.Top;
                actual   = m => m.Bottom();
            }
            else
            {
                throw new NotSupportedException();
            }

            for (var speed = 5; speed < 1000; speed *= 2)
            {
                Console.WriteLine($"Speed: {speed}");
                var movingObject = st.Add(new SpacialElement(1, 1, movingObjectLocation.Left, movingObjectLocation.Top)
                {
                    BackgroundColor = RGB.Blue
                });
                var v = new Velocity(movingObject);
                await st.DelayAsync(500);

                v.Angle = movementAngle;
                v.Speed = speed;
                await st.DelayAsync(20000);

                PhysicsTest.AssertClose(expected, actual(movingObject), .2f);
                Console.WriteLine($"Wall.Left == {expected}, movingObject.Right() == {actual(movingObject)}");
                movingObject.Lifetime.Dispose();
            }
        }