1
1
mirror of https://github.com/Kozea/WeasyPrint.git synced 2024-10-05 00:21:15 +03:00
WeasyPrint/weasy/tests/test_draw.py

131 lines
4.1 KiB
Python
Raw Normal View History

2011-07-12 19:53:15 +04:00
# coding: utf8
# WeasyPrint converts web documents (HTML, CSS, ...) to PDF.
# Copyright (C) 2011 Simon Sapin
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os.path
2011-07-12 19:53:15 +04:00
import png
from attest import Tests, assert_hook
2011-07-12 19:53:15 +04:00
2011-08-10 18:19:32 +04:00
from . import resource_filename
from ..document import PNGDocument
from . import make_expected_results
make_expected_results.make_all()
2011-07-12 19:53:15 +04:00
suite = Tests()
2011-07-12 19:53:15 +04:00
def make_filename(dirname, basename):
return os.path.join(os.path.dirname(__file__), dirname, basename + '.png')
2011-07-12 20:27:33 +04:00
2011-08-10 21:33:16 +04:00
def format_pixel(lines, x, y):
pixel = lines[y][3 * x:3 * (x + 1)]
return ('#' + 3 * '%02x') % tuple(pixel)
def test_pixels(name, expected_width, expected_height, html):
reader = png.Reader(filename=make_filename('expected_results', name))
width, height, expected_lines, meta = reader.read()
assert width == expected_width
assert height == height
assert meta['greyscale'] == False
assert meta['alpha'] == False
assert meta['bitdepth'] == 8
expected_lines = list(expected_lines)
2011-07-12 20:27:33 +04:00
document = PNGDocument.from_string(html)
2011-08-10 18:19:32 +04:00
# Dummy filename, but in the right directory.
document.base_url = resource_filename('<test>')
filename = make_filename('test_results', name)
document.write_to(filename)
2011-07-13 13:31:44 +04:00
2011-07-12 20:27:33 +04:00
reader = png.Reader(filename=filename)
width, height, lines, meta = reader.read()
lines = list(lines)
2011-07-12 19:53:15 +04:00
assert width == expected_width
assert height == height
assert meta['greyscale'] == False
assert meta['alpha'] == False
assert meta['bitdepth'] == 8
assert len(lines) == height
assert len(lines[0]) == width * 3
if lines != expected_lines:
for y in xrange(height):
for x in xrange(width):
2011-08-10 21:33:16 +04:00
pixel = format_pixel(lines, x, y)
expected_pixel = format_pixel(expected_lines, x, y)
assert pixel == expected_pixel, \
'Pixel (%i, %i) does not match in %s' % (x, y, name)
@suite.test
2011-08-10 18:19:32 +04:00
def test_canvas_background():
test_pixels('all_blue', 10, 10, '''
<style>
@page { size: 10px }
/* bodys background propagates to the whole canvas */
body { margin: 2px; background: #00f; height: 5px }
</style>
<body>
''')
test_pixels('blocks', 10, 10, '''
<style>
@page { size: 10px }
/* htmls background propagates to the whole canvas */
html { margin: 1px; background: #f00 }
/* html has a background, so bodys does not propagate */
body { margin: 1px; background: #00f; height: 5px }
</style>
<body>
''')
2011-08-10 18:19:32 +04:00
2011-08-10 18:52:34 +04:00
@suite.test
def test_background_image():
for name, css in [
2011-08-10 21:33:16 +04:00
('repeat', ''),
('repeat_x', 'repeat-x'),
('repeat_y', 'repeat-y'),
('left_top', 'no-repeat 0 0%'),
('center_top', 'no-repeat 50% 0px'),
('right_top', 'no-repeat 6px top'),
('left_center', 'no-repeat left center'),
('center_center', 'no-repeat 3px 3px'),
('right_center', 'no-repeat 100% 50%'),
('left_bottom', 'no-repeat 0% bottom'),
('center_bottom', 'no-repeat center 6px'),
('right_bottom', 'no-repeat 6px 100%'),
]:
2011-08-10 21:33:16 +04:00
test_pixels('background_' + name, 14, 16, '''
<style>
@page { size: 14px 16px }
html { background: #fff }
body { margin: 2px; height: 10px;
background: url(pattern.png) %s }
</style>
<body>
''' % (css,))