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