mirror of
				https://github.com/Textualize/textual.git
				synced 2025-10-17 02:38:12 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			191 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from __future__ import annotations
 | |
| 
 | |
| from fractions import Fraction
 | |
| 
 | |
| from textual.box_model import BoxModel
 | |
| from textual.geometry import Size, Spacing
 | |
| from textual.widget import Widget
 | |
| 
 | |
| 
 | |
| def test_content_box():
 | |
|     one = Fraction(1)
 | |
| 
 | |
|     class TestWidget(Widget):
 | |
|         def get_content_width(self, container: Size, parent: Size) -> int:
 | |
|             assert False, "must not be called"
 | |
| 
 | |
|         def get_content_height(self, container: Size, parent: Size) -> int:
 | |
|             assert False, "must not be called"
 | |
| 
 | |
|     widget = TestWidget()
 | |
| 
 | |
|     # border-box is default
 | |
|     assert widget.styles.box_sizing == "border-box"
 | |
| 
 | |
|     widget.styles.width = 10
 | |
|     widget.styles.height = 8
 | |
|     widget.styles.padding = 1
 | |
|     widget.styles.border = ("solid", "red")
 | |
| 
 | |
|     box_model = widget._get_box_model(
 | |
|         Size(60, 20),
 | |
|         Size(80, 24),
 | |
|         one,
 | |
|         one,
 | |
|     )
 | |
|     # Size should be inclusive of padding / border
 | |
|     assert box_model == BoxModel(Fraction(10), Fraction(8), Spacing(0, 0, 0, 0))
 | |
| 
 | |
|     # Switch to content-box
 | |
|     widget.styles.box_sizing = "content-box"
 | |
| 
 | |
|     box_model = widget._get_box_model(Size(60, 20), Size(80, 24), one, one)
 | |
|     # width and height have added padding / border to accommodate content
 | |
|     assert box_model == BoxModel(Fraction(14), Fraction(12), Spacing(0, 0, 0, 0))
 | |
| 
 | |
| 
 | |
| def test_width():
 | |
|     """Test width settings."""
 | |
| 
 | |
|     one = Fraction(1)
 | |
| 
 | |
|     class TestWidget(Widget):
 | |
|         def get_content_width(self, container: Size, parent: Size) -> int:
 | |
|             return 10
 | |
| 
 | |
|         def get_content_height(self, container: Size, parent: Size, width: int) -> int:
 | |
|             return 10
 | |
| 
 | |
|     widget = TestWidget()
 | |
|     styles = widget.styles
 | |
|     box_model = widget._get_box_model(Size(60, 20), Size(80, 24), one, one)
 | |
|     assert box_model == BoxModel(Fraction(60), Fraction(20), Spacing(0, 0, 0, 0))
 | |
| 
 | |
|     # Add a margin and check that it is reported
 | |
|     styles.margin = (1, 2, 3, 4)
 | |
| 
 | |
|     box_model = widget._get_box_model(Size(60, 20), Size(80, 24), one, one)
 | |
|     assert box_model == BoxModel(Fraction(54), Fraction(16), Spacing(1, 2, 3, 4))
 | |
| 
 | |
|     # Set width to auto-detect
 | |
|     styles.width = "auto"
 | |
| 
 | |
|     box_model = widget._get_box_model(Size(60, 20), Size(80, 24), one, one)
 | |
|     # Setting width to auto should call get_auto_width
 | |
|     assert box_model == BoxModel(Fraction(10), Fraction(16), Spacing(1, 2, 3, 4))
 | |
| 
 | |
|     # Set width to 100 vw which should make it the width of the parent
 | |
|     styles.width = "100vw"
 | |
| 
 | |
|     box_model = widget._get_box_model(Size(60, 20), Size(80, 24), one, one)
 | |
|     assert box_model == BoxModel(Fraction(80), Fraction(16), Spacing(1, 2, 3, 4))
 | |
| 
 | |
|     # Set the width to 100% should make it fill the container size
 | |
|     styles.width = "100%"
 | |
| 
 | |
|     box_model = widget._get_box_model(Size(60, 20), Size(80, 24), one, one)
 | |
|     assert box_model == BoxModel(Fraction(54), Fraction(16), Spacing(1, 2, 3, 4))
 | |
| 
 | |
|     styles.width = "100vw"
 | |
|     styles.max_width = "50%"
 | |
| 
 | |
|     box_model = widget._get_box_model(Size(60, 20), Size(80, 24), one, one)
 | |
|     assert box_model == BoxModel(Fraction(27), Fraction(16), Spacing(1, 2, 3, 4))
 | |
| 
 | |
| 
 | |
| def test_height():
 | |
|     """Test height settings."""
 | |
| 
 | |
|     one = Fraction(1)
 | |
| 
 | |
|     class TestWidget(Widget):
 | |
|         def get_content_width(self, container: Size, parent: Size) -> int:
 | |
|             return 10
 | |
| 
 | |
|         def get_content_height(self, container: Size, parent: Size, width: int) -> int:
 | |
|             return 10
 | |
| 
 | |
|     widget = TestWidget()
 | |
|     styles = widget.styles
 | |
| 
 | |
|     box_model = widget._get_box_model(Size(60, 20), Size(80, 24), one, one)
 | |
|     assert box_model == BoxModel(Fraction(60), Fraction(20), Spacing(0, 0, 0, 0))
 | |
| 
 | |
|     # Add a margin and check that it is reported
 | |
|     styles.margin = (1, 2, 3, 4)
 | |
| 
 | |
|     box_model = widget._get_box_model(Size(60, 20), Size(80, 24), one, one)
 | |
|     assert box_model == BoxModel(Fraction(54), Fraction(16), Spacing(1, 2, 3, 4))
 | |
| 
 | |
|     # Set height to 100 vw which should make it the height of the parent
 | |
|     styles.height = "100vh"
 | |
| 
 | |
|     box_model = widget._get_box_model(Size(60, 20), Size(80, 24), one, one)
 | |
|     assert box_model == BoxModel(Fraction(54), Fraction(24), Spacing(1, 2, 3, 4))
 | |
| 
 | |
|     # Set the height to 100% should make it fill the container size
 | |
|     styles.height = "100%"
 | |
| 
 | |
|     box_model = widget._get_box_model(Size(60, 20), Size(80, 24), one, one)
 | |
|     assert box_model == BoxModel(Fraction(54), Fraction(16), Spacing(1, 2, 3, 4))
 | |
| 
 | |
|     styles.height = "auto"
 | |
|     styles.margin = 2
 | |
| 
 | |
|     box_model = widget._get_box_model(Size(60, 20), Size(80, 24), one, one)
 | |
|     print(box_model)
 | |
|     assert box_model == BoxModel(Fraction(56), Fraction(10), Spacing(2, 2, 2, 2))
 | |
| 
 | |
|     styles.margin = 1, 2, 3, 4
 | |
|     styles.height = "100vh"
 | |
|     styles.max_height = "50%"
 | |
| 
 | |
|     box_model = widget._get_box_model(Size(60, 20), Size(80, 24), one, one)
 | |
|     assert box_model == BoxModel(Fraction(54), Fraction(8), Spacing(1, 2, 3, 4))
 | |
| 
 | |
| 
 | |
| def test_max():
 | |
|     """Check that max_width and max_height are respected."""
 | |
|     one = Fraction(1)
 | |
| 
 | |
|     class TestWidget(Widget):
 | |
|         def get_content_width(self, container: Size, parent: Size) -> int:
 | |
|             assert False, "must not be called"
 | |
| 
 | |
|         def get_content_height(self, container: Size, parent: Size, width: int) -> int:
 | |
|             assert False, "must not be called"
 | |
| 
 | |
|     widget = TestWidget()
 | |
|     styles = widget.styles
 | |
| 
 | |
|     styles.width = 100
 | |
|     styles.height = 80
 | |
|     styles.max_width = 40
 | |
|     styles.max_height = 30
 | |
| 
 | |
|     box_model = widget._get_box_model(Size(40, 30), Size(80, 24), one, one)
 | |
|     assert box_model == BoxModel(Fraction(40), Fraction(30), Spacing(0, 0, 0, 0))
 | |
| 
 | |
| 
 | |
| def test_min():
 | |
|     """Check that min_width and min_height are respected."""
 | |
| 
 | |
|     one = Fraction(1)
 | |
| 
 | |
|     class TestWidget(Widget):
 | |
|         def get_content_width(self, container: Size, parent: Size) -> int:
 | |
|             assert False, "must not be called"
 | |
| 
 | |
|         def get_content_height(self, container: Size, parent: Size, width: int) -> int:
 | |
|             assert False, "must not be called"
 | |
| 
 | |
|     widget = TestWidget()
 | |
|     styles = widget.styles
 | |
|     styles.width = 10
 | |
|     styles.height = 5
 | |
|     styles.min_width = 40
 | |
|     styles.min_height = 30
 | |
| 
 | |
|     box_model = widget._get_box_model(Size(40, 30), Size(80, 24), one, one)
 | |
|     assert box_model == BoxModel(Fraction(40), Fraction(30), Spacing(0, 0, 0, 0))
 | 
