mirror of
				https://github.com/nsnail/spectre.console.git
				synced 2025-11-04 02:25:28 +08:00 
			
		
		
		
	Add Layout widget (#1041)
* Add width to panels * Add height to panels * Replace RenderContext with RenderOptions * Remove exclusivity from alternative buffer * Add Layout widget * Add Align widget
This commit is contained in:
		@@ -0,0 +1,15 @@
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
            ┌──────────────┐            
 | 
			
		||||
            │ Hello World! │            
 | 
			
		||||
            └──────────────┘            
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
            ┌──────────────┐            
 | 
			
		||||
            │ Hello World! │            
 | 
			
		||||
            └──────────────┘            
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
            ┌──────────────┐            
 | 
			
		||||
            │ Hello World! │            
 | 
			
		||||
            └──────────────┘            
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
┌──────────────┐                        
 | 
			
		||||
│ Hello World! │                        
 | 
			
		||||
└──────────────┘                        
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
┌──────────────┐                        
 | 
			
		||||
│ Hello World! │                        
 | 
			
		||||
└──────────────┘                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
┌──────────────┐                        
 | 
			
		||||
│ Hello World! │                        
 | 
			
		||||
└──────────────┘                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                        ┌──────────────┐
 | 
			
		||||
                        │ Hello World! │
 | 
			
		||||
                        └──────────────┘
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                        ┌──────────────┐
 | 
			
		||||
                        │ Hello World! │
 | 
			
		||||
                        └──────────────┘
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
                        ┌──────────────┐
 | 
			
		||||
                        │ Hello World! │
 | 
			
		||||
                        └──────────────┘
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
                                        
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
╭─40 x 15──────────────────────────────╮
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
│             Placeholder              │
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
╰──────────────────────────────────────╯
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
╭─T1 (40 x 7)──────────────────────────╮
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
│             Placeholder              │
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
╰──────────────────────────────────────╯
 | 
			
		||||
╭─T2 (40 x 8)──────────────────────────╮
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
│             Placeholder              │
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
╰──────────────────────────────────────╯
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
╔══════════════════════════════════════╗
 | 
			
		||||
║ Hello                                ║
 | 
			
		||||
║                                      ║
 | 
			
		||||
║                                      ║
 | 
			
		||||
║                                      ║
 | 
			
		||||
║                                      ║
 | 
			
		||||
║                                      ║
 | 
			
		||||
║                                      ║
 | 
			
		||||
║                                      ║
 | 
			
		||||
║                                      ║
 | 
			
		||||
║                                      ║
 | 
			
		||||
║                                      ║
 | 
			
		||||
║                                      ║
 | 
			
		||||
║                                      ║
 | 
			
		||||
╚══════════════════════════════════════╝
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
╭─Left (20 x 15)───╮╭─Right (20 x 15)──╮
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
│   Placeholder    ││   Placeholder    │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
╰──────────────────╯╰──────────────────╯
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
╭─L1…────╮╭─L2…────╮╭─R1…────╮╭─R2…────╮
 | 
			
		||||
│        ││        ││        ││        │
 | 
			
		||||
│        ││        ││        ││        │
 | 
			
		||||
│        ││        ││        ││        │
 | 
			
		||||
│        ││        ││        ││        │
 | 
			
		||||
│        ││        ││        ││        │
 | 
			
		||||
│ Placeh ││ Placeh ││ Placeh ││ Placeh │
 | 
			
		||||
│ older  ││ older  ││ older  ││ older  │
 | 
			
		||||
│        ││        ││        ││        │
 | 
			
		||||
│        ││        ││        ││        │
 | 
			
		||||
│        ││        ││        ││        │
 | 
			
		||||
│        ││        ││        ││        │
 | 
			
		||||
│        ││        ││        ││        │
 | 
			
		||||
│        ││        ││        ││        │
 | 
			
		||||
╰────────╯╰────────╯╰────────╯╰────────╯
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
╭─T1 (40 x 3)──────────────────────────╮
 | 
			
		||||
│             Placeholder              │
 | 
			
		||||
╰──────────────────────────────────────╯
 | 
			
		||||
╭─T2 (40 x 4)──────────────────────────╮
 | 
			
		||||
│             Placeholder              │
 | 
			
		||||
│                                      │
 | 
			
		||||
╰──────────────────────────────────────╯
 | 
			
		||||
╭─B1 (40 x 4)──────────────────────────╮
 | 
			
		||||
│             Placeholder              │
 | 
			
		||||
│                                      │
 | 
			
		||||
╰──────────────────────────────────────╯
 | 
			
		||||
╭─B2 (40 x 4)──────────────────────────╮
 | 
			
		||||
│             Placeholder              │
 | 
			
		||||
│                                      │
 | 
			
		||||
╰──────────────────────────────────────╯
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
╭─A (20 x 3)───────╮╭─B (20 x 3)───────╮
 | 
			
		||||
│   Placeholder    ││   Placeholder    │
 | 
			
		||||
╰──────────────────╯╰──────────────────╯
 | 
			
		||||
╭─C (20 x 4)───────╮╭─D (20 x 4)───────╮
 | 
			
		||||
│   Placeholder    ││   Placeholder    │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
╰──────────────────╯╰──────────────────╯
 | 
			
		||||
╭─E (20 x 4)───────╮╭─F (20 x 4)───────╮
 | 
			
		||||
│   Placeholder    ││   Placeholder    │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
╰──────────────────╯╰──────────────────╯
 | 
			
		||||
╭─G (20 x 4)───────╮╭─H (20 x 4)───────╮
 | 
			
		||||
│   Placeholder    ││   Placeholder    │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
╰──────────────────╯╰──────────────────╯
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
╭─Left (30 x 15)─────────────╮╭─Right…─╮
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││ Placeh │
 | 
			
		||||
│        Placeholder         ││ older  │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
╰────────────────────────────╯╰────────╯
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
╭─Left (30 x 15)─────────────╮╭─Right…─╮
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││ Placeh │
 | 
			
		||||
│        Placeholder         ││ older  │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
│                            ││        │
 | 
			
		||||
╰────────────────────────────╯╰────────╯
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
╭─Left (28 x 15)───────────╮╭─Right…───╮
 | 
			
		||||
│                          ││          │
 | 
			
		||||
│                          ││          │
 | 
			
		||||
│                          ││          │
 | 
			
		||||
│                          ││          │
 | 
			
		||||
│                          ││          │
 | 
			
		||||
│                          ││ Placehol │
 | 
			
		||||
│       Placeholder        ││   der    │
 | 
			
		||||
│                          ││          │
 | 
			
		||||
│                          ││          │
 | 
			
		||||
│                          ││          │
 | 
			
		||||
│                          ││          │
 | 
			
		||||
│                          ││          │
 | 
			
		||||
│                          ││          │
 | 
			
		||||
╰──────────────────────────╯╰──────────╯
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
╭─Top (40 x 7)─────────────────────────╮
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
│             Placeholder              │
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
╰──────────────────────────────────────╯
 | 
			
		||||
╭─Bottom (40 x 8)──────────────────────╮
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
│             Placeholder              │
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
│                                      │
 | 
			
		||||
╰──────────────────────────────────────╯
 | 
			
		||||
@@ -0,0 +1,15 @@
 | 
			
		||||
╭─B (40 x 3)───────────────────────────╮
 | 
			
		||||
│             Placeholder              │
 | 
			
		||||
╰──────────────────────────────────────╯
 | 
			
		||||
╭─C (20 x 4)───────╮╭─D (20 x 4)───────╮
 | 
			
		||||
│   Placeholder    ││   Placeholder    │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
╰──────────────────╯╰──────────────────╯
 | 
			
		||||
╭─E (20 x 4)───────╮╭─F (20 x 4)───────╮
 | 
			
		||||
│   Placeholder    ││   Placeholder    │
 | 
			
		||||
│                  ││                  │
 | 
			
		||||
╰──────────────────╯╰──────────────────╯
 | 
			
		||||
╭─G (40 x 4)───────────────────────────╮
 | 
			
		||||
│             Placeholder              │
 | 
			
		||||
│                                      │
 | 
			
		||||
╰──────────────────────────────────────╯
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
┌───────────────────┐
 | 
			
		||||
│ Hello World       │
 | 
			
		||||
│ Hello Hello Hello │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
│                   │
 | 
			
		||||
└───────────────────┘
 | 
			
		||||
@@ -0,0 +1,3 @@
 | 
			
		||||
┌───────────────────────┐
 | 
			
		||||
│ Hello World           │
 | 
			
		||||
└───────────────────────┘
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
┌────────────────────────────────────────────────┐
 | 
			
		||||
│ Hello World                                    │
 | 
			
		||||
│ Hello Hello Hello                              │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
│                                                │
 | 
			
		||||
└────────────────────────────────────────────────┘
 | 
			
		||||
@@ -0,0 +1,3 @@
 | 
			
		||||
┌──────────────────┐
 | 
			
		||||
│ Hello World      │
 | 
			
		||||
└──────────────────┘
 | 
			
		||||
@@ -0,0 +1,6 @@
 | 
			
		||||
                          ┌────────┬────────┬───────┐                           
 | 
			
		||||
                          │ Foo    │ Bar    │ Baz   │                           
 | 
			
		||||
                          ├────────┼────────┼───────┤                           
 | 
			
		||||
                          │ Qux    │ Corgi  │ Waldo │                           
 | 
			
		||||
                          │ Grault │ Garply │ Fred  │                           
 | 
			
		||||
                          └────────┴────────┴───────┘                           
 | 
			
		||||
@@ -0,0 +1,6 @@
 | 
			
		||||
┌────────┬────────┬───────┐                                                     
 | 
			
		||||
│ Foo    │ Bar    │ Baz   │                                                     
 | 
			
		||||
├────────┼────────┼───────┤                                                     
 | 
			
		||||
│ Qux    │ Corgi  │ Waldo │                                                     
 | 
			
		||||
│ Grault │ Garply │ Fred  │                                                     
 | 
			
		||||
└────────┴────────┴───────┘                                                     
 | 
			
		||||
@@ -0,0 +1,6 @@
 | 
			
		||||
                                                     ┌────────┬────────┬───────┐
 | 
			
		||||
                                                     │ Foo    │ Bar    │ Baz   │
 | 
			
		||||
                                                     ├────────┼────────┼───────┤
 | 
			
		||||
                                                     │ Qux    │ Corgi  │ Waldo │
 | 
			
		||||
                                                     │ Grault │ Garply │ Fred  │
 | 
			
		||||
                                                     └────────┴────────┴───────┘
 | 
			
		||||
@@ -1,8 +1,7 @@
 | 
			
		||||
<Project Sdk="Microsoft.NET.Sdk">
 | 
			
		||||
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('Windows'))">net7.0;net48</TargetFrameworks>
 | 
			
		||||
    <TargetFrameworks Condition="!$([MSBuild]::IsOSPlatform('Windows'))">net7.0</TargetFrameworks>
 | 
			
		||||
    <TargetFrameworks>net7.0</TargetFrameworks>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ public sealed class ProgressColumnFixture<T>
 | 
			
		||||
    public string Render()
 | 
			
		||||
    {
 | 
			
		||||
        var console = new TestConsole();
 | 
			
		||||
        var context = new RenderContext(console.Profile.Capabilities);
 | 
			
		||||
        var context = RenderOptions.Create(console, console.Profile.Capabilities);
 | 
			
		||||
        console.Write(Column.Render(context, Task, TimeSpan.Zero));
 | 
			
		||||
        return console.Output;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@ public sealed class RenderHookTests
 | 
			
		||||
{
 | 
			
		||||
    private sealed class HelloRenderHook : IRenderHook
 | 
			
		||||
    {
 | 
			
		||||
        public IEnumerable<IRenderable> Process(RenderContext context, IEnumerable<IRenderable> renderables)
 | 
			
		||||
        public IEnumerable<IRenderable> Process(RenderOptions options, IEnumerable<IRenderable> renderables)
 | 
			
		||||
        {
 | 
			
		||||
            return new IRenderable[] { new Text("Hello\n") }.Concat(renderables);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										155
									
								
								test/Spectre.Console.Tests/Unit/Widgets/AlignTests.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								test/Spectre.Console.Tests/Unit/Widgets/AlignTests.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,155 @@
 | 
			
		||||
using Spectre.Console.Extensions;
 | 
			
		||||
 | 
			
		||||
namespace Spectre.Console.Tests.Unit;
 | 
			
		||||
 | 
			
		||||
[UsesVerify]
 | 
			
		||||
[ExpectationPath("Widgets/Align")]
 | 
			
		||||
public sealed class AlignTests
 | 
			
		||||
{
 | 
			
		||||
    [UsesVerify]
 | 
			
		||||
    public sealed class Left
 | 
			
		||||
    {
 | 
			
		||||
        [Fact]
 | 
			
		||||
        [Expectation("Left_Top")]
 | 
			
		||||
        public Task Should_Render_Panel_Left_Aligned_At_Top()
 | 
			
		||||
        {
 | 
			
		||||
            // Given
 | 
			
		||||
            var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
            var align = Align.Left(new Panel("Hello World!"), VerticalAlignment.Top).Height(15);
 | 
			
		||||
 | 
			
		||||
            // When
 | 
			
		||||
            console.Write(align);
 | 
			
		||||
 | 
			
		||||
            // Then
 | 
			
		||||
            return Verifier.Verify(console.Output);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        [Expectation("Left_Middle")]
 | 
			
		||||
        public Task Should_Render_Panel_Left_Aligned_At_Middle()
 | 
			
		||||
        {
 | 
			
		||||
            // Given
 | 
			
		||||
            var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
            var align = Align.Left(new Panel("Hello World!"), VerticalAlignment.Middle).Height(15);
 | 
			
		||||
 | 
			
		||||
            // When
 | 
			
		||||
            console.Write(align);
 | 
			
		||||
 | 
			
		||||
            // Then
 | 
			
		||||
            return Verifier.Verify(console.Output);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        [Expectation("Left_Bottom")]
 | 
			
		||||
        public Task Should_Render_Panel_Left_Aligned_At_Bottom()
 | 
			
		||||
        {
 | 
			
		||||
            // Given
 | 
			
		||||
            var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
            var align = Align.Left(new Panel("Hello World!"), VerticalAlignment.Bottom).Height(15);
 | 
			
		||||
 | 
			
		||||
            // When
 | 
			
		||||
            console.Write(align);
 | 
			
		||||
 | 
			
		||||
            // Then
 | 
			
		||||
            return Verifier.Verify(console.Output);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [UsesVerify]
 | 
			
		||||
    public sealed class Center
 | 
			
		||||
    {
 | 
			
		||||
        [Fact]
 | 
			
		||||
        [Expectation("Center_Top")]
 | 
			
		||||
        public Task Should_Render_Panel_Center_Aligned_At_Top()
 | 
			
		||||
        {
 | 
			
		||||
            // Given
 | 
			
		||||
            var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
            var align = Align.Center(new Panel("Hello World!"), VerticalAlignment.Top).Height(15);
 | 
			
		||||
 | 
			
		||||
            // When
 | 
			
		||||
            console.Write(align);
 | 
			
		||||
 | 
			
		||||
            // Then
 | 
			
		||||
            return Verifier.Verify(console.Output);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        [Expectation("Center_Middle")]
 | 
			
		||||
        public Task Should_Render_Panel_Center_Aligned_At_Middle()
 | 
			
		||||
        {
 | 
			
		||||
            // Given
 | 
			
		||||
            var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
            var align = Align.Center(new Panel("Hello World!"), VerticalAlignment.Middle).Height(15);
 | 
			
		||||
 | 
			
		||||
            // When
 | 
			
		||||
            console.Write(align);
 | 
			
		||||
 | 
			
		||||
            // Then
 | 
			
		||||
            return Verifier.Verify(console.Output);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        [Expectation("Center_Bottom")]
 | 
			
		||||
        public Task Should_Render_Panel_Center_Aligned_At_Bottom()
 | 
			
		||||
        {
 | 
			
		||||
            // Given
 | 
			
		||||
            var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
            var align = Align.Center(new Panel("Hello World!"), VerticalAlignment.Bottom).Height(15);
 | 
			
		||||
 | 
			
		||||
            // When
 | 
			
		||||
            console.Write(align);
 | 
			
		||||
 | 
			
		||||
            // Then
 | 
			
		||||
            return Verifier.Verify(console.Output);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [UsesVerify]
 | 
			
		||||
    public sealed class Right
 | 
			
		||||
    {
 | 
			
		||||
        [Fact]
 | 
			
		||||
        [Expectation("Right_Top")]
 | 
			
		||||
        public Task Should_Render_Panel_Right_Aligned_At_Top()
 | 
			
		||||
        {
 | 
			
		||||
            // Given
 | 
			
		||||
            var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
            var align = Align.Right(new Panel("Hello World!"), VerticalAlignment.Top).Height(15);
 | 
			
		||||
 | 
			
		||||
            // When
 | 
			
		||||
            console.Write(align);
 | 
			
		||||
 | 
			
		||||
            // Then
 | 
			
		||||
            return Verifier.Verify(console.Output);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        [Expectation("Right_Middle")]
 | 
			
		||||
        public Task Should_Render_Panel_Right_Aligned_At_Middle()
 | 
			
		||||
        {
 | 
			
		||||
            // Given
 | 
			
		||||
            var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
            var align = Align.Right(new Panel("Hello World!"), VerticalAlignment.Middle).Height(15);
 | 
			
		||||
 | 
			
		||||
            // When
 | 
			
		||||
            console.Write(align);
 | 
			
		||||
 | 
			
		||||
            // Then
 | 
			
		||||
            return Verifier.Verify(console.Output);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        [Expectation("Right_Bottom")]
 | 
			
		||||
        public Task Should_Render_Panel_Right_Aligned_At_Bottom()
 | 
			
		||||
        {
 | 
			
		||||
            // Given
 | 
			
		||||
            var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
            var align = Align.Right(new Panel("Hello World!"), VerticalAlignment.Bottom).Height(15);
 | 
			
		||||
 | 
			
		||||
            // When
 | 
			
		||||
            console.Write(align);
 | 
			
		||||
 | 
			
		||||
            // Then
 | 
			
		||||
            return Verifier.Verify(console.Output);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -60,7 +60,7 @@ public sealed class FigletTests
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole().Width(120);
 | 
			
		||||
        var text = new FigletText(FigletFont.Default, "Spectre.Console")
 | 
			
		||||
            .Alignment(Justify.Left);
 | 
			
		||||
            .Justify(Justify.Left);
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(text);
 | 
			
		||||
@@ -76,7 +76,7 @@ public sealed class FigletTests
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole().Width(120);
 | 
			
		||||
        var text = new FigletText(FigletFont.Default, "Spectre.Console")
 | 
			
		||||
            .Alignment(Justify.Center);
 | 
			
		||||
            .Justify(Justify.Center);
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(text);
 | 
			
		||||
@@ -92,7 +92,7 @@ public sealed class FigletTests
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole().Width(120);
 | 
			
		||||
        var text = new FigletText(FigletFont.Default, "Spectre.Console")
 | 
			
		||||
            .Alignment(Justify.Right);
 | 
			
		||||
            .Justify(Justify.Right);
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(text);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										268
									
								
								test/Spectre.Console.Tests/Unit/Widgets/LayoutTests.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										268
									
								
								test/Spectre.Console.Tests/Unit/Widgets/LayoutTests.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,268 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Unit;
 | 
			
		||||
 | 
			
		||||
[UsesVerify]
 | 
			
		||||
[ExpectationPath("Widgets/Layout")]
 | 
			
		||||
public sealed class LayoutTests
 | 
			
		||||
{
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Empty_Layout")]
 | 
			
		||||
    public Task Should_Render_Empty_Layout()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
        var layout = new Layout();
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(layout);
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Layout")]
 | 
			
		||||
    public Task Should_Render_Empty_Layout_With_Renderable()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
        var layout = new Layout().Update(new Panel("Hello").DoubleBorder().Expand());
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(layout);
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Layout_With_Columns")]
 | 
			
		||||
    public Task Should_Render_Layout_With_Columns()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
        var layout = new Layout()
 | 
			
		||||
            .SplitColumns(
 | 
			
		||||
                new Layout("Left"),
 | 
			
		||||
                new Layout("Right"));
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(layout);
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Layout_With_Rows")]
 | 
			
		||||
    public Task Should_Render_Layout_With_Rows()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
        var layout = new Layout()
 | 
			
		||||
            .SplitRows(
 | 
			
		||||
                new Layout("Top"),
 | 
			
		||||
                new Layout("Bottom"));
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(layout);
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Layout_With_Nested_Columns")]
 | 
			
		||||
    public Task Should_Render_Layout_With_Nested_Columns()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
        var layout = new Layout()
 | 
			
		||||
            .SplitColumns(
 | 
			
		||||
                new Layout("Left")
 | 
			
		||||
                    .SplitColumns(
 | 
			
		||||
                        new Layout("L1"),
 | 
			
		||||
                        new Layout("L2")),
 | 
			
		||||
                new Layout("Right")
 | 
			
		||||
                    .SplitColumns(
 | 
			
		||||
                        new Layout("R1"),
 | 
			
		||||
                        new Layout("R2")));
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(layout);
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Layout_With_Nested_Rows")]
 | 
			
		||||
    public Task Should_Render_Layout_With_Nested_Rows()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
        var layout = new Layout()
 | 
			
		||||
            .SplitRows(
 | 
			
		||||
                new Layout("Top")
 | 
			
		||||
                    .SplitRows(
 | 
			
		||||
                        new Layout("T1"),
 | 
			
		||||
                        new Layout("T2")),
 | 
			
		||||
                new Layout("Bottom")
 | 
			
		||||
                    .SplitRows(
 | 
			
		||||
                        new Layout("B1"),
 | 
			
		||||
                        new Layout("B2")));
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(layout);
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Layout_With_Nested_Rows_And_Columns")]
 | 
			
		||||
    public Task Should_Render_Layout_With_Nested_Rows_And_Columns()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
        var layout = new Layout()
 | 
			
		||||
            .SplitRows(
 | 
			
		||||
                new Layout("Top")
 | 
			
		||||
                    .SplitRows(
 | 
			
		||||
                        new Layout("T1")
 | 
			
		||||
                            .SplitColumns(
 | 
			
		||||
                                new Layout("A"),
 | 
			
		||||
                                new Layout("B")),
 | 
			
		||||
                        new Layout("T2")
 | 
			
		||||
                            .SplitColumns(
 | 
			
		||||
                                new Layout("C"),
 | 
			
		||||
                                new Layout("D"))),
 | 
			
		||||
                new Layout("Bottom")
 | 
			
		||||
                    .SplitRows(
 | 
			
		||||
                        new Layout("B1")
 | 
			
		||||
                            .SplitColumns(
 | 
			
		||||
                                new Layout("E"),
 | 
			
		||||
                                new Layout("F")),
 | 
			
		||||
                        new Layout("B2")
 | 
			
		||||
                            .SplitColumns(
 | 
			
		||||
                                    new Layout("G"),
 | 
			
		||||
                                    new Layout("H"))));
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(layout);
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Layout_Without_Invisible_Children")]
 | 
			
		||||
    public Task Should_Render_Layout_Without_Invisible_Children()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
        var layout = new Layout()
 | 
			
		||||
            .SplitRows(
 | 
			
		||||
                new Layout("Top")
 | 
			
		||||
                    .SplitRows(
 | 
			
		||||
                        new Layout("T1")
 | 
			
		||||
                            .SplitColumns(
 | 
			
		||||
                                new Layout("A").Invisible(),
 | 
			
		||||
                                new Layout("B")),
 | 
			
		||||
                        new Layout("T2")
 | 
			
		||||
                            .SplitColumns(
 | 
			
		||||
                                new Layout("C"),
 | 
			
		||||
                                new Layout("D"))),
 | 
			
		||||
                new Layout("Bottom")
 | 
			
		||||
                    .SplitRows(
 | 
			
		||||
                        new Layout("B1")
 | 
			
		||||
                            .SplitColumns(
 | 
			
		||||
                                new Layout("E"),
 | 
			
		||||
                                new Layout("F")),
 | 
			
		||||
                        new Layout("B2")
 | 
			
		||||
                            .SplitColumns(
 | 
			
		||||
                                    new Layout("G"),
 | 
			
		||||
                                    new Layout("H").Invisible())));
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(layout);
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Layout_With_Respect_To_Ratio")]
 | 
			
		||||
    public Task Should_Render_Layout_With_Respect_To_Ratio()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
        var layout = new Layout()
 | 
			
		||||
            .SplitColumns(
 | 
			
		||||
                new Layout("Left").Ratio(3),
 | 
			
		||||
                new Layout("Right"));
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(layout);
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Layout_With_Respect_To_Size")]
 | 
			
		||||
    public Task Should_Render_Layout_With_Respect_To_Size()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
        var layout = new Layout()
 | 
			
		||||
            .SplitColumns(
 | 
			
		||||
                new Layout("Left").Size(28),
 | 
			
		||||
                new Layout("Right"));
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(layout);
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Layout_With_Respect_To_Minimum_Size")]
 | 
			
		||||
    public Task Should_Render_Layout_With_Respect_To_Minimum_Size()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
        var layout = new Layout()
 | 
			
		||||
            .SplitColumns(
 | 
			
		||||
                new Layout("Left").Size(28).MinimumSize(30),
 | 
			
		||||
                new Layout("Right"));
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(layout);
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Fallback_Layout")]
 | 
			
		||||
    public Task Should_Fall_Back_To_Parent_Layout_If_All_Children_Are_Invisible()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole().Size(new Size(40, 15));
 | 
			
		||||
        var layout = new Layout()
 | 
			
		||||
            .SplitRows(
 | 
			
		||||
                new Layout("T1").SplitColumns(
 | 
			
		||||
                    new Layout("A").Invisible(),
 | 
			
		||||
                    new Layout("B").Invisible()),
 | 
			
		||||
                new Layout("T2").SplitColumns(
 | 
			
		||||
                    new Layout("C").Invisible(),
 | 
			
		||||
                    new Layout("D").Invisible()));
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(layout);
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -81,7 +81,7 @@ public sealed class PanelTests
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(new Panel("Hello World")
 | 
			
		||||
        {
 | 
			
		||||
            Header = new PanelHeader("Greeting").LeftAligned(),
 | 
			
		||||
            Header = new PanelHeader("Greeting").LeftJustified(),
 | 
			
		||||
            Expand = true,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -117,7 +117,7 @@ public sealed class PanelTests
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(new Panel("Hello World")
 | 
			
		||||
        {
 | 
			
		||||
            Header = new PanelHeader("Greeting").RightAligned(),
 | 
			
		||||
            Header = new PanelHeader("Greeting").RightJustified(),
 | 
			
		||||
            Expand = true,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -204,6 +204,76 @@ public sealed class PanelTests
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Width")]
 | 
			
		||||
    public Task Should_Render_To_Specified_Width()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole();
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(new Panel(new Text("Hello World"))
 | 
			
		||||
        {
 | 
			
		||||
            Width = 25,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Width_MaxWidth")]
 | 
			
		||||
    public Task Should_Use_Max_Width_If_Specified_Width_Is_Too_Large()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole();
 | 
			
		||||
        console.Profile.Width = 20;
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(new Panel(new Text("Hello World"))
 | 
			
		||||
        {
 | 
			
		||||
            Width = 25,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Height")]
 | 
			
		||||
    public Task Should_Render_To_Specified_Height()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole();
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(new Panel(new Text("Hello World\nHello Hello Hello"))
 | 
			
		||||
        {
 | 
			
		||||
            Height = 25,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Width_Height")]
 | 
			
		||||
    public Task Should_Render_To_Specified_Width_And_Height()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole();
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(new Panel("Hello World\nHello Hello Hello")
 | 
			
		||||
        {
 | 
			
		||||
            Width = 50,
 | 
			
		||||
            Height = 25,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Child_RightAligned")]
 | 
			
		||||
    public Task Should_Justify_Child_To_Right_Correctly()
 | 
			
		||||
@@ -213,7 +283,7 @@ public sealed class PanelTests
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(
 | 
			
		||||
            new Panel(new Text("Hello World").RightAligned())
 | 
			
		||||
            new Panel(new Text("Hello World").RightJustified())
 | 
			
		||||
            {
 | 
			
		||||
                Expand = true,
 | 
			
		||||
            });
 | 
			
		||||
 
 | 
			
		||||
@@ -70,7 +70,7 @@ public sealed class RuleTests
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(new Rule("Hello World")
 | 
			
		||||
        {
 | 
			
		||||
            Alignment = Justify.Left,
 | 
			
		||||
            Justification = Justify.Left,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
@@ -87,7 +87,7 @@ public sealed class RuleTests
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(new Rule("Hello World")
 | 
			
		||||
        {
 | 
			
		||||
            Alignment = Justify.Right,
 | 
			
		||||
            Justification = Justify.Right,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
 
 | 
			
		||||
@@ -187,7 +187,9 @@ public sealed class TableTests
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole();
 | 
			
		||||
        var table = new Table();
 | 
			
		||||
#pragma warning disable CS0618 // Type or member is obsolete
 | 
			
		||||
        table.Alignment = Justify.Left;
 | 
			
		||||
#pragma warning restore CS0618 // Type or member is obsolete
 | 
			
		||||
        table.AddColumns("Foo", "Bar", "Baz");
 | 
			
		||||
        table.AddRow("Qux", "Corgi", "Waldo");
 | 
			
		||||
        table.AddRow("Grault", "Garply", "Fred");
 | 
			
		||||
@@ -199,6 +201,24 @@ public sealed class TableTests
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_LeftAligned", "Align_Widget")]
 | 
			
		||||
    public Task Should_Left_Align_Table_Correctly_When_Wrapped_In_Align_Widget()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole();
 | 
			
		||||
        var table = new Table();
 | 
			
		||||
        table.AddColumns("Foo", "Bar", "Baz");
 | 
			
		||||
        table.AddRow("Qux", "Corgi", "Waldo");
 | 
			
		||||
        table.AddRow("Grault", "Garply", "Fred");
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(Align.Left(table));
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Centered")]
 | 
			
		||||
    public Task Should_Center_Table_Correctly()
 | 
			
		||||
@@ -206,7 +226,9 @@ public sealed class TableTests
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole();
 | 
			
		||||
        var table = new Table();
 | 
			
		||||
#pragma warning disable CS0618 // Type or member is obsolete
 | 
			
		||||
        table.Alignment = Justify.Center;
 | 
			
		||||
#pragma warning restore CS0618 // Type or member is obsolete
 | 
			
		||||
        table.AddColumns("Foo", "Bar", "Baz");
 | 
			
		||||
        table.AddRow("Qux", "Corgi", "Waldo");
 | 
			
		||||
        table.AddRow("Grault", "Garply", "Fred");
 | 
			
		||||
@@ -218,6 +240,24 @@ public sealed class TableTests
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Centered", "Align_Widget")]
 | 
			
		||||
    public Task Should_Center_Table_Correctly_When_Wrapped_In_Align_Widget()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole();
 | 
			
		||||
        var table = new Table();
 | 
			
		||||
        table.AddColumns("Foo", "Bar", "Baz");
 | 
			
		||||
        table.AddRow("Qux", "Corgi", "Waldo");
 | 
			
		||||
        table.AddRow("Grault", "Garply", "Fred");
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(Align.Center(table));
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_RightAligned")]
 | 
			
		||||
    public Task Should_Right_Align_Table_Correctly()
 | 
			
		||||
@@ -225,7 +265,9 @@ public sealed class TableTests
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole();
 | 
			
		||||
        var table = new Table();
 | 
			
		||||
#pragma warning disable CS0618 // Type or member is obsolete
 | 
			
		||||
        table.Alignment = Justify.Right;
 | 
			
		||||
#pragma warning restore CS0618 // Type or member is obsolete
 | 
			
		||||
        table.AddColumns("Foo", "Bar", "Baz");
 | 
			
		||||
        table.AddRow("Qux", "Corgi", "Waldo");
 | 
			
		||||
        table.AddRow("Grault", "Garply", "Fred");
 | 
			
		||||
@@ -237,6 +279,24 @@ public sealed class TableTests
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_RightAligned", "Align_Widget")]
 | 
			
		||||
    public Task Should_Right_Align_Table_Correctly_When_Wrapped_In_Align_Widget()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole();
 | 
			
		||||
        var table = new Table();
 | 
			
		||||
        table.AddColumns("Foo", "Bar", "Baz");
 | 
			
		||||
        table.AddRow("Qux", "Corgi", "Waldo");
 | 
			
		||||
        table.AddRow("Grault", "Garply", "Fred");
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(Align.Right(table));
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        return Verifier.Verify(console.Output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Fact]
 | 
			
		||||
    [Expectation("Render_Nested")]
 | 
			
		||||
    public Task Should_Render_Table_Nested_In_Panels_Correctly()
 | 
			
		||||
@@ -380,7 +440,7 @@ public sealed class TableTests
 | 
			
		||||
        table.AddColumn(new TableColumn(new Panel("[u]DEF[/]").BorderColor(Color.Green)));
 | 
			
		||||
        table.AddColumn(new TableColumn(new Panel("[u]GHI[/]").BorderColor(Color.Blue)));
 | 
			
		||||
        table.AddRow(new Text("Hello").Centered(), new Markup("[red]World[/]"), Text.Empty);
 | 
			
		||||
        table.AddRow(second, new Text("Whaat"), new Text("Lol").RightAligned());
 | 
			
		||||
        table.AddRow(second, new Text("Whaat"), new Text("Lol").RightJustified());
 | 
			
		||||
        table.AddRow(new Markup("[blue]Hej[/]"), new Markup("[yellow]Världen[/]"), Text.Empty);
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
 
 | 
			
		||||
@@ -77,7 +77,7 @@ public sealed class TextPathTests
 | 
			
		||||
        var console = new TestConsole().Width(40);
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        console.Write(new TextPath("C:/My documents/Bar/Baz.txt").RightAligned());
 | 
			
		||||
        console.Write(new TextPath("C:/My documents/Bar/Baz.txt").RightJustified());
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        console.Output.TrimEnd('\n')
 | 
			
		||||
 
 | 
			
		||||
@@ -42,11 +42,13 @@ public sealed class TextTests
 | 
			
		||||
    public void Should_Consider_The_Longest_Word_As_Minimum_Width()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole();
 | 
			
		||||
        var caps = new TestCapabilities { Unicode = true };
 | 
			
		||||
        var text = new Text("Foo Bar Baz\nQux\nLol mobile");
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        var result = ((IRenderable)text).Measure(caps.CreateRenderContext(), 80);
 | 
			
		||||
        var result = ((IRenderable)text).Measure(
 | 
			
		||||
            caps.CreateRenderContext(console), 80);
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        result.Min.ShouldBe(6);
 | 
			
		||||
@@ -56,11 +58,13 @@ public sealed class TextTests
 | 
			
		||||
    public void Should_Consider_The_Longest_Line_As_Maximum_Width()
 | 
			
		||||
    {
 | 
			
		||||
        // Given
 | 
			
		||||
        var console = new TestConsole();
 | 
			
		||||
        var caps = new TestCapabilities { Unicode = true };
 | 
			
		||||
        var text = new Text("Foo Bar Baz\nQux\nLol mobile");
 | 
			
		||||
 | 
			
		||||
        // When
 | 
			
		||||
        var result = ((IRenderable)text).Measure(caps.CreateRenderContext(), 80);
 | 
			
		||||
        var result = ((IRenderable)text).Measure(
 | 
			
		||||
            caps.CreateRenderContext(console), 80);
 | 
			
		||||
 | 
			
		||||
        // Then
 | 
			
		||||
        result.Max.ShouldBe(11);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user