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

148 lines
4.2 KiB
Python

"""
weasyprint.tests.test_draw.test_box
-----------------------------------
Test how boxes, borders, outlines are drawn.
:copyright: Copyright 2011-2019 Simon Sapin and contributors, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
import itertools
from ... import HTML
from ..testing_utils import assert_no_logs
from . import PIXELS_BY_CHAR, assert_different_renderings, assert_pixels
@assert_no_logs
def test_borders(margin='10px', prop='border'):
"""Test the rendering of borders"""
source = '''
<style>
@page { size: 140px 110px }
html { background: #fff }
body { width: 100px; height: 70px;
margin: %s; %s: 10px %s blue }
</style>
<body>'''
# Do not test the exact rendering of earch border style but at least
# check that they do not do the same.
assert_different_renderings(140, 110, [
('%s_%s' % (prop, border_style), source % (margin, prop, border_style))
for border_style in [
'none', 'solid', 'dashed', 'dotted', 'double',
'inset', 'outset', 'groove', 'ridge']])
css_margin = margin
width = 140
height = 110
margin = 10
border = 10
solid_pixels = [[PIXELS_BY_CHAR['_']] * width for y in range(height)]
for x in range(margin, width - margin):
for y in itertools.chain(
range(margin, margin + border),
range(height - margin - border, height - margin)):
solid_pixels[y][x] = PIXELS_BY_CHAR['B']
for y in range(margin, height - margin):
for x in itertools.chain(
range(margin, margin + border),
range(width - margin - border, width - margin)):
solid_pixels[y][x] = PIXELS_BY_CHAR['B']
solid_pixels = [b''.join(line) for line in solid_pixels]
assert_pixels(
prop + '_solid', 140, 110, solid_pixels,
source % (css_margin, prop, 'solid'))
@assert_no_logs
def test_outlines():
return test_borders(margin='20px', prop='outline')
@assert_no_logs
def test_small_borders_1():
# Regression test for ZeroDivisionError on dashed or dotted borders
# smaller than a dash/dot.
# https://github.com/Kozea/WeasyPrint/issues/49
html = '''
<style>
@page { size: 50px 50px }
html { background: #fff }
body { margin: 5px; height: 0; border: 10px %s blue }
</style>
<body>'''
for style in ['none', 'solid', 'dashed', 'dotted']:
HTML(string=html % style).write_image_surface()
@assert_no_logs
def test_small_borders_2():
# Regression test for ZeroDivisionError on dashed or dotted borders
# smaller than a dash/dot.
# https://github.com/Kozea/WeasyPrint/issues/146
html = '''
<style>
@page { size: 50px 50px }
html { background: #fff }
body { height: 0; width: 0; border-width: 1px 0; border-style: %s }
</style>
<body>'''
for style in ['none', 'solid', 'dashed', 'dotted']:
HTML(string=html % style).write_image_surface()
@assert_no_logs
def test_margin_boxes():
assert_pixels('margin_boxes', 15, 15, '''
_______________
_GGG______BBBB_
_GGG______BBBB_
_______________
_____RRRR______
_____RRRR______
_____RRRR______
_____RRRR______
_______________
_bbb______gggg_
_bbb______gggg_
_bbb______gggg_
_bbb______gggg_
_bbb______gggg_
_______________
''', '''
<style>
html { height: 100% }
body { background: #f00; height: 100% }
@page {
size: 15px;
margin: 4px 6px 7px 5px;
background: white;
@top-left-corner {
margin: 1px;
content: " ";
background: #0f0;
}
@top-right-corner {
margin: 1px;
content: " ";
background: #00f;
}
@bottom-right-corner {
margin: 1px;
content: " ";
background: #008000;
}
@bottom-left-corner {
margin: 1px;
content: " ";
background: #000080;
}
}
</style>
<body>''')