skipped 234 lines 235 235 wantErr: true, 236 236 }, 237 237 { 238 + desc: "fails when Row heightPerc used under Row heightFixed", 239 + termSize: image.Point{10, 10}, 240 + builder: func() *Builder { 241 + b := New() 242 + b.Add( 243 + RowHeightFixed( 244 + 5, 245 + RowHeightPerc(10), 246 + ), 247 + ) 248 + return b 249 + }(), 250 + wantErr: true, 251 + }, 252 + { 253 + desc: "fails when Row heightPerc used under Col widthFixed", 254 + termSize: image.Point{10, 10}, 255 + builder: func() *Builder { 256 + b := New() 257 + b.Add( 258 + ColWidthFixed( 259 + 5, 260 + RowHeightPerc(10), 261 + ), 262 + ) 263 + return b 264 + }(), 265 + wantErr: true, 266 + }, 267 + { 238 268 desc: "fails when Col widthPerc is too low at top level", 239 269 termSize: image.Point{10, 10}, 240 270 builder: func() *Builder { skipped 48 lines 289 319 wantErr: true, 290 320 }, 291 321 { 322 + desc: "fails when Col widthPerc used under Col widthFixed", 323 + termSize: image.Point{10, 10}, 324 + builder: func() *Builder { 325 + b := New() 326 + b.Add( 327 + ColWidthFixed( 328 + 5, 329 + ColWidthPerc(10), 330 + ), 331 + ) 332 + return b 333 + }(), 334 + wantErr: true, 335 + }, 336 + { 337 + desc: "fails when Col widthPerc used under Row heightFixed", 338 + termSize: image.Point{10, 10}, 339 + builder: func() *Builder { 340 + b := New() 341 + b.Add( 342 + RowHeightFixed( 343 + 5, 344 + ColWidthPerc(10), 345 + ), 346 + ) 347 + return b 348 + }(), 349 + wantErr: true, 350 + }, 351 + { 292 352 desc: "fails when height sum is too large at top level", 293 353 termSize: image.Point{10, 10}, 294 354 builder: func() *Builder { skipped 95 lines 390 450 }, 391 451 }, 392 452 { 453 + desc: "two equal rows, fixed size", 454 + termSize: image.Point{10, 10}, 455 + builder: func() *Builder { 456 + b := New() 457 + b.Add(RowHeightFixed(5, Widget(mirror()))) 458 + b.Add(RowHeightFixed(5, Widget(mirror()))) 459 + return b 460 + }(), 461 + want: func(size image.Point) *faketerm.Terminal { 462 + ft := faketerm.MustNew(size) 463 + top, bot := mustHSplit(ft.Area(), 50) 464 + fakewidget.MustDraw(ft, testcanvas.MustNew(top), &widgetapi.Meta{}, widgetapi.Options{}) 465 + fakewidget.MustDraw(ft, testcanvas.MustNew(bot), &widgetapi.Meta{}, widgetapi.Options{}) 466 + return ft 467 + }, 468 + }, 469 + { 393 470 desc: "two equal rows with options", 394 471 termSize: image.Point{10, 10}, 395 472 builder: func() *Builder { skipped 33 lines 429 506 }, 430 507 }, 431 508 { 509 + desc: "two equal rows with options, fixed size", 510 + termSize: image.Point{10, 10}, 511 + builder: func() *Builder { 512 + b := New() 513 + b.Add(RowHeightFixedWithOpts( 514 + 5, 515 + []container.Option{ 516 + container.Border(linestyle.Double), 517 + }, 518 + Widget(mirror()), 519 + )) 520 + b.Add(RowHeightFixedWithOpts( 521 + 5, 522 + []container.Option{ 523 + container.Border(linestyle.Double), 524 + }, 525 + Widget(mirror()), 526 + )) 527 + return b 528 + }(), 529 + want: func(size image.Point) *faketerm.Terminal { 530 + ft := faketerm.MustNew(size) 531 + 532 + top, bot := mustHSplit(ft.Area(), 50) 533 + topCvs := testcanvas.MustNew(top) 534 + botCvs := testcanvas.MustNew(bot) 535 + testdraw.MustBorder(topCvs, topCvs.Area(), draw.BorderLineStyle(linestyle.Double)) 536 + testdraw.MustBorder(botCvs, botCvs.Area(), draw.BorderLineStyle(linestyle.Double)) 537 + testcanvas.MustApply(topCvs, ft) 538 + testcanvas.MustApply(botCvs, ft) 539 + 540 + topWidget := testcanvas.MustNew(area.ExcludeBorder(top)) 541 + botWidget := testcanvas.MustNew(area.ExcludeBorder(bot)) 542 + fakewidget.MustDraw(ft, topWidget, &widgetapi.Meta{}, widgetapi.Options{}) 543 + fakewidget.MustDraw(ft, botWidget, &widgetapi.Meta{}, widgetapi.Options{}) 544 + return ft 545 + }, 546 + }, 547 + { 432 548 desc: "two unequal rows", 433 549 termSize: image.Point{10, 10}, 434 550 builder: func() *Builder { skipped 11 lines 446 562 }, 447 563 }, 448 564 { 565 + desc: "two unequal rows, fixed size", 566 + termSize: image.Point{10, 10}, 567 + builder: func() *Builder { 568 + b := New() 569 + b.Add(RowHeightFixed(2, Widget(mirror()))) 570 + b.Add(RowHeightFixed(8, Widget(mirror()))) 571 + return b 572 + }(), 573 + want: func(size image.Point) *faketerm.Terminal { 574 + ft := faketerm.MustNew(size) 575 + top, bot := mustHSplit(ft.Area(), 20) 576 + fakewidget.MustDraw(ft, testcanvas.MustNew(top), &widgetapi.Meta{}, widgetapi.Options{}) 577 + fakewidget.MustDraw(ft, testcanvas.MustNew(bot), &widgetapi.Meta{}, widgetapi.Options{}) 578 + return ft 579 + }, 580 + }, 581 + { 582 + desc: "two equal columns", 583 + termSize: image.Point{20, 10}, 584 + builder: func() *Builder { 585 + b := New() 586 + b.Add(ColWidthPerc(50, Widget(mirror()))) 587 + b.Add(ColWidthPerc(50, Widget(mirror()))) 588 + return b 589 + }(), 590 + want: func(size image.Point) *faketerm.Terminal { 591 + ft := faketerm.MustNew(size) 592 + left, right := mustVSplit(ft.Area(), 50) 593 + fakewidget.MustDraw(ft, testcanvas.MustNew(left), &widgetapi.Meta{}, widgetapi.Options{}) 594 + fakewidget.MustDraw(ft, testcanvas.MustNew(right), &widgetapi.Meta{}, widgetapi.Options{}) 595 + return ft 596 + }, 597 + }, 598 + { 599 + desc: "two equal columns, fixed size", 600 + termSize: image.Point{20, 10}, 601 + builder: func() *Builder { 602 + b := New() 603 + b.Add(ColWidthFixed(10, Widget(mirror()))) 604 + b.Add(ColWidthFixed(10, Widget(mirror()))) 605 + return b 606 + }(), 607 + want: func(size image.Point) *faketerm.Terminal { 608 + ft := faketerm.MustNew(size) 609 + left, right := mustVSplit(ft.Area(), 50) 610 + fakewidget.MustDraw(ft, testcanvas.MustNew(left), &widgetapi.Meta{}, widgetapi.Options{}) 611 + fakewidget.MustDraw(ft, testcanvas.MustNew(right), &widgetapi.Meta{}, widgetapi.Options{}) 612 + return ft 613 + }, 614 + }, 615 + { 449 616 desc: "two equal columns with options", 450 617 termSize: image.Point{20, 10}, 451 618 builder: func() *Builder { skipped 33 lines 485 652 }, 486 653 }, 487 654 { 488 - desc: "two equal columns", 655 + desc: "two equal columns with options , fixed size ", 489 656 termSize: image.Point{20, 10}, 490 657 builder: func() *Builder { 491 658 b := New() 492 - b.Add(ColWidthPerc(50, Widget(mirror()))) 493 - b.Add(ColWidthPerc(50, Widget(mirror()))) 659 + b.Add(ColWidthFixedWithOpts( 660 + 10, 661 + []container.Option{ 662 + container.Border(linestyle.Double), 663 + }, 664 + Widget(mirror()), 665 + )) 666 + b.Add(ColWidthFixedWithOpts( 667 + 10, 668 + []container.Option{ 669 + container.Border(linestyle.Double), 670 + }, 671 + Widget(mirror()), 672 + )) 494 673 return b 495 674 }(), 496 675 want: func(size image.Point) *faketerm.Terminal { 497 676 ft := faketerm.MustNew(size) 677 + 498 678 left, right := mustVSplit(ft.Area(), 50) 499 - fakewidget.MustDraw(ft, testcanvas.MustNew(left), &widgetapi.Meta{}, widgetapi.Options{}) 500 - fakewidget.MustDraw(ft, testcanvas.MustNew(right), &widgetapi.Meta{}, widgetapi.Options{}) 679 + leftCvs := testcanvas.MustNew(left) 680 + rightCvs := testcanvas.MustNew(right) 681 + testdraw.MustBorder(leftCvs, leftCvs.Area(), draw.BorderLineStyle(linestyle.Double)) 682 + testdraw.MustBorder(rightCvs, rightCvs.Area(), draw.BorderLineStyle(linestyle.Double)) 683 + testcanvas.MustApply(leftCvs, ft) 684 + testcanvas.MustApply(rightCvs, ft) 685 + 686 + leftWidget := testcanvas.MustNew(area.ExcludeBorder(left)) 687 + rightWidget := testcanvas.MustNew(area.ExcludeBorder(right)) 688 + fakewidget.MustDraw(ft, leftWidget, &widgetapi.Meta{}, widgetapi.Options{}) 689 + fakewidget.MustDraw(ft, rightWidget, &widgetapi.Meta{}, widgetapi.Options{}) 501 690 return ft 502 691 }, 503 692 }, skipped 4 lines 508 697 b := New() 509 698 b.Add(ColWidthPerc(20, Widget(mirror()))) 510 699 b.Add(ColWidthPerc(80, Widget(mirror()))) 700 + return b 701 + }(), 702 + want: func(size image.Point) *faketerm.Terminal { 703 + ft := faketerm.MustNew(size) 704 + left, right := mustVSplit(ft.Area(), 20) 705 + fakewidget.MustDraw(ft, testcanvas.MustNew(left), &widgetapi.Meta{}, widgetapi.Options{}) 706 + fakewidget.MustDraw(ft, testcanvas.MustNew(right), &widgetapi.Meta{}, widgetapi.Options{}) 707 + return ft 708 + }, 709 + }, 710 + { 711 + desc: "two unequal columns, fixed size", 712 + termSize: image.Point{40, 10}, 713 + builder: func() *Builder { 714 + b := New() 715 + b.Add(ColWidthFixed(8, Widget(mirror()))) 716 + b.Add(ColWidthFixed(32, Widget(mirror()))) 511 717 return b 512 718 }(), 513 719 want: func(size image.Point) *faketerm.Terminal { skipped 46 lines 560 766 20, 561 767 ColWidthPerc(20, Widget(mirror())), 562 768 ColWidthPerc(80, Widget(mirror())), 769 + ), 770 + RowHeightPerc( 771 + 80, 772 + ColWidthPerc(80, Widget(mirror())), 773 + ColWidthPerc(20, Widget(mirror())), 774 + ), 775 + ) 776 + return b 777 + }(), 778 + want: func(size image.Point) *faketerm.Terminal { 779 + ft := faketerm.MustNew(size) 780 + top, bot := mustHSplit(ft.Area(), 20) 781 + 782 + topLeft, topRight := mustVSplit(top, 20) 783 + botLeft, botRight := mustVSplit(bot, 80) 784 + fakewidget.MustDraw(ft, testcanvas.MustNew(topLeft), &widgetapi.Meta{}, widgetapi.Options{}) 785 + fakewidget.MustDraw(ft, testcanvas.MustNew(topRight), &widgetapi.Meta{}, widgetapi.Options{}) 786 + fakewidget.MustDraw(ft, testcanvas.MustNew(botLeft), &widgetapi.Meta{}, widgetapi.Options{}) 787 + fakewidget.MustDraw(ft, testcanvas.MustNew(botRight), &widgetapi.Meta{}, widgetapi.Options{}) 788 + return ft 789 + }, 790 + }, 791 + { 792 + desc: "rows with columns (unequal), fixed and relative sizes mixed", 793 + termSize: image.Point{40, 20}, 794 + builder: func() *Builder { 795 + b := New() 796 + b.Add( 797 + RowHeightFixed( 798 + 4, 799 + ColWidthFixed(8, Widget(mirror())), 800 + ColWidthFixed(32, Widget(mirror())), 563 801 ), 564 802 RowHeightPerc( 565 803 80, skipped 234 lines 800 1038 801 1039 gridOpts, err := tc.builder.Build() 802 1040 if (err != nil) != tc.wantErr { 803 - t.Errorf("tc.builder => unexpected error:%v, wantErr:%v", err, tc.wantErr) 1041 + t.Errorf("tc.builder => unexpected error: %v, wantErr:%v", err, tc.wantErr) 804 1042 } 805 1043 if err != nil { 806 1044 return skipped 27 lines