From 1ca1949642b403ec258d3811e7151cd220bcc418 Mon Sep 17 00:00:00 2001 From: VAN BOSSUYT Nicolas Date: Mon, 30 Sep 2024 12:22:33 +0200 Subject: [PATCH] meta: Added simple reporting to reftest. --- meta/plugins/reftest.py | 122 ++++-- tests/.gitignore | 1 + tests/css/box-model/padding.xhtml | 4 +- tests/css/display-block-basic.bmp | Bin 1920054 -> 160054 bytes tests/css/display-block.xhtml | 185 +++++---- tests/css/display-flex.xhtml | 289 ++++++++------ tests/css/float.xhtml | 48 ++- tests/css/position.xhtml | 148 +++---- tests/css/text.xhtml | 24 +- tests/css/values/percent.xhtml | 2 +- tests/docs/sale-order/sale-order.xhtml | 522 +++++++++++++++++++------ 11 files changed, 895 insertions(+), 450 deletions(-) create mode 100644 tests/.gitignore diff --git a/meta/plugins/reftest.py b/meta/plugins/reftest.py index bb4ee50..4b91d31 100644 --- a/meta/plugins/reftest.py +++ b/meta/plugins/reftest.py @@ -49,21 +49,39 @@ class RefTestArgs(model.TargetArgs): @cli.command(None, "reftests", "Manage the reftests") +def _(): ... + + +TESTS_DIR: Path = Path(__file__).parent.parent.parent / "tests" +TEST_REPORT = TESTS_DIR / "report" + + +@cli.command(None, "reftests/clean", "Manage the reftests") def _(args: RefTestArgs): - paperMuncher = buildPaperMuncher(args) + for f in TEST_REPORT.glob("*.*"): + f.unlink() + TEST_REPORT.rmdir() + print(f"Cleaned {TEST_REPORT}") - test_folder = Path(__file__).parent.parent.parent / "tests" - test_tmp_folder = test_folder / "_local" - test_tmp_folder.mkdir(parents=True, exist_ok=True) - # for temp in test_tmp_folder.glob('*.*'): - # temp.unlink() - temp_file = test_tmp_folder / "reftest.xhtml" +@cli.command(None, "reftests/run", "Manage the reftests") +def _(args: RefTestArgs): + paperMuncher = buildPaperMuncher(args) - def update_temp_file(container, rendering): + TEST_REPORT.mkdir(parents=True, exist_ok=True) + report = """ + + + + Reftest + + +""" + + def update_temp_file(path, container, rendering): # write xhtml into the temporary file xhtml = re.sub(r"", rendering, container) if container else rendering - with temp_file.open("w") as f: + with path.open("w") as f: f.write(f"\n{textwrap.dedent(xhtml)}") REG_INFO = re.compile(r"""(\w+)=['"]([^'"]+)['"]""") @@ -71,7 +89,7 @@ def update_temp_file(container, rendering): def getInfo(txt): return {prop: value for prop, value in REG_INFO.findall(txt)} - for file in test_folder.glob(args.glob or "*/*.xhtml"): + for file in TESTS_DIR.glob(args.glob or "*/*.xhtml"): if file.suffix != ".xhtml": continue print(f"Running comparison test {file}...") @@ -94,7 +112,7 @@ def getInfo(txt): expected_xhtml = None expected_image: bytes | None = None - expected_image_url = test_tmp_folder / f"{temp_file_name}.expected.bmp" + expected_image_url = TEST_REPORT / f"{temp_file_name}.expected.bmp" if props.get("id"): ref_image = file.parent / f"{props.get('id')}.bmp" if ref_image.exists(): @@ -116,13 +134,15 @@ def getInfo(txt): print(f"{vt100.YELLOW}Skip test{vt100.RESET}") continue - update_temp_file(container, rendering) + input_path = TEST_REPORT / f"{temp_file_name}-{num}.xhtml" + + update_temp_file(input_path, container, rendering) # generate temporary bmp - img_path = test_tmp_folder / f"{temp_file_name}-{num}.bmp" + img_path = TEST_REPORT / f"{temp_file_name}-{num}.bmp" if props.get("size") == "full": - paperMuncher.popen("render", "-sdlpo", img_path, temp_file) + paperMuncher.popen("render", "-sdlpo", img_path, input_path) else: size = props.get("size", "200") paperMuncher.popen( @@ -133,7 +153,7 @@ def getInfo(txt): size, "-sdlpo", img_path, - temp_file, + input_path, ) with img_path.open("rb") as imageFile: @@ -144,7 +164,7 @@ def getInfo(txt): expected_xhtml = rendering if not expected_image: expected_image = output_image - with (test_tmp_folder / f"{temp_file_name}.expected.bmp").open( + with (TEST_REPORT / f"{temp_file_name}.expected.bmp").open( "wb" ) as imageWriter: imageWriter.write(expected_image) @@ -153,16 +173,21 @@ def getInfo(txt): # check if the rendering is different assert expected_image is not None assert output_image is not None - if compareImages(expected_image, output_image) == (tag == "rendering"): - img_path.unlink() + + passed = compareImages(expected_image, output_image) == ( + tag == "rendering" + ) + + if passed: + # img_path.unlink() print(f"{vt100.GREEN}Passed{vt100.RESET}") else: # generate temporary file for debugging paperMuncher.popen( "print", "-sdlpo", - test_tmp_folder / f"{temp_file_name}-{num}.pdf", - temp_file, + TEST_REPORT / f"{temp_file_name}-{num}.pdf", + input_path, ) help = renderingProps.get("help") @@ -176,10 +201,10 @@ def getInfo(txt): print(f"{vt100.WHITE}{expected_image_url}{vt100.RESET}") print(f"{vt100.BLUE}{rendering[1:].rstrip()}{vt100.RESET}") print( - f"{vt100.BLUE}{test_tmp_folder / f'{temp_file_name}-{num}.pdf'}{vt100.RESET}" + f"{vt100.BLUE}{TEST_REPORT / f'{temp_file_name}-{num}.pdf'}{vt100.RESET}" ) print( - f"{vt100.BLUE}{test_tmp_folder / f'{temp_file_name}-{num}.bmp'}{vt100.RESET}" + f"{vt100.BLUE}{TEST_REPORT / f'{temp_file_name}-{num}.bmp'}{vt100.RESET}" ) if help: print(f"{vt100.BLUE}{help}{vt100.RESET}") @@ -192,15 +217,58 @@ def getInfo(txt): print(f"{vt100.WHITE}{expected_image_url}{vt100.RESET}") print(f"{vt100.BLUE}{rendering[1:].rstrip()}{vt100.RESET}") print( - f"{vt100.BLUE}{test_tmp_folder / f'{temp_file_name}-{num}.pdf'}{vt100.RESET}" + f"{vt100.BLUE}{TEST_REPORT / f'{temp_file_name}-{num}.pdf'}{vt100.RESET}" ) print( - f"{vt100.BLUE}{test_tmp_folder / f'{temp_file_name}-{num}.bmp'}{vt100.RESET}" + f"{vt100.BLUE}{TEST_REPORT / f'{temp_file_name}-{num}.bmp'}{vt100.RESET}" ) if help: print(f"{vt100.BLUE}{help}{vt100.RESET}") - if args.fast: - break + report += f""" +
+

{props.get('name')}

+
+ + + +
+ PDF + Expected + Source +
+
+ """ + + if args.fast: + break + + report += """ + + + + """ + + with (TEST_REPORT / "report.html").open("w") as f: + f.write(report) + + print(f"Report: {TEST_REPORT / 'report.html'}") - temp_file.unlink() diff --git a/tests/.gitignore b/tests/.gitignore new file mode 100644 index 0000000..05c3192 --- /dev/null +++ b/tests/.gitignore @@ -0,0 +1 @@ +report diff --git a/tests/css/box-model/padding.xhtml b/tests/css/box-model/padding.xhtml index 0269264..a9dd2de 100644 --- a/tests/css/box-model/padding.xhtml +++ b/tests/css/box-model/padding.xhtml @@ -1,6 +1,6 @@ - + - - - - + + + + + + + + + + @@ -108,34 +115,42 @@ - - - - - - - + + + + + + + + + + @@ -226,34 +241,42 @@ - - - - - - - + + + + + + + + + + diff --git a/tests/css/display-flex.xhtml b/tests/css/display-flex.xhtml index ca3a252..40ab0f1 100644 --- a/tests/css/display-flex.xhtml +++ b/tests/css/display-flex.xhtml @@ -1,26 +1,32 @@ - - - - - - - + + + + + + + + + + @@ -76,33 +82,39 @@ - - - - - - - + + + + + + + + + + @@ -130,7 +142,8 @@
4
5
6
-
7
+
7 +
8
9
@@ -139,32 +152,38 @@ - - - - - - - + + + + + + + + + + @@ -201,32 +220,38 @@ - - - - - - - + + + + + + + + + + @@ -263,32 +288,38 @@ - - - - - - - + + + + + + + + + + @@ -313,7 +344,9 @@
1
2
3
-
4
+
+ 4
5
6
7
diff --git a/tests/css/float.xhtml b/tests/css/float.xhtml index 8fe7452..ef371d2 100644 --- a/tests/css/float.xhtml +++ b/tests/css/float.xhtml @@ -1,26 +1,32 @@ - - - - - - - + + + + + + + + + + diff --git a/tests/css/position.xhtml b/tests/css/position.xhtml index 0368385..37aab79 100644 --- a/tests/css/position.xhtml +++ b/tests/css/position.xhtml @@ -1,38 +1,46 @@ - - - - - -
- -
- + + + + + + + +
+ +
+ +
@@ -278,39 +286,47 @@ - - - - - -
- -
- + + + + + + + +
+ +
+ +
diff --git a/tests/css/text.xhtml b/tests/css/text.xhtml index 005fdf3..8bcff20 100644 --- a/tests/css/text.xhtml +++ b/tests/css/text.xhtml @@ -1,13 +1,31 @@ -
abc def ghi
+ + + +
abc def ghi
+ + +
-
abc def ghi
+ + + +
abc def ghi
+ + +
-
abc def ghi
+ + + +
abc def ghi
+ + +
diff --git a/tests/css/values/percent.xhtml b/tests/css/values/percent.xhtml index 0b4160e..f8da65b 100644 --- a/tests/css/values/percent.xhtml +++ b/tests/css/values/percent.xhtml @@ -1,6 +1,6 @@ - + - - - - + + + + + + + + + + @@ -72,37 +88,47 @@ height: 24px; position: relative; } + .table .tr.head { height: 26px; border-top: 2px solid #000000; border-bottom: 2px solid #000000; } + .table .tr.total { border-top: 2px solid #000000; } + .table .th { color: #0000FF; } - .table .td, .table .th { + + .table .td, + .table .th { position: absolute; top: 0px; left: 0px; } + .table .quantity { width: 100px; } + .table .item { width: 100px; left: 100px; } + .table .description { width: 194px; left: 200px; } + .table .unit-price { width: 100px; left: 394px; } + .table .amount { width: 100px; left: 494px; @@ -142,7 +168,8 @@
3
Eleifend
-
Maecenas condimentum gravida massa, eu iaculis mauris suscipit nec. Vivamus varius nisl mauris.
+
Maecenas condimentum gravida massa, eu iaculis mauris suscipit nec. + Vivamus varius nisl mauris.
€ 123.99
€ 371.97
@@ -160,22 +187,118 @@
€ 11.0
€ 77.0
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Vestibulum nibh orci, mollis eget euismod in.
Total
@@ -185,20 +308,79 @@

1) Curabitur eleifend tellus a maximus scelerisque.

-

1.1) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed pellentesque a orci nec vestibulum. Phasellus eu purus dignissim, ullamcorper nisi ac, auctor elit. Pellentesque sit amet porttitor justo. Donec a enim eget risus faucibus dapibus ultricies eu urna. Nunc et mi in quam posuere tincidunt non id leo. Sed eu nunc quam. Donec laoreet suscipit orci, ac pellentesque risus efficitur vitae. Curabitur eget ullamcorper odio.

-

1.2) In ultrices id massa nec porta. Sed accumsan dapibus neque eget gravida. Phasellus tempor euismod est, eget eleifend leo aliquam ac. Quisque lacinia dolor felis, vel pellentesque velit viverra id. In consequat eros sodales, mollis turpis id, tempus arcu. Nam consectetur, tellus quis porttitor vulputate, diam libero sollicitudin erat, ut vulputate velit eros sed mauris. Curabitur bibendum aliquet orci a tincidunt. Sed gravida in nunc ut gravida. Ut luctus neque eget sodales malesuada. Curabitur mattis ultricies sollicitudin.

-

1.3) Aenean placerat justo diam. Suspendisse potenti. In ut pharetra tellus. Suspendisse vel elementum ante, a faucibus orci. Nulla fringilla lacinia nisi, quis molestie risus maximus id. Duis sollicitudin felis sed tellus accumsan rhoncus ac vel quam. Fusce viverra quam vel turpis blandit, eget porta arcu sodales. Duis ultrices mi eu ex viverra ultrices. Vestibulum congue laoreet risus id sagittis. Donec ornare ac nulla a consequat. Proin condimentum enim et turpis semper, eu efficitur turpis dictum.

+

1.1) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed pellentesque a orci nec vestibulum. + Phasellus eu purus dignissim, ullamcorper nisi ac, auctor elit. Pellentesque sit amet porttitor justo. + Donec a enim eget risus faucibus dapibus ultricies eu urna. Nunc et mi in quam posuere tincidunt non id + leo. Sed eu nunc quam. Donec laoreet suscipit orci, ac pellentesque risus efficitur vitae. Curabitur + eget ullamcorper odio.

+

1.2) In ultrices id massa nec porta. Sed accumsan dapibus neque eget gravida. Phasellus tempor euismod + est, eget eleifend leo aliquam ac. Quisque lacinia dolor felis, vel pellentesque velit viverra id. In + consequat eros sodales, mollis turpis id, tempus arcu. Nam consectetur, tellus quis porttitor vulputate, + diam libero sollicitudin erat, ut vulputate velit eros sed mauris. Curabitur bibendum aliquet orci a + tincidunt. Sed gravida in nunc ut gravida. Ut luctus neque eget sodales malesuada. Curabitur mattis + ultricies sollicitudin.

+

1.3) Aenean placerat justo diam. Suspendisse potenti. In ut pharetra tellus. Suspendisse vel elementum + ante, a faucibus orci. Nulla fringilla lacinia nisi, quis molestie risus maximus id. Duis sollicitudin + felis sed tellus accumsan rhoncus ac vel quam. Fusce viverra quam vel turpis blandit, eget porta arcu + sodales. Duis ultrices mi eu ex viverra ultrices. Vestibulum congue laoreet risus id sagittis. Donec + ornare ac nulla a consequat. Proin condimentum enim et turpis semper, eu efficitur turpis dictum.

2) Nulla ac eros ultrices nisi congue viverra eget sagittis orci.

-

2.1) Mauris tincidunt dolor vitae iaculis tempus. Nulla facilisi. Integer a interdum sapien, eget dapibus nisl. Etiam id tellus ac dui fringilla bibendum. Vivamus et enim ex. Sed et neque dolor. Sed sed semper nulla. Donec varius metus a ex aliquet, non elementum ante vehicula. Fusce tempus volutpat sem malesuada cursus. In venenatis purus sapien, in ultricies nulla porttitor et. Donec a pellentesque felis. Vivamus lorem ante, suscipit venenatis egestas id, vulputate at tortor. Aliquam hendrerit arcu et lacus eleifend, a egestas arcu volutpat. Duis accumsan volutpat magna, non hendrerit felis auctor ut.

-

2.2) Etiam aliquam, lectus ac vestibulum blandit, justo nulla egestas nibh, sed sodales orci eros et mi. Sed euismod scelerisque ipsum. Pellentesque a sodales lectus. Praesent at condimentum urna, at fringilla erat. Nunc tristique dolor vitae porta ullamcorper. Integer quis felis et ex scelerisque imperdiet. Integer laoreet mauris sit amet neque molestie, sed volutpat ex consequat. Proin nec neque pulvinar dui dapibus gravida. Duis laoreet justo ac mauris maximus volutpat. Duis lobortis auctor malesuada. Phasellus tincidunt efficitur tellus eget finibus. Sed ornare vitae ipsum eu cursus. Donec vitae mauris nec dui ornare rhoncus nec ut risus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

+

2.1) Mauris tincidunt dolor vitae iaculis tempus. Nulla facilisi. Integer a interdum sapien, eget dapibus + nisl. Etiam id tellus ac dui fringilla bibendum. Vivamus et enim ex. Sed et neque dolor. Sed sed semper + nulla. Donec varius metus a ex aliquet, non elementum ante vehicula. Fusce tempus volutpat sem malesuada + cursus. In venenatis purus sapien, in ultricies nulla porttitor et. Donec a pellentesque felis. Vivamus + lorem ante, suscipit venenatis egestas id, vulputate at tortor. Aliquam hendrerit arcu et lacus + eleifend, a egestas arcu volutpat. Duis accumsan volutpat magna, non hendrerit felis auctor ut.

+

2.2) Etiam aliquam, lectus ac vestibulum blandit, justo nulla egestas nibh, sed sodales orci eros et mi. + Sed euismod scelerisque ipsum. Pellentesque a sodales lectus. Praesent at condimentum urna, at fringilla + erat. Nunc tristique dolor vitae porta ullamcorper. Integer quis felis et ex scelerisque imperdiet. + Integer laoreet mauris sit amet neque molestie, sed volutpat ex consequat. Proin nec neque pulvinar dui + dapibus gravida. Duis laoreet justo ac mauris maximus volutpat. Duis lobortis auctor malesuada. + Phasellus tincidunt efficitur tellus eget finibus. Sed ornare vitae ipsum eu cursus. Donec vitae mauris + nec dui ornare rhoncus nec ut risus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

3) Proin quis purus at orci efficitur cursus at vel justo.

-

3.1) Quisque vitae mi consectetur, porta libero in, faucibus erat. Donec scelerisque sollicitudin dolor. Aenean non interdum magna. Vivamus rutrum mattis fringilla. Cras nec diam sit amet augue venenatis egestas sit amet non sapien. Suspendisse euismod massa eget mauris fermentum, ac fringilla neque aliquet. Nullam pulvinar nec dui efficitur tempor. Cras ultrices massa felis, quis pharetra risus interdum vitae. Donec quis luctus mi. Nullam et suscipit orci. Phasellus imperdiet viverra nunc at bibendum. Cras consectetur tempor risus vel rhoncus. Sed elementum felis sem, vitae feugiat est pharetra ut.

-

3.2) Phasellus a faucibus neque. Proin a felis sit amet eros semper finibus non a lectus. Ut ornare consectetur lectus nec vulputate. Nullam non auctor sem, eget congue lacus. Pellentesque consectetur euismod nunc at placerat. Vivamus augue elit, lacinia in quam quis, pretium viverra nisi. Pellentesque ac molestie magna. Vivamus vel pretium velit. In ultrices gravida enim, non viverra nunc interdum ut. Proin tristique vestibulum quam, at laoreet orci aliquam et. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; In in augue vel purus lobortis sodales. Praesent convallis, sapien eget posuere viverra, lacus dolor volutpat ex, ac convallis nibh sem non odio. Donec aliquam mollis aliquam. Maecenas posuere neque convallis, tempus lorem vel, scelerisque dui. Cras tristique erat vitae diam lacinia euismod.

-

3.3) In tempor diam ornare, commodo lectus commodo, vestibulum enim. Ut rutrum, nunc a commodo dignissim, augue nibh mollis ligula, in lobortis justo leo eu tellus. Suspendisse ipsum neque, ornare sed erat in, efficitur ornare arcu. Curabitur pulvinar lectus justo, non feugiat metus dignissim sed. Praesent euismod metus nec tellus lacinia, sed dictum diam vehicula. Vivamus convallis euismod sapien id vestibulum. Nunc justo felis, feugiat vitae malesuada vulputate, hendrerit ut diam. Etiam porta iaculis ipsum, non pretium nisl dignissim nec. Aenean id tempus mauris. Quisque venenatis eros in eleifend feugiat. Curabitur dapibus tellus non dui mattis scelerisque. Donec imperdiet eget nunc vitae sodales. Mauris ut lacus dui.

+

3.1) Quisque vitae mi consectetur, porta libero in, faucibus erat. Donec scelerisque sollicitudin dolor. + Aenean non interdum magna. Vivamus rutrum mattis fringilla. Cras nec diam sit amet augue venenatis + egestas sit amet non sapien. Suspendisse euismod massa eget mauris fermentum, ac fringilla neque + aliquet. Nullam pulvinar nec dui efficitur tempor. Cras ultrices massa felis, quis pharetra risus + interdum vitae. Donec quis luctus mi. Nullam et suscipit orci. Phasellus imperdiet viverra nunc at + bibendum. Cras consectetur tempor risus vel rhoncus. Sed elementum felis sem, vitae feugiat est pharetra + ut.

+

3.2) Phasellus a faucibus neque. Proin a felis sit amet eros semper finibus non a lectus. Ut ornare + consectetur lectus nec vulputate. Nullam non auctor sem, eget congue lacus. Pellentesque consectetur + euismod nunc at placerat. Vivamus augue elit, lacinia in quam quis, pretium viverra nisi. Pellentesque + ac molestie magna. Vivamus vel pretium velit. In ultrices gravida enim, non viverra nunc interdum ut. + Proin tristique vestibulum quam, at laoreet orci aliquam et. Vestibulum ante ipsum primis in faucibus + orci luctus et ultrices posuere cubilia curae; In in augue vel purus lobortis sodales. Praesent + convallis, sapien eget posuere viverra, lacus dolor volutpat ex, ac convallis nibh sem non odio. Donec + aliquam mollis aliquam. Maecenas posuere neque convallis, tempus lorem vel, scelerisque dui. Cras + tristique erat vitae diam lacinia euismod.

+

3.3) In tempor diam ornare, commodo lectus commodo, vestibulum enim. Ut rutrum, nunc a commodo dignissim, + augue nibh mollis ligula, in lobortis justo leo eu tellus. Suspendisse ipsum neque, ornare sed erat in, + efficitur ornare arcu. Curabitur pulvinar lectus justo, non feugiat metus dignissim sed. Praesent + euismod metus nec tellus lacinia, sed dictum diam vehicula. Vivamus convallis euismod sapien id + vestibulum. Nunc justo felis, feugiat vitae malesuada vulputate, hendrerit ut diam. Etiam porta iaculis + ipsum, non pretium nisl dignissim nec. Aenean id tempus mauris. Quisque venenatis eros in eleifend + feugiat. Curabitur dapibus tellus non dui mattis scelerisque. Donec imperdiet eget nunc vitae sodales. + Mauris ut lacus dui.

4) Vulputate

-

4.1) Donec eget lacus vel purus semper ullamcorper eu id nisl. Curabitur mollis vel odio ut eleifend. Sed sed mollis urna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse potenti. Nulla sit amet pharetra orci. Aliquam tempus, magna quis congue faucibus, est elit ullamcorper arcu, at pellentesque augue dolor at tellus. Nam venenatis dolor sapien, tincidunt vehicula risus pulvinar vel. Integer malesuada odio a consectetur sollicitudin. Pellentesque at dignissim dolor. Aliquam pharetra ullamcorper leo, vitae vestibulum odio fermentum ut. Curabitur vulputate nulla eget est cursus, eu consectetur magna rhoncus. Donec at tristique enim, a molestie dui. Maecenas porta sit amet sapien ut dapibus. Integer interdum massa diam, nec sagittis tellus vestibulum quis. Donec quis nisi consequat, commodo metus nec, sollicitudin odio.

-

4.2) Vestibulum luctus ex et turpis bibendum, ut faucibus erat ultrices. Cras id congue risus. Ut ultricies porta quam a elementum. In elementum ante at lectus ultricies, sit amet mattis turpis aliquam. Vestibulum rhoncus orci sodales eros facilisis imperdiet. Praesent euismod elit erat, quis feugiat erat gravida eget. Mauris consequat neque sit amet porttitor imperdiet.

-

4.3) Maecenas quis nisl tellus. Nunc cursus bibendum consectetur. Donec sagittis a magna et viverra. Aenean viverra aliquet pretium. Vivamus convallis sem at ante euismod, a dictum felis aliquam. Phasellus sed risus purus. Nunc in accumsan dui, varius sollicitudin justo. Vestibulum ultrices ultricies enim nec lobortis. Praesent non scelerisque mauris. Vivamus quis diam urna. Nunc a gravida felis.

+

4.1) Donec eget lacus vel purus semper ullamcorper eu id nisl. Curabitur mollis vel odio ut eleifend. Sed + sed mollis urna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse potenti. Nulla sit + amet pharetra orci. Aliquam tempus, magna quis congue faucibus, est elit ullamcorper arcu, at + pellentesque augue dolor at tellus. Nam venenatis dolor sapien, tincidunt vehicula risus pulvinar vel. + Integer malesuada odio a consectetur sollicitudin. Pellentesque at dignissim dolor. Aliquam pharetra + ullamcorper leo, vitae vestibulum odio fermentum ut. Curabitur vulputate nulla eget est cursus, eu + consectetur magna rhoncus. Donec at tristique enim, a molestie dui. Maecenas porta sit amet sapien ut + dapibus. Integer interdum massa diam, nec sagittis tellus vestibulum quis. Donec quis nisi consequat, + commodo metus nec, sollicitudin odio.

+

4.2) Vestibulum luctus ex et turpis bibendum, ut faucibus erat ultrices. Cras id congue risus. Ut + ultricies porta quam a elementum. In elementum ante at lectus ultricies, sit amet mattis turpis aliquam. + Vestibulum rhoncus orci sodales eros facilisis imperdiet. Praesent euismod elit erat, quis feugiat erat + gravida eget. Mauris consequat neque sit amet porttitor imperdiet.

+

4.3) Maecenas quis nisl tellus. Nunc cursus bibendum consectetur. Donec sagittis a magna et viverra. + Aenean viverra aliquet pretium. Vivamus convallis sem at ante euismod, a dictum felis aliquam. Phasellus + sed risus purus. Nunc in accumsan dui, varius sollicitudin justo. Vestibulum ultrices ultricies enim nec + lobortis. Praesent non scelerisque mauris. Vivamus quis diam urna. Nunc a gravida felis.

@@ -209,23 +391,29 @@ border-collapse: collapse; line-height: 1.5; } + table tr { border-top: 1px solid #000000; height: 24px; } - table td, table th { + + table td, + table th { padding: 0; font: inherit; text-align: inherit; vertical-align: top; } + table th { color: #0000FF; } + table tr.head { border-top: 2px solid #000000; border-bottom: 2px solid #000000; } + table tr.total { border-top: 2px solid #000000; } @@ -264,7 +452,8 @@ 3 Eleifend - Maecenas condimentum gravida massa, eu iaculis mauris suscipit nec. Vivamus varius nisl mauris. + Maecenas condimentum gravida massa, eu iaculis mauris suscipit nec. Vivamus varius nisl mauris. + € 123.99 € 371.97 @@ -282,22 +471,54 @@ € 11.0 € 77.0 - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Vestibulum nibh orci, mollis eget euismod in. Total @@ -307,20 +528,79 @@

1) Curabitur eleifend tellus a maximus scelerisque.

-

1.1) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed pellentesque a orci nec vestibulum. Phasellus eu purus dignissim, ullamcorper nisi ac, auctor elit. Pellentesque sit amet porttitor justo. Donec a enim eget risus faucibus dapibus ultricies eu urna. Nunc et mi in quam posuere tincidunt non id leo. Sed eu nunc quam. Donec laoreet suscipit orci, ac pellentesque risus efficitur vitae. Curabitur eget ullamcorper odio.

-

1.2) In ultrices id massa nec porta. Sed accumsan dapibus neque eget gravida. Phasellus tempor euismod est, eget eleifend leo aliquam ac. Quisque lacinia dolor felis, vel pellentesque velit viverra id. In consequat eros sodales, mollis turpis id, tempus arcu. Nam consectetur, tellus quis porttitor vulputate, diam libero sollicitudin erat, ut vulputate velit eros sed mauris. Curabitur bibendum aliquet orci a tincidunt. Sed gravida in nunc ut gravida. Ut luctus neque eget sodales malesuada. Curabitur mattis ultricies sollicitudin.

-

1.3) Aenean placerat justo diam. Suspendisse potenti. In ut pharetra tellus. Suspendisse vel elementum ante, a faucibus orci. Nulla fringilla lacinia nisi, quis molestie risus maximus id. Duis sollicitudin felis sed tellus accumsan rhoncus ac vel quam. Fusce viverra quam vel turpis blandit, eget porta arcu sodales. Duis ultrices mi eu ex viverra ultrices. Vestibulum congue laoreet risus id sagittis. Donec ornare ac nulla a consequat. Proin condimentum enim et turpis semper, eu efficitur turpis dictum.

+

1.1) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed pellentesque a orci nec vestibulum. + Phasellus eu purus dignissim, ullamcorper nisi ac, auctor elit. Pellentesque sit amet porttitor justo. + Donec a enim eget risus faucibus dapibus ultricies eu urna. Nunc et mi in quam posuere tincidunt non id + leo. Sed eu nunc quam. Donec laoreet suscipit orci, ac pellentesque risus efficitur vitae. Curabitur + eget ullamcorper odio.

+

1.2) In ultrices id massa nec porta. Sed accumsan dapibus neque eget gravida. Phasellus tempor euismod + est, eget eleifend leo aliquam ac. Quisque lacinia dolor felis, vel pellentesque velit viverra id. In + consequat eros sodales, mollis turpis id, tempus arcu. Nam consectetur, tellus quis porttitor vulputate, + diam libero sollicitudin erat, ut vulputate velit eros sed mauris. Curabitur bibendum aliquet orci a + tincidunt. Sed gravida in nunc ut gravida. Ut luctus neque eget sodales malesuada. Curabitur mattis + ultricies sollicitudin.

+

1.3) Aenean placerat justo diam. Suspendisse potenti. In ut pharetra tellus. Suspendisse vel elementum + ante, a faucibus orci. Nulla fringilla lacinia nisi, quis molestie risus maximus id. Duis sollicitudin + felis sed tellus accumsan rhoncus ac vel quam. Fusce viverra quam vel turpis blandit, eget porta arcu + sodales. Duis ultrices mi eu ex viverra ultrices. Vestibulum congue laoreet risus id sagittis. Donec + ornare ac nulla a consequat. Proin condimentum enim et turpis semper, eu efficitur turpis dictum.

2) Nulla ac eros ultrices nisi congue viverra eget sagittis orci.

-

2.1) Mauris tincidunt dolor vitae iaculis tempus. Nulla facilisi. Integer a interdum sapien, eget dapibus nisl. Etiam id tellus ac dui fringilla bibendum. Vivamus et enim ex. Sed et neque dolor. Sed sed semper nulla. Donec varius metus a ex aliquet, non elementum ante vehicula. Fusce tempus volutpat sem malesuada cursus. In venenatis purus sapien, in ultricies nulla porttitor et. Donec a pellentesque felis. Vivamus lorem ante, suscipit venenatis egestas id, vulputate at tortor. Aliquam hendrerit arcu et lacus eleifend, a egestas arcu volutpat. Duis accumsan volutpat magna, non hendrerit felis auctor ut.

-

2.2) Etiam aliquam, lectus ac vestibulum blandit, justo nulla egestas nibh, sed sodales orci eros et mi. Sed euismod scelerisque ipsum. Pellentesque a sodales lectus. Praesent at condimentum urna, at fringilla erat. Nunc tristique dolor vitae porta ullamcorper. Integer quis felis et ex scelerisque imperdiet. Integer laoreet mauris sit amet neque molestie, sed volutpat ex consequat. Proin nec neque pulvinar dui dapibus gravida. Duis laoreet justo ac mauris maximus volutpat. Duis lobortis auctor malesuada. Phasellus tincidunt efficitur tellus eget finibus. Sed ornare vitae ipsum eu cursus. Donec vitae mauris nec dui ornare rhoncus nec ut risus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

+

2.1) Mauris tincidunt dolor vitae iaculis tempus. Nulla facilisi. Integer a interdum sapien, eget dapibus + nisl. Etiam id tellus ac dui fringilla bibendum. Vivamus et enim ex. Sed et neque dolor. Sed sed semper + nulla. Donec varius metus a ex aliquet, non elementum ante vehicula. Fusce tempus volutpat sem malesuada + cursus. In venenatis purus sapien, in ultricies nulla porttitor et. Donec a pellentesque felis. Vivamus + lorem ante, suscipit venenatis egestas id, vulputate at tortor. Aliquam hendrerit arcu et lacus + eleifend, a egestas arcu volutpat. Duis accumsan volutpat magna, non hendrerit felis auctor ut.

+

2.2) Etiam aliquam, lectus ac vestibulum blandit, justo nulla egestas nibh, sed sodales orci eros et mi. + Sed euismod scelerisque ipsum. Pellentesque a sodales lectus. Praesent at condimentum urna, at fringilla + erat. Nunc tristique dolor vitae porta ullamcorper. Integer quis felis et ex scelerisque imperdiet. + Integer laoreet mauris sit amet neque molestie, sed volutpat ex consequat. Proin nec neque pulvinar dui + dapibus gravida. Duis laoreet justo ac mauris maximus volutpat. Duis lobortis auctor malesuada. + Phasellus tincidunt efficitur tellus eget finibus. Sed ornare vitae ipsum eu cursus. Donec vitae mauris + nec dui ornare rhoncus nec ut risus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

3) Proin quis purus at orci efficitur cursus at vel justo.

-

3.1) Quisque vitae mi consectetur, porta libero in, faucibus erat. Donec scelerisque sollicitudin dolor. Aenean non interdum magna. Vivamus rutrum mattis fringilla. Cras nec diam sit amet augue venenatis egestas sit amet non sapien. Suspendisse euismod massa eget mauris fermentum, ac fringilla neque aliquet. Nullam pulvinar nec dui efficitur tempor. Cras ultrices massa felis, quis pharetra risus interdum vitae. Donec quis luctus mi. Nullam et suscipit orci. Phasellus imperdiet viverra nunc at bibendum. Cras consectetur tempor risus vel rhoncus. Sed elementum felis sem, vitae feugiat est pharetra ut.

-

3.2) Phasellus a faucibus neque. Proin a felis sit amet eros semper finibus non a lectus. Ut ornare consectetur lectus nec vulputate. Nullam non auctor sem, eget congue lacus. Pellentesque consectetur euismod nunc at placerat. Vivamus augue elit, lacinia in quam quis, pretium viverra nisi. Pellentesque ac molestie magna. Vivamus vel pretium velit. In ultrices gravida enim, non viverra nunc interdum ut. Proin tristique vestibulum quam, at laoreet orci aliquam et. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; In in augue vel purus lobortis sodales. Praesent convallis, sapien eget posuere viverra, lacus dolor volutpat ex, ac convallis nibh sem non odio. Donec aliquam mollis aliquam. Maecenas posuere neque convallis, tempus lorem vel, scelerisque dui. Cras tristique erat vitae diam lacinia euismod.

-

3.3) In tempor diam ornare, commodo lectus commodo, vestibulum enim. Ut rutrum, nunc a commodo dignissim, augue nibh mollis ligula, in lobortis justo leo eu tellus. Suspendisse ipsum neque, ornare sed erat in, efficitur ornare arcu. Curabitur pulvinar lectus justo, non feugiat metus dignissim sed. Praesent euismod metus nec tellus lacinia, sed dictum diam vehicula. Vivamus convallis euismod sapien id vestibulum. Nunc justo felis, feugiat vitae malesuada vulputate, hendrerit ut diam. Etiam porta iaculis ipsum, non pretium nisl dignissim nec. Aenean id tempus mauris. Quisque venenatis eros in eleifend feugiat. Curabitur dapibus tellus non dui mattis scelerisque. Donec imperdiet eget nunc vitae sodales. Mauris ut lacus dui.

+

3.1) Quisque vitae mi consectetur, porta libero in, faucibus erat. Donec scelerisque sollicitudin dolor. + Aenean non interdum magna. Vivamus rutrum mattis fringilla. Cras nec diam sit amet augue venenatis + egestas sit amet non sapien. Suspendisse euismod massa eget mauris fermentum, ac fringilla neque + aliquet. Nullam pulvinar nec dui efficitur tempor. Cras ultrices massa felis, quis pharetra risus + interdum vitae. Donec quis luctus mi. Nullam et suscipit orci. Phasellus imperdiet viverra nunc at + bibendum. Cras consectetur tempor risus vel rhoncus. Sed elementum felis sem, vitae feugiat est pharetra + ut.

+

3.2) Phasellus a faucibus neque. Proin a felis sit amet eros semper finibus non a lectus. Ut ornare + consectetur lectus nec vulputate. Nullam non auctor sem, eget congue lacus. Pellentesque consectetur + euismod nunc at placerat. Vivamus augue elit, lacinia in quam quis, pretium viverra nisi. Pellentesque + ac molestie magna. Vivamus vel pretium velit. In ultrices gravida enim, non viverra nunc interdum ut. + Proin tristique vestibulum quam, at laoreet orci aliquam et. Vestibulum ante ipsum primis in faucibus + orci luctus et ultrices posuere cubilia curae; In in augue vel purus lobortis sodales. Praesent + convallis, sapien eget posuere viverra, lacus dolor volutpat ex, ac convallis nibh sem non odio. Donec + aliquam mollis aliquam. Maecenas posuere neque convallis, tempus lorem vel, scelerisque dui. Cras + tristique erat vitae diam lacinia euismod.

+

3.3) In tempor diam ornare, commodo lectus commodo, vestibulum enim. Ut rutrum, nunc a commodo dignissim, + augue nibh mollis ligula, in lobortis justo leo eu tellus. Suspendisse ipsum neque, ornare sed erat in, + efficitur ornare arcu. Curabitur pulvinar lectus justo, non feugiat metus dignissim sed. Praesent + euismod metus nec tellus lacinia, sed dictum diam vehicula. Vivamus convallis euismod sapien id + vestibulum. Nunc justo felis, feugiat vitae malesuada vulputate, hendrerit ut diam. Etiam porta iaculis + ipsum, non pretium nisl dignissim nec. Aenean id tempus mauris. Quisque venenatis eros in eleifend + feugiat. Curabitur dapibus tellus non dui mattis scelerisque. Donec imperdiet eget nunc vitae sodales. + Mauris ut lacus dui.

4) Vulputate

-

4.1) Donec eget lacus vel purus semper ullamcorper eu id nisl. Curabitur mollis vel odio ut eleifend. Sed sed mollis urna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse potenti. Nulla sit amet pharetra orci. Aliquam tempus, magna quis congue faucibus, est elit ullamcorper arcu, at pellentesque augue dolor at tellus. Nam venenatis dolor sapien, tincidunt vehicula risus pulvinar vel. Integer malesuada odio a consectetur sollicitudin. Pellentesque at dignissim dolor. Aliquam pharetra ullamcorper leo, vitae vestibulum odio fermentum ut. Curabitur vulputate nulla eget est cursus, eu consectetur magna rhoncus. Donec at tristique enim, a molestie dui. Maecenas porta sit amet sapien ut dapibus. Integer interdum massa diam, nec sagittis tellus vestibulum quis. Donec quis nisi consequat, commodo metus nec, sollicitudin odio.

-

4.2) Vestibulum luctus ex et turpis bibendum, ut faucibus erat ultrices. Cras id congue risus. Ut ultricies porta quam a elementum. In elementum ante at lectus ultricies, sit amet mattis turpis aliquam. Vestibulum rhoncus orci sodales eros facilisis imperdiet. Praesent euismod elit erat, quis feugiat erat gravida eget. Mauris consequat neque sit amet porttitor imperdiet.

-

4.3) Maecenas quis nisl tellus. Nunc cursus bibendum consectetur. Donec sagittis a magna et viverra. Aenean viverra aliquet pretium. Vivamus convallis sem at ante euismod, a dictum felis aliquam. Phasellus sed risus purus. Nunc in accumsan dui, varius sollicitudin justo. Vestibulum ultrices ultricies enim nec lobortis. Praesent non scelerisque mauris. Vivamus quis diam urna. Nunc a gravida felis.

+

4.1) Donec eget lacus vel purus semper ullamcorper eu id nisl. Curabitur mollis vel odio ut eleifend. Sed + sed mollis urna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse potenti. Nulla sit + amet pharetra orci. Aliquam tempus, magna quis congue faucibus, est elit ullamcorper arcu, at + pellentesque augue dolor at tellus. Nam venenatis dolor sapien, tincidunt vehicula risus pulvinar vel. + Integer malesuada odio a consectetur sollicitudin. Pellentesque at dignissim dolor. Aliquam pharetra + ullamcorper leo, vitae vestibulum odio fermentum ut. Curabitur vulputate nulla eget est cursus, eu + consectetur magna rhoncus. Donec at tristique enim, a molestie dui. Maecenas porta sit amet sapien ut + dapibus. Integer interdum massa diam, nec sagittis tellus vestibulum quis. Donec quis nisi consequat, + commodo metus nec, sollicitudin odio.

+

4.2) Vestibulum luctus ex et turpis bibendum, ut faucibus erat ultrices. Cras id congue risus. Ut + ultricies porta quam a elementum. In elementum ante at lectus ultricies, sit amet mattis turpis aliquam. + Vestibulum rhoncus orci sodales eros facilisis imperdiet. Praesent euismod elit erat, quis feugiat erat + gravida eget. Mauris consequat neque sit amet porttitor imperdiet.

+

4.3) Maecenas quis nisl tellus. Nunc cursus bibendum consectetur. Donec sagittis a magna et viverra. + Aenean viverra aliquet pretium. Vivamus convallis sem at ante euismod, a dictum felis aliquam. Phasellus + sed risus purus. Nunc in accumsan dui, varius sollicitudin justo. Vestibulum ultrices ultricies enim nec + lobortis. Praesent non scelerisque mauris. Vivamus quis diam urna. Nunc a gravida felis.