debian-weasyprint/weasyprint/tests/test_draw/test_overflow.py

171 lines
4.1 KiB
Python

"""
weasyprint.tests.test_draw.test_overflow
----------------------------------------
Test overflow and clipping.
:copyright: Copyright 2011-2019 Simon Sapin and contributors, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
import pytest
from ..testing_utils import assert_no_logs, requires
from . import assert_pixels
@assert_no_logs
def test_overflow_1():
# See test_images
assert_pixels('inline_image_overflow', 8, 8, '''
________
________
__rBBB__
__BBBB__
________
________
________
________
''', '''
<style>
@page { size: 8px }
body { margin: 2px 0 0 2px; background: #fff; font-size:0 }
div { height: 2px; overflow: hidden }
</style>
<div><img src="pattern.png"></div>''')
@assert_no_logs
def test_overflow_2():
# <body> is only 1px high, but its overflow is propageted to the viewport
# ie. the padding edge of the page box.
assert_pixels('inline_image_viewport_overflow', 8, 8, '''
________
________
__rBBB__
__BBBB__
__BBBB__
________
________
________
''', '''
<style>
@page { size: 8px; background: #fff;
margin: 2px;
padding-bottom: 2px;
border-bottom: 1px transparent solid; }
body { height: 1px; overflow: hidden; font-size: 0 }
</style>
<div><img src="pattern.png"></div>''')
@assert_no_logs
def test_overflow_3():
# Assert that the border is not clipped by overflow: hidden
assert_pixels('border_box_overflow', 8, 8, '''
________
________
__BBBB__
__B__B__
__B__B__
__BBBB__
________
________
''', '''
<style>
@page { size: 8px; background: #fff; margin: 2px; }
div { width: 2px; height: 2px; overflow: hidden;
border: 1px solid blue; }
</style>
<div></div>''')
@assert_no_logs
@requires('cairo', (1, 12, 0))
@pytest.mark.parametrize('number, css, pixels', (
(1, '5px, 5px, 9px, auto', '''
______________
______________
______________
______________
______________
______________
______rBBBrBg_
______BBBBBBg_
______BBBBBBg_
______BBBBBBg_
______________
______________
______________
______________
______________
______________
'''),
(2, '5px, 5px, auto, 10px', '''
______________
______________
______________
______________
______________
______________
______rBBBr___
______BBBBB___
______BBBBB___
______BBBBB___
______rBBBr___
______BBBBB___
______ggggg___
______________
______________
______________
'''),
(3, '5px, auto, 9px, 10px', '''
______________
______________
______________
______________
______________
______________
_grBBBrBBBr___
_gBBBBBBBBB___
_gBBBBBBBBB___
_gBBBBBBBBB___
______________
______________
______________
______________
______________
______________
'''),
(4, 'auto, 5px, 9px, 10px', '''
______________
______ggggg___
______rBBBr___
______BBBBB___
______BBBBB___
______BBBBB___
______rBBBr___
______BBBBB___
______BBBBB___
______BBBBB___
______________
______________
______________
______________
______________
______________
'''),
))
def test_clip(number, css, pixels):
assert_pixels('background_repeat_clipped_%s' % number, 14, 16, pixels, '''
<style>
@page { size: 14px 16px; background: #fff }
div { margin: 1px; border: 1px green solid;
background: url(pattern.png);
position: absolute; /* clip only applies on abspos */
top: 0; bottom: 2px; left: 0; right: 0;
clip: rect(%s); }
</style>
<div>''' % css)