From e039552f9d7bb49da8dafe7a83b87a08202eb30f Mon Sep 17 00:00:00 2001 From: Laurenz Date: Sat, 13 Apr 2024 10:39:45 +0200 Subject: Better test runner (#3922) --- .gitignore | 8 +- Cargo.lock | 5 +- crates/typst-cli/src/world.rs | 2 +- crates/typst-ide/Cargo.toml | 5 + crates/typst-ide/src/complete.rs | 31 + crates/typst-ide/src/lib.rs | 85 ++ crates/typst-pdf/src/page.rs | 4 +- crates/typst-pdf/src/pattern.rs | 4 +- crates/typst-render/src/lib.rs | 23 +- crates/typst/src/model/footnote.rs | 11 +- tests/Cargo.toml | 14 +- tests/README.md | 54 +- tests/ref/align-center-in-flow.png | Bin 0 -> 567 bytes tests/ref/align-in-stack.png | Bin 0 -> 158 bytes tests/ref/align-right.png | Bin 0 -> 1434 bytes tests/ref/align-start-and-end.png | Bin 0 -> 795 bytes tests/ref/array-basic-syntax.png | Bin 0 -> 2355 bytes tests/ref/array-insert-and-remove.png | Bin 0 -> 118 bytes tests/ref/array-join-content.png | Bin 0 -> 546 bytes tests/ref/baseline-box.png | Bin 0 -> 3908 bytes tests/ref/baseline-text.png | Bin 0 -> 2217 bytes tests/ref/bibliography-basic.png | Bin 0 -> 7559 bytes tests/ref/bibliography-before-content.png | Bin 0 -> 17022 bytes tests/ref/bibliography-full.png | Bin 0 -> 53991 bytes tests/ref/bibliography-math.png | Bin 0 -> 4568 bytes tests/ref/bibliography-multiple-files.png | Bin 0 -> 16122 bytes tests/ref/bibliography-ordering.png | Bin 0 -> 12210 bytes tests/ref/bidi-consecutive-embedded-ltr-runs.png | Bin 0 -> 751 bytes tests/ref/bidi-consecutive-embedded-rtl-runs.png | Bin 0 -> 548 bytes tests/ref/bidi-en-he-top-level.png | Bin 0 -> 636 bytes tests/ref/bidi-explicit-dir.png | Bin 0 -> 911 bytes tests/ref/bidi-manual-linebreak.png | Bin 0 -> 966 bytes tests/ref/bidi-nesting.png | Bin 0 -> 286 bytes tests/ref/bidi-obj.png | Bin 0 -> 1498 bytes tests/ref/bidi-raw.png | Bin 0 -> 2469 bytes tests/ref/bidi-spacing.png | Bin 0 -> 461 bytes tests/ref/bidi-whitespace-reset.png | Bin 0 -> 378 bytes tests/ref/block-box-fill.png | Bin 0 -> 5566 bytes tests/ref/block-clip-svg-glyphs.png | Bin 0 -> 1980 bytes tests/ref/block-clip-text.png | Bin 0 -> 1253 bytes tests/ref/block-clipping-multiple-pages.png | Bin 0 -> 2057 bytes tests/ref/block-fixed-height.png | Bin 0 -> 7156 bytes tests/ref/block-multiple-pages.png | Bin 0 -> 2214 bytes tests/ref/block-sizing.png | Bin 0 -> 139 bytes tests/ref/block-spacing-basic.png | Bin 0 -> 733 bytes tests/ref/block-spacing-collapse-text-style.png | Bin 0 -> 299 bytes tests/ref/block-spacing-maximum.png | Bin 0 -> 1515 bytes tests/ref/block-spacing-table.png | Bin 0 -> 586 bytes tests/ref/box-clip-radius-without-stroke.png | Bin 0 -> 1225 bytes tests/ref/box-clip-radius.png | Bin 0 -> 1245 bytes tests/ref/box-clip-rect.png | Bin 0 -> 1938 bytes tests/ref/box-layoutable-child.png | Bin 0 -> 257 bytes tests/ref/box-width-fr.png | Bin 0 -> 464 bytes tests/ref/box.png | Bin 0 -> 691 bytes tests/ref/bugs/1050-terms-indent.png | Bin 22472 -> 0 bytes tests/ref/bugs/1240-stack-fr.png | Bin 1197 -> 0 bytes tests/ref/bugs/1597-cite-footnote.png | Bin 4387 -> 0 bytes tests/ref/bugs/2044-invalid-parsed-ident.png | Bin 603 -> 0 bytes tests/ref/bugs/2105-linebreak-tofu.png | Bin 473 -> 0 bytes tests/ref/bugs/2595-float-overlap.png | Bin 15654 -> 0 bytes tests/ref/bugs/2650-cjk-latin-spacing-meta.png | Bin 1299 -> 0 bytes tests/ref/bugs/2715-float-order.png | Bin 13006 -> 0 bytes tests/ref/bugs/3082-chinese-punctuation.png | Bin 7673 -> 0 bytes tests/ref/bugs/3641-float-loop.png | Bin 3904 -> 0 bytes tests/ref/bugs/3650-italic-equation.png | Bin 3958 -> 0 bytes tests/ref/bugs/3658-math-size.png | Bin 531 -> 0 bytes tests/ref/bugs/3662-pdf-smartquotes.png | Bin 11950 -> 0 bytes tests/ref/bugs/3700-deformed-stroke.png | Bin 144 -> 0 bytes tests/ref/bugs/3841-tabs-in-raw-typ-code.png | Bin 13011 -> 0 bytes tests/ref/bugs/870-image-rotation.png | Bin 296 -> 0 bytes tests/ref/bugs/args-sink.png | Bin 956 -> 0 bytes tests/ref/bugs/bibliography-math.png | Bin 15075 -> 0 bytes tests/ref/bugs/bidi-tofus.png | Bin 513 -> 0 bytes tests/ref/bugs/block-width-box.png | Bin 1683 -> 0 bytes tests/ref/bugs/cite-locate.png | Bin 40633 -> 0 bytes tests/ref/bugs/cite-show-set.png | Bin 2193 -> 0 bytes tests/ref/bugs/clamp-panic.png | Bin 274 -> 0 bytes tests/ref/bugs/columns-1.png | Bin 1459 -> 0 bytes tests/ref/bugs/emoji-linebreak.png | Bin 287 -> 0 bytes tests/ref/bugs/flow-1.png | Bin 9686 -> 0 bytes tests/ref/bugs/flow-2.png | Bin 5676 -> 0 bytes tests/ref/bugs/flow-3.png | Bin 1724 -> 0 bytes tests/ref/bugs/flow-4.png | Bin 8493 -> 0 bytes tests/ref/bugs/flow-5.png | Bin 20421 -> 0 bytes tests/ref/bugs/fold-vector.png | Bin 3771 -> 0 bytes tests/ref/bugs/footnote-keep-multiple.png | Bin 1914 -> 0 bytes tests/ref/bugs/footnote-list.png | Bin 1410 -> 0 bytes tests/ref/bugs/gradient-cmyk-encode.png | Bin 1601 -> 0 bytes tests/ref/bugs/grid-1.png | Bin 835 -> 0 bytes tests/ref/bugs/grid-2.png | Bin 15244 -> 0 bytes tests/ref/bugs/grid-3.png | Bin 1897 -> 0 bytes tests/ref/bugs/grid-4.png | Bin 1117 -> 0 bytes tests/ref/bugs/hide-meta.png | Bin 11164 -> 0 bytes tests/ref/bugs/justify-hanging-indent.png | Bin 1864 -> 0 bytes tests/ref/bugs/line-align.png | Bin 137 -> 0 bytes tests/ref/bugs/linebreak-no-justifiables.png | Bin 1829 -> 0 bytes tests/ref/bugs/mat-aug-color.png | Bin 1692 -> 0 bytes tests/ref/bugs/math-eval.png | Bin 2589 -> 0 bytes tests/ref/bugs/math-hide.png | Bin 1719 -> 0 bytes tests/ref/bugs/math-number-spacing.png | Bin 1188 -> 0 bytes tests/ref/bugs/math-realize.png | Bin 53710 -> 0 bytes tests/ref/bugs/math-shift.png | Bin 2262 -> 0 bytes tests/ref/bugs/math-text-break.png | Bin 885 -> 0 bytes tests/ref/bugs/new-cm-svg.png | Bin 2845 -> 0 bytes tests/ref/bugs/newline-mode.png | Bin 7771 -> 0 bytes tests/ref/bugs/pagebreak-bibliography.png | Bin 1860 -> 0 bytes tests/ref/bugs/pagebreak-numbering.png | Bin 4136 -> 0 bytes tests/ref/bugs/pagebreak-set-style.png | Bin 5441 -> 0 bytes tests/ref/bugs/place-base.png | Bin 1486 -> 0 bytes tests/ref/bugs/place-nested.png | Bin 1298 -> 0 bytes tests/ref/bugs/place-pagebreak.png | Bin 978 -> 0 bytes tests/ref/bugs/place-spacing.png | Bin 6347 -> 0 bytes tests/ref/bugs/raw-color-overwrite.png | Bin 15184 -> 0 bytes tests/ref/bugs/smartquotes-in-outline.png | Bin 10122 -> 0 bytes tests/ref/bugs/smartquotes-on-newline.png | Bin 1625 -> 0 bytes tests/ref/bugs/spacing-behaviour.png | Bin 638 -> 0 bytes tests/ref/bugs/square-base.png | Bin 150 -> 0 bytes tests/ref/bugs/table-lines.png | Bin 1180 -> 0 bytes tests/ref/bugs/table-row-missing.png | Bin 1029 -> 0 bytes tests/ref/call-basic.png | Bin 0 -> 973 bytes tests/ref/circle-auto-sizing.png | Bin 0 -> 12418 bytes tests/ref/circle-directly-in-rect.png | Bin 0 -> 244 bytes tests/ref/circle-relative-sizing.png | Bin 0 -> 967 bytes tests/ref/circle-sizing-options.png | Bin 0 -> 210 bytes tests/ref/circle.png | Bin 0 -> 889 bytes tests/ref/cite-footnote.png | Bin 0 -> 13673 bytes tests/ref/cite-form.png | Bin 0 -> 10731 bytes tests/ref/cite-group.png | Bin 0 -> 5440 bytes tests/ref/cite-grouping-and-ordering.png | Bin 0 -> 1308 bytes tests/ref/cjk-punctuation-adjustment-1.png | Bin 0 -> 1938 bytes tests/ref/cjk-punctuation-adjustment-2.png | Bin 0 -> 997 bytes tests/ref/cjk-punctuation-adjustment-3.png | Bin 0 -> 8214 bytes tests/ref/closure-capture-in-lvalue.png | Bin 0 -> 513 bytes tests/ref/closure-path-resolve-in-layout-phase.png | Bin 0 -> 2179 bytes tests/ref/closure-without-params-non-atomic.png | Bin 0 -> 206 bytes tests/ref/code-block-basic-syntax.png | Bin 0 -> 810 bytes tests/ref/color-cmyk-ops.png | Bin 0 -> 242 bytes tests/ref/color-luma.png | Bin 0 -> 106 bytes tests/ref/color-outside-srgb-gamut.png | Bin 0 -> 102 bytes tests/ref/color-rotate-hue.png | Bin 0 -> 220 bytes tests/ref/color-saturation.png | Bin 0 -> 228 bytes tests/ref/color-spaces.png | Bin 0 -> 143 bytes tests/ref/columns-colbreak-after-place.png | Bin 0 -> 410 bytes tests/ref/columns-empty-second-column.png | Bin 0 -> 1175 bytes tests/ref/columns-in-auto-sized-rect.png | Bin 0 -> 569 bytes tests/ref/columns-in-fixed-size-rect.png | Bin 0 -> 3833 bytes tests/ref/columns-more-with-gutter.png | Bin 0 -> 386 bytes tests/ref/columns-one.png | Bin 0 -> 838 bytes tests/ref/columns-page-height-auto.png | Bin 0 -> 4156 bytes tests/ref/columns-page-width-auto.png | Bin 0 -> 747 bytes tests/ref/columns-rtl.png | Bin 0 -> 4764 bytes tests/ref/columns-set-page-colbreak-pagebreak.png | Bin 0 -> 376 bytes tests/ref/columns-set-page.png | Bin 0 -> 5807 bytes tests/ref/coma.png | Bin 101892 -> 29091 bytes tests/ref/comment-end-of-line.png | Bin 0 -> 1113 bytes tests/ref/comments.png | Bin 0 -> 374 bytes tests/ref/compiler/array.png | Bin 8306 -> 0 bytes tests/ref/compiler/block.png | Bin 2088 -> 0 bytes tests/ref/compiler/break-continue.png | Bin 9732 -> 0 bytes tests/ref/compiler/call.png | Bin 2598 -> 0 bytes tests/ref/compiler/closure.png | Bin 472 -> 0 bytes tests/ref/compiler/color.png | Bin 1354 -> 0 bytes tests/ref/compiler/comment.png | Bin 873 -> 0 bytes tests/ref/compiler/construct.png | Bin 6113 -> 0 bytes tests/ref/compiler/content-field.png | Bin 8252 -> 0 bytes tests/ref/compiler/dict.png | Bin 4055 -> 0 bytes tests/ref/compiler/for.png | Bin 3342 -> 0 bytes tests/ref/compiler/highlight.png | Bin 70314 -> 0 bytes tests/ref/compiler/if.png | Bin 2274 -> 0 bytes tests/ref/compiler/import.png | Bin 5941 -> 0 bytes tests/ref/compiler/include.png | Bin 46292 -> 0 bytes tests/ref/compiler/label.png | Bin 22342 -> 0 bytes tests/ref/compiler/let.png | Bin 3527 -> 0 bytes tests/ref/compiler/ops.png | Bin 1029 -> 0 bytes tests/ref/compiler/repr-color-gradient.png | Bin 50018 -> 0 bytes tests/ref/compiler/repr.png | Bin 64757 -> 0 bytes tests/ref/compiler/return.png | Bin 2849 -> 0 bytes tests/ref/compiler/select-where-styles.png | Bin 17334 -> 0 bytes tests/ref/compiler/selector-logical.png | Bin 3844 -> 0 bytes tests/ref/compiler/set.png | Bin 26054 -> 0 bytes tests/ref/compiler/shorthand.png | Bin 10903 -> 0 bytes tests/ref/compiler/show-bare.png | Bin 25759 -> 0 bytes tests/ref/compiler/show-node.png | Bin 21916 -> 0 bytes tests/ref/compiler/show-recursive.png | Bin 14951 -> 0 bytes tests/ref/compiler/show-selector-logical.png | Bin 8272 -> 0 bytes tests/ref/compiler/show-selector.png | Bin 16871 -> 0 bytes tests/ref/compiler/show-set-func.png | Bin 5772 -> 0 bytes tests/ref/compiler/show-set-text.png | Bin 8734 -> 0 bytes tests/ref/compiler/show-set.png | Bin 22168 -> 0 bytes tests/ref/compiler/show-text.png | Bin 45317 -> 0 bytes tests/ref/compiler/while.png | Bin 953 -> 0 bytes tests/ref/compute/construct.png | Bin 1324 -> 0 bytes tests/ref/compute/data.png | Bin 8386 -> 0 bytes tests/ref/compute/eval-path.png | Bin 33952 -> 0 bytes tests/ref/compute/foundations.png | Bin 2344 -> 0 bytes tests/ref/content-field-materialized-heading.png | Bin 0 -> 203 bytes tests/ref/content-field-materialized-query.png | Bin 0 -> 269 bytes tests/ref/content-field-materialized-table.png | Bin 0 -> 836 bytes tests/ref/content-fields-complex.png | Bin 0 -> 951 bytes tests/ref/content-label-field-access.png | Bin 0 -> 689 bytes tests/ref/content-label-fields-method.png | Bin 0 -> 689 bytes tests/ref/content-label-has-method.png | Bin 0 -> 689 bytes tests/ref/context-compatibility-locate.png | Bin 0 -> 1514 bytes tests/ref/context-compatibility-styling.png | Bin 0 -> 380 bytes tests/ref/counter-basic-1.png | Bin 0 -> 836 bytes tests/ref/counter-figure.png | Bin 0 -> 2253 bytes tests/ref/counter-heading.png | Bin 0 -> 1506 bytes tests/ref/counter-label.png | Bin 0 -> 649 bytes tests/ref/counter-page.png | Bin 0 -> 3464 bytes tests/ref/csv.png | Bin 0 -> 3344 bytes tests/ref/destructuring-during-loop-continue.png | Bin 0 -> 526 bytes tests/ref/dict-basic-methods.png | Bin 0 -> 141 bytes tests/ref/dict-basic-syntax.png | Bin 0 -> 1552 bytes tests/ref/dict-from-module.png | Bin 0 -> 237 bytes tests/ref/dict-remove-order.png | Bin 0 -> 141 bytes tests/ref/document-set-title.png | Bin 0 -> 393 bytes tests/ref/ellipse-auto-sizing.png | Bin 0 -> 7791 bytes tests/ref/ellipse.png | Bin 0 -> 458 bytes tests/ref/emph-and-strong-call-in-word.png | Bin 0 -> 576 bytes tests/ref/emph-double-underscore-empty-hint.png | Bin 0 -> 319 bytes tests/ref/emph-syntax.png | Bin 0 -> 5148 bytes tests/ref/empty.png | Bin 92 -> 0 bytes tests/ref/enum-built-in-loop.png | Bin 0 -> 551 bytes tests/ref/enum-function-call.png | Bin 0 -> 877 bytes tests/ref/enum-number-align-2d.png | Bin 0 -> 756 bytes tests/ref/enum-number-align-default.png | Bin 0 -> 419 bytes tests/ref/enum-number-align-specified.png | Bin 0 -> 358 bytes tests/ref/enum-number-align-unaffected.png | Bin 0 -> 1796 bytes tests/ref/enum-number-align-unfolded.png | Bin 0 -> 812 bytes tests/ref/enum-number-override-nested.png | Bin 0 -> 1109 bytes tests/ref/enum-number-override.png | Bin 0 -> 1166 bytes .../ref/enum-numbering-closure-nested-complex.png | Bin 0 -> 1029 bytes tests/ref/enum-numbering-closure-nested.png | Bin 0 -> 327 bytes tests/ref/enum-numbering-closure.png | Bin 0 -> 1542 bytes tests/ref/enum-numbering-full.png | Bin 0 -> 497 bytes tests/ref/enum-numbering-pattern.png | Bin 0 -> 1318 bytes tests/ref/enum-syntax-at-start.png | Bin 0 -> 548 bytes tests/ref/enum-syntax-edge-cases.png | Bin 0 -> 627 bytes tests/ref/escape.png | Bin 0 -> 3916 bytes tests/ref/eval-in-show-rule.png | Bin 0 -> 1191 bytes tests/ref/eval-mode.png | Bin 0 -> 881 bytes tests/ref/eval-path-resolve-in-show-rule.png | Bin 0 -> 4379 bytes tests/ref/eval-path-resolve.png | Bin 0 -> 4379 bytes tests/ref/field-function.png | Bin 0 -> 304 bytes tests/ref/figure-and-caption-show.png | Bin 0 -> 1153 bytes tests/ref/figure-basic.png | Bin 0 -> 7931 bytes tests/ref/figure-breakable.png | Bin 0 -> 805 bytes tests/ref/figure-caption-separator.png | Bin 0 -> 1133 bytes tests/ref/figure-caption-show.png | Bin 0 -> 851 bytes tests/ref/figure-caption-where-selector.png | Bin 0 -> 1612 bytes tests/ref/figure-localization-fr.png | Bin 0 -> 791 bytes tests/ref/figure-localization-gr.png | Bin 0 -> 973 bytes tests/ref/figure-localization-ru.png | Bin 0 -> 789 bytes tests/ref/figure-localization-zh.png | Bin 0 -> 508 bytes tests/ref/figure-table.png | Bin 0 -> 2973 bytes tests/ref/figure-theorem.png | Bin 0 -> 7020 bytes tests/ref/float-display.png | Bin 0 -> 1621 bytes tests/ref/float-repr.png | Bin 0 -> 1923 bytes ...flow-first-region-counter-update-and-placed.png | Bin 0 -> 976 bytes ...first-region-counter-update-placed-and-line.png | Bin 0 -> 1525 bytes tests/ref/flow-first-region-counter-update.png | Bin 0 -> 685 bytes tests/ref/flow-first-region-no-item.png | Bin 0 -> 932 bytes tests/ref/flow-first-region-placed.png | Bin 0 -> 1126 bytes tests/ref/flow-first-region-zero-sized-item.png | Bin 0 -> 879 bytes tests/ref/flow-fr.png | Bin 0 -> 570 bytes tests/ref/flow-heading-no-orphan.png | Bin 0 -> 3162 bytes tests/ref/flow-par-no-orphan-and-widow-lines.png | Bin 0 -> 23825 bytes tests/ref/fold-vec-order-meta.png | Bin 0 -> 994 bytes tests/ref/fold-vec-order-text-decos.png | Bin 0 -> 461 bytes tests/ref/fold-vec-order-text-features.png | Bin 0 -> 149 bytes tests/ref/footnote-basic.png | Bin 0 -> 410 bytes tests/ref/footnote-break-across-pages.png | Bin 0 -> 29276 bytes tests/ref/footnote-duplicate.png | Bin 0 -> 7518 bytes tests/ref/footnote-entry.png | Bin 0 -> 1841 bytes tests/ref/footnote-in-caption.png | Bin 0 -> 6113 bytes tests/ref/footnote-in-columns.png | Bin 0 -> 3585 bytes tests/ref/footnote-in-table.png | Bin 0 -> 12304 bytes tests/ref/footnote-invariant.png | Bin 0 -> 5202 bytes tests/ref/footnote-nested-same-frame.png | Bin 0 -> 743 bytes tests/ref/footnote-nested.png | Bin 0 -> 2469 bytes tests/ref/footnote-ref-call.png | Bin 0 -> 534 bytes tests/ref/footnote-ref-forward.png | Bin 0 -> 1269 bytes tests/ref/footnote-ref-in-footnote.png | Bin 0 -> 2554 bytes tests/ref/footnote-ref-multiple.png | Bin 0 -> 4411 bytes tests/ref/footnote-ref.png | Bin 0 -> 1480 bytes tests/ref/footnote-space-collapsing.png | Bin 0 -> 742 bytes tests/ref/footnote-styling.png | Bin 0 -> 848 bytes tests/ref/for-loop-basic.png | Bin 0 -> 1256 bytes tests/ref/gradient-conic-angled.png | Bin 0 -> 2608 bytes tests/ref/gradient-conic-center-shifted-1.png | Bin 0 -> 2026 bytes tests/ref/gradient-conic-center-shifted-2.png | Bin 0 -> 2066 bytes tests/ref/gradient-conic-hsl.png | Bin 0 -> 3366 bytes tests/ref/gradient-conic-hsv.png | Bin 0 -> 3465 bytes tests/ref/gradient-conic-oklab.png | Bin 0 -> 3278 bytes tests/ref/gradient-conic-oklch.png | Bin 0 -> 3291 bytes tests/ref/gradient-conic-relative-parent.png | Bin 0 -> 2281 bytes tests/ref/gradient-conic-relative-self.png | Bin 0 -> 3066 bytes tests/ref/gradient-conic-stroke.png | Bin 0 -> 1341 bytes tests/ref/gradient-conic-text.png | Bin 0 -> 10468 bytes tests/ref/gradient-conic.png | Bin 0 -> 2576 bytes tests/ref/gradient-fill-and-stroke.png | Bin 0 -> 2920 bytes tests/ref/gradient-linear-angled.png | Bin 0 -> 4165 bytes tests/ref/gradient-linear-hsl.png | Bin 0 -> 204 bytes tests/ref/gradient-linear-hsv.png | Bin 0 -> 198 bytes tests/ref/gradient-linear-line.png | Bin 0 -> 1233 bytes tests/ref/gradient-linear-oklab.png | Bin 0 -> 206 bytes tests/ref/gradient-linear-oklch.png | Bin 0 -> 198 bytes tests/ref/gradient-linear-relative-parent.png | Bin 0 -> 223 bytes tests/ref/gradient-linear-relative-self.png | Bin 0 -> 541 bytes tests/ref/gradient-linear-repeat-and-mirror-1.png | Bin 0 -> 292 bytes tests/ref/gradient-linear-repeat-and-mirror-2.png | Bin 0 -> 325 bytes tests/ref/gradient-linear-repeat-and-mirror-3.png | Bin 0 -> 218 bytes tests/ref/gradient-linear-sharp-and-repeat.png | Bin 0 -> 178 bytes tests/ref/gradient-linear-sharp-and-smooth.png | Bin 0 -> 7457 bytes .../gradient-linear-sharp-repeat-and-mirror.png | Bin 0 -> 186 bytes tests/ref/gradient-linear-sharp.png | Bin 0 -> 1092 bytes tests/ref/gradient-linear-stroke.png | Bin 0 -> 494 bytes tests/ref/gradient-math-cancel.png | Bin 0 -> 969 bytes tests/ref/gradient-math-conic.png | Bin 0 -> 1664 bytes tests/ref/gradient-math-dir.png | Bin 0 -> 2568 bytes tests/ref/gradient-math-frac.png | Bin 0 -> 787 bytes tests/ref/gradient-math-mat.png | Bin 0 -> 1540 bytes tests/ref/gradient-math-misc.png | Bin 0 -> 3103 bytes tests/ref/gradient-math-radial.png | Bin 0 -> 1616 bytes tests/ref/gradient-math-root.png | Bin 0 -> 1569 bytes tests/ref/gradient-math-underover.png | Bin 0 -> 1314 bytes tests/ref/gradient-presets.png | Bin 0 -> 17420 bytes tests/ref/gradient-radial-center.png | Bin 0 -> 1994 bytes .../gradient-radial-focal-center-and-radius.png | Bin 0 -> 3987 bytes tests/ref/gradient-radial-hsl.png | Bin 0 -> 6271 bytes tests/ref/gradient-radial-radius.png | Bin 0 -> 2935 bytes tests/ref/gradient-radial-relative-parent.png | Bin 0 -> 1724 bytes tests/ref/gradient-radial-relative-self.png | Bin 0 -> 2238 bytes tests/ref/gradient-radial-text.png | Bin 0 -> 10645 bytes tests/ref/gradient-repr.png | Bin 0 -> 9175 bytes tests/ref/gradient-text-decoration.png | Bin 0 -> 2343 bytes tests/ref/gradient-text-dir.png | Bin 0 -> 9419 bytes tests/ref/gradient-text-global.png | Bin 0 -> 7171 bytes tests/ref/gradient-text-in-container.png | Bin 0 -> 896 bytes tests/ref/gradient-text-rotate.png | Bin 0 -> 489 bytes tests/ref/gradient-transformed.png | Bin 0 -> 223 bytes tests/ref/grid-align.png | Bin 0 -> 1498 bytes tests/ref/grid-auto-shrink.png | Bin 0 -> 3321 bytes tests/ref/grid-breaking-expand-vertically.png | Bin 0 -> 700 bytes tests/ref/grid-calendar.png | Bin 0 -> 6653 bytes tests/ref/grid-cell-align-override.png | Bin 0 -> 828 bytes tests/ref/grid-cell-breaking.png | Bin 0 -> 3581 bytes tests/ref/grid-cell-folding.png | Bin 0 -> 1096 bytes ...l-override-in-header-and-footer-with-gutter.png | Bin 0 -> 949 bytes .../grid-cell-override-in-header-and-footer.png | Bin 0 -> 905 bytes tests/ref/grid-cell-override.png | Bin 0 -> 3546 bytes .../grid-cell-position-automatic-skip-manual.png | Bin 0 -> 572 bytes tests/ref/grid-cell-position-extra-rows.png | Bin 0 -> 776 bytes tests/ref/grid-cell-position-out-of-order.png | Bin 0 -> 352 bytes tests/ref/grid-cell-position-partial.png | Bin 0 -> 1666 bytes tests/ref/grid-cell-set.png | Bin 0 -> 3862 bytes tests/ref/grid-cell-show-and-override.png | Bin 0 -> 2626 bytes tests/ref/grid-cell-show-based-on-position.png | Bin 0 -> 1450 bytes tests/ref/grid-cell-show-emph.png | Bin 0 -> 697 bytes tests/ref/grid-cell-show-x-y.png | Bin 0 -> 2740 bytes tests/ref/grid-cell-show.png | Bin 0 -> 1903 bytes tests/ref/grid-cell-various-overrides.png | Bin 0 -> 1268 bytes tests/ref/grid-colspan-gutter.png | Bin 0 -> 7505 bytes tests/ref/grid-colspan-multiple-regions.png | Bin 0 -> 2571 bytes ...colspan-over-all-fr-columns-page-width-auto.png | Bin 0 -> 1843 bytes tests/ref/grid-colspan-over-all-fr-columns.png | Bin 0 -> 2128 bytes tests/ref/grid-colspan-over-some-fr-columns.png | Bin 0 -> 1622 bytes tests/ref/grid-colspan-thick-stroke.png | Bin 0 -> 4027 bytes tests/ref/grid-colspan.png | Bin 0 -> 6689 bytes tests/ref/grid-column-sizing-auto-base.png | Bin 0 -> 123 bytes tests/ref/grid-column-sizing-fr-base.png | Bin 0 -> 126 bytes tests/ref/grid-column-sizing-mixed-base.png | Bin 0 -> 127 bytes tests/ref/grid-columns-sizings-rect.png | Bin 0 -> 180 bytes tests/ref/grid-complete-rows.png | Bin 0 -> 304 bytes tests/ref/grid-consecutive-rows-breaking.png | Bin 0 -> 2768 bytes tests/ref/grid-exam.png | Bin 0 -> 4861 bytes tests/ref/grid-fill-func.png | Bin 0 -> 709 bytes tests/ref/grid-finance.png | Bin 0 -> 4846 bytes tests/ref/grid-footer-bare-1.png | Bin 0 -> 252 bytes tests/ref/grid-footer-bare-2.png | Bin 0 -> 553 bytes tests/ref/grid-footer-below-rowspans.png | Bin 0 -> 202 bytes tests/ref/grid-footer-cell-with-y.png | Bin 0 -> 207 bytes tests/ref/grid-footer-expand.png | Bin 0 -> 364 bytes tests/ref/grid-footer-gutter-and-no-repeat.png | Bin 0 -> 7032 bytes tests/ref/grid-footer-hline-and-vline-1.png | Bin 0 -> 690 bytes tests/ref/grid-footer-hline-and-vline-2.png | Bin 0 -> 413 bytes tests/ref/grid-footer-relative-row-sizes.png | Bin 0 -> 457 bytes tests/ref/grid-footer-rowspan.png | Bin 0 -> 1451 bytes tests/ref/grid-footer-stroke-edge-cases.png | Bin 0 -> 1233 bytes tests/ref/grid-footer-top-stroke.png | Bin 0 -> 2462 bytes tests/ref/grid-footer.png | Bin 0 -> 7023 bytes tests/ref/grid-funcs-gutter.png | Bin 0 -> 3376 bytes tests/ref/grid-gutter-fr.png | Bin 0 -> 1293 bytes .../grid-header-and-footer-containing-rowspan.png | Bin 0 -> 5304 bytes tests/ref/grid-header-and-footer-empty.png | Bin 0 -> 1592 bytes tests/ref/grid-header-and-footer-lack-of-space.png | Bin 0 -> 3768 bytes .../grid-header-and-footer-orphan-prevention.png | Bin 0 -> 8488 bytes .../grid-header-and-rowspan-non-contiguous-1.png | Bin 0 -> 7080 bytes .../grid-header-and-rowspan-non-contiguous-2.png | Bin 0 -> 7094 bytes .../grid-header-and-rowspan-non-contiguous-3.png | Bin 0 -> 7062 bytes tests/ref/grid-header-block-with-fixed-height.png | Bin 0 -> 1299 bytes tests/ref/grid-header-cell-with-y.png | Bin 0 -> 214 bytes tests/ref/grid-header-containing-rowspan.png | Bin 0 -> 8610 bytes tests/ref/grid-header-empty.png | Bin 0 -> 4734 bytes tests/ref/grid-header-expand.png | Bin 0 -> 2024 bytes ...-header-footer-and-rowspan-non-contiguous-1.png | Bin 0 -> 4334 bytes ...-header-footer-and-rowspan-non-contiguous-2.png | Bin 0 -> 4403 bytes .../grid-header-footer-block-with-fixed-height.png | Bin 0 -> 2151 bytes tests/ref/grid-header-hline-and-vline.png | Bin 0 -> 1231 bytes tests/ref/grid-header-hline-bottom-manually.png | Bin 0 -> 506 bytes tests/ref/grid-header-hline-bottom.png | Bin 0 -> 339 bytes tests/ref/grid-header-lack-of-space.png | Bin 0 -> 3193 bytes tests/ref/grid-header-last-child.png | Bin 0 -> 253 bytes tests/ref/grid-header-nested.png | Bin 0 -> 12613 bytes tests/ref/grid-header-orphan-prevention.png | Bin 0 -> 10968 bytes tests/ref/grid-header-relative-row-sizes.png | Bin 0 -> 449 bytes tests/ref/grid-header-rowspan-base.png | Bin 0 -> 415 bytes tests/ref/grid-header-stroke-edge-cases.png | Bin 0 -> 1176 bytes tests/ref/grid-headers-gutter.png | Bin 0 -> 12339 bytes tests/ref/grid-headers-no-repeat.png | Bin 0 -> 8915 bytes tests/ref/grid-headers.png | Bin 0 -> 10990 bytes tests/ref/grid-inset-folding.png | Bin 0 -> 202 bytes tests/ref/grid-inset.png | Bin 0 -> 4201 bytes tests/ref/grid-nested-breaking.png | Bin 0 -> 1665 bytes tests/ref/grid-nested-footers.png | Bin 0 -> 726 bytes tests/ref/grid-nested-headers.png | Bin 0 -> 494 bytes tests/ref/grid-nested-with-footers.png | Bin 0 -> 611 bytes tests/ref/grid-nested-with-headers.png | Bin 0 -> 583 bytes tests/ref/grid-row-sizing-manual-align.png | Bin 0 -> 594 bytes tests/ref/grid-rowspan-block-full-height.png | Bin 0 -> 341 bytes tests/ref/grid-rowspan-block-overflow.png | Bin 0 -> 232 bytes tests/ref/grid-rowspan-cell-coordinates.png | Bin 0 -> 4633 bytes tests/ref/grid-rowspan-cell-order.png | Bin 0 -> 2242 bytes tests/ref/grid-rowspan-excessive-gutter.png | Bin 0 -> 2147 bytes tests/ref/grid-rowspan-excessive.png | Bin 0 -> 1571 bytes tests/ref/grid-rowspan-fixed-size.png | Bin 0 -> 1488 bytes tests/ref/grid-rowspan-gutter.png | Bin 0 -> 10559 bytes .../grid-rowspan-in-all-columns-stroke-gutter.png | Bin 0 -> 1109 bytes tests/ref/grid-rowspan-in-all-columns-stroke.png | Bin 0 -> 939 bytes tests/ref/grid-rowspan-over-auto-row.png | Bin 0 -> 1004 bytes tests/ref/grid-rowspan-over-fr-row-at-end.png | Bin 0 -> 682 bytes tests/ref/grid-rowspan-over-fr-row-at-start.png | Bin 0 -> 685 bytes tests/ref/grid-rowspan-split-1.png | Bin 0 -> 915 bytes tests/ref/grid-rowspan-split-10.png | Bin 0 -> 589 bytes tests/ref/grid-rowspan-split-11.png | Bin 0 -> 924 bytes tests/ref/grid-rowspan-split-12.png | Bin 0 -> 1530 bytes tests/ref/grid-rowspan-split-13.png | Bin 0 -> 1463 bytes tests/ref/grid-rowspan-split-14.png | Bin 0 -> 6200 bytes tests/ref/grid-rowspan-split-15.png | Bin 0 -> 1727 bytes tests/ref/grid-rowspan-split-16.png | Bin 0 -> 1121 bytes tests/ref/grid-rowspan-split-17.png | Bin 0 -> 4650 bytes tests/ref/grid-rowspan-split-2.png | Bin 0 -> 1004 bytes tests/ref/grid-rowspan-split-3.png | Bin 0 -> 2049 bytes tests/ref/grid-rowspan-split-4.png | Bin 0 -> 2113 bytes tests/ref/grid-rowspan-split-5.png | Bin 0 -> 1414 bytes tests/ref/grid-rowspan-split-6.png | Bin 0 -> 1433 bytes tests/ref/grid-rowspan-split-7.png | Bin 0 -> 778 bytes tests/ref/grid-rowspan-split-8.png | Bin 0 -> 815 bytes tests/ref/grid-rowspan-split-9.png | Bin 0 -> 967 bytes tests/ref/grid-rowspan-unbreakable-1.png | Bin 0 -> 740 bytes tests/ref/grid-rowspan-unbreakable-2.png | Bin 0 -> 3602 bytes tests/ref/grid-rowspan.png | Bin 0 -> 9089 bytes tests/ref/grid-rtl-colspan-stroke.png | Bin 0 -> 7997 bytes tests/ref/grid-rtl-colspan.png | Bin 0 -> 6124 bytes tests/ref/grid-rtl-complex.png | Bin 0 -> 10001 bytes tests/ref/grid-rtl-header.png | Bin 0 -> 10680 bytes tests/ref/grid-rtl-multiple-regions.png | Bin 0 -> 2561 bytes tests/ref/grid-rtl-rowspan.png | Bin 0 -> 1012 bytes tests/ref/grid-rtl-vline-position.png | Bin 0 -> 1391 bytes tests/ref/grid-rtl.png | Bin 0 -> 412 bytes .../grid-same-row-multiple-columns-breaking.png | Bin 0 -> 1560 bytes tests/ref/grid-stroke-array.png | Bin 0 -> 2359 bytes .../grid-stroke-automatically-positioned-lines.png | Bin 0 -> 1079 bytes tests/ref/grid-stroke-border-partial.png | Bin 0 -> 2454 bytes tests/ref/grid-stroke-complex.png | Bin 0 -> 1756 bytes tests/ref/grid-stroke-field-in-show.png | Bin 0 -> 255 bytes tests/ref/grid-stroke-folding.png | Bin 0 -> 1096 bytes tests/ref/grid-stroke-func.png | Bin 0 -> 534 bytes .../grid-stroke-hline-position-bottom-gutter.png | Bin 0 -> 1716 bytes tests/ref/grid-stroke-hline-position-bottom.png | Bin 0 -> 1300 bytes tests/ref/grid-stroke-hline-rowspan.png | Bin 0 -> 400 bytes .../ref/grid-stroke-manually-positioned-lines.png | Bin 0 -> 972 bytes tests/ref/grid-stroke-none.png | Bin 0 -> 424 bytes tests/ref/grid-stroke-pattern.png | Bin 0 -> 1817 bytes tests/ref/grid-stroke-priority-cell.png | Bin 0 -> 1164 bytes tests/ref/grid-stroke-priority-line-cell.png | Bin 0 -> 2563 bytes tests/ref/grid-stroke-priority-line.png | Bin 0 -> 545 bytes tests/ref/grid-stroke-set-on-cell-and-line.png | Bin 0 -> 1149 bytes tests/ref/grid-stroke-vline-colspan.png | Bin 0 -> 680 bytes .../grid-stroke-vline-position-left-and-right.png | Bin 0 -> 823 bytes .../grid-trailing-linebreak-region-overflow.png | Bin 0 -> 715 bytes tests/ref/heading-basic.png | Bin 0 -> 1029 bytes tests/ref/heading-block.png | Bin 0 -> 1157 bytes tests/ref/heading-offset-and-level.png | Bin 0 -> 619 bytes tests/ref/heading-offset.png | Bin 0 -> 5624 bytes tests/ref/heading-show-where.png | Bin 0 -> 2349 bytes tests/ref/heading-syntax-at-start.png | Bin 0 -> 1469 bytes tests/ref/heading-syntax-edge-cases.png | Bin 0 -> 737 bytes tests/ref/hide-image.png | Bin 0 -> 8838 bytes tests/ref/hide-line.png | Bin 0 -> 352 bytes tests/ref/hide-list.png | Bin 0 -> 775 bytes tests/ref/hide-polygon.png | Bin 0 -> 791 bytes tests/ref/hide-rect.png | Bin 0 -> 1203 bytes tests/ref/hide-table.png | Bin 0 -> 619 bytes tests/ref/hide-text.png | Bin 0 -> 380 bytes tests/ref/highlight-bounds.png | Bin 0 -> 1218 bytes tests/ref/highlight-edges-bounds.png | Bin 0 -> 638 bytes tests/ref/highlight-edges.png | Bin 0 -> 1288 bytes tests/ref/highlight-radius.png | Bin 0 -> 1666 bytes tests/ref/highlight-stroke.png | Bin 0 -> 2186 bytes tests/ref/highlight.png | Bin 0 -> 4693 bytes tests/ref/hyphenate-between-shape-runs.png | Bin 0 -> 462 bytes tests/ref/hyphenate-off-temporarily.png | Bin 0 -> 4793 bytes tests/ref/hyphenate-punctuation.png | Bin 0 -> 530 bytes tests/ref/hyphenate-shy.png | Bin 0 -> 607 bytes tests/ref/hyphenate.png | Bin 0 -> 1249 bytes tests/ref/if-condition-complex.png | Bin 0 -> 829 bytes tests/ref/if-markup.png | Bin 0 -> 215 bytes tests/ref/image-baseline-with-box.png | Bin 0 -> 6375 bytes tests/ref/image-decode-detect-format.png | Bin 0 -> 10628 bytes tests/ref/image-decode-specify-format.png | Bin 0 -> 10628 bytes tests/ref/image-decode-svg.png | Bin 0 -> 686 bytes tests/ref/image-fit.png | Bin 0 -> 10287 bytes tests/ref/image-jump-to-next-page.png | Bin 0 -> 5393 bytes tests/ref/image-natural-dpi-sizing.png | Bin 0 -> 225 bytes tests/ref/image-rgba-png-and-jpeg.png | Bin 0 -> 18076 bytes tests/ref/image-sizing.png | Bin 0 -> 8625 bytes tests/ref/image-svg-complex.png | Bin 0 -> 1249 bytes tests/ref/image-svg-text-font.png | Bin 0 -> 1363 bytes tests/ref/image-svg-text.png | Bin 0 -> 5658 bytes tests/ref/import-basic.png | Bin 0 -> 1529 bytes tests/ref/import-from-function-scope.png | Bin 0 -> 436 bytes tests/ref/import-source-field-access.png | Bin 0 -> 177 bytes tests/ref/include-file.png | Bin 0 -> 16601 bytes tests/ref/int-display.png | Bin 0 -> 1406 bytes tests/ref/int-repr.png | Bin 0 -> 1402 bytes tests/ref/issue-1041-smartquotes-in-outline.png | Bin 0 -> 3482 bytes tests/ref/issue-1050-terms-indent.png | Bin 0 -> 8165 bytes tests/ref/issue-1052-math-number-spacing.png | Bin 0 -> 486 bytes tests/ref/issue-1216-clamp-panic.png | Bin 0 -> 175 bytes tests/ref/issue-1240-stack-h-fr.png | Bin 0 -> 332 bytes tests/ref/issue-1240-stack-v-fr.png | Bin 0 -> 281 bytes tests/ref/issue-1368-place-pagebreak.png | Bin 0 -> 418 bytes tests/ref/issue-1373-bidi-tofus.png | Bin 0 -> 227 bytes tests/ref/issue-1388-table-row-missing.png | Bin 0 -> 454 bytes tests/ref/issue-1398-line-align.png | Bin 0 -> 147 bytes tests/ref/issue-1433-footnote-in-list.png | Bin 0 -> 529 bytes .../ref/issue-1540-smartquotes-across-newlines.png | Bin 0 -> 597 bytes tests/ref/issue-1597-cite-footnote.png | Bin 0 -> 1380 bytes tests/ref/issue-1825-rect-overflow.png | Bin 0 -> 10073 bytes tests/ref/issue-183-table-lines.png | Bin 0 -> 560 bytes tests/ref/issue-1948-math-text-break.png | Bin 0 -> 385 bytes tests/ref/issue-2044-invalid-parsed-ident.png | Bin 0 -> 291 bytes tests/ref/issue-2051-new-cm-svg.png | Bin 0 -> 1214 bytes tests/ref/issue-2055-math-eval.png | Bin 0 -> 1043 bytes tests/ref/issue-2095-pagebreak-numbering.png | Bin 0 -> 1407 bytes tests/ref/issue-2105-linebreak-tofu.png | Bin 0 -> 246 bytes tests/ref/issue-2128-block-width-box.png | Bin 0 -> 769 bytes tests/ref/issue-2134-pagebreak-bibliography.png | Bin 0 -> 782 bytes tests/ref/issue-2162-pagebreak-set-style.png | Bin 0 -> 2169 bytes tests/ref/issue-2199-place-spacing-bottom.png | Bin 0 -> 1222 bytes tests/ref/issue-2199-place-spacing-default.png | Bin 0 -> 1225 bytes tests/ref/issue-2214-baseline-math.png | Bin 0 -> 891 bytes tests/ref/issue-2259-raw-color-overwrite.png | Bin 0 -> 2617 bytes tests/ref/issue-2268-mat-augment-color.png | Bin 0 -> 669 bytes tests/ref/issue-2419-justify-hanging-indent.png | Bin 0 -> 712 bytes tests/ref/issue-2530-enum-item-panic.png | Bin 0 -> 470 bytes tests/ref/issue-2530-figure-caption-panic.png | Bin 0 -> 194 bytes tests/ref/issue-2530-list-item-panic.png | Bin 0 -> 262 bytes tests/ref/issue-2530-term-item-panic.png | Bin 0 -> 463 bytes tests/ref/issue-2531-cite-show-set.png | Bin 0 -> 984 bytes ...sue-2538-cjk-latin-spacing-before-linebreak.png | Bin 0 -> 914 bytes tests/ref/issue-2595-float-overlap.png | Bin 0 -> 4055 bytes tests/ref/issue-2650-cjk-latin-spacing-meta.png | Bin 0 -> 532 bytes tests/ref/issue-2715-float-order.png | Bin 0 -> 4790 bytes tests/ref/issue-2902-gradient-oklab-panic.png | Bin 0 -> 1129 bytes tests/ref/issue-2902-gradient-oklch-panic.png | Bin 0 -> 1140 bytes tests/ref/issue-3082-chinese-punctuation.png | Bin 0 -> 3012 bytes tests/ref/issue-3191-raw-indent-shrink.png | Bin 0 -> 1422 bytes ...sue-3191-raw-normal-paragraphs-still-shrink.png | Bin 0 -> 1143 bytes tests/ref/issue-3232-dict-empty.png | Bin 0 -> 261 bytes tests/ref/issue-3264-rect-negative-dimensions.png | Bin 0 -> 4176 bytes tests/ref/issue-3363-json-large-number.png | Bin 0 -> 663 bytes tests/ref/issue-3586-figure-caption-separator.png | Bin 0 -> 133 bytes tests/ref/issue-3624-spacing-behaviour.png | Bin 0 -> 277 bytes tests/ref/issue-3641-float-loop.png | Bin 0 -> 1426 bytes tests/ref/issue-3650-italic-equation.png | Bin 0 -> 1494 bytes tests/ref/issue-3658-math-size.png | Bin 0 -> 320 bytes tests/ref/issue-3662-pdf-smartquotes.png | Bin 0 -> 4710 bytes tests/ref/issue-3700-deformed-stroke.png | Bin 0 -> 103 bytes tests/ref/issue-3841-tabs-in-raw-type-code.png | Bin 0 -> 4857 bytes tests/ref/issue-622-hide-meta-cite.png | Bin 0 -> 2419 bytes tests/ref/issue-622-hide-meta-outline.png | Bin 0 -> 2177 bytes tests/ref/issue-785-cite-locate.png | Bin 0 -> 15456 bytes tests/ref/issue-80-emoji-linebreak.png | Bin 0 -> 211 bytes tests/ref/issue-852-mat-type.png | Bin 0 -> 1926 bytes tests/ref/issue-870-image-rotation.png | Bin 0 -> 200 bytes tests/ref/issue-886-args-sink.png | Bin 0 -> 417 bytes tests/ref/issue-columns-heading.png | Bin 0 -> 585 bytes tests/ref/issue-flow-frame-placement.png | Bin 0 -> 2985 bytes .../ref/issue-flow-layout-index-out-of-bounds.png | Bin 0 -> 7462 bytes tests/ref/issue-flow-overlarge-frames.png | Bin 0 -> 3276 bytes tests/ref/issue-flow-trailing-leading.png | Bin 0 -> 1987 bytes tests/ref/issue-flow-weak-spacing.png | Bin 0 -> 726 bytes tests/ref/issue-gradient-cmyk-encode.png | Bin 0 -> 303 bytes tests/ref/issue-grid-base-auto-row-list.png | Bin 0 -> 225 bytes tests/ref/issue-grid-base-auto-row.png | Bin 0 -> 278 bytes tests/ref/issue-grid-double-skip.png | Bin 0 -> 685 bytes tests/ref/issue-grid-gutter-skip.png | Bin 0 -> 527 bytes tests/ref/issue-grid-skip-list.png | Bin 0 -> 1333 bytes tests/ref/issue-grid-skip.png | Bin 0 -> 1691 bytes tests/ref/issue-math-realize-hide.png | Bin 0 -> 494 bytes tests/ref/issue-math-realize-scripting.png | Bin 0 -> 2607 bytes tests/ref/issue-math-realize-show.png | Bin 0 -> 1802 bytes tests/ref/issue-multiple-footnote-in-one-line.png | Bin 0 -> 713 bytes tests/ref/issue-non-atomic-closure.png | Bin 0 -> 136 bytes tests/ref/issue-place-base.png | Bin 0 -> 599 bytes tests/ref/issue-rtl-safe-to-break-panic.png | Bin 0 -> 168 bytes tests/ref/justify-avoid-runts.png | Bin 0 -> 1879 bytes tests/ref/justify-chinese.png | Bin 0 -> 6678 bytes tests/ref/justify-code-blocks.png | Bin 0 -> 2402 bytes tests/ref/justify-japanese.png | Bin 0 -> 10514 bytes tests/ref/justify-justified-linebreak.png | Bin 0 -> 387 bytes tests/ref/justify-knuth-story.png | Bin 0 -> 24663 bytes tests/ref/justify-manual-linebreak.png | Bin 0 -> 302 bytes tests/ref/justify-no-leading-spaces.png | Bin 0 -> 2735 bytes tests/ref/justify-punctuation-adjustment.png | Bin 0 -> 7702 bytes tests/ref/justify-shrink-last-line.png | Bin 0 -> 801 bytes tests/ref/justify-variants.png | Bin 0 -> 8052 bytes tests/ref/justify-whitespace-adjustment.png | Bin 0 -> 1828 bytes tests/ref/justify-without-justifiables.png | Bin 0 -> 831 bytes tests/ref/justify.png | Bin 0 -> 4013 bytes tests/ref/label-after-expression.png | Bin 0 -> 392 bytes tests/ref/label-after-parbreak.png | Bin 0 -> 290 bytes tests/ref/label-dynamic-show-set.png | Bin 0 -> 595 bytes tests/ref/label-in-block.png | Bin 0 -> 835 bytes tests/ref/label-on-text.png | Bin 0 -> 1404 bytes tests/ref/label-show-where-selector.png | Bin 0 -> 1307 bytes tests/ref/label-unclosed-is-text.png | Bin 0 -> 479 bytes tests/ref/layout-in-fixed-size-block.png | Bin 0 -> 2633 bytes tests/ref/layout-in-page-call.png | Bin 0 -> 2572 bytes tests/ref/layout/align.png | Bin 8400 -> 0 bytes tests/ref/layout/block-sizing.png | Bin 31042 -> 0 bytes tests/ref/layout/block-spacing.png | Bin 1868 -> 0 bytes tests/ref/layout/cjk-latin-spacing.png | Bin 8399 -> 0 bytes tests/ref/layout/cjk-punctuation-adjustment.png | Bin 28665 -> 0 bytes tests/ref/layout/clip.png | Bin 33092 -> 0 bytes tests/ref/layout/code-indent-shrink.png | Bin 8232 -> 0 bytes tests/ref/layout/columns.png | Bin 95706 -> 0 bytes tests/ref/layout/container-fill.png | Bin 18457 -> 0 bytes tests/ref/layout/container.png | Bin 21577 -> 0 bytes tests/ref/layout/enum-align.png | Bin 18701 -> 0 bytes tests/ref/layout/enum-numbering.png | Bin 19079 -> 0 bytes tests/ref/layout/enum.png | Bin 14280 -> 0 bytes tests/ref/layout/flow-orphan.png | Bin 83917 -> 0 bytes tests/ref/layout/grid-1.png | Bin 8143 -> 0 bytes tests/ref/layout/grid-2.png | Bin 61931 -> 0 bytes tests/ref/layout/grid-3.png | Bin 47584 -> 0 bytes tests/ref/layout/grid-4.png | Bin 425 -> 0 bytes tests/ref/layout/grid-5.png | Bin 9301 -> 0 bytes tests/ref/layout/grid-auto-shrink.png | Bin 8390 -> 0 bytes tests/ref/layout/grid-cell.png | Bin 45433 -> 0 bytes tests/ref/layout/grid-colspan.png | Bin 91276 -> 0 bytes tests/ref/layout/grid-footers-1.png | Bin 50791 -> 0 bytes tests/ref/layout/grid-footers-2.png | Bin 52405 -> 0 bytes tests/ref/layout/grid-footers-3.png | Bin 52783 -> 0 bytes tests/ref/layout/grid-footers-4.png | Bin 20513 -> 0 bytes tests/ref/layout/grid-footers-5.png | Bin 18713 -> 0 bytes tests/ref/layout/grid-headers-1.png | Bin 126196 -> 0 bytes tests/ref/layout/grid-headers-2.png | Bin 113070 -> 0 bytes tests/ref/layout/grid-headers-3.png | Bin 102354 -> 0 bytes tests/ref/layout/grid-headers-4.png | Bin 42192 -> 0 bytes tests/ref/layout/grid-positioning.png | Bin 54618 -> 0 bytes tests/ref/layout/grid-rowspan-basic.png | Bin 99968 -> 0 bytes tests/ref/layout/grid-rowspan-split-1.png | Bin 30406 -> 0 bytes tests/ref/layout/grid-rowspan-split-2.png | Bin 11282 -> 0 bytes tests/ref/layout/grid-rowspan-split-3.png | Bin 100103 -> 0 bytes tests/ref/layout/grid-rtl.png | Bin 97027 -> 0 bytes tests/ref/layout/grid-stroke.png | Bin 57859 -> 0 bytes tests/ref/layout/grid-styling.png | Bin 30784 -> 0 bytes tests/ref/layout/hide.png | Bin 49286 -> 0 bytes tests/ref/layout/list-attach.png | Bin 11170 -> 0 bytes tests/ref/layout/list-marker.png | Bin 3825 -> 0 bytes tests/ref/layout/list.png | Bin 20705 -> 0 bytes tests/ref/layout/out-of-flow-in-block.png | Bin 16297 -> 0 bytes tests/ref/layout/pad.png | Bin 51646 -> 0 bytes tests/ref/layout/page-binding.png | Bin 16919 -> 0 bytes tests/ref/layout/page-margin.png | Bin 15338 -> 0 bytes tests/ref/layout/page-marginals.png | Bin 57998 -> 0 bytes tests/ref/layout/page-number-align.png | Bin 1343 -> 0 bytes tests/ref/layout/page-style.png | Bin 1294 -> 0 bytes tests/ref/layout/page.png | Bin 14273 -> 0 bytes tests/ref/layout/pagebreak-parity.png | Bin 4906 -> 0 bytes tests/ref/layout/pagebreak-weak.png | Bin 18958 -> 0 bytes tests/ref/layout/pagebreak.png | Bin 10413 -> 0 bytes tests/ref/layout/par-bidi.png | Bin 31441 -> 0 bytes tests/ref/layout/par-indent.png | Bin 64257 -> 0 bytes tests/ref/layout/par-justify-cjk.png | Bin 89706 -> 0 bytes tests/ref/layout/par-justify.png | Bin 52393 -> 0 bytes tests/ref/layout/par-knuth.png | Bin 68723 -> 0 bytes tests/ref/layout/par-simple.png | Bin 58603 -> 0 bytes tests/ref/layout/par.png | Bin 27043 -> 0 bytes tests/ref/layout/place-background.png | Bin 77357 -> 0 bytes tests/ref/layout/place-float-auto.png | Bin 3331 -> 0 bytes tests/ref/layout/place-float-columns.png | Bin 106011 -> 0 bytes tests/ref/layout/place-float-figure.png | Bin 111833 -> 0 bytes tests/ref/layout/place-nested.png | Bin 6966 -> 0 bytes tests/ref/layout/place.png | Bin 44931 -> 0 bytes tests/ref/layout/repeat.png | Bin 9048 -> 0 bytes tests/ref/layout/spacing.png | Bin 4158 -> 0 bytes tests/ref/layout/stack-1.png | Bin 1507 -> 0 bytes tests/ref/layout/stack-2.png | Bin 8247 -> 0 bytes tests/ref/layout/table-cell.png | Bin 49090 -> 0 bytes tests/ref/layout/table.png | Bin 26146 -> 0 bytes tests/ref/layout/terms.png | Bin 20057 -> 0 bytes tests/ref/layout/transform-layout.png | Bin 42107 -> 0 bytes tests/ref/layout/transform.png | Bin 51410 -> 0 bytes tests/ref/let-basic.png | Bin 0 -> 343 bytes tests/ref/let-termination.png | Bin 0 -> 479 bytes tests/ref/line-basic.png | Bin 0 -> 445 bytes tests/ref/line-positioning.png | Bin 0 -> 506 bytes tests/ref/line-stroke-dash.png | Bin 0 -> 171 bytes tests/ref/line-stroke-set.png | Bin 0 -> 150 bytes tests/ref/line-stroke.png | Bin 0 -> 193 bytes tests/ref/linebreak-cite-punctuation.png | Bin 0 -> 10248 bytes tests/ref/linebreak-hyphen-nbsp.png | Bin 0 -> 838 bytes tests/ref/linebreak-link-end.png | Bin 0 -> 2080 bytes tests/ref/linebreak-link-justify.png | Bin 0 -> 12258 bytes tests/ref/linebreak-link.png | Bin 0 -> 6373 bytes tests/ref/linebreak-manual-consecutive.png | Bin 0 -> 956 bytes .../linebreak-manual-directly-after-automatic.png | Bin 0 -> 1002 bytes tests/ref/linebreak-manual-justified.png | Bin 0 -> 1755 bytes tests/ref/linebreak-manual-trailing-multiple.png | Bin 0 -> 464 bytes tests/ref/linebreak-manual.png | Bin 0 -> 398 bytes tests/ref/linebreak-math-punctuation.png | Bin 0 -> 3054 bytes tests/ref/linebreak-narrow-nbsp.png | Bin 0 -> 1317 bytes tests/ref/linebreak-overflow-double.png | Bin 0 -> 1382 bytes tests/ref/linebreak-overflow.png | Bin 0 -> 858 bytes tests/ref/linebreak-shape-run.png | Bin 0 -> 706 bytes tests/ref/linebreak-thai.png | Bin 0 -> 6968 bytes tests/ref/link-basic.png | Bin 0 -> 6194 bytes tests/ref/link-bracket-balanced.png | Bin 0 -> 3895 bytes tests/ref/link-bracket-unbalanced-closing.png | Bin 0 -> 2129 bytes tests/ref/link-on-block.png | Bin 0 -> 2423 bytes tests/ref/link-show.png | Bin 0 -> 2639 bytes tests/ref/link-to-label.png | Bin 0 -> 993 bytes tests/ref/link-to-page.png | Bin 0 -> 985 bytes tests/ref/link-trailing-period.png | Bin 0 -> 2990 bytes tests/ref/link-transformed.png | Bin 0 -> 1274 bytes tests/ref/list-attached-above-spacing.png | Bin 0 -> 605 bytes tests/ref/list-attached.png | Bin 0 -> 1464 bytes tests/ref/list-basic.png | Bin 0 -> 1001 bytes tests/ref/list-content-block.png | Bin 0 -> 965 bytes tests/ref/list-indent-specifics.png | Bin 0 -> 392 bytes tests/ref/list-marker-align-unaffected.png | Bin 0 -> 822 bytes tests/ref/list-marker-bare-hyphen.png | Bin 0 -> 773 bytes tests/ref/list-marker-closure.png | Bin 0 -> 503 bytes tests/ref/list-marker-cycle.png | Bin 0 -> 312 bytes tests/ref/list-marker-dash.png | Bin 0 -> 239 bytes tests/ref/list-mix.png | Bin 0 -> 968 bytes tests/ref/list-mixed-tabs-and-spaces.png | Bin 0 -> 765 bytes tests/ref/list-nested.png | Bin 0 -> 2740 bytes .../ref/list-non-attached-followed-by-attached.png | Bin 0 -> 593 bytes tests/ref/list-rtl.png | Bin 0 -> 401 bytes tests/ref/list-syntax-edge-cases.png | Bin 0 -> 565 bytes tests/ref/list-tabs.png | Bin 0 -> 694 bytes tests/ref/list-tight-non-attached-tight.png | Bin 0 -> 798 bytes tests/ref/list-top-level-indent.png | Bin 0 -> 679 bytes tests/ref/list-wide-cannot-attach.png | Bin 0 -> 609 bytes tests/ref/list-wide-really-cannot-attach.png | Bin 0 -> 605 bytes tests/ref/locate-element-selector.png | Bin 0 -> 685 bytes tests/ref/locate-position.png | Bin 0 -> 685 bytes tests/ref/loop-break-join-in-first-arg.png | Bin 0 -> 380 bytes tests/ref/loop-break-join-in-nested-blocks.png | Bin 0 -> 1043 bytes tests/ref/loop-break-join-in-set-rule-args.png | Bin 0 -> 245 bytes tests/ref/loop-break-join-set-and-show.png | Bin 0 -> 1128 bytes tests/ref/lorem-pars.png | Bin 0 -> 6514 bytes tests/ref/lorem.png | Bin 0 -> 2806 bytes tests/ref/math-accent-align.png | Bin 0 -> 614 bytes tests/ref/math-accent-bounds.png | Bin 0 -> 333 bytes tests/ref/math-accent-func.png | Bin 0 -> 284 bytes tests/ref/math-accent-high-base.png | Bin 0 -> 571 bytes tests/ref/math-accent-sized.png | Bin 0 -> 379 bytes tests/ref/math-accent-superscript.png | Bin 0 -> 472 bytes tests/ref/math-accent-sym-call.png | Bin 0 -> 926 bytes tests/ref/math-accent-wide-base.png | Bin 0 -> 510 bytes tests/ref/math-align-aligned-in-source.png | Bin 0 -> 493 bytes tests/ref/math-align-basic.png | Bin 0 -> 650 bytes tests/ref/math-align-cases.png | Bin 0 -> 578 bytes tests/ref/math-align-implicit.png | Bin 0 -> 706 bytes tests/ref/math-align-lines-mixed.png | Bin 0 -> 430 bytes tests/ref/math-align-post-fix.png | Bin 0 -> 709 bytes tests/ref/math-align-toggle.png | Bin 0 -> 469 bytes tests/ref/math-align-weird.png | Bin 0 -> 1243 bytes tests/ref/math-align-wider-first-column.png | Bin 0 -> 704 bytes tests/ref/math-attach-default-placement.png | Bin 0 -> 1866 bytes tests/ref/math-attach-descender-collision.png | Bin 0 -> 739 bytes tests/ref/math-attach-followed-by-func-call.png | Bin 0 -> 1206 bytes tests/ref/math-attach-force-scripts-and-limits.png | Bin 0 -> 1137 bytes tests/ref/math-attach-high.png | Bin 0 -> 1296 bytes tests/ref/math-attach-horizontal-align.png | Bin 0 -> 2001 bytes tests/ref/math-attach-integral.png | Bin 0 -> 965 bytes tests/ref/math-attach-large-operator.png | Bin 0 -> 839 bytes tests/ref/math-attach-limit.png | Bin 0 -> 727 bytes tests/ref/math-attach-mixed.png | Bin 0 -> 2357 bytes tests/ref/math-attach-nested.png | Bin 0 -> 952 bytes tests/ref/math-attach-postscripts.png | Bin 0 -> 497 bytes tests/ref/math-attach-prescripts.png | Bin 0 -> 675 bytes tests/ref/math-attach-show-limit.png | Bin 0 -> 673 bytes tests/ref/math-attach-subscript-multiline.png | Bin 0 -> 772 bytes tests/ref/math-attach-to-group.png | Bin 0 -> 651 bytes tests/ref/math-binom-multiple.png | Bin 0 -> 526 bytes tests/ref/math-binom.png | Bin 0 -> 323 bytes tests/ref/math-box-with-baseline.png | Bin 0 -> 225 bytes tests/ref/math-box-without-baseline.png | Bin 0 -> 461 bytes tests/ref/math-call-non-func.png | Bin 0 -> 761 bytes tests/ref/math-cancel-angle-absolute.png | Bin 0 -> 353 bytes tests/ref/math-cancel-angle-func.png | Bin 0 -> 938 bytes tests/ref/math-cancel-cross.png | Bin 0 -> 1618 bytes tests/ref/math-cancel-customized.png | Bin 0 -> 1062 bytes tests/ref/math-cancel-display.png | Bin 0 -> 1315 bytes tests/ref/math-cancel-inline.png | Bin 0 -> 621 bytes tests/ref/math-cancel-inverted.png | Bin 0 -> 789 bytes tests/ref/math-cases-gap.png | Bin 0 -> 285 bytes tests/ref/math-cases.png | Bin 0 -> 1257 bytes tests/ref/math-class-chars.png | Bin 0 -> 1331 bytes tests/ref/math-class-content.png | Bin 0 -> 786 bytes tests/ref/math-class-exceptions.png | Bin 0 -> 507 bytes tests/ref/math-class-limits.png | Bin 0 -> 495 bytes tests/ref/math-class-nested.png | Bin 0 -> 228 bytes tests/ref/math-common-symbols.png | Bin 0 -> 243 bytes tests/ref/math-dif.png | Bin 0 -> 1049 bytes tests/ref/math-equation-align-numbered.png | Bin 0 -> 1314 bytes tests/ref/math-equation-align-unnumbered.png | Bin 0 -> 826 bytes tests/ref/math-equation-auto-wrapping.png | Bin 0 -> 160 bytes tests/ref/math-equation-font.png | Bin 0 -> 1035 bytes tests/ref/math-equation-number-align-end.png | Bin 0 -> 1541 bytes tests/ref/math-equation-number-align-left.png | Bin 0 -> 1526 bytes ...math-equation-number-align-multiline-bottom.png | Bin 0 -> 758 bytes ...math-equation-number-align-multiline-expand.png | Bin 0 -> 510 bytes ...h-equation-number-align-multiline-top-start.png | Bin 0 -> 597 bytes tests/ref/math-equation-number-align-multiline.png | Bin 0 -> 587 bytes tests/ref/math-equation-number-align-right.png | Bin 0 -> 1506 bytes tests/ref/math-equation-number-align-start.png | Bin 0 -> 1528 bytes tests/ref/math-equation-number-align.png | Bin 0 -> 1541 bytes tests/ref/math-equation-numbering.png | Bin 0 -> 4604 bytes tests/ref/math-equation-show-rule.png | Bin 0 -> 1033 bytes tests/ref/math-font-fallback.png | Bin 0 -> 400 bytes tests/ref/math-font-features.png | Bin 0 -> 1248 bytes tests/ref/math-font-switch.png | Bin 0 -> 348 bytes tests/ref/math-frac-associativity.png | Bin 0 -> 484 bytes tests/ref/math-frac-baseline.png | Bin 0 -> 594 bytes tests/ref/math-frac-large.png | Bin 0 -> 563 bytes tests/ref/math-frac-paren-removal.png | Bin 0 -> 506 bytes tests/ref/math-frac-precedence.png | Bin 0 -> 3867 bytes .../ref/math-linebreaking-after-binop-and-rel.png | Bin 0 -> 647 bytes ...h-linebreaking-after-relation-without-space.png | Bin 0 -> 439 bytes ...-linebreaking-between-consecutive-relations.png | Bin 0 -> 387 bytes tests/ref/math-linebreaking-empty.png | Bin 0 -> 615 bytes tests/ref/math-linebreaking-in-box.png | Bin 0 -> 222 bytes tests/ref/math-linebreaking-lr.png | Bin 0 -> 559 bytes tests/ref/math-linebreaking-multiline.png | Bin 0 -> 317 bytes tests/ref/math-linebreaking-trailing-linebreak.png | Bin 0 -> 296 bytes tests/ref/math-lr-call.png | Bin 0 -> 847 bytes tests/ref/math-lr-color.png | Bin 0 -> 670 bytes tests/ref/math-lr-fences.png | Bin 0 -> 601 bytes tests/ref/math-lr-half.png | Bin 0 -> 396 bytes tests/ref/math-lr-matching.png | Bin 0 -> 1262 bytes tests/ref/math-lr-mid.png | Bin 0 -> 1433 bytes tests/ref/math-lr-shorthands.png | Bin 0 -> 452 bytes tests/ref/math-lr-size.png | Bin 0 -> 663 bytes tests/ref/math-lr-symbol-unmatched.png | Bin 0 -> 349 bytes tests/ref/math-lr-unbalanced.png | Bin 0 -> 938 bytes tests/ref/math-lr-unmatched.png | Bin 0 -> 542 bytes tests/ref/math-lr-weak-spacing.png | Bin 0 -> 647 bytes tests/ref/math-mat-align-complex.png | Bin 0 -> 1522 bytes tests/ref/math-mat-align-explicit--alternating.png | Bin 0 -> 908 bytes tests/ref/math-mat-align-explicit-left.png | Bin 0 -> 896 bytes tests/ref/math-mat-align-explicit-right.png | Bin 0 -> 916 bytes tests/ref/math-mat-align-implicit.png | Bin 0 -> 930 bytes tests/ref/math-mat-align-signed-numbers.png | Bin 0 -> 1865 bytes tests/ref/math-mat-augment-set.png | Bin 0 -> 1716 bytes tests/ref/math-mat-augment.png | Bin 0 -> 3489 bytes tests/ref/math-mat-baseline.png | Bin 0 -> 837 bytes tests/ref/math-mat-delim-direct.png | Bin 0 -> 1090 bytes tests/ref/math-mat-delim-set.png | Bin 0 -> 580 bytes tests/ref/math-mat-gap.png | Bin 0 -> 489 bytes tests/ref/math-mat-gaps.png | Bin 0 -> 493 bytes tests/ref/math-mat-semicolon.png | Bin 0 -> 1091 bytes tests/ref/math-mat-sparse.png | Bin 0 -> 898 bytes ...math-multiline-multiple-trailing-linebreaks.png | Bin 0 -> 927 bytes tests/ref/math-multiline-no-trailing-linebreak.png | Bin 0 -> 759 bytes tests/ref/math-multiline-trailing-linebreak.png | Bin 0 -> 786 bytes tests/ref/math-nested-normal-layout.png | Bin 0 -> 1253 bytes tests/ref/math-non-math-content.png | Bin 0 -> 195 bytes tests/ref/math-op-call.png | Bin 0 -> 795 bytes tests/ref/math-op-custom.png | Bin 0 -> 589 bytes tests/ref/math-op-predefined.png | Bin 0 -> 378 bytes tests/ref/math-op-scripts-vs-limits.png | Bin 0 -> 863 bytes tests/ref/math-op-styled.png | Bin 0 -> 314 bytes tests/ref/math-optical-size-frac-script-script.png | Bin 0 -> 553 bytes tests/ref/math-optical-size-nested-scripts.png | Bin 0 -> 769 bytes .../ref/math-optical-size-prime-large-operator.png | Bin 0 -> 685 bytes tests/ref/math-optical-size-primes.png | Bin 0 -> 949 bytes tests/ref/math-primes-after-code-expr.png | Bin 0 -> 484 bytes tests/ref/math-primes-attach.png | Bin 0 -> 374 bytes tests/ref/math-primes-complex.png | Bin 0 -> 1274 bytes tests/ref/math-primes-limits.png | Bin 0 -> 468 bytes tests/ref/math-primes-scripts.png | Bin 0 -> 513 bytes tests/ref/math-primes-spaces.png | Bin 0 -> 342 bytes tests/ref/math-primes.png | Bin 0 -> 341 bytes tests/ref/math-root-basic.png | Bin 0 -> 366 bytes tests/ref/math-root-large-body.png | Bin 0 -> 1614 bytes tests/ref/math-root-large-index.png | Bin 0 -> 638 bytes tests/ref/math-root-precomposed.png | Bin 0 -> 602 bytes tests/ref/math-root-radical-attachment.png | Bin 0 -> 1021 bytes tests/ref/math-root-syntax.png | Bin 0 -> 1255 bytes tests/ref/math-shorthandes.png | Bin 0 -> 1211 bytes tests/ref/math-size.png | Bin 0 -> 729 bytes tests/ref/math-spacing-basic.png | Bin 0 -> 2595 bytes tests/ref/math-spacing-decorated.png | Bin 0 -> 2378 bytes tests/ref/math-spacing-kept-spaces.png | Bin 0 -> 884 bytes tests/ref/math-spacing-predefined.png | Bin 0 -> 847 bytes tests/ref/math-spacing-set-comprehension.png | Bin 0 -> 687 bytes tests/ref/math-spacing-weak.png | Bin 0 -> 861 bytes tests/ref/math-style-exceptions.png | Bin 0 -> 1304 bytes tests/ref/math-style-greek-exceptions.png | Bin 0 -> 301 bytes tests/ref/math-style-hebrew-exceptions.png | Bin 0 -> 296 bytes tests/ref/math-style-italic-default.png | Bin 0 -> 466 bytes tests/ref/math-style.png | Bin 0 -> 1784 bytes tests/ref/math-symbol-show-rule.png | Bin 0 -> 194 bytes tests/ref/math-table.png | Bin 0 -> 770 bytes tests/ref/math-text-color.png | Bin 0 -> 860 bytes tests/ref/math-underover-brace.png | Bin 0 -> 751 bytes tests/ref/math-underover-brackets.png | Bin 0 -> 1029 bytes tests/ref/math-underover-line-bracket.png | Bin 0 -> 469 bytes tests/ref/math-unicode.png | Bin 0 -> 743 bytes tests/ref/math-vec-align-explicit-alternating.png | Bin 0 -> 908 bytes tests/ref/math-vec-delim-set.png | Bin 0 -> 196 bytes tests/ref/math-vec-gap.png | Bin 0 -> 397 bytes tests/ref/math-vec-wide.png | Bin 0 -> 591 bytes tests/ref/math/accent.png | Bin 8774 -> 0 bytes tests/ref/math/alignment.png | Bin 7837 -> 0 bytes tests/ref/math/attach-p1.png | Bin 14206 -> 0 bytes tests/ref/math/attach-p2.png | Bin 11007 -> 0 bytes tests/ref/math/attach-p3.png | Bin 15051 -> 0 bytes tests/ref/math/call.png | Bin 1972 -> 0 bytes tests/ref/math/cancel.png | Bin 24771 -> 0 bytes tests/ref/math/cases.png | Bin 3001 -> 0 bytes tests/ref/math/class.png | Bin 7545 -> 0 bytes tests/ref/math/content.png | Bin 10306 -> 0 bytes tests/ref/math/delimited.png | Bin 101279 -> 0 bytes tests/ref/math/equation-block-align.png | Bin 5170 -> 0 bytes tests/ref/math/equation-number.png | Bin 23214 -> 0 bytes tests/ref/math/equation-show.png | Bin 2428 -> 0 bytes tests/ref/math/font-features.png | Bin 2985 -> 0 bytes tests/ref/math/frac.png | Bin 30979 -> 0 bytes tests/ref/math/linebreak.png | Bin 7385 -> 0 bytes tests/ref/math/matrix-alignment.png | Bin 14061 -> 0 bytes tests/ref/math/matrix-gaps.png | Bin 2925 -> 0 bytes tests/ref/math/matrix.png | Bin 43626 -> 0 bytes tests/ref/math/multiline.png | Bin 13232 -> 0 bytes tests/ref/math/numbering.png | Bin 12055 -> 0 bytes tests/ref/math/op.png | Bin 6762 -> 0 bytes tests/ref/math/opticalsize.png | Bin 14078 -> 0 bytes tests/ref/math/prime.png | Bin 1248 -> 0 bytes tests/ref/math/root.png | Bin 12190 -> 0 bytes tests/ref/math/spacing.png | Bin 100588 -> 0 bytes tests/ref/math/style.png | Bin 29726 -> 0 bytes tests/ref/math/syntax.png | Bin 4868 -> 0 bytes tests/ref/math/unbalanced.png | Bin 2432 -> 0 bytes tests/ref/math/underover.png | Bin 4868 -> 0 bytes tests/ref/math/vec.png | Bin 1606 -> 0 bytes tests/ref/meta/bibliography-full.png | Bin 149158 -> 0 bytes tests/ref/meta/bibliography-ordering.png | Bin 140609 -> 0 bytes tests/ref/meta/bibliography.png | Bin 108543 -> 0 bytes tests/ref/meta/cite-footnote.png | Bin 36731 -> 0 bytes tests/ref/meta/cite-form.png | Bin 32970 -> 0 bytes tests/ref/meta/cite-group.png | Bin 15233 -> 0 bytes tests/ref/meta/counter-page.png | Bin 14766 -> 0 bytes tests/ref/meta/counter.png | Bin 44350 -> 0 bytes tests/ref/meta/document.png | Bin 965 -> 0 bytes tests/ref/meta/figure-caption.png | Bin 9192 -> 0 bytes tests/ref/meta/figure-localization.png | Bin 6629 -> 0 bytes tests/ref/meta/figure.png | Bin 54114 -> 0 bytes tests/ref/meta/footnote-break.png | Bin 90355 -> 0 bytes tests/ref/meta/footnote-columns.png | Bin 10873 -> 0 bytes tests/ref/meta/footnote-container.png | Bin 45934 -> 0 bytes tests/ref/meta/footnote-invariant.png | Bin 28671 -> 0 bytes tests/ref/meta/footnote-refs.png | Bin 28467 -> 0 bytes tests/ref/meta/footnote-table.png | Bin 40162 -> 0 bytes tests/ref/meta/footnote.png | Bin 18782 -> 0 bytes tests/ref/meta/heading.png | Bin 41024 -> 0 bytes tests/ref/meta/link.png | Bin 59069 -> 0 bytes tests/ref/meta/numbering.png | Bin 62312 -> 0 bytes tests/ref/meta/outline-entry.png | Bin 62248 -> 0 bytes tests/ref/meta/outline-first-par-indent.png | Bin 28062 -> 0 bytes tests/ref/meta/outline-indent.png | Bin 309889 -> 0 bytes tests/ref/meta/outline.png | Bin 108902 -> 0 bytes tests/ref/meta/page-label.png | Bin 123792 -> 0 bytes tests/ref/meta/query-before-after.png | Bin 122197 -> 0 bytes tests/ref/meta/query-figure.png | Bin 290886 -> 0 bytes tests/ref/meta/query-header.png | Bin 121241 -> 0 bytes tests/ref/meta/ref.png | Bin 34099 -> 0 bytes tests/ref/meta/state.png | Bin 47195 -> 0 bytes tests/ref/newline-continuation-code.png | Bin 0 -> 1230 bytes tests/ref/newline-continuation-markup.png | Bin 0 -> 906 bytes tests/ref/numbering-chinese.png | Bin 0 -> 2610 bytes tests/ref/numbering-hebrew.png | Bin 0 -> 1340 bytes tests/ref/numbering-japanese-aiueo.png | Bin 0 -> 6285 bytes tests/ref/numbering-japanese-iroha.png | Bin 0 -> 3840 bytes tests/ref/numbering-korean.png | Bin 0 -> 4068 bytes tests/ref/numbering-latin.png | Bin 0 -> 2670 bytes tests/ref/numbering-symbol-and-roman.png | Bin 0 -> 2997 bytes tests/ref/numbers.png | Bin 0 -> 4426 bytes tests/ref/ops-add-content.png | Bin 0 -> 432 bytes tests/ref/ops-multiply-inf-with-length.png | Bin 0 -> 1066 bytes tests/ref/outline-entry-complex.png | Bin 0 -> 14497 bytes tests/ref/outline-entry.png | Bin 0 -> 10052 bytes tests/ref/outline-first-line-indent.png | Bin 0 -> 10876 bytes tests/ref/outline-indent-no-numbering.png | Bin 0 -> 4637 bytes tests/ref/outline-indent-numbering.png | Bin 0 -> 21639 bytes tests/ref/outline.png | Bin 0 -> 40746 bytes tests/ref/overhang-lone.png | Bin 0 -> 93 bytes tests/ref/overhang.png | Bin 0 -> 3848 bytes tests/ref/overline-background.png | Bin 0 -> 1498 bytes tests/ref/pad-basic.png | Bin 0 -> 1158 bytes tests/ref/pad-expanding-contents.png | Bin 0 -> 254 bytes tests/ref/pad-followed-by-content.png | Bin 0 -> 11851 bytes tests/ref/page-call-followed-by-pagebreak.png | Bin 0 -> 116 bytes tests/ref/page-call-styled-empty.png | Bin 0 -> 86 bytes tests/ref/page-fill.png | Bin 0 -> 824 bytes tests/ref/page-large.png | Bin 0 -> 304 bytes tests/ref/page-margin-binding-from-text-lang.png | Bin 0 -> 534 bytes tests/ref/page-margin-individual.png | Bin 0 -> 1007 bytes tests/ref/page-margin-inside-outside-override.png | Bin 0 -> 5076 bytes tests/ref/page-margin-inside-with-binding.png | Bin 0 -> 535 bytes tests/ref/page-margin-inside.png | Bin 0 -> 466 bytes tests/ref/page-margin-uniform.png | Bin 0 -> 243 bytes tests/ref/page-marginals.png | Bin 0 -> 19769 bytes tests/ref/page-number-align-bottom-left.png | Bin 0 -> 280 bytes tests/ref/page-number-align-top-right.png | Bin 0 -> 347 bytes tests/ref/page-numbering-pdf-label.png | Bin 0 -> 8905 bytes tests/ref/page-set-empty.png | Bin 0 -> 86 bytes tests/ref/page-set-forces-break.png | Bin 0 -> 753 bytes tests/ref/page-set-only-pagebreak.png | Bin 0 -> 94 bytes tests/ref/page-set-override-and-mix.png | Bin 0 -> 414 bytes tests/ref/page-set-override-thrice.png | Bin 0 -> 73 bytes tests/ref/pagebreak-around-set-page.png | Bin 0 -> 116 bytes tests/ref/pagebreak-followed-by-page-call.png | Bin 0 -> 1066 bytes tests/ref/pagebreak-meta.png | Bin 0 -> 412 bytes tests/ref/pagebreak-set-page-mixed.png | Bin 0 -> 949 bytes tests/ref/pagebreak-to-auto-sized.png | Bin 0 -> 381 bytes tests/ref/pagebreak-to-multiple-pages.png | Bin 0 -> 576 bytes tests/ref/pagebreak-to.png | Bin 0 -> 1067 bytes tests/ref/pagebreak-weak-after-set-page.png | Bin 0 -> 815 bytes tests/ref/pagebreak-weak-meta.png | Bin 0 -> 430 bytes tests/ref/pagebreak-weak-place.png | Bin 0 -> 620 bytes tests/ref/pagebreak.png | Bin 0 -> 80 bytes tests/ref/par-basic.png | Bin 0 -> 20380 bytes tests/ref/par-first-line-indent.png | Bin 0 -> 11026 bytes tests/ref/par-hanging-indent-manual-linebreak.png | Bin 0 -> 886 bytes tests/ref/par-hanging-indent-rtl.png | Bin 0 -> 2114 bytes tests/ref/par-hanging-indent.png | Bin 0 -> 1473 bytes tests/ref/par-leading-and-block-spacing.png | Bin 0 -> 2017 bytes tests/ref/par-spacing-and-first-line-indent.png | Bin 0 -> 1333 bytes ...arser-backtracking-destructuring-whitespace.png | Bin 0 -> 444 bytes tests/ref/path.png | Bin 0 -> 3150 bytes tests/ref/pattern-line.png | Bin 0 -> 125 bytes tests/ref/pattern-lines.png | Bin 0 -> 128 bytes tests/ref/pattern-relative-parent.png | Bin 0 -> 347 bytes tests/ref/pattern-relative-self.png | Bin 0 -> 423 bytes tests/ref/pattern-small.png | Bin 0 -> 83 bytes tests/ref/pattern-spacing-negative.png | Bin 0 -> 202 bytes tests/ref/pattern-spacing-positive.png | Bin 0 -> 241 bytes tests/ref/pattern-spacing-zero.png | Bin 0 -> 215 bytes tests/ref/pattern-stroke.png | Bin 0 -> 248 bytes tests/ref/pattern-text.png | Bin 0 -> 5324 bytes tests/ref/place-background.png | Bin 0 -> 19865 bytes tests/ref/place-basic.png | Bin 0 -> 11811 bytes tests/ref/place-block-spacing.png | Bin 0 -> 632 bytes tests/ref/place-bottom-in-box.png | Bin 0 -> 137 bytes tests/ref/place-bottom-right-in-box.png | Bin 0 -> 1445 bytes tests/ref/place-float-columns.png | Bin 0 -> 28138 bytes tests/ref/place-float-figure.png | Bin 0 -> 35400 bytes tests/ref/place-float.png | Bin 0 -> 1338 bytes tests/ref/place-horizon-in-boxes.png | Bin 0 -> 570 bytes tests/ref/place-top-left-in-box.png | Bin 0 -> 325 bytes tests/ref/polygon-line-join.png | Bin 0 -> 577 bytes tests/ref/polygon.png | Bin 0 -> 3375 bytes tests/ref/query-and-or.png | Bin 0 -> 1664 bytes tests/ref/query-before-after.png | Bin 0 -> 35716 bytes tests/ref/query-complex.png | Bin 0 -> 1458 bytes tests/ref/query-list-of-figures.png | Bin 0 -> 10471 bytes tests/ref/query-running-header.png | Bin 0 -> 9017 bytes tests/ref/quote-block-spacing.png | Bin 0 -> 2798 bytes tests/ref/quote-cite-format-author-date.png | Bin 0 -> 2208 bytes tests/ref/quote-cite-format-label-or-numeric.png | Bin 0 -> 2224 bytes tests/ref/quote-cite-format-note.png | Bin 0 -> 2943 bytes tests/ref/quote-dir-align.png | Bin 0 -> 1115 bytes tests/ref/quote-dir-author-pos.png | Bin 0 -> 967 bytes tests/ref/quote-inline.png | Bin 0 -> 1523 bytes tests/ref/quote-nesting-custom.png | Bin 0 -> 545 bytes tests/ref/quote-nesting.png | Bin 0 -> 4523 bytes tests/ref/raw-align-default.png | Bin 0 -> 5747 bytes tests/ref/raw-align-specified.png | Bin 0 -> 5474 bytes tests/ref/raw-block-no-parbreaks.png | Bin 0 -> 1293 bytes tests/ref/raw-consecutive-single-backticks.png | Bin 0 -> 177 bytes tests/ref/raw-dedent-empty-line.png | Bin 0 -> 202 bytes tests/ref/raw-dedent-first-line.png | Bin 0 -> 242 bytes tests/ref/raw-dedent-last-line.png | Bin 0 -> 206 bytes tests/ref/raw-empty.png | Bin 0 -> 542 bytes tests/ref/raw-highlight-typ.png | Bin 0 -> 25790 bytes tests/ref/raw-highlight.png | Bin 0 -> 14370 bytes tests/ref/raw-inline-multiline.png | Bin 0 -> 5127 bytes tests/ref/raw-line-alternating-fill.png | Bin 0 -> 5028 bytes tests/ref/raw-line-text-fill.png | Bin 0 -> 4362 bytes tests/ref/raw-line.png | Bin 0 -> 3926 bytes tests/ref/raw-more-backticks.png | Bin 0 -> 412 bytes tests/ref/raw-show-set.png | Bin 0 -> 253 bytes tests/ref/raw-single-backtick-lang.png | Bin 0 -> 303 bytes tests/ref/raw-syntaxes.png | Bin 0 -> 1564 bytes tests/ref/raw-tab-size.png | Bin 0 -> 1543 bytes tests/ref/raw-theme.png | Bin 0 -> 1874 bytes tests/ref/raw-trimming.png | Bin 0 -> 2274 bytes tests/ref/raw-typst-lang.png | Bin 0 -> 922 bytes tests/ref/rect-customization.png | Bin 0 -> 3895 bytes tests/ref/rect-fill-stroke.png | Bin 0 -> 1367 bytes tests/ref/rect-stroke.png | Bin 0 -> 322 bytes tests/ref/rect.png | Bin 0 -> 135 bytes tests/ref/ref-basic.png | Bin 0 -> 3979 bytes tests/ref/ref-supplements.png | Bin 0 -> 8276 bytes tests/ref/repeat-align-and-dir.png | Bin 0 -> 621 bytes tests/ref/repeat-basic.png | Bin 0 -> 2330 bytes tests/ref/repeat-dots-rtl.png | Bin 0 -> 441 bytes tests/ref/repeat-empty.png | Bin 0 -> 195 bytes tests/ref/repeat-unboxed.png | Bin 0 -> 133 bytes tests/ref/repr-color.png | Bin 0 -> 7598 bytes tests/ref/repr-literals.png | Bin 0 -> 1444 bytes tests/ref/repr-misc.png | Bin 0 -> 4070 bytes tests/ref/repr-numerical.png | Bin 0 -> 4798 bytes tests/ref/return-in-nested-content-block.png | Bin 0 -> 1051 bytes tests/ref/set-if.png | Bin 0 -> 1576 bytes tests/ref/set-instantiation-site-markup.png | Bin 0 -> 1084 bytes tests/ref/set-instantiation-site.png | Bin 0 -> 430 bytes tests/ref/set-scoped-in-code-block.png | Bin 0 -> 958 bytes tests/ref/set-text-override.png | Bin 0 -> 1175 bytes tests/ref/set-vs-construct-1.png | Bin 0 -> 402 bytes tests/ref/set-vs-construct-2.png | Bin 0 -> 338 bytes tests/ref/set-vs-construct-3.png | Bin 0 -> 99 bytes tests/ref/set-vs-construct-4.png | Bin 0 -> 440 bytes tests/ref/shaping-emoji-bad-zwj.png | Bin 0 -> 647 bytes tests/ref/shaping-emoji-basic.png | Bin 0 -> 952 bytes tests/ref/shaping-font-fallback.png | Bin 0 -> 3823 bytes .../shaping-forced-script-font-feature-enabled.png | Bin 0 -> 450 bytes ...haping-forced-script-font-feature-inhibited.png | Bin 0 -> 491 bytes tests/ref/shaping-script-separation.png | Bin 0 -> 993 bytes tests/ref/shorthand-dashes.png | Bin 0 -> 598 bytes tests/ref/shorthand-ellipsis.png | Bin 0 -> 311 bytes tests/ref/shorthand-nbsp-and-shy-hyphen.png | Bin 0 -> 1352 bytes tests/ref/shorthand-nbsp-width.png | Bin 0 -> 266 bytes tests/ref/shorthands-math.png | Bin 0 -> 1832 bytes tests/ref/show-bare-basic.png | Bin 0 -> 3286 bytes tests/ref/show-bare-content-block.png | Bin 0 -> 289 bytes tests/ref/show-bare-replace-with-content.png | Bin 0 -> 275 bytes tests/ref/show-bare-vs-set-text.png | Bin 0 -> 725 bytes tests/ref/show-function-order-with-set.png | Bin 0 -> 1504 bytes tests/ref/show-function-set-on-it.png | Bin 0 -> 555 bytes tests/ref/show-in-show.png | Bin 0 -> 638 bytes tests/ref/show-multiple-rules.png | Bin 0 -> 352 bytes tests/ref/show-nested-scopes.png | Bin 0 -> 1347 bytes tests/ref/show-recursive-identity.png | Bin 0 -> 555 bytes tests/ref/show-recursive-multiple.png | Bin 0 -> 2035 bytes tests/ref/show-rule-in-function.png | Bin 0 -> 2667 bytes tests/ref/show-selector-basic.png | Bin 0 -> 452 bytes tests/ref/show-selector-discard.png | Bin 0 -> 613 bytes tests/ref/show-selector-element-or-label.png | Bin 0 -> 2390 bytes tests/ref/show-selector-or-elements-with-set.png | Bin 0 -> 915 bytes tests/ref/show-selector-realistic.png | Bin 0 -> 3867 bytes tests/ref/show-selector-replace-and-show-set.png | Bin 0 -> 241 bytes tests/ref/show-selector-replace.png | Bin 0 -> 330 bytes tests/ref/show-selector-where.png | Bin 0 -> 5290 bytes tests/ref/show-set-on-layoutable-element.png | Bin 0 -> 716 bytes tests/ref/show-set-on-same-element.png | Bin 0 -> 919 bytes tests/ref/show-set-override.png | Bin 0 -> 1615 bytes tests/ref/show-set-same-element-and-order.png | Bin 0 -> 2453 bytes tests/ref/show-set-same-element-matched-field.png | Bin 0 -> 603 bytes .../show-set-same-element-matching-interaction.png | Bin 0 -> 677 bytes ...-set-same-element-synthesized-matched-field.png | Bin 0 -> 554 bytes tests/ref/show-set-text-order-adjacent-1.png | Bin 0 -> 458 bytes tests/ref/show-set-text-order-adjacent-2.png | Bin 0 -> 480 bytes tests/ref/show-set-text-order-contained-1.png | Bin 0 -> 488 bytes tests/ref/show-set-text-order-contained-2.png | Bin 0 -> 249 bytes tests/ref/show-set-text-order-contained-3.png | Bin 0 -> 458 bytes tests/ref/show-set-text-order-contained-4.png | Bin 0 -> 505 bytes tests/ref/show-set-text-order-overlapping-1.png | Bin 0 -> 653 bytes tests/ref/show-set-text-order-overlapping-2.png | Bin 0 -> 321 bytes tests/ref/show-set-vs-construct.png | Bin 0 -> 772 bytes tests/ref/show-set-where-override.png | Bin 0 -> 1493 bytes tests/ref/show-text-basic.png | Bin 0 -> 971 bytes tests/ref/show-text-cyclic-raw.png | Bin 0 -> 463 bytes tests/ref/show-text-cyclic.png | Bin 0 -> 840 bytes tests/ref/show-text-exactly-once.png | Bin 0 -> 477 bytes tests/ref/show-text-get-text-on-it.png | Bin 0 -> 615 bytes tests/ref/show-text-in-other-show.png | Bin 0 -> 758 bytes tests/ref/show-text-indirectly-cyclic.png | Bin 0 -> 646 bytes tests/ref/show-text-path-resolving.png | Bin 0 -> 1722 bytes tests/ref/show-text-regex-case-insensitive.png | Bin 0 -> 3771 bytes tests/ref/show-text-regex-character-class.png | Bin 0 -> 1510 bytes tests/ref/show-text-regex-word-boundary.png | Bin 0 -> 1655 bytes tests/ref/show-text-regex.png | Bin 0 -> 1031 bytes tests/ref/show-where-folding-stroke.png | Bin 0 -> 718 bytes tests/ref/show-where-folding-text-size.png | Bin 0 -> 1330 bytes tests/ref/show-where-optional-field-raw.png | Bin 0 -> 780 bytes tests/ref/show-where-optional-field-text.png | Bin 0 -> 2068 bytes tests/ref/show-where-resolving-hyphenate.png | Bin 0 -> 476 bytes tests/ref/show-where-resolving-length.png | Bin 0 -> 369 bytes tests/ref/smallcaps.png | Bin 0 -> 377 bytes tests/ref/smartquote-apostrophe.png | Bin 0 -> 1845 bytes tests/ref/smartquote-custom-complex.png | Bin 0 -> 1561 bytes tests/ref/smartquote-custom.png | Bin 0 -> 1527 bytes tests/ref/smartquote-disable.png | Bin 0 -> 2575 bytes tests/ref/smartquote-disabled-temporarily.png | Bin 0 -> 2804 bytes tests/ref/smartquote-empty.png | Bin 0 -> 126 bytes tests/ref/smartquote-escape.png | Bin 0 -> 1307 bytes tests/ref/smartquote-nesting.png | Bin 0 -> 1163 bytes tests/ref/smartquote.png | Bin 0 -> 20489 bytes tests/ref/space-collapsing-comments.png | Bin 0 -> 503 bytes tests/ref/space-collapsing-linebreaks.png | Bin 0 -> 266 bytes tests/ref/space-collapsing-stringy-linebreak.png | Bin 0 -> 208 bytes tests/ref/space-collapsing-with-h.png | Bin 0 -> 399 bytes tests/ref/space-collapsing.png | Bin 0 -> 1370 bytes tests/ref/space-ideographic-kept.png | Bin 0 -> 905 bytes tests/ref/space-thin-kept.png | Bin 0 -> 1021 bytes tests/ref/space-trailing-linebreak.png | Bin 0 -> 596 bytes tests/ref/spacing-h-and-v.png | Bin 0 -> 860 bytes tests/ref/spacing-rtl.png | Bin 0 -> 299 bytes tests/ref/square-auto-sized.png | Bin 0 -> 544 bytes tests/ref/square-base.png | Bin 0 -> 169 bytes tests/ref/square-circle-alignment.png | Bin 0 -> 870 bytes tests/ref/square-circle-overspecified.png | Bin 0 -> 321 bytes tests/ref/square-contents-overflow.png | Bin 0 -> 2749 bytes tests/ref/square-height-limited-stack.png | Bin 0 -> 83 bytes tests/ref/square-height-limited.png | Bin 0 -> 2346 bytes tests/ref/square-overflow.png | Bin 0 -> 305 bytes tests/ref/square-rect-rounded.png | Bin 0 -> 857 bytes tests/ref/square-relative-size.png | Bin 0 -> 339 bytes tests/ref/square-relatively-sized-child.png | Bin 0 -> 197 bytes tests/ref/square.png | Bin 0 -> 314 bytes tests/ref/stack-basic.png | Bin 0 -> 129 bytes tests/ref/stack-fr.png | Bin 0 -> 2205 bytes tests/ref/stack-overflow.png | Bin 0 -> 103 bytes tests/ref/stack-rtl-align-and-fr.png | Bin 0 -> 288 bytes tests/ref/stack-spacing.png | Bin 0 -> 114 bytes tests/ref/state-basic.png | Bin 0 -> 758 bytes tests/ref/state-multiple-calls-same-key.png | Bin 0 -> 245 bytes tests/ref/state-nested.png | Bin 0 -> 15413 bytes tests/ref/state-no-convergence.png | Bin 0 -> 139 bytes tests/ref/strike-background.png | Bin 0 -> 1546 bytes tests/ref/strike-with.png | Bin 0 -> 2539 bytes tests/ref/stroke-composition.png | Bin 0 -> 2776 bytes tests/ref/stroke-folding.png | Bin 0 -> 231 bytes tests/ref/stroke-text.png | Bin 0 -> 14345 bytes tests/ref/stroke-zero-thickness.png | Bin 0 -> 621 bytes tests/ref/strong-delta.png | Bin 0 -> 907 bytes tests/ref/strong-double-star-empty-hint.png | Bin 0 -> 314 bytes tests/ref/sub-super-non-typographic.png | Bin 0 -> 312 bytes tests/ref/sub-super.png | Bin 0 -> 1097 bytes tests/ref/super-underline.png | Bin 0 -> 1846 bytes tests/ref/symbol-constructor.png | Bin 0 -> 511 bytes tests/ref/symbol.png | Bin 0 -> 1542 bytes tests/ref/table-align-array.png | Bin 0 -> 586 bytes tests/ref/table-cell-align-override.png | Bin 0 -> 955 bytes tests/ref/table-cell-folding.png | Bin 0 -> 1242 bytes tests/ref/table-cell-override.png | Bin 0 -> 3546 bytes tests/ref/table-cell-set.png | Bin 0 -> 4249 bytes tests/ref/table-cell-show-and-override.png | Bin 0 -> 2926 bytes tests/ref/table-cell-show-based-on-position.png | Bin 0 -> 1890 bytes tests/ref/table-cell-show-emph.png | Bin 0 -> 798 bytes tests/ref/table-cell-show.png | Bin 0 -> 1903 bytes tests/ref/table-cell-various-overrides.png | Bin 0 -> 2570 bytes tests/ref/table-fill-basic.png | Bin 0 -> 454 bytes tests/ref/table-gutters.png | Bin 0 -> 5071 bytes tests/ref/table-inset-fold.png | Bin 0 -> 307 bytes tests/ref/table-inset.png | Bin 0 -> 3548 bytes tests/ref/table-newlines.png | Bin 0 -> 761 bytes .../table-stroke-vline-position-left-and-right.png | Bin 0 -> 1051 bytes tests/ref/terms-built-in-loop.png | Bin 0 -> 1592 bytes tests/ref/terms-constructor.png | Bin 0 -> 630 bytes tests/ref/terms-grid.png | Bin 0 -> 1255 bytes tests/ref/terms-multiline.png | Bin 0 -> 1664 bytes tests/ref/terms-rtl.png | Bin 0 -> 794 bytes tests/ref/terms-style-change-interrupted.png | Bin 0 -> 1524 bytes tests/ref/terms-syntax-edge-cases.png | Bin 0 -> 682 bytes tests/ref/text-alternates-and-stylistic-sets.png | Bin 0 -> 458 bytes tests/ref/text-call-body.png | Bin 0 -> 1522 bytes tests/ref/text-chinese-basic.png | Bin 0 -> 8210 bytes tests/ref/text-cjk-latin-spacing.png | Bin 0 -> 2669 bytes tests/ref/text-copy-paste-ligatures.png | Bin 0 -> 1127 bytes tests/ref/text-edge.png | Bin 0 -> 8187 bytes tests/ref/text-features.png | Bin 0 -> 479 bytes tests/ref/text-font-change-after-space.png | Bin 0 -> 397 bytes tests/ref/text-font-just-a-space.png | Bin 0 -> 190 bytes tests/ref/text-font-properties.png | Bin 0 -> 6926 bytes tests/ref/text-kerning.png | Bin 0 -> 248 bytes tests/ref/text-lang-hyphenate.png | Bin 0 -> 1287 bytes tests/ref/text-lang-region.png | Bin 0 -> 375 bytes tests/ref/text-lang-script-shaping.png | Bin 0 -> 500 bytes tests/ref/text-lang-shaping.png | Bin 0 -> 374 bytes tests/ref/text-lang-unknown-region.png | Bin 0 -> 323 bytes tests/ref/text-lang.png | Bin 0 -> 323 bytes tests/ref/text-ligatures.png | Bin 0 -> 345 bytes tests/ref/text-number-type.png | Bin 0 -> 675 bytes tests/ref/text-number-width.png | Bin 0 -> 973 bytes tests/ref/text-size-em-nesting.png | Bin 0 -> 660 bytes tests/ref/text-size-em.png | Bin 0 -> 104 bytes tests/ref/text-slashed-zero-and-fractions.png | Bin 0 -> 523 bytes tests/ref/text-spacing-relative.png | Bin 0 -> 412 bytes tests/ref/text-spacing.png | Bin 0 -> 565 bytes tests/ref/text-tracking-arabic.png | Bin 0 -> 252 bytes tests/ref/text-tracking-changed-temporarily.png | Bin 0 -> 437 bytes tests/ref/text-tracking-mark-placement.png | Bin 0 -> 315 bytes tests/ref/text-tracking-negative.png | Bin 0 -> 798 bytes tests/ref/text/baseline.png | Bin 29911 -> 0 bytes tests/ref/text/chinese.png | Bin 20722 -> 0 bytes tests/ref/text/copy-paste.png | Bin 2792 -> 0 bytes tests/ref/text/deco.png | Bin 64132 -> 0 bytes tests/ref/text/edge.png | Bin 22578 -> 0 bytes tests/ref/text/em.png | Bin 2311 -> 0 bytes tests/ref/text/emoji.png | Bin 3727 -> 0 bytes tests/ref/text/emphasis.png | Bin 16982 -> 0 bytes tests/ref/text/escape.png | Bin 10601 -> 0 bytes tests/ref/text/fallback.png | Bin 9877 -> 0 bytes tests/ref/text/features.png | Bin 9551 -> 0 bytes tests/ref/text/font.png | Bin 20573 -> 0 bytes tests/ref/text/hyphenate.png | Bin 20467 -> 0 bytes tests/ref/text/lang-with-region.png | Bin 1392 -> 0 bytes tests/ref/text/lang.png | Bin 5252 -> 0 bytes tests/ref/text/linebreak-link.png | Bin 65582 -> 0 bytes tests/ref/text/linebreak-obj.png | Bin 46200 -> 0 bytes tests/ref/text/linebreak.png | Bin 44823 -> 0 bytes tests/ref/text/lorem.png | Bin 26281 -> 0 bytes tests/ref/text/microtype.png | Bin 10874 -> 0 bytes tests/ref/text/numbers.png | Bin 38321 -> 0 bytes tests/ref/text/quote-nesting.png | Bin 14034 -> 0 bytes tests/ref/text/quote.png | Bin 60156 -> 0 bytes tests/ref/text/quotes.png | Bin 86003 -> 0 bytes tests/ref/text/raw-align.png | Bin 32817 -> 0 bytes tests/ref/text/raw-code.png | Bin 55071 -> 0 bytes tests/ref/text/raw-line.png | Bin 32488 -> 0 bytes tests/ref/text/raw-syntaxes.png | Bin 5142 -> 0 bytes tests/ref/text/raw-tabs.png | Bin 3382 -> 0 bytes tests/ref/text/raw-theme.png | Bin 5380 -> 0 bytes tests/ref/text/raw.png | Bin 21650 -> 0 bytes tests/ref/text/shaping.png | Bin 3975 -> 0 bytes tests/ref/text/shift.png | Bin 7826 -> 0 bytes tests/ref/text/smartquotes.png | Bin 7843 -> 0 bytes tests/ref/text/space.png | Bin 12663 -> 0 bytes tests/ref/text/stroke.png | Bin 97009 -> 0 bytes tests/ref/text/symbol.png | Bin 3958 -> 0 bytes tests/ref/text/tracking-spacing.png | Bin 6433 -> 0 bytes tests/ref/transform-rotate-and-scale.png | Bin 0 -> 7901 bytes tests/ref/transform-rotate-origin.png | Bin 0 -> 4753 bytes tests/ref/transform-rotate-relative-sizing.png | Bin 0 -> 2382 bytes tests/ref/transform-rotate.png | Bin 0 -> 4352 bytes tests/ref/transform-scale-origin.png | Bin 0 -> 116 bytes tests/ref/transform-scale-relative-sizing.png | Bin 0 -> 1975 bytes tests/ref/transform-scale.png | Bin 0 -> 1802 bytes tests/ref/transform-tex-logo.png | Bin 0 -> 877 bytes tests/ref/underline-background.png | Bin 0 -> 1626 bytes tests/ref/underline-overline-strike.png | Bin 0 -> 6404 bytes tests/ref/underline-stroke-folding.png | Bin 0 -> 663 bytes tests/ref/visualize/gradient-conic.png | Bin 23950 -> 0 bytes tests/ref/visualize/gradient-dir.png | Bin 1089556 -> 0 bytes tests/ref/visualize/gradient-hue-rotation.png | Bin 32558 -> 0 bytes tests/ref/visualize/gradient-math.png | Bin 71803 -> 0 bytes tests/ref/visualize/gradient-presets.png | Bin 314444 -> 0 bytes tests/ref/visualize/gradient-radial.png | Bin 56014 -> 0 bytes tests/ref/visualize/gradient-relative-conic.png | Bin 88675 -> 0 bytes tests/ref/visualize/gradient-relative-linear.png | Bin 485209 -> 0 bytes tests/ref/visualize/gradient-relative-radial.png | Bin 403617 -> 0 bytes tests/ref/visualize/gradient-repeat.png | Bin 159948 -> 0 bytes tests/ref/visualize/gradient-sharp.png | Bin 30371 -> 0 bytes tests/ref/visualize/gradient-stroke.png | Bin 15249 -> 0 bytes tests/ref/visualize/gradient-text-decorations.png | Bin 6393 -> 0 bytes tests/ref/visualize/gradient-text-other.png | Bin 60270 -> 0 bytes tests/ref/visualize/gradient-text.png | Bin 48309 -> 0 bytes tests/ref/visualize/gradient-transform.png | Bin 86942 -> 0 bytes tests/ref/visualize/image-scale.png | Bin 314 -> 0 bytes tests/ref/visualize/image.png | Bin 400573 -> 0 bytes tests/ref/visualize/line.png | Bin 3218 -> 0 bytes tests/ref/visualize/path.png | Bin 3575 -> 0 bytes tests/ref/visualize/pattern-relative.png | Bin 1548 -> 0 bytes tests/ref/visualize/pattern-simple.png | Bin 343 -> 0 bytes tests/ref/visualize/pattern-small.png | Bin 106 -> 0 bytes tests/ref/visualize/pattern-spacing.png | Bin 307 -> 0 bytes tests/ref/visualize/pattern-stroke.png | Bin 352 -> 0 bytes tests/ref/visualize/pattern-text.png | Bin 29319 -> 0 bytes tests/ref/visualize/polygon.png | Bin 3865 -> 0 bytes tests/ref/visualize/shape-aspect.png | Bin 4717 -> 0 bytes tests/ref/visualize/shape-circle.png | Bin 39242 -> 0 bytes tests/ref/visualize/shape-ellipse.png | Bin 23998 -> 0 bytes tests/ref/visualize/shape-fill-stroke.png | Bin 10272 -> 0 bytes tests/ref/visualize/shape-rect.png | Bin 261994 -> 0 bytes tests/ref/visualize/shape-rounded.png | Bin 1975 -> 0 bytes tests/ref/visualize/shape-square.png | Bin 18888 -> 0 bytes tests/ref/visualize/stroke.png | Bin 4465 -> 0 bytes tests/ref/visualize/svg-text.png | Bin 17763 -> 0 bytes tests/ref/while-loop-basic.png | Bin 0 -> 408 bytes tests/src/args.rs | 46 + tests/src/collect.rs | 420 +++++++ tests/src/logger.rs | 141 +++ tests/src/metadata.rs | 334 ------ tests/src/run.rs | 442 ++++++++ tests/src/tests.rs | 1179 ++------------------ tests/src/world.rs | 229 ++++ tests/suite/foundations/array.typ | 472 ++++++++ tests/suite/foundations/assert.typ | 40 + tests/suite/foundations/bytes.typ | 31 + tests/suite/foundations/calc.typ | 261 +++++ tests/suite/foundations/content.typ | 120 ++ tests/suite/foundations/context.typ | 65 ++ tests/suite/foundations/datetime.typ | 93 ++ tests/suite/foundations/dict.typ | 266 +++++ tests/suite/foundations/duration.typ | 103 ++ tests/suite/foundations/eval.typ | 54 + tests/suite/foundations/float.typ | 66 ++ tests/suite/foundations/int.typ | 73 ++ tests/suite/foundations/label.typ | 70 ++ tests/suite/foundations/panic.typ | 14 + tests/suite/foundations/plugin.typ | 47 + tests/suite/foundations/repr.typ | 51 + tests/suite/foundations/str.typ | 315 ++++++ tests/suite/foundations/type.typ | 25 + tests/suite/foundations/version.typ | 47 + tests/suite/introspection/counter.typ | 78 ++ tests/suite/introspection/here.typ | 3 + tests/suite/introspection/locate.typ | 32 + tests/suite/introspection/query.typ | 267 +++++ tests/suite/introspection/state.typ | 63 ++ tests/suite/layout/align.typ | 142 +++ tests/suite/layout/angle.typ | 8 + tests/suite/layout/clip.typ | 0 tests/suite/layout/columns.typ | 124 ++ tests/suite/layout/container.typ | 183 +++ tests/suite/layout/dir.typ | 24 + tests/suite/layout/flow/flow.typ | 67 ++ tests/suite/layout/flow/invisibles.typ | 61 + tests/suite/layout/flow/orphan.typ | 31 + tests/suite/layout/grid/cell.typ | 132 +++ tests/suite/layout/grid/colspan.typ | 142 +++ tests/suite/layout/grid/footers.typ | 404 +++++++ tests/suite/layout/grid/grid.typ | 276 +++++ tests/suite/layout/grid/headers.typ | 368 ++++++ tests/suite/layout/grid/positioning.typ | 203 ++++ tests/suite/layout/grid/rowspan.typ | 490 ++++++++ tests/suite/layout/grid/rtl.typ | 195 ++++ tests/suite/layout/grid/stroke.typ | 435 ++++++++ tests/suite/layout/grid/styling.typ | 160 +++ tests/suite/layout/hide.typ | 104 ++ tests/suite/layout/inline/baseline.typ | 17 + tests/suite/layout/inline/bidi.typ | 77 ++ tests/suite/layout/inline/cjk.typ | 90 ++ tests/suite/layout/inline/hyphenate.typ | 51 + tests/suite/layout/inline/justify.typ | 170 +++ tests/suite/layout/inline/linebreak.typ | 109 ++ tests/suite/layout/inline/overhang.typ | 24 + tests/suite/layout/inline/shaping.typ | 65 ++ tests/suite/layout/inline/text.typ | 89 ++ tests/suite/layout/layout.typ | 14 + tests/suite/layout/length.typ | 69 ++ tests/suite/layout/limits.typ | 32 + tests/suite/layout/measure.typ | 9 + tests/suite/layout/pad.typ | 30 + tests/suite/layout/page.typ | 231 ++++ tests/suite/layout/pagebreak.typ | 143 +++ tests/suite/layout/place.typ | 226 ++++ tests/suite/layout/relative.typ | 7 + tests/suite/layout/repeat.typ | 44 + tests/suite/layout/spacing.typ | 38 + tests/suite/layout/stack.typ | 82 ++ tests/suite/layout/table.typ | 284 +++++ tests/suite/layout/transform.typ | 106 ++ tests/suite/loading/csv.typ | 27 + tests/suite/loading/json.typ | 16 + tests/suite/loading/read.typ | 12 + tests/suite/loading/toml.typ | 41 + tests/suite/loading/xml.typ | 28 + tests/suite/loading/yaml.typ | 17 + tests/suite/math/accent.typ | 33 + tests/suite/math/alignment.typ | 34 + tests/suite/math/attach.typ | 130 +++ tests/suite/math/cancel.typ | 38 + tests/suite/math/cases.typ | 13 + tests/suite/math/class.typ | 47 + tests/suite/math/delimited.typ | 64 ++ tests/suite/math/equation.typ | 212 ++++ tests/suite/math/frac.typ | 43 + tests/suite/math/interactions.typ | 95 ++ tests/suite/math/mat.typ | 163 +++ tests/suite/math/multiline.typ | 109 ++ tests/suite/math/op.typ | 30 + tests/suite/math/primes.typ | 50 + tests/suite/math/root.typ | 45 + tests/suite/math/size.typ | 9 + tests/suite/math/spacing.typ | 59 + tests/suite/math/style.typ | 34 + tests/suite/math/syntax.typ | 34 + tests/suite/math/text.typ | 45 + tests/suite/math/underover.typ | 21 + tests/suite/math/vec.typ | 27 + tests/suite/model/bibliography.typ | 55 + tests/suite/model/cite.typ | 92 ++ tests/suite/model/document.typ | 36 + tests/suite/model/emph-strong.typ | 74 ++ tests/suite/model/enum.typ | 156 +++ tests/suite/model/figure.typ | 220 ++++ tests/suite/model/footnote.typ | 182 +++ tests/suite/model/heading.typ | 80 ++ tests/suite/model/link.typ | 77 ++ tests/suite/model/list.typ | 147 +++ tests/suite/model/numbering.typ | 103 ++ tests/suite/model/outline.typ | 176 +++ tests/suite/model/par.typ | 78 ++ tests/suite/model/quote.typ | 86 ++ tests/suite/model/ref.typ | 56 + tests/suite/model/terms.typ | 77 ++ tests/suite/playground.typ | 1 + tests/suite/scripting/blocks.typ | 143 +++ tests/suite/scripting/call.typ | 200 ++++ tests/suite/scripting/closure.typ | 223 ++++ tests/suite/scripting/destructuring.typ | 357 ++++++ tests/suite/scripting/field.typ | 76 ++ tests/suite/scripting/for.typ | 135 +++ tests/suite/scripting/get-rule.typ | 67 ++ tests/suite/scripting/if.typ | 134 +++ tests/suite/scripting/import.typ | 334 ++++++ tests/suite/scripting/include.typ | 32 + tests/suite/scripting/let.typ | 143 +++ tests/suite/scripting/loop.typ | 142 +++ tests/suite/scripting/methods.typ | 51 + tests/suite/scripting/module.typ | 13 + tests/suite/scripting/modules/chap1.typ | 8 + tests/suite/scripting/modules/chap2.typ | 10 + tests/suite/scripting/modules/cycle1.typ | 5 + tests/suite/scripting/modules/cycle2.typ | 5 + tests/suite/scripting/ops.typ | 465 ++++++++ tests/suite/scripting/params.typ | 69 ++ tests/suite/scripting/recursion.typ | 55 + tests/suite/scripting/return.typ | 87 ++ tests/suite/scripting/while.typ | 59 + tests/suite/styling/fold.typ | 19 + tests/suite/styling/set.typ | 96 ++ tests/suite/styling/show-set.typ | 70 ++ tests/suite/styling/show-text.typ | 133 +++ tests/suite/styling/show-where.typ | 89 ++ tests/suite/styling/show.typ | 262 +++++ tests/suite/symbols/symbol.typ | 38 + tests/suite/syntax/backtracking.typ | 32 + tests/suite/syntax/comment.typ | 43 + tests/suite/syntax/embedded.typ | 9 + tests/suite/syntax/escape.typ | 36 + tests/suite/syntax/newlines.typ | 77 ++ tests/suite/syntax/numbers.typ | 32 + tests/suite/syntax/shorthand.typ | 61 + tests/suite/text/case.typ | 11 + tests/suite/text/coma.typ | 26 + tests/suite/text/copy-paste.typ | 8 + tests/suite/text/deco.typ | 85 ++ tests/suite/text/edge.typ | 39 + tests/suite/text/em.typ | 33 + tests/suite/text/font.typ | 66 ++ tests/suite/text/lang.typ | 74 ++ tests/suite/text/lorem.typ | 32 + tests/suite/text/raw.typ | 630 +++++++++++ tests/suite/text/shift.typ | 19 + tests/suite/text/smallcaps.typ | 3 + tests/suite/text/smartquote.typ | 122 ++ tests/suite/text/space.typ | 60 + tests/suite/visualize/circle.typ | 69 ++ tests/suite/visualize/color.typ | 331 ++++++ tests/suite/visualize/ellipse.typ | 31 + tests/suite/visualize/gradient.typ | 631 +++++++++++ tests/suite/visualize/image.typ | 122 ++ tests/suite/visualize/line.typ | 92 ++ tests/suite/visualize/path.typ | 52 + tests/suite/visualize/pattern.typ | 131 +++ tests/suite/visualize/polygon.typ | 51 + tests/suite/visualize/rect.typ | 107 ++ tests/suite/visualize/square.typ | 146 +++ tests/suite/visualize/stroke.typ | 171 +++ tests/typ/autocomplete/showcase.typ | 13 - tests/typ/bugs/1050-terms-indent.typ | 11 - tests/typ/bugs/1240-stack-fr.typ | 18 - tests/typ/bugs/1597-cite-footnote.typ | 12 - tests/typ/bugs/2044-invalid-parsed-ident.typ | 6 - tests/typ/bugs/2105-linebreak-tofu.typ | 1 - tests/typ/bugs/2595-float-overlap.typ | 13 - tests/typ/bugs/2650-cjk-latin-spacing-meta.typ | 5 - tests/typ/bugs/2715-float-order.typ | 19 - tests/typ/bugs/2821-missing-fields.typ | 9 - tests/typ/bugs/2902-gradient-oklch-panic.typ | 20 - tests/typ/bugs/3082-chinese-punctuation.typ | 4 - tests/typ/bugs/3110-no-type-ctor-or-field.typ | 15 - tests/typ/bugs/3154-array-dict-mut-entry.typ | 109 -- tests/typ/bugs/3232-dict-wrong-keys.typ | 23 - tests/typ/bugs/3275-loop-errors.typ | 67 -- tests/typ/bugs/3363-json-large-number.typ | 8 - tests/typ/bugs/3502-colon-space.typ | 14 - tests/typ/bugs/3586-figure-caption-separator.typ | 7 - tests/typ/bugs/3601-empty-raw.typ | 7 - tests/typ/bugs/3641-float-loop.typ | 11 - tests/typ/bugs/3650-italic-equation.typ | 4 - tests/typ/bugs/3658-math-size.typ | 5 - tests/typ/bugs/3662-pdf-smartquotes.typ | 12 - tests/typ/bugs/3700-deformed-stroke.typ | 11 - tests/typ/bugs/3841-tabs-in-raw-typ-code.typ | 20 - tests/typ/bugs/870-image-rotation.typ | 6 - tests/typ/bugs/args-sink.typ | 5 - tests/typ/bugs/args-underscore.typ | 5 - tests/typ/bugs/bibliography-math.typ | 4 - tests/typ/bugs/bidi-tofus.typ | 7 - tests/typ/bugs/block-width-box.typ | 6 - tests/typ/bugs/cite-locate.typ | 23 - tests/typ/bugs/cite-show-set.typ | 9 - tests/typ/bugs/clamp-panic.typ | 3 - tests/typ/bugs/columns-1.typ | 12 - tests/typ/bugs/emoji-linebreak.typ | 6 - tests/typ/bugs/equation-numbering-reference.typ | 15 - tests/typ/bugs/flow-1.typ | 11 - tests/typ/bugs/flow-2.typ | 10 - tests/typ/bugs/flow-3.typ | 12 - tests/typ/bugs/flow-4.typ | 5 - tests/typ/bugs/flow-5.typ | 13 - tests/typ/bugs/fold-vector.typ | 20 - tests/typ/bugs/footnote-keep-multiple.typ | 10 - tests/typ/bugs/footnote-list.typ | 11 - tests/typ/bugs/gradient-cmyk-encode.typ | 27 - tests/typ/bugs/grid-1.typ | 16 - tests/typ/bugs/grid-2.typ | 20 - tests/typ/bugs/grid-3.typ | 8 - tests/typ/bugs/grid-4.typ | 17 - tests/typ/bugs/hide-meta.typ | 24 - tests/typ/bugs/int-constructor.typ | 7 - tests/typ/bugs/justify-hanging-indent.typ | 6 - tests/typ/bugs/label-fields-dict.typ | 31 - tests/typ/bugs/layout-infinite-lengths.typ | 25 - tests/typ/bugs/line-align.typ | 5 - tests/typ/bugs/linebreak-no-justifiables.typ | 5 - tests/typ/bugs/mat-aug-color.typ | 9 - tests/typ/bugs/math-eval.typ | 5 - tests/typ/bugs/math-number-spacing.typ | 9 - tests/typ/bugs/math-realize.typ | 47 - tests/typ/bugs/math-shift.typ | 5 - tests/typ/bugs/math-text-break.typ | 4 - tests/typ/bugs/measure-image.typ | 8 - tests/typ/bugs/new-cm-svg.typ | 2 - tests/typ/bugs/newline-mode.typ | 84 -- tests/typ/bugs/pagebreak-bibliography.typ | 5 - tests/typ/bugs/pagebreak-numbering.typ | 12 - tests/typ/bugs/pagebreak-set-style.typ | 12 - tests/typ/bugs/parameter-pattern.typ | 5 - tests/typ/bugs/parenthesized.typ | 98 -- tests/typ/bugs/place-base.typ | 7 - tests/typ/bugs/place-pagebreak.typ | 7 - tests/typ/bugs/place-spacing.typ | 15 - tests/typ/bugs/raw-color-overwrite.typ | 13 - tests/typ/bugs/smartquotes-in-outline.typ | 4 - tests/typ/bugs/smartquotes-on-newline.typ | 7 - tests/typ/bugs/spacing-behaviour.typ | 9 - tests/typ/bugs/square-base.typ | 5 - tests/typ/bugs/subelement-panic.typ | 40 - tests/typ/bugs/table-lines.typ | 10 - tests/typ/bugs/table-row-missing.typ | 8 - tests/typ/coma.typ | 24 - tests/typ/compiler/array.typ | 370 ------ tests/typ/compiler/backtracking.typ | 33 - tests/typ/compiler/block.typ | 145 --- tests/typ/compiler/break-continue.typ | 162 --- tests/typ/compiler/bytes.typ | 32 - tests/typ/compiler/call.typ | 111 -- tests/typ/compiler/closure.typ | 219 ---- tests/typ/compiler/color.typ | 101 -- tests/typ/compiler/comment.typ | 34 - tests/typ/compiler/construct.typ | 31 - tests/typ/compiler/content-field.typ | 63 -- tests/typ/compiler/delayed-error.typ | 11 - tests/typ/compiler/dict.typ | 160 --- tests/typ/compiler/duration.typ | 104 -- tests/typ/compiler/embedded-expr.typ | 22 - tests/typ/compiler/field.typ | 200 ---- tests/typ/compiler/for.typ | 136 --- tests/typ/compiler/highlight.typ | 42 - tests/typ/compiler/hint.typ | 41 - tests/typ/compiler/if.typ | 136 --- tests/typ/compiler/import.typ | 262 ----- tests/typ/compiler/include.typ | 32 - tests/typ/compiler/label.typ | 72 -- tests/typ/compiler/let.typ | 302 ----- tests/typ/compiler/methods.typ | 287 ----- tests/typ/compiler/module.typ | 13 - tests/typ/compiler/modules/chap1.typ | 9 - tests/typ/compiler/modules/chap2.typ | 11 - tests/typ/compiler/modules/cycle1.typ | 6 - tests/typ/compiler/modules/cycle2.typ | 6 - tests/typ/compiler/ops-assoc.typ | 18 - tests/typ/compiler/ops-invalid.typ | 134 --- tests/typ/compiler/ops-prec.typ | 36 - tests/typ/compiler/ops.typ | 359 ------ tests/typ/compiler/packages.typ | 69 -- tests/typ/compiler/plugin-oob.typ | 14 - tests/typ/compiler/plugin.typ | 36 - tests/typ/compiler/raw.typ | 170 --- tests/typ/compiler/recursion.typ | 56 - tests/typ/compiler/repr-color-gradient.typ | 23 - tests/typ/compiler/repr.typ | 49 - tests/typ/compiler/return.typ | 89 -- tests/typ/compiler/select-where-styles.typ | 91 -- tests/typ/compiler/selector-logical.typ | 126 --- tests/typ/compiler/set.typ | 66 -- tests/typ/compiler/shorthand.typ | 61 - tests/typ/compiler/show-bare.typ | 41 - tests/typ/compiler/show-node.typ | 104 -- tests/typ/compiler/show-recursive.typ | 51 - tests/typ/compiler/show-selector-logical.typ | 21 - tests/typ/compiler/show-selector.typ | 39 - tests/typ/compiler/show-set-func.typ | 16 - tests/typ/compiler/show-set-text.typ | 41 - tests/typ/compiler/show-set.typ | 55 - tests/typ/compiler/show-text.typ | 93 -- tests/typ/compiler/spread.typ | 133 --- tests/typ/compiler/string.typ | 247 ---- tests/typ/compiler/type-compatibility.typ | 10 - tests/typ/compiler/while.typ | 60 - tests/typ/compute/calc.typ | 355 ------ tests/typ/compute/construct.typ | 316 ------ tests/typ/compute/data.typ | 144 --- tests/typ/compute/eval-path.typ | 18 - tests/typ/compute/foundations.typ | 107 -- tests/typ/compute/version.typ | 47 - tests/typ/empty.typ | 0 tests/typ/layout/align.typ | 52 - tests/typ/layout/block-sizing.typ | 24 - tests/typ/layout/block-spacing.typ | 9 - tests/typ/layout/cjk-latin-spacing.typ | 29 - tests/typ/layout/cjk-punctuation-adjustment.typ | 44 - tests/typ/layout/clip.typ | 68 -- tests/typ/layout/code-indent-shrink.typ | 28 - tests/typ/layout/columns.typ | 112 -- tests/typ/layout/container-fill.typ | 7 - tests/typ/layout/container.typ | 50 - tests/typ/layout/enum-align.typ | 51 - tests/typ/layout/enum-numbering.typ | 55 - tests/typ/layout/enum.typ | 48 - tests/typ/layout/flow-orphan.typ | 30 - tests/typ/layout/grid-1.typ | 41 - tests/typ/layout/grid-2.typ | 29 - tests/typ/layout/grid-3.typ | 61 - tests/typ/layout/grid-4.typ | 33 - tests/typ/layout/grid-5.typ | 40 - tests/typ/layout/grid-auto-shrink.typ | 12 - tests/typ/layout/grid-cell.typ | 133 --- tests/typ/layout/grid-colspan.typ | 141 --- tests/typ/layout/grid-footers-1.typ | 192 ---- tests/typ/layout/grid-footers-2.typ | 31 - tests/typ/layout/grid-footers-3.typ | 44 - tests/typ/layout/grid-footers-4.typ | 42 - tests/typ/layout/grid-footers-5.typ | 87 -- tests/typ/layout/grid-headers-1.typ | 162 --- tests/typ/layout/grid-headers-2.typ | 52 - tests/typ/layout/grid-headers-3.typ | 35 - tests/typ/layout/grid-headers-4.typ | 112 -- tests/typ/layout/grid-positioning.typ | 205 ---- tests/typ/layout/grid-rowspan-basic.typ | 252 ----- tests/typ/layout/grid-rowspan-split-1.typ | 89 -- tests/typ/layout/grid-rowspan-split-2.typ | 37 - tests/typ/layout/grid-rowspan-split-3.typ | 108 -- tests/typ/layout/grid-rtl.typ | 195 ---- tests/typ/layout/grid-stroke.typ | 434 ------- tests/typ/layout/grid-styling.typ | 160 --- tests/typ/layout/hide.typ | 76 -- tests/typ/layout/list-attach.typ | 54 - tests/typ/layout/list-marker.typ | 34 - tests/typ/layout/list.typ | 57 - tests/typ/layout/out-of-flow-in-block.typ | 61 - tests/typ/layout/pad.typ | 30 - tests/typ/layout/page-binding.typ | 46 - tests/typ/layout/page-margin.typ | 20 - tests/typ/layout/page-marginals.typ | 24 - tests/typ/layout/page-number-align.typ | 25 - tests/typ/layout/page-style.typ | 28 - tests/typ/layout/page.typ | 42 - tests/typ/layout/pagebreak-parity.typ | 35 - tests/typ/layout/pagebreak-weak.typ | 30 - tests/typ/layout/pagebreak.typ | 45 - tests/typ/layout/par-bidi.typ | 72 -- tests/typ/layout/par-indent.typ | 51 - tests/typ/layout/par-justify-cjk.typ | 64 -- tests/typ/layout/par-justify.typ | 65 -- tests/typ/layout/par-knuth.typ | 30 - tests/typ/layout/par-simple.typ | 20 - tests/typ/layout/par.typ | 36 - tests/typ/layout/place-background.typ | 18 - tests/typ/layout/place-float-auto.typ | 31 - tests/typ/layout/place-float-columns.typ | 19 - tests/typ/layout/place-float-figure.typ | 21 - tests/typ/layout/place-nested.typ | 40 - tests/typ/layout/place.typ | 35 - tests/typ/layout/repeat.typ | 44 - tests/typ/layout/spacing.typ | 46 - tests/typ/layout/stack-1.typ | 52 - tests/typ/layout/stack-2.typ | 23 - tests/typ/layout/table-cell.typ | 128 --- tests/typ/layout/table.typ | 141 --- tests/typ/layout/terms.typ | 60 - tests/typ/layout/transform-layout.typ | 58 - tests/typ/layout/transform.typ | 49 - tests/typ/lint/markup.typ | 26 - tests/typ/math/accent.typ | 33 - tests/typ/math/alignment.typ | 34 - tests/typ/math/attach-p1.typ | 63 -- tests/typ/math/attach-p2.typ | 27 - tests/typ/math/attach-p3.typ | 42 - tests/typ/math/call.typ | 7 - tests/typ/math/cancel.typ | 38 - tests/typ/math/cases.typ | 9 - tests/typ/math/class.typ | 47 - tests/typ/math/content.typ | 33 - tests/typ/math/delimited.typ | 59 - tests/typ/math/equation-block-align.typ | 33 - tests/typ/math/equation-number.typ | 145 --- tests/typ/math/equation-show.typ | 7 - tests/typ/math/font-features.typ | 10 - tests/typ/math/frac.typ | 43 - tests/typ/math/linebreak.typ | 50 - tests/typ/math/matrix-alignment.typ | 58 - tests/typ/math/matrix-gaps.typ | 17 - tests/typ/math/matrix.typ | 97 -- tests/typ/math/multiline.typ | 56 - tests/typ/math/numbering.typ | 11 - tests/typ/math/op.typ | 30 - tests/typ/math/opticalsize.typ | 69 -- tests/typ/math/prime.typ | 9 - tests/typ/math/root.typ | 45 - tests/typ/math/spacing.typ | 48 - tests/typ/math/style.typ | 52 - tests/typ/math/syntax.typ | 22 - tests/typ/math/unbalanced.typ | 6 - tests/typ/math/underover.typ | 21 - tests/typ/math/vec.typ | 14 - tests/typ/meta/bibliography-full.typ | 5 - tests/typ/meta/bibliography-ordering.typ | 16 - tests/typ/meta/bibliography.typ | 44 - tests/typ/meta/cite-footnote.typ | 5 - tests/typ/meta/cite-form.typ | 10 - tests/typ/meta/cite-group.typ | 19 - tests/typ/meta/context-compatibility.typ | 29 - tests/typ/meta/context.typ | 181 --- tests/typ/meta/counter-page.typ | 10 - tests/typ/meta/counter.typ | 52 - tests/typ/meta/document.typ | 49 - tests/typ/meta/figure-caption.typ | 64 -- tests/typ/meta/figure-localization.typ | 34 - tests/typ/meta/figure.typ | 111 -- tests/typ/meta/footnote-break.typ | 16 - tests/typ/meta/footnote-columns.typ | 9 - tests/typ/meta/footnote-container.typ | 32 - tests/typ/meta/footnote-invariant.typ | 9 - tests/typ/meta/footnote-refs.typ | 40 - tests/typ/meta/footnote-table.typ | 23 - tests/typ/meta/footnote.typ | 34 - tests/typ/meta/heading.typ | 73 -- tests/typ/meta/link.typ | 77 -- tests/typ/meta/numbering.typ | 103 -- tests/typ/meta/outline-entry.typ | 59 - tests/typ/meta/outline-first-par-indent.typ | 15 - tests/typ/meta/outline-indent.typ | 60 - tests/typ/meta/outline.typ | 45 - tests/typ/meta/page-label.typ | 47 - tests/typ/meta/query-before-after.typ | 69 -- tests/typ/meta/query-figure.typ | 41 - tests/typ/meta/query-header.typ | 30 - tests/typ/meta/ref.typ | 48 - tests/typ/meta/state.typ | 56 - tests/typ/text/baseline.typ | 12 - tests/typ/text/case.typ | 12 - tests/typ/text/chinese.typ | 9 - tests/typ/text/copy-paste.typ | 8 - tests/typ/text/deco.typ | 85 -- tests/typ/text/edge.typ | 39 - tests/typ/text/em.typ | 33 - tests/typ/text/emoji.typ | 18 - tests/typ/text/emphasis.typ | 50 - tests/typ/text/escape.typ | 36 - tests/typ/text/fallback.typ | 20 - tests/typ/text/features.typ | 63 -- tests/typ/text/font.typ | 66 -- tests/typ/text/hyphenate.typ | 51 - tests/typ/text/lang-with-region.typ | 16 - tests/typ/text/lang.typ | 59 - tests/typ/text/linebreak-link.typ | 23 - tests/typ/text/linebreak-obj.typ | 24 - tests/typ/text/linebreak.typ | 60 - tests/typ/text/lorem.typ | 32 - tests/typ/text/microtype.typ | 23 - tests/typ/text/numbers.typ | 110 -- tests/typ/text/quote-nesting.typ | 27 - tests/typ/text/quote.typ | 60 - tests/typ/text/quotes.typ | 71 -- tests/typ/text/raw-align.typ | 37 - tests/typ/text/raw-code.typ | 86 -- tests/typ/text/raw-line.typ | 109 -- tests/typ/text/raw-syntaxes.typ | 14 - tests/typ/text/raw-tabs.typ | 11 - tests/typ/text/raw-theme.typ | 24 - tests/typ/text/raw.typ | 79 -- tests/typ/text/shaping.typ | 29 - tests/typ/text/shift.typ | 19 - tests/typ/text/smartquotes.typ | 29 - tests/typ/text/space.typ | 53 - tests/typ/text/stroke.typ | 21 - tests/typ/text/symbol.typ | 18 - tests/typ/text/tracking-spacing.typ | 31 - tests/typ/visualize/gradient-conic.typ | 25 - tests/typ/visualize/gradient-dir.typ | 13 - tests/typ/visualize/gradient-hue-rotation.typ | 66 -- tests/typ/visualize/gradient-math.typ | 89 -- tests/typ/visualize/gradient-presets.typ | 33 - tests/typ/visualize/gradient-radial.typ | 49 - tests/typ/visualize/gradient-relative-conic.typ | 29 - tests/typ/visualize/gradient-relative-linear.typ | 29 - tests/typ/visualize/gradient-relative-radial.typ | 29 - tests/typ/visualize/gradient-repeat.typ | 36 - tests/typ/visualize/gradient-sharp.typ | 29 - tests/typ/visualize/gradient-stroke.typ | 31 - tests/typ/visualize/gradient-text-decorations.typ | 9 - tests/typ/visualize/gradient-text-other.typ | 14 - tests/typ/visualize/gradient-text.typ | 49 - tests/typ/visualize/gradient-transform.typ | 12 - tests/typ/visualize/image-scale.typ | 6 - tests/typ/visualize/image.typ | 82 -- tests/typ/visualize/line.typ | 51 - tests/typ/visualize/path.typ | 52 - tests/typ/visualize/pattern-relative.typ | 23 - tests/typ/visualize/pattern-simple.typ | 18 - tests/typ/visualize/pattern-small.typ | 19 - tests/typ/visualize/pattern-spacing.typ | 31 - tests/typ/visualize/pattern-stroke.typ | 13 - tests/typ/visualize/pattern-text.typ | 28 - tests/typ/visualize/polygon.typ | 36 - tests/typ/visualize/shape-aspect.typ | 63 -- tests/typ/visualize/shape-circle.typ | 58 - tests/typ/visualize/shape-ellipse.typ | 31 - tests/typ/visualize/shape-fill-stroke.typ | 93 -- tests/typ/visualize/shape-rect.typ | 78 -- tests/typ/visualize/shape-rounded.typ | 53 - tests/typ/visualize/shape-square.typ | 39 - tests/typ/visualize/stroke.typ | 115 -- tests/typ/visualize/svg-text.typ | 18 - tools/test-helper/README.md | 38 +- tools/test-helper/extension.js | 363 ------ tools/test-helper/package.json | 115 +- tools/test-helper/src/extension.ts | 492 ++++++++ tools/test-helper/tsconfig.json | 11 + 1964 files changed, 20464 insertions(+), 20494 deletions(-) create mode 100644 tests/ref/align-center-in-flow.png create mode 100644 tests/ref/align-in-stack.png create mode 100644 tests/ref/align-right.png create mode 100644 tests/ref/align-start-and-end.png create mode 100644 tests/ref/array-basic-syntax.png create mode 100644 tests/ref/array-insert-and-remove.png create mode 100644 tests/ref/array-join-content.png create mode 100644 tests/ref/baseline-box.png create mode 100644 tests/ref/baseline-text.png create mode 100644 tests/ref/bibliography-basic.png create mode 100644 tests/ref/bibliography-before-content.png create mode 100644 tests/ref/bibliography-full.png create mode 100644 tests/ref/bibliography-math.png create mode 100644 tests/ref/bibliography-multiple-files.png create mode 100644 tests/ref/bibliography-ordering.png create mode 100644 tests/ref/bidi-consecutive-embedded-ltr-runs.png create mode 100644 tests/ref/bidi-consecutive-embedded-rtl-runs.png create mode 100644 tests/ref/bidi-en-he-top-level.png create mode 100644 tests/ref/bidi-explicit-dir.png create mode 100644 tests/ref/bidi-manual-linebreak.png create mode 100644 tests/ref/bidi-nesting.png create mode 100644 tests/ref/bidi-obj.png create mode 100644 tests/ref/bidi-raw.png create mode 100644 tests/ref/bidi-spacing.png create mode 100644 tests/ref/bidi-whitespace-reset.png create mode 100644 tests/ref/block-box-fill.png create mode 100644 tests/ref/block-clip-svg-glyphs.png create mode 100644 tests/ref/block-clip-text.png create mode 100644 tests/ref/block-clipping-multiple-pages.png create mode 100644 tests/ref/block-fixed-height.png create mode 100644 tests/ref/block-multiple-pages.png create mode 100644 tests/ref/block-sizing.png create mode 100644 tests/ref/block-spacing-basic.png create mode 100644 tests/ref/block-spacing-collapse-text-style.png create mode 100644 tests/ref/block-spacing-maximum.png create mode 100644 tests/ref/block-spacing-table.png create mode 100644 tests/ref/box-clip-radius-without-stroke.png create mode 100644 tests/ref/box-clip-radius.png create mode 100644 tests/ref/box-clip-rect.png create mode 100644 tests/ref/box-layoutable-child.png create mode 100644 tests/ref/box-width-fr.png create mode 100644 tests/ref/box.png delete mode 100644 tests/ref/bugs/1050-terms-indent.png delete mode 100644 tests/ref/bugs/1240-stack-fr.png delete mode 100644 tests/ref/bugs/1597-cite-footnote.png delete mode 100644 tests/ref/bugs/2044-invalid-parsed-ident.png delete mode 100644 tests/ref/bugs/2105-linebreak-tofu.png delete mode 100644 tests/ref/bugs/2595-float-overlap.png delete mode 100644 tests/ref/bugs/2650-cjk-latin-spacing-meta.png delete mode 100644 tests/ref/bugs/2715-float-order.png delete mode 100644 tests/ref/bugs/3082-chinese-punctuation.png delete mode 100644 tests/ref/bugs/3641-float-loop.png delete mode 100644 tests/ref/bugs/3650-italic-equation.png delete mode 100644 tests/ref/bugs/3658-math-size.png delete mode 100644 tests/ref/bugs/3662-pdf-smartquotes.png delete mode 100644 tests/ref/bugs/3700-deformed-stroke.png delete mode 100644 tests/ref/bugs/3841-tabs-in-raw-typ-code.png delete mode 100644 tests/ref/bugs/870-image-rotation.png delete mode 100644 tests/ref/bugs/args-sink.png delete mode 100644 tests/ref/bugs/bibliography-math.png delete mode 100644 tests/ref/bugs/bidi-tofus.png delete mode 100644 tests/ref/bugs/block-width-box.png delete mode 100644 tests/ref/bugs/cite-locate.png delete mode 100644 tests/ref/bugs/cite-show-set.png delete mode 100644 tests/ref/bugs/clamp-panic.png delete mode 100644 tests/ref/bugs/columns-1.png delete mode 100644 tests/ref/bugs/emoji-linebreak.png delete mode 100644 tests/ref/bugs/flow-1.png delete mode 100644 tests/ref/bugs/flow-2.png delete mode 100644 tests/ref/bugs/flow-3.png delete mode 100644 tests/ref/bugs/flow-4.png delete mode 100644 tests/ref/bugs/flow-5.png delete mode 100644 tests/ref/bugs/fold-vector.png delete mode 100644 tests/ref/bugs/footnote-keep-multiple.png delete mode 100644 tests/ref/bugs/footnote-list.png delete mode 100644 tests/ref/bugs/gradient-cmyk-encode.png delete mode 100644 tests/ref/bugs/grid-1.png delete mode 100644 tests/ref/bugs/grid-2.png delete mode 100644 tests/ref/bugs/grid-3.png delete mode 100644 tests/ref/bugs/grid-4.png delete mode 100644 tests/ref/bugs/hide-meta.png delete mode 100644 tests/ref/bugs/justify-hanging-indent.png delete mode 100644 tests/ref/bugs/line-align.png delete mode 100644 tests/ref/bugs/linebreak-no-justifiables.png delete mode 100644 tests/ref/bugs/mat-aug-color.png delete mode 100644 tests/ref/bugs/math-eval.png delete mode 100644 tests/ref/bugs/math-hide.png delete mode 100644 tests/ref/bugs/math-number-spacing.png delete mode 100644 tests/ref/bugs/math-realize.png delete mode 100644 tests/ref/bugs/math-shift.png delete mode 100644 tests/ref/bugs/math-text-break.png delete mode 100644 tests/ref/bugs/new-cm-svg.png delete mode 100644 tests/ref/bugs/newline-mode.png delete mode 100644 tests/ref/bugs/pagebreak-bibliography.png delete mode 100644 tests/ref/bugs/pagebreak-numbering.png delete mode 100644 tests/ref/bugs/pagebreak-set-style.png delete mode 100644 tests/ref/bugs/place-base.png delete mode 100644 tests/ref/bugs/place-nested.png delete mode 100644 tests/ref/bugs/place-pagebreak.png delete mode 100644 tests/ref/bugs/place-spacing.png delete mode 100644 tests/ref/bugs/raw-color-overwrite.png delete mode 100644 tests/ref/bugs/smartquotes-in-outline.png delete mode 100644 tests/ref/bugs/smartquotes-on-newline.png delete mode 100644 tests/ref/bugs/spacing-behaviour.png delete mode 100644 tests/ref/bugs/square-base.png delete mode 100644 tests/ref/bugs/table-lines.png delete mode 100644 tests/ref/bugs/table-row-missing.png create mode 100644 tests/ref/call-basic.png create mode 100644 tests/ref/circle-auto-sizing.png create mode 100644 tests/ref/circle-directly-in-rect.png create mode 100644 tests/ref/circle-relative-sizing.png create mode 100644 tests/ref/circle-sizing-options.png create mode 100644 tests/ref/circle.png create mode 100644 tests/ref/cite-footnote.png create mode 100644 tests/ref/cite-form.png create mode 100644 tests/ref/cite-group.png create mode 100644 tests/ref/cite-grouping-and-ordering.png create mode 100644 tests/ref/cjk-punctuation-adjustment-1.png create mode 100644 tests/ref/cjk-punctuation-adjustment-2.png create mode 100644 tests/ref/cjk-punctuation-adjustment-3.png create mode 100644 tests/ref/closure-capture-in-lvalue.png create mode 100644 tests/ref/closure-path-resolve-in-layout-phase.png create mode 100644 tests/ref/closure-without-params-non-atomic.png create mode 100644 tests/ref/code-block-basic-syntax.png create mode 100644 tests/ref/color-cmyk-ops.png create mode 100644 tests/ref/color-luma.png create mode 100644 tests/ref/color-outside-srgb-gamut.png create mode 100644 tests/ref/color-rotate-hue.png create mode 100644 tests/ref/color-saturation.png create mode 100644 tests/ref/color-spaces.png create mode 100644 tests/ref/columns-colbreak-after-place.png create mode 100644 tests/ref/columns-empty-second-column.png create mode 100644 tests/ref/columns-in-auto-sized-rect.png create mode 100644 tests/ref/columns-in-fixed-size-rect.png create mode 100644 tests/ref/columns-more-with-gutter.png create mode 100644 tests/ref/columns-one.png create mode 100644 tests/ref/columns-page-height-auto.png create mode 100644 tests/ref/columns-page-width-auto.png create mode 100644 tests/ref/columns-rtl.png create mode 100644 tests/ref/columns-set-page-colbreak-pagebreak.png create mode 100644 tests/ref/columns-set-page.png create mode 100644 tests/ref/comment-end-of-line.png create mode 100644 tests/ref/comments.png delete mode 100644 tests/ref/compiler/array.png delete mode 100644 tests/ref/compiler/block.png delete mode 100644 tests/ref/compiler/break-continue.png delete mode 100644 tests/ref/compiler/call.png delete mode 100644 tests/ref/compiler/closure.png delete mode 100644 tests/ref/compiler/color.png delete mode 100644 tests/ref/compiler/comment.png delete mode 100644 tests/ref/compiler/construct.png delete mode 100644 tests/ref/compiler/content-field.png delete mode 100644 tests/ref/compiler/dict.png delete mode 100644 tests/ref/compiler/for.png delete mode 100644 tests/ref/compiler/highlight.png delete mode 100644 tests/ref/compiler/if.png delete mode 100644 tests/ref/compiler/import.png delete mode 100644 tests/ref/compiler/include.png delete mode 100644 tests/ref/compiler/label.png delete mode 100644 tests/ref/compiler/let.png delete mode 100644 tests/ref/compiler/ops.png delete mode 100644 tests/ref/compiler/repr-color-gradient.png delete mode 100644 tests/ref/compiler/repr.png delete mode 100644 tests/ref/compiler/return.png delete mode 100644 tests/ref/compiler/select-where-styles.png delete mode 100644 tests/ref/compiler/selector-logical.png delete mode 100644 tests/ref/compiler/set.png delete mode 100644 tests/ref/compiler/shorthand.png delete mode 100644 tests/ref/compiler/show-bare.png delete mode 100644 tests/ref/compiler/show-node.png delete mode 100644 tests/ref/compiler/show-recursive.png delete mode 100644 tests/ref/compiler/show-selector-logical.png delete mode 100644 tests/ref/compiler/show-selector.png delete mode 100644 tests/ref/compiler/show-set-func.png delete mode 100644 tests/ref/compiler/show-set-text.png delete mode 100644 tests/ref/compiler/show-set.png delete mode 100644 tests/ref/compiler/show-text.png delete mode 100644 tests/ref/compiler/while.png delete mode 100644 tests/ref/compute/construct.png delete mode 100644 tests/ref/compute/data.png delete mode 100644 tests/ref/compute/eval-path.png delete mode 100644 tests/ref/compute/foundations.png create mode 100644 tests/ref/content-field-materialized-heading.png create mode 100644 tests/ref/content-field-materialized-query.png create mode 100644 tests/ref/content-field-materialized-table.png create mode 100644 tests/ref/content-fields-complex.png create mode 100644 tests/ref/content-label-field-access.png create mode 100644 tests/ref/content-label-fields-method.png create mode 100644 tests/ref/content-label-has-method.png create mode 100644 tests/ref/context-compatibility-locate.png create mode 100644 tests/ref/context-compatibility-styling.png create mode 100644 tests/ref/counter-basic-1.png create mode 100644 tests/ref/counter-figure.png create mode 100644 tests/ref/counter-heading.png create mode 100644 tests/ref/counter-label.png create mode 100644 tests/ref/counter-page.png create mode 100644 tests/ref/csv.png create mode 100644 tests/ref/destructuring-during-loop-continue.png create mode 100644 tests/ref/dict-basic-methods.png create mode 100644 tests/ref/dict-basic-syntax.png create mode 100644 tests/ref/dict-from-module.png create mode 100644 tests/ref/dict-remove-order.png create mode 100644 tests/ref/document-set-title.png create mode 100644 tests/ref/ellipse-auto-sizing.png create mode 100644 tests/ref/ellipse.png create mode 100644 tests/ref/emph-and-strong-call-in-word.png create mode 100644 tests/ref/emph-double-underscore-empty-hint.png create mode 100644 tests/ref/emph-syntax.png delete mode 100644 tests/ref/empty.png create mode 100644 tests/ref/enum-built-in-loop.png create mode 100644 tests/ref/enum-function-call.png create mode 100644 tests/ref/enum-number-align-2d.png create mode 100644 tests/ref/enum-number-align-default.png create mode 100644 tests/ref/enum-number-align-specified.png create mode 100644 tests/ref/enum-number-align-unaffected.png create mode 100644 tests/ref/enum-number-align-unfolded.png create mode 100644 tests/ref/enum-number-override-nested.png create mode 100644 tests/ref/enum-number-override.png create mode 100644 tests/ref/enum-numbering-closure-nested-complex.png create mode 100644 tests/ref/enum-numbering-closure-nested.png create mode 100644 tests/ref/enum-numbering-closure.png create mode 100644 tests/ref/enum-numbering-full.png create mode 100644 tests/ref/enum-numbering-pattern.png create mode 100644 tests/ref/enum-syntax-at-start.png create mode 100644 tests/ref/enum-syntax-edge-cases.png create mode 100644 tests/ref/escape.png create mode 100644 tests/ref/eval-in-show-rule.png create mode 100644 tests/ref/eval-mode.png create mode 100644 tests/ref/eval-path-resolve-in-show-rule.png create mode 100644 tests/ref/eval-path-resolve.png create mode 100644 tests/ref/field-function.png create mode 100644 tests/ref/figure-and-caption-show.png create mode 100644 tests/ref/figure-basic.png create mode 100644 tests/ref/figure-breakable.png create mode 100644 tests/ref/figure-caption-separator.png create mode 100644 tests/ref/figure-caption-show.png create mode 100644 tests/ref/figure-caption-where-selector.png create mode 100644 tests/ref/figure-localization-fr.png create mode 100644 tests/ref/figure-localization-gr.png create mode 100644 tests/ref/figure-localization-ru.png create mode 100644 tests/ref/figure-localization-zh.png create mode 100644 tests/ref/figure-table.png create mode 100644 tests/ref/figure-theorem.png create mode 100644 tests/ref/float-display.png create mode 100644 tests/ref/float-repr.png create mode 100644 tests/ref/flow-first-region-counter-update-and-placed.png create mode 100644 tests/ref/flow-first-region-counter-update-placed-and-line.png create mode 100644 tests/ref/flow-first-region-counter-update.png create mode 100644 tests/ref/flow-first-region-no-item.png create mode 100644 tests/ref/flow-first-region-placed.png create mode 100644 tests/ref/flow-first-region-zero-sized-item.png create mode 100644 tests/ref/flow-fr.png create mode 100644 tests/ref/flow-heading-no-orphan.png create mode 100644 tests/ref/flow-par-no-orphan-and-widow-lines.png create mode 100644 tests/ref/fold-vec-order-meta.png create mode 100644 tests/ref/fold-vec-order-text-decos.png create mode 100644 tests/ref/fold-vec-order-text-features.png create mode 100644 tests/ref/footnote-basic.png create mode 100644 tests/ref/footnote-break-across-pages.png create mode 100644 tests/ref/footnote-duplicate.png create mode 100644 tests/ref/footnote-entry.png create mode 100644 tests/ref/footnote-in-caption.png create mode 100644 tests/ref/footnote-in-columns.png create mode 100644 tests/ref/footnote-in-table.png create mode 100644 tests/ref/footnote-invariant.png create mode 100644 tests/ref/footnote-nested-same-frame.png create mode 100644 tests/ref/footnote-nested.png create mode 100644 tests/ref/footnote-ref-call.png create mode 100644 tests/ref/footnote-ref-forward.png create mode 100644 tests/ref/footnote-ref-in-footnote.png create mode 100644 tests/ref/footnote-ref-multiple.png create mode 100644 tests/ref/footnote-ref.png create mode 100644 tests/ref/footnote-space-collapsing.png create mode 100644 tests/ref/footnote-styling.png create mode 100644 tests/ref/for-loop-basic.png create mode 100644 tests/ref/gradient-conic-angled.png create mode 100644 tests/ref/gradient-conic-center-shifted-1.png create mode 100644 tests/ref/gradient-conic-center-shifted-2.png create mode 100644 tests/ref/gradient-conic-hsl.png create mode 100644 tests/ref/gradient-conic-hsv.png create mode 100644 tests/ref/gradient-conic-oklab.png create mode 100644 tests/ref/gradient-conic-oklch.png create mode 100644 tests/ref/gradient-conic-relative-parent.png create mode 100644 tests/ref/gradient-conic-relative-self.png create mode 100644 tests/ref/gradient-conic-stroke.png create mode 100644 tests/ref/gradient-conic-text.png create mode 100644 tests/ref/gradient-conic.png create mode 100644 tests/ref/gradient-fill-and-stroke.png create mode 100644 tests/ref/gradient-linear-angled.png create mode 100644 tests/ref/gradient-linear-hsl.png create mode 100644 tests/ref/gradient-linear-hsv.png create mode 100644 tests/ref/gradient-linear-line.png create mode 100644 tests/ref/gradient-linear-oklab.png create mode 100644 tests/ref/gradient-linear-oklch.png create mode 100644 tests/ref/gradient-linear-relative-parent.png create mode 100644 tests/ref/gradient-linear-relative-self.png create mode 100644 tests/ref/gradient-linear-repeat-and-mirror-1.png create mode 100644 tests/ref/gradient-linear-repeat-and-mirror-2.png create mode 100644 tests/ref/gradient-linear-repeat-and-mirror-3.png create mode 100644 tests/ref/gradient-linear-sharp-and-repeat.png create mode 100644 tests/ref/gradient-linear-sharp-and-smooth.png create mode 100644 tests/ref/gradient-linear-sharp-repeat-and-mirror.png create mode 100644 tests/ref/gradient-linear-sharp.png create mode 100644 tests/ref/gradient-linear-stroke.png create mode 100644 tests/ref/gradient-math-cancel.png create mode 100644 tests/ref/gradient-math-conic.png create mode 100644 tests/ref/gradient-math-dir.png create mode 100644 tests/ref/gradient-math-frac.png create mode 100644 tests/ref/gradient-math-mat.png create mode 100644 tests/ref/gradient-math-misc.png create mode 100644 tests/ref/gradient-math-radial.png create mode 100644 tests/ref/gradient-math-root.png create mode 100644 tests/ref/gradient-math-underover.png create mode 100644 tests/ref/gradient-presets.png create mode 100644 tests/ref/gradient-radial-center.png create mode 100644 tests/ref/gradient-radial-focal-center-and-radius.png create mode 100644 tests/ref/gradient-radial-hsl.png create mode 100644 tests/ref/gradient-radial-radius.png create mode 100644 tests/ref/gradient-radial-relative-parent.png create mode 100644 tests/ref/gradient-radial-relative-self.png create mode 100644 tests/ref/gradient-radial-text.png create mode 100644 tests/ref/gradient-repr.png create mode 100644 tests/ref/gradient-text-decoration.png create mode 100644 tests/ref/gradient-text-dir.png create mode 100644 tests/ref/gradient-text-global.png create mode 100644 tests/ref/gradient-text-in-container.png create mode 100644 tests/ref/gradient-text-rotate.png create mode 100644 tests/ref/gradient-transformed.png create mode 100644 tests/ref/grid-align.png create mode 100644 tests/ref/grid-auto-shrink.png create mode 100644 tests/ref/grid-breaking-expand-vertically.png create mode 100644 tests/ref/grid-calendar.png create mode 100644 tests/ref/grid-cell-align-override.png create mode 100644 tests/ref/grid-cell-breaking.png create mode 100644 tests/ref/grid-cell-folding.png create mode 100644 tests/ref/grid-cell-override-in-header-and-footer-with-gutter.png create mode 100644 tests/ref/grid-cell-override-in-header-and-footer.png create mode 100644 tests/ref/grid-cell-override.png create mode 100644 tests/ref/grid-cell-position-automatic-skip-manual.png create mode 100644 tests/ref/grid-cell-position-extra-rows.png create mode 100644 tests/ref/grid-cell-position-out-of-order.png create mode 100644 tests/ref/grid-cell-position-partial.png create mode 100644 tests/ref/grid-cell-set.png create mode 100644 tests/ref/grid-cell-show-and-override.png create mode 100644 tests/ref/grid-cell-show-based-on-position.png create mode 100644 tests/ref/grid-cell-show-emph.png create mode 100644 tests/ref/grid-cell-show-x-y.png create mode 100644 tests/ref/grid-cell-show.png create mode 100644 tests/ref/grid-cell-various-overrides.png create mode 100644 tests/ref/grid-colspan-gutter.png create mode 100644 tests/ref/grid-colspan-multiple-regions.png create mode 100644 tests/ref/grid-colspan-over-all-fr-columns-page-width-auto.png create mode 100644 tests/ref/grid-colspan-over-all-fr-columns.png create mode 100644 tests/ref/grid-colspan-over-some-fr-columns.png create mode 100644 tests/ref/grid-colspan-thick-stroke.png create mode 100644 tests/ref/grid-colspan.png create mode 100644 tests/ref/grid-column-sizing-auto-base.png create mode 100644 tests/ref/grid-column-sizing-fr-base.png create mode 100644 tests/ref/grid-column-sizing-mixed-base.png create mode 100644 tests/ref/grid-columns-sizings-rect.png create mode 100644 tests/ref/grid-complete-rows.png create mode 100644 tests/ref/grid-consecutive-rows-breaking.png create mode 100644 tests/ref/grid-exam.png create mode 100644 tests/ref/grid-fill-func.png create mode 100644 tests/ref/grid-finance.png create mode 100644 tests/ref/grid-footer-bare-1.png create mode 100644 tests/ref/grid-footer-bare-2.png create mode 100644 tests/ref/grid-footer-below-rowspans.png create mode 100644 tests/ref/grid-footer-cell-with-y.png create mode 100644 tests/ref/grid-footer-expand.png create mode 100644 tests/ref/grid-footer-gutter-and-no-repeat.png create mode 100644 tests/ref/grid-footer-hline-and-vline-1.png create mode 100644 tests/ref/grid-footer-hline-and-vline-2.png create mode 100644 tests/ref/grid-footer-relative-row-sizes.png create mode 100644 tests/ref/grid-footer-rowspan.png create mode 100644 tests/ref/grid-footer-stroke-edge-cases.png create mode 100644 tests/ref/grid-footer-top-stroke.png create mode 100644 tests/ref/grid-footer.png create mode 100644 tests/ref/grid-funcs-gutter.png create mode 100644 tests/ref/grid-gutter-fr.png create mode 100644 tests/ref/grid-header-and-footer-containing-rowspan.png create mode 100644 tests/ref/grid-header-and-footer-empty.png create mode 100644 tests/ref/grid-header-and-footer-lack-of-space.png create mode 100644 tests/ref/grid-header-and-footer-orphan-prevention.png create mode 100644 tests/ref/grid-header-and-rowspan-non-contiguous-1.png create mode 100644 tests/ref/grid-header-and-rowspan-non-contiguous-2.png create mode 100644 tests/ref/grid-header-and-rowspan-non-contiguous-3.png create mode 100644 tests/ref/grid-header-block-with-fixed-height.png create mode 100644 tests/ref/grid-header-cell-with-y.png create mode 100644 tests/ref/grid-header-containing-rowspan.png create mode 100644 tests/ref/grid-header-empty.png create mode 100644 tests/ref/grid-header-expand.png create mode 100644 tests/ref/grid-header-footer-and-rowspan-non-contiguous-1.png create mode 100644 tests/ref/grid-header-footer-and-rowspan-non-contiguous-2.png create mode 100644 tests/ref/grid-header-footer-block-with-fixed-height.png create mode 100644 tests/ref/grid-header-hline-and-vline.png create mode 100644 tests/ref/grid-header-hline-bottom-manually.png create mode 100644 tests/ref/grid-header-hline-bottom.png create mode 100644 tests/ref/grid-header-lack-of-space.png create mode 100644 tests/ref/grid-header-last-child.png create mode 100644 tests/ref/grid-header-nested.png create mode 100644 tests/ref/grid-header-orphan-prevention.png create mode 100644 tests/ref/grid-header-relative-row-sizes.png create mode 100644 tests/ref/grid-header-rowspan-base.png create mode 100644 tests/ref/grid-header-stroke-edge-cases.png create mode 100644 tests/ref/grid-headers-gutter.png create mode 100644 tests/ref/grid-headers-no-repeat.png create mode 100644 tests/ref/grid-headers.png create mode 100644 tests/ref/grid-inset-folding.png create mode 100644 tests/ref/grid-inset.png create mode 100644 tests/ref/grid-nested-breaking.png create mode 100644 tests/ref/grid-nested-footers.png create mode 100644 tests/ref/grid-nested-headers.png create mode 100644 tests/ref/grid-nested-with-footers.png create mode 100644 tests/ref/grid-nested-with-headers.png create mode 100644 tests/ref/grid-row-sizing-manual-align.png create mode 100644 tests/ref/grid-rowspan-block-full-height.png create mode 100644 tests/ref/grid-rowspan-block-overflow.png create mode 100644 tests/ref/grid-rowspan-cell-coordinates.png create mode 100644 tests/ref/grid-rowspan-cell-order.png create mode 100644 tests/ref/grid-rowspan-excessive-gutter.png create mode 100644 tests/ref/grid-rowspan-excessive.png create mode 100644 tests/ref/grid-rowspan-fixed-size.png create mode 100644 tests/ref/grid-rowspan-gutter.png create mode 100644 tests/ref/grid-rowspan-in-all-columns-stroke-gutter.png create mode 100644 tests/ref/grid-rowspan-in-all-columns-stroke.png create mode 100644 tests/ref/grid-rowspan-over-auto-row.png create mode 100644 tests/ref/grid-rowspan-over-fr-row-at-end.png create mode 100644 tests/ref/grid-rowspan-over-fr-row-at-start.png create mode 100644 tests/ref/grid-rowspan-split-1.png create mode 100644 tests/ref/grid-rowspan-split-10.png create mode 100644 tests/ref/grid-rowspan-split-11.png create mode 100644 tests/ref/grid-rowspan-split-12.png create mode 100644 tests/ref/grid-rowspan-split-13.png create mode 100644 tests/ref/grid-rowspan-split-14.png create mode 100644 tests/ref/grid-rowspan-split-15.png create mode 100644 tests/ref/grid-rowspan-split-16.png create mode 100644 tests/ref/grid-rowspan-split-17.png create mode 100644 tests/ref/grid-rowspan-split-2.png create mode 100644 tests/ref/grid-rowspan-split-3.png create mode 100644 tests/ref/grid-rowspan-split-4.png create mode 100644 tests/ref/grid-rowspan-split-5.png create mode 100644 tests/ref/grid-rowspan-split-6.png create mode 100644 tests/ref/grid-rowspan-split-7.png create mode 100644 tests/ref/grid-rowspan-split-8.png create mode 100644 tests/ref/grid-rowspan-split-9.png create mode 100644 tests/ref/grid-rowspan-unbreakable-1.png create mode 100644 tests/ref/grid-rowspan-unbreakable-2.png create mode 100644 tests/ref/grid-rowspan.png create mode 100644 tests/ref/grid-rtl-colspan-stroke.png create mode 100644 tests/ref/grid-rtl-colspan.png create mode 100644 tests/ref/grid-rtl-complex.png create mode 100644 tests/ref/grid-rtl-header.png create mode 100644 tests/ref/grid-rtl-multiple-regions.png create mode 100644 tests/ref/grid-rtl-rowspan.png create mode 100644 tests/ref/grid-rtl-vline-position.png create mode 100644 tests/ref/grid-rtl.png create mode 100644 tests/ref/grid-same-row-multiple-columns-breaking.png create mode 100644 tests/ref/grid-stroke-array.png create mode 100644 tests/ref/grid-stroke-automatically-positioned-lines.png create mode 100644 tests/ref/grid-stroke-border-partial.png create mode 100644 tests/ref/grid-stroke-complex.png create mode 100644 tests/ref/grid-stroke-field-in-show.png create mode 100644 tests/ref/grid-stroke-folding.png create mode 100644 tests/ref/grid-stroke-func.png create mode 100644 tests/ref/grid-stroke-hline-position-bottom-gutter.png create mode 100644 tests/ref/grid-stroke-hline-position-bottom.png create mode 100644 tests/ref/grid-stroke-hline-rowspan.png create mode 100644 tests/ref/grid-stroke-manually-positioned-lines.png create mode 100644 tests/ref/grid-stroke-none.png create mode 100644 tests/ref/grid-stroke-pattern.png create mode 100644 tests/ref/grid-stroke-priority-cell.png create mode 100644 tests/ref/grid-stroke-priority-line-cell.png create mode 100644 tests/ref/grid-stroke-priority-line.png create mode 100644 tests/ref/grid-stroke-set-on-cell-and-line.png create mode 100644 tests/ref/grid-stroke-vline-colspan.png create mode 100644 tests/ref/grid-stroke-vline-position-left-and-right.png create mode 100644 tests/ref/grid-trailing-linebreak-region-overflow.png create mode 100644 tests/ref/heading-basic.png create mode 100644 tests/ref/heading-block.png create mode 100644 tests/ref/heading-offset-and-level.png create mode 100644 tests/ref/heading-offset.png create mode 100644 tests/ref/heading-show-where.png create mode 100644 tests/ref/heading-syntax-at-start.png create mode 100644 tests/ref/heading-syntax-edge-cases.png create mode 100644 tests/ref/hide-image.png create mode 100644 tests/ref/hide-line.png create mode 100644 tests/ref/hide-list.png create mode 100644 tests/ref/hide-polygon.png create mode 100644 tests/ref/hide-rect.png create mode 100644 tests/ref/hide-table.png create mode 100644 tests/ref/hide-text.png create mode 100644 tests/ref/highlight-bounds.png create mode 100644 tests/ref/highlight-edges-bounds.png create mode 100644 tests/ref/highlight-edges.png create mode 100644 tests/ref/highlight-radius.png create mode 100644 tests/ref/highlight-stroke.png create mode 100644 tests/ref/highlight.png create mode 100644 tests/ref/hyphenate-between-shape-runs.png create mode 100644 tests/ref/hyphenate-off-temporarily.png create mode 100644 tests/ref/hyphenate-punctuation.png create mode 100644 tests/ref/hyphenate-shy.png create mode 100644 tests/ref/hyphenate.png create mode 100644 tests/ref/if-condition-complex.png create mode 100644 tests/ref/if-markup.png create mode 100644 tests/ref/image-baseline-with-box.png create mode 100644 tests/ref/image-decode-detect-format.png create mode 100644 tests/ref/image-decode-specify-format.png create mode 100644 tests/ref/image-decode-svg.png create mode 100644 tests/ref/image-fit.png create mode 100644 tests/ref/image-jump-to-next-page.png create mode 100644 tests/ref/image-natural-dpi-sizing.png create mode 100644 tests/ref/image-rgba-png-and-jpeg.png create mode 100644 tests/ref/image-sizing.png create mode 100644 tests/ref/image-svg-complex.png create mode 100644 tests/ref/image-svg-text-font.png create mode 100644 tests/ref/image-svg-text.png create mode 100644 tests/ref/import-basic.png create mode 100644 tests/ref/import-from-function-scope.png create mode 100644 tests/ref/import-source-field-access.png create mode 100644 tests/ref/include-file.png create mode 100644 tests/ref/int-display.png create mode 100644 tests/ref/int-repr.png create mode 100644 tests/ref/issue-1041-smartquotes-in-outline.png create mode 100644 tests/ref/issue-1050-terms-indent.png create mode 100644 tests/ref/issue-1052-math-number-spacing.png create mode 100644 tests/ref/issue-1216-clamp-panic.png create mode 100644 tests/ref/issue-1240-stack-h-fr.png create mode 100644 tests/ref/issue-1240-stack-v-fr.png create mode 100644 tests/ref/issue-1368-place-pagebreak.png create mode 100644 tests/ref/issue-1373-bidi-tofus.png create mode 100644 tests/ref/issue-1388-table-row-missing.png create mode 100644 tests/ref/issue-1398-line-align.png create mode 100644 tests/ref/issue-1433-footnote-in-list.png create mode 100644 tests/ref/issue-1540-smartquotes-across-newlines.png create mode 100644 tests/ref/issue-1597-cite-footnote.png create mode 100644 tests/ref/issue-1825-rect-overflow.png create mode 100644 tests/ref/issue-183-table-lines.png create mode 100644 tests/ref/issue-1948-math-text-break.png create mode 100644 tests/ref/issue-2044-invalid-parsed-ident.png create mode 100644 tests/ref/issue-2051-new-cm-svg.png create mode 100644 tests/ref/issue-2055-math-eval.png create mode 100644 tests/ref/issue-2095-pagebreak-numbering.png create mode 100644 tests/ref/issue-2105-linebreak-tofu.png create mode 100644 tests/ref/issue-2128-block-width-box.png create mode 100644 tests/ref/issue-2134-pagebreak-bibliography.png create mode 100644 tests/ref/issue-2162-pagebreak-set-style.png create mode 100644 tests/ref/issue-2199-place-spacing-bottom.png create mode 100644 tests/ref/issue-2199-place-spacing-default.png create mode 100644 tests/ref/issue-2214-baseline-math.png create mode 100644 tests/ref/issue-2259-raw-color-overwrite.png create mode 100644 tests/ref/issue-2268-mat-augment-color.png create mode 100644 tests/ref/issue-2419-justify-hanging-indent.png create mode 100644 tests/ref/issue-2530-enum-item-panic.png create mode 100644 tests/ref/issue-2530-figure-caption-panic.png create mode 100644 tests/ref/issue-2530-list-item-panic.png create mode 100644 tests/ref/issue-2530-term-item-panic.png create mode 100644 tests/ref/issue-2531-cite-show-set.png create mode 100644 tests/ref/issue-2538-cjk-latin-spacing-before-linebreak.png create mode 100644 tests/ref/issue-2595-float-overlap.png create mode 100644 tests/ref/issue-2650-cjk-latin-spacing-meta.png create mode 100644 tests/ref/issue-2715-float-order.png create mode 100644 tests/ref/issue-2902-gradient-oklab-panic.png create mode 100644 tests/ref/issue-2902-gradient-oklch-panic.png create mode 100644 tests/ref/issue-3082-chinese-punctuation.png create mode 100644 tests/ref/issue-3191-raw-indent-shrink.png create mode 100644 tests/ref/issue-3191-raw-normal-paragraphs-still-shrink.png create mode 100644 tests/ref/issue-3232-dict-empty.png create mode 100644 tests/ref/issue-3264-rect-negative-dimensions.png create mode 100644 tests/ref/issue-3363-json-large-number.png create mode 100644 tests/ref/issue-3586-figure-caption-separator.png create mode 100644 tests/ref/issue-3624-spacing-behaviour.png create mode 100644 tests/ref/issue-3641-float-loop.png create mode 100644 tests/ref/issue-3650-italic-equation.png create mode 100644 tests/ref/issue-3658-math-size.png create mode 100644 tests/ref/issue-3662-pdf-smartquotes.png create mode 100644 tests/ref/issue-3700-deformed-stroke.png create mode 100644 tests/ref/issue-3841-tabs-in-raw-type-code.png create mode 100644 tests/ref/issue-622-hide-meta-cite.png create mode 100644 tests/ref/issue-622-hide-meta-outline.png create mode 100644 tests/ref/issue-785-cite-locate.png create mode 100644 tests/ref/issue-80-emoji-linebreak.png create mode 100644 tests/ref/issue-852-mat-type.png create mode 100644 tests/ref/issue-870-image-rotation.png create mode 100644 tests/ref/issue-886-args-sink.png create mode 100644 tests/ref/issue-columns-heading.png create mode 100644 tests/ref/issue-flow-frame-placement.png create mode 100644 tests/ref/issue-flow-layout-index-out-of-bounds.png create mode 100644 tests/ref/issue-flow-overlarge-frames.png create mode 100644 tests/ref/issue-flow-trailing-leading.png create mode 100644 tests/ref/issue-flow-weak-spacing.png create mode 100644 tests/ref/issue-gradient-cmyk-encode.png create mode 100644 tests/ref/issue-grid-base-auto-row-list.png create mode 100644 tests/ref/issue-grid-base-auto-row.png create mode 100644 tests/ref/issue-grid-double-skip.png create mode 100644 tests/ref/issue-grid-gutter-skip.png create mode 100644 tests/ref/issue-grid-skip-list.png create mode 100644 tests/ref/issue-grid-skip.png create mode 100644 tests/ref/issue-math-realize-hide.png create mode 100644 tests/ref/issue-math-realize-scripting.png create mode 100644 tests/ref/issue-math-realize-show.png create mode 100644 tests/ref/issue-multiple-footnote-in-one-line.png create mode 100644 tests/ref/issue-non-atomic-closure.png create mode 100644 tests/ref/issue-place-base.png create mode 100644 tests/ref/issue-rtl-safe-to-break-panic.png create mode 100644 tests/ref/justify-avoid-runts.png create mode 100644 tests/ref/justify-chinese.png create mode 100644 tests/ref/justify-code-blocks.png create mode 100644 tests/ref/justify-japanese.png create mode 100644 tests/ref/justify-justified-linebreak.png create mode 100644 tests/ref/justify-knuth-story.png create mode 100644 tests/ref/justify-manual-linebreak.png create mode 100644 tests/ref/justify-no-leading-spaces.png create mode 100644 tests/ref/justify-punctuation-adjustment.png create mode 100644 tests/ref/justify-shrink-last-line.png create mode 100644 tests/ref/justify-variants.png create mode 100644 tests/ref/justify-whitespace-adjustment.png create mode 100644 tests/ref/justify-without-justifiables.png create mode 100644 tests/ref/justify.png create mode 100644 tests/ref/label-after-expression.png create mode 100644 tests/ref/label-after-parbreak.png create mode 100644 tests/ref/label-dynamic-show-set.png create mode 100644 tests/ref/label-in-block.png create mode 100644 tests/ref/label-on-text.png create mode 100644 tests/ref/label-show-where-selector.png create mode 100644 tests/ref/label-unclosed-is-text.png create mode 100644 tests/ref/layout-in-fixed-size-block.png create mode 100644 tests/ref/layout-in-page-call.png delete mode 100644 tests/ref/layout/align.png delete mode 100644 tests/ref/layout/block-sizing.png delete mode 100644 tests/ref/layout/block-spacing.png delete mode 100644 tests/ref/layout/cjk-latin-spacing.png delete mode 100644 tests/ref/layout/cjk-punctuation-adjustment.png delete mode 100644 tests/ref/layout/clip.png delete mode 100644 tests/ref/layout/code-indent-shrink.png delete mode 100644 tests/ref/layout/columns.png delete mode 100644 tests/ref/layout/container-fill.png delete mode 100644 tests/ref/layout/container.png delete mode 100644 tests/ref/layout/enum-align.png delete mode 100644 tests/ref/layout/enum-numbering.png delete mode 100644 tests/ref/layout/enum.png delete mode 100644 tests/ref/layout/flow-orphan.png delete mode 100644 tests/ref/layout/grid-1.png delete mode 100644 tests/ref/layout/grid-2.png delete mode 100644 tests/ref/layout/grid-3.png delete mode 100644 tests/ref/layout/grid-4.png delete mode 100644 tests/ref/layout/grid-5.png delete mode 100644 tests/ref/layout/grid-auto-shrink.png delete mode 100644 tests/ref/layout/grid-cell.png delete mode 100644 tests/ref/layout/grid-colspan.png delete mode 100644 tests/ref/layout/grid-footers-1.png delete mode 100644 tests/ref/layout/grid-footers-2.png delete mode 100644 tests/ref/layout/grid-footers-3.png delete mode 100644 tests/ref/layout/grid-footers-4.png delete mode 100644 tests/ref/layout/grid-footers-5.png delete mode 100644 tests/ref/layout/grid-headers-1.png delete mode 100644 tests/ref/layout/grid-headers-2.png delete mode 100644 tests/ref/layout/grid-headers-3.png delete mode 100644 tests/ref/layout/grid-headers-4.png delete mode 100644 tests/ref/layout/grid-positioning.png delete mode 100644 tests/ref/layout/grid-rowspan-basic.png delete mode 100644 tests/ref/layout/grid-rowspan-split-1.png delete mode 100644 tests/ref/layout/grid-rowspan-split-2.png delete mode 100644 tests/ref/layout/grid-rowspan-split-3.png delete mode 100644 tests/ref/layout/grid-rtl.png delete mode 100644 tests/ref/layout/grid-stroke.png delete mode 100644 tests/ref/layout/grid-styling.png delete mode 100644 tests/ref/layout/hide.png delete mode 100644 tests/ref/layout/list-attach.png delete mode 100644 tests/ref/layout/list-marker.png delete mode 100644 tests/ref/layout/list.png delete mode 100644 tests/ref/layout/out-of-flow-in-block.png delete mode 100644 tests/ref/layout/pad.png delete mode 100644 tests/ref/layout/page-binding.png delete mode 100644 tests/ref/layout/page-margin.png delete mode 100644 tests/ref/layout/page-marginals.png delete mode 100644 tests/ref/layout/page-number-align.png delete mode 100644 tests/ref/layout/page-style.png delete mode 100644 tests/ref/layout/page.png delete mode 100644 tests/ref/layout/pagebreak-parity.png delete mode 100644 tests/ref/layout/pagebreak-weak.png delete mode 100644 tests/ref/layout/pagebreak.png delete mode 100644 tests/ref/layout/par-bidi.png delete mode 100644 tests/ref/layout/par-indent.png delete mode 100644 tests/ref/layout/par-justify-cjk.png delete mode 100644 tests/ref/layout/par-justify.png delete mode 100644 tests/ref/layout/par-knuth.png delete mode 100644 tests/ref/layout/par-simple.png delete mode 100644 tests/ref/layout/par.png delete mode 100644 tests/ref/layout/place-background.png delete mode 100644 tests/ref/layout/place-float-auto.png delete mode 100644 tests/ref/layout/place-float-columns.png delete mode 100644 tests/ref/layout/place-float-figure.png delete mode 100644 tests/ref/layout/place-nested.png delete mode 100644 tests/ref/layout/place.png delete mode 100644 tests/ref/layout/repeat.png delete mode 100644 tests/ref/layout/spacing.png delete mode 100644 tests/ref/layout/stack-1.png delete mode 100644 tests/ref/layout/stack-2.png delete mode 100644 tests/ref/layout/table-cell.png delete mode 100644 tests/ref/layout/table.png delete mode 100644 tests/ref/layout/terms.png delete mode 100644 tests/ref/layout/transform-layout.png delete mode 100644 tests/ref/layout/transform.png create mode 100644 tests/ref/let-basic.png create mode 100644 tests/ref/let-termination.png create mode 100644 tests/ref/line-basic.png create mode 100644 tests/ref/line-positioning.png create mode 100644 tests/ref/line-stroke-dash.png create mode 100644 tests/ref/line-stroke-set.png create mode 100644 tests/ref/line-stroke.png create mode 100644 tests/ref/linebreak-cite-punctuation.png create mode 100644 tests/ref/linebreak-hyphen-nbsp.png create mode 100644 tests/ref/linebreak-link-end.png create mode 100644 tests/ref/linebreak-link-justify.png create mode 100644 tests/ref/linebreak-link.png create mode 100644 tests/ref/linebreak-manual-consecutive.png create mode 100644 tests/ref/linebreak-manual-directly-after-automatic.png create mode 100644 tests/ref/linebreak-manual-justified.png create mode 100644 tests/ref/linebreak-manual-trailing-multiple.png create mode 100644 tests/ref/linebreak-manual.png create mode 100644 tests/ref/linebreak-math-punctuation.png create mode 100644 tests/ref/linebreak-narrow-nbsp.png create mode 100644 tests/ref/linebreak-overflow-double.png create mode 100644 tests/ref/linebreak-overflow.png create mode 100644 tests/ref/linebreak-shape-run.png create mode 100644 tests/ref/linebreak-thai.png create mode 100644 tests/ref/link-basic.png create mode 100644 tests/ref/link-bracket-balanced.png create mode 100644 tests/ref/link-bracket-unbalanced-closing.png create mode 100644 tests/ref/link-on-block.png create mode 100644 tests/ref/link-show.png create mode 100644 tests/ref/link-to-label.png create mode 100644 tests/ref/link-to-page.png create mode 100644 tests/ref/link-trailing-period.png create mode 100644 tests/ref/link-transformed.png create mode 100644 tests/ref/list-attached-above-spacing.png create mode 100644 tests/ref/list-attached.png create mode 100644 tests/ref/list-basic.png create mode 100644 tests/ref/list-content-block.png create mode 100644 tests/ref/list-indent-specifics.png create mode 100644 tests/ref/list-marker-align-unaffected.png create mode 100644 tests/ref/list-marker-bare-hyphen.png create mode 100644 tests/ref/list-marker-closure.png create mode 100644 tests/ref/list-marker-cycle.png create mode 100644 tests/ref/list-marker-dash.png create mode 100644 tests/ref/list-mix.png create mode 100644 tests/ref/list-mixed-tabs-and-spaces.png create mode 100644 tests/ref/list-nested.png create mode 100644 tests/ref/list-non-attached-followed-by-attached.png create mode 100644 tests/ref/list-rtl.png create mode 100644 tests/ref/list-syntax-edge-cases.png create mode 100644 tests/ref/list-tabs.png create mode 100644 tests/ref/list-tight-non-attached-tight.png create mode 100644 tests/ref/list-top-level-indent.png create mode 100644 tests/ref/list-wide-cannot-attach.png create mode 100644 tests/ref/list-wide-really-cannot-attach.png create mode 100644 tests/ref/locate-element-selector.png create mode 100644 tests/ref/locate-position.png create mode 100644 tests/ref/loop-break-join-in-first-arg.png create mode 100644 tests/ref/loop-break-join-in-nested-blocks.png create mode 100644 tests/ref/loop-break-join-in-set-rule-args.png create mode 100644 tests/ref/loop-break-join-set-and-show.png create mode 100644 tests/ref/lorem-pars.png create mode 100644 tests/ref/lorem.png create mode 100644 tests/ref/math-accent-align.png create mode 100644 tests/ref/math-accent-bounds.png create mode 100644 tests/ref/math-accent-func.png create mode 100644 tests/ref/math-accent-high-base.png create mode 100644 tests/ref/math-accent-sized.png create mode 100644 tests/ref/math-accent-superscript.png create mode 100644 tests/ref/math-accent-sym-call.png create mode 100644 tests/ref/math-accent-wide-base.png create mode 100644 tests/ref/math-align-aligned-in-source.png create mode 100644 tests/ref/math-align-basic.png create mode 100644 tests/ref/math-align-cases.png create mode 100644 tests/ref/math-align-implicit.png create mode 100644 tests/ref/math-align-lines-mixed.png create mode 100644 tests/ref/math-align-post-fix.png create mode 100644 tests/ref/math-align-toggle.png create mode 100644 tests/ref/math-align-weird.png create mode 100644 tests/ref/math-align-wider-first-column.png create mode 100644 tests/ref/math-attach-default-placement.png create mode 100644 tests/ref/math-attach-descender-collision.png create mode 100644 tests/ref/math-attach-followed-by-func-call.png create mode 100644 tests/ref/math-attach-force-scripts-and-limits.png create mode 100644 tests/ref/math-attach-high.png create mode 100644 tests/ref/math-attach-horizontal-align.png create mode 100644 tests/ref/math-attach-integral.png create mode 100644 tests/ref/math-attach-large-operator.png create mode 100644 tests/ref/math-attach-limit.png create mode 100644 tests/ref/math-attach-mixed.png create mode 100644 tests/ref/math-attach-nested.png create mode 100644 tests/ref/math-attach-postscripts.png create mode 100644 tests/ref/math-attach-prescripts.png create mode 100644 tests/ref/math-attach-show-limit.png create mode 100644 tests/ref/math-attach-subscript-multiline.png create mode 100644 tests/ref/math-attach-to-group.png create mode 100644 tests/ref/math-binom-multiple.png create mode 100644 tests/ref/math-binom.png create mode 100644 tests/ref/math-box-with-baseline.png create mode 100644 tests/ref/math-box-without-baseline.png create mode 100644 tests/ref/math-call-non-func.png create mode 100644 tests/ref/math-cancel-angle-absolute.png create mode 100644 tests/ref/math-cancel-angle-func.png create mode 100644 tests/ref/math-cancel-cross.png create mode 100644 tests/ref/math-cancel-customized.png create mode 100644 tests/ref/math-cancel-display.png create mode 100644 tests/ref/math-cancel-inline.png create mode 100644 tests/ref/math-cancel-inverted.png create mode 100644 tests/ref/math-cases-gap.png create mode 100644 tests/ref/math-cases.png create mode 100644 tests/ref/math-class-chars.png create mode 100644 tests/ref/math-class-content.png create mode 100644 tests/ref/math-class-exceptions.png create mode 100644 tests/ref/math-class-limits.png create mode 100644 tests/ref/math-class-nested.png create mode 100644 tests/ref/math-common-symbols.png create mode 100644 tests/ref/math-dif.png create mode 100644 tests/ref/math-equation-align-numbered.png create mode 100644 tests/ref/math-equation-align-unnumbered.png create mode 100644 tests/ref/math-equation-auto-wrapping.png create mode 100644 tests/ref/math-equation-font.png create mode 100644 tests/ref/math-equation-number-align-end.png create mode 100644 tests/ref/math-equation-number-align-left.png create mode 100644 tests/ref/math-equation-number-align-multiline-bottom.png create mode 100644 tests/ref/math-equation-number-align-multiline-expand.png create mode 100644 tests/ref/math-equation-number-align-multiline-top-start.png create mode 100644 tests/ref/math-equation-number-align-multiline.png create mode 100644 tests/ref/math-equation-number-align-right.png create mode 100644 tests/ref/math-equation-number-align-start.png create mode 100644 tests/ref/math-equation-number-align.png create mode 100644 tests/ref/math-equation-numbering.png create mode 100644 tests/ref/math-equation-show-rule.png create mode 100644 tests/ref/math-font-fallback.png create mode 100644 tests/ref/math-font-features.png create mode 100644 tests/ref/math-font-switch.png create mode 100644 tests/ref/math-frac-associativity.png create mode 100644 tests/ref/math-frac-baseline.png create mode 100644 tests/ref/math-frac-large.png create mode 100644 tests/ref/math-frac-paren-removal.png create mode 100644 tests/ref/math-frac-precedence.png create mode 100644 tests/ref/math-linebreaking-after-binop-and-rel.png create mode 100644 tests/ref/math-linebreaking-after-relation-without-space.png create mode 100644 tests/ref/math-linebreaking-between-consecutive-relations.png create mode 100644 tests/ref/math-linebreaking-empty.png create mode 100644 tests/ref/math-linebreaking-in-box.png create mode 100644 tests/ref/math-linebreaking-lr.png create mode 100644 tests/ref/math-linebreaking-multiline.png create mode 100644 tests/ref/math-linebreaking-trailing-linebreak.png create mode 100644 tests/ref/math-lr-call.png create mode 100644 tests/ref/math-lr-color.png create mode 100644 tests/ref/math-lr-fences.png create mode 100644 tests/ref/math-lr-half.png create mode 100644 tests/ref/math-lr-matching.png create mode 100644 tests/ref/math-lr-mid.png create mode 100644 tests/ref/math-lr-shorthands.png create mode 100644 tests/ref/math-lr-size.png create mode 100644 tests/ref/math-lr-symbol-unmatched.png create mode 100644 tests/ref/math-lr-unbalanced.png create mode 100644 tests/ref/math-lr-unmatched.png create mode 100644 tests/ref/math-lr-weak-spacing.png create mode 100644 tests/ref/math-mat-align-complex.png create mode 100644 tests/ref/math-mat-align-explicit--alternating.png create mode 100644 tests/ref/math-mat-align-explicit-left.png create mode 100644 tests/ref/math-mat-align-explicit-right.png create mode 100644 tests/ref/math-mat-align-implicit.png create mode 100644 tests/ref/math-mat-align-signed-numbers.png create mode 100644 tests/ref/math-mat-augment-set.png create mode 100644 tests/ref/math-mat-augment.png create mode 100644 tests/ref/math-mat-baseline.png create mode 100644 tests/ref/math-mat-delim-direct.png create mode 100644 tests/ref/math-mat-delim-set.png create mode 100644 tests/ref/math-mat-gap.png create mode 100644 tests/ref/math-mat-gaps.png create mode 100644 tests/ref/math-mat-semicolon.png create mode 100644 tests/ref/math-mat-sparse.png create mode 100644 tests/ref/math-multiline-multiple-trailing-linebreaks.png create mode 100644 tests/ref/math-multiline-no-trailing-linebreak.png create mode 100644 tests/ref/math-multiline-trailing-linebreak.png create mode 100644 tests/ref/math-nested-normal-layout.png create mode 100644 tests/ref/math-non-math-content.png create mode 100644 tests/ref/math-op-call.png create mode 100644 tests/ref/math-op-custom.png create mode 100644 tests/ref/math-op-predefined.png create mode 100644 tests/ref/math-op-scripts-vs-limits.png create mode 100644 tests/ref/math-op-styled.png create mode 100644 tests/ref/math-optical-size-frac-script-script.png create mode 100644 tests/ref/math-optical-size-nested-scripts.png create mode 100644 tests/ref/math-optical-size-prime-large-operator.png create mode 100644 tests/ref/math-optical-size-primes.png create mode 100644 tests/ref/math-primes-after-code-expr.png create mode 100644 tests/ref/math-primes-attach.png create mode 100644 tests/ref/math-primes-complex.png create mode 100644 tests/ref/math-primes-limits.png create mode 100644 tests/ref/math-primes-scripts.png create mode 100644 tests/ref/math-primes-spaces.png create mode 100644 tests/ref/math-primes.png create mode 100644 tests/ref/math-root-basic.png create mode 100644 tests/ref/math-root-large-body.png create mode 100644 tests/ref/math-root-large-index.png create mode 100644 tests/ref/math-root-precomposed.png create mode 100644 tests/ref/math-root-radical-attachment.png create mode 100644 tests/ref/math-root-syntax.png create mode 100644 tests/ref/math-shorthandes.png create mode 100644 tests/ref/math-size.png create mode 100644 tests/ref/math-spacing-basic.png create mode 100644 tests/ref/math-spacing-decorated.png create mode 100644 tests/ref/math-spacing-kept-spaces.png create mode 100644 tests/ref/math-spacing-predefined.png create mode 100644 tests/ref/math-spacing-set-comprehension.png create mode 100644 tests/ref/math-spacing-weak.png create mode 100644 tests/ref/math-style-exceptions.png create mode 100644 tests/ref/math-style-greek-exceptions.png create mode 100644 tests/ref/math-style-hebrew-exceptions.png create mode 100644 tests/ref/math-style-italic-default.png create mode 100644 tests/ref/math-style.png create mode 100644 tests/ref/math-symbol-show-rule.png create mode 100644 tests/ref/math-table.png create mode 100644 tests/ref/math-text-color.png create mode 100644 tests/ref/math-underover-brace.png create mode 100644 tests/ref/math-underover-brackets.png create mode 100644 tests/ref/math-underover-line-bracket.png create mode 100644 tests/ref/math-unicode.png create mode 100644 tests/ref/math-vec-align-explicit-alternating.png create mode 100644 tests/ref/math-vec-delim-set.png create mode 100644 tests/ref/math-vec-gap.png create mode 100644 tests/ref/math-vec-wide.png delete mode 100644 tests/ref/math/accent.png delete mode 100644 tests/ref/math/alignment.png delete mode 100644 tests/ref/math/attach-p1.png delete mode 100644 tests/ref/math/attach-p2.png delete mode 100644 tests/ref/math/attach-p3.png delete mode 100644 tests/ref/math/call.png delete mode 100644 tests/ref/math/cancel.png delete mode 100644 tests/ref/math/cases.png delete mode 100644 tests/ref/math/class.png delete mode 100644 tests/ref/math/content.png delete mode 100644 tests/ref/math/delimited.png delete mode 100644 tests/ref/math/equation-block-align.png delete mode 100644 tests/ref/math/equation-number.png delete mode 100644 tests/ref/math/equation-show.png delete mode 100644 tests/ref/math/font-features.png delete mode 100644 tests/ref/math/frac.png delete mode 100644 tests/ref/math/linebreak.png delete mode 100644 tests/ref/math/matrix-alignment.png delete mode 100644 tests/ref/math/matrix-gaps.png delete mode 100644 tests/ref/math/matrix.png delete mode 100644 tests/ref/math/multiline.png delete mode 100644 tests/ref/math/numbering.png delete mode 100644 tests/ref/math/op.png delete mode 100644 tests/ref/math/opticalsize.png delete mode 100644 tests/ref/math/prime.png delete mode 100644 tests/ref/math/root.png delete mode 100644 tests/ref/math/spacing.png delete mode 100644 tests/ref/math/style.png delete mode 100644 tests/ref/math/syntax.png delete mode 100644 tests/ref/math/unbalanced.png delete mode 100644 tests/ref/math/underover.png delete mode 100644 tests/ref/math/vec.png delete mode 100644 tests/ref/meta/bibliography-full.png delete mode 100644 tests/ref/meta/bibliography-ordering.png delete mode 100644 tests/ref/meta/bibliography.png delete mode 100644 tests/ref/meta/cite-footnote.png delete mode 100644 tests/ref/meta/cite-form.png delete mode 100644 tests/ref/meta/cite-group.png delete mode 100644 tests/ref/meta/counter-page.png delete mode 100644 tests/ref/meta/counter.png delete mode 100644 tests/ref/meta/document.png delete mode 100644 tests/ref/meta/figure-caption.png delete mode 100644 tests/ref/meta/figure-localization.png delete mode 100644 tests/ref/meta/figure.png delete mode 100644 tests/ref/meta/footnote-break.png delete mode 100644 tests/ref/meta/footnote-columns.png delete mode 100644 tests/ref/meta/footnote-container.png delete mode 100644 tests/ref/meta/footnote-invariant.png delete mode 100644 tests/ref/meta/footnote-refs.png delete mode 100644 tests/ref/meta/footnote-table.png delete mode 100644 tests/ref/meta/footnote.png delete mode 100644 tests/ref/meta/heading.png delete mode 100644 tests/ref/meta/link.png delete mode 100644 tests/ref/meta/numbering.png delete mode 100644 tests/ref/meta/outline-entry.png delete mode 100644 tests/ref/meta/outline-first-par-indent.png delete mode 100644 tests/ref/meta/outline-indent.png delete mode 100644 tests/ref/meta/outline.png delete mode 100644 tests/ref/meta/page-label.png delete mode 100644 tests/ref/meta/query-before-after.png delete mode 100644 tests/ref/meta/query-figure.png delete mode 100644 tests/ref/meta/query-header.png delete mode 100644 tests/ref/meta/ref.png delete mode 100644 tests/ref/meta/state.png create mode 100644 tests/ref/newline-continuation-code.png create mode 100644 tests/ref/newline-continuation-markup.png create mode 100644 tests/ref/numbering-chinese.png create mode 100644 tests/ref/numbering-hebrew.png create mode 100644 tests/ref/numbering-japanese-aiueo.png create mode 100644 tests/ref/numbering-japanese-iroha.png create mode 100644 tests/ref/numbering-korean.png create mode 100644 tests/ref/numbering-latin.png create mode 100644 tests/ref/numbering-symbol-and-roman.png create mode 100644 tests/ref/numbers.png create mode 100644 tests/ref/ops-add-content.png create mode 100644 tests/ref/ops-multiply-inf-with-length.png create mode 100644 tests/ref/outline-entry-complex.png create mode 100644 tests/ref/outline-entry.png create mode 100644 tests/ref/outline-first-line-indent.png create mode 100644 tests/ref/outline-indent-no-numbering.png create mode 100644 tests/ref/outline-indent-numbering.png create mode 100644 tests/ref/outline.png create mode 100644 tests/ref/overhang-lone.png create mode 100644 tests/ref/overhang.png create mode 100644 tests/ref/overline-background.png create mode 100644 tests/ref/pad-basic.png create mode 100644 tests/ref/pad-expanding-contents.png create mode 100644 tests/ref/pad-followed-by-content.png create mode 100644 tests/ref/page-call-followed-by-pagebreak.png create mode 100644 tests/ref/page-call-styled-empty.png create mode 100644 tests/ref/page-fill.png create mode 100644 tests/ref/page-large.png create mode 100644 tests/ref/page-margin-binding-from-text-lang.png create mode 100644 tests/ref/page-margin-individual.png create mode 100644 tests/ref/page-margin-inside-outside-override.png create mode 100644 tests/ref/page-margin-inside-with-binding.png create mode 100644 tests/ref/page-margin-inside.png create mode 100644 tests/ref/page-margin-uniform.png create mode 100644 tests/ref/page-marginals.png create mode 100644 tests/ref/page-number-align-bottom-left.png create mode 100644 tests/ref/page-number-align-top-right.png create mode 100644 tests/ref/page-numbering-pdf-label.png create mode 100644 tests/ref/page-set-empty.png create mode 100644 tests/ref/page-set-forces-break.png create mode 100644 tests/ref/page-set-only-pagebreak.png create mode 100644 tests/ref/page-set-override-and-mix.png create mode 100644 tests/ref/page-set-override-thrice.png create mode 100644 tests/ref/pagebreak-around-set-page.png create mode 100644 tests/ref/pagebreak-followed-by-page-call.png create mode 100644 tests/ref/pagebreak-meta.png create mode 100644 tests/ref/pagebreak-set-page-mixed.png create mode 100644 tests/ref/pagebreak-to-auto-sized.png create mode 100644 tests/ref/pagebreak-to-multiple-pages.png create mode 100644 tests/ref/pagebreak-to.png create mode 100644 tests/ref/pagebreak-weak-after-set-page.png create mode 100644 tests/ref/pagebreak-weak-meta.png create mode 100644 tests/ref/pagebreak-weak-place.png create mode 100644 tests/ref/pagebreak.png create mode 100644 tests/ref/par-basic.png create mode 100644 tests/ref/par-first-line-indent.png create mode 100644 tests/ref/par-hanging-indent-manual-linebreak.png create mode 100644 tests/ref/par-hanging-indent-rtl.png create mode 100644 tests/ref/par-hanging-indent.png create mode 100644 tests/ref/par-leading-and-block-spacing.png create mode 100644 tests/ref/par-spacing-and-first-line-indent.png create mode 100644 tests/ref/parser-backtracking-destructuring-whitespace.png create mode 100644 tests/ref/path.png create mode 100644 tests/ref/pattern-line.png create mode 100644 tests/ref/pattern-lines.png create mode 100644 tests/ref/pattern-relative-parent.png create mode 100644 tests/ref/pattern-relative-self.png create mode 100644 tests/ref/pattern-small.png create mode 100644 tests/ref/pattern-spacing-negative.png create mode 100644 tests/ref/pattern-spacing-positive.png create mode 100644 tests/ref/pattern-spacing-zero.png create mode 100644 tests/ref/pattern-stroke.png create mode 100644 tests/ref/pattern-text.png create mode 100644 tests/ref/place-background.png create mode 100644 tests/ref/place-basic.png create mode 100644 tests/ref/place-block-spacing.png create mode 100644 tests/ref/place-bottom-in-box.png create mode 100644 tests/ref/place-bottom-right-in-box.png create mode 100644 tests/ref/place-float-columns.png create mode 100644 tests/ref/place-float-figure.png create mode 100644 tests/ref/place-float.png create mode 100644 tests/ref/place-horizon-in-boxes.png create mode 100644 tests/ref/place-top-left-in-box.png create mode 100644 tests/ref/polygon-line-join.png create mode 100644 tests/ref/polygon.png create mode 100644 tests/ref/query-and-or.png create mode 100644 tests/ref/query-before-after.png create mode 100644 tests/ref/query-complex.png create mode 100644 tests/ref/query-list-of-figures.png create mode 100644 tests/ref/query-running-header.png create mode 100644 tests/ref/quote-block-spacing.png create mode 100644 tests/ref/quote-cite-format-author-date.png create mode 100644 tests/ref/quote-cite-format-label-or-numeric.png create mode 100644 tests/ref/quote-cite-format-note.png create mode 100644 tests/ref/quote-dir-align.png create mode 100644 tests/ref/quote-dir-author-pos.png create mode 100644 tests/ref/quote-inline.png create mode 100644 tests/ref/quote-nesting-custom.png create mode 100644 tests/ref/quote-nesting.png create mode 100644 tests/ref/raw-align-default.png create mode 100644 tests/ref/raw-align-specified.png create mode 100644 tests/ref/raw-block-no-parbreaks.png create mode 100644 tests/ref/raw-consecutive-single-backticks.png create mode 100644 tests/ref/raw-dedent-empty-line.png create mode 100644 tests/ref/raw-dedent-first-line.png create mode 100644 tests/ref/raw-dedent-last-line.png create mode 100644 tests/ref/raw-empty.png create mode 100644 tests/ref/raw-highlight-typ.png create mode 100644 tests/ref/raw-highlight.png create mode 100644 tests/ref/raw-inline-multiline.png create mode 100644 tests/ref/raw-line-alternating-fill.png create mode 100644 tests/ref/raw-line-text-fill.png create mode 100644 tests/ref/raw-line.png create mode 100644 tests/ref/raw-more-backticks.png create mode 100644 tests/ref/raw-show-set.png create mode 100644 tests/ref/raw-single-backtick-lang.png create mode 100644 tests/ref/raw-syntaxes.png create mode 100644 tests/ref/raw-tab-size.png create mode 100644 tests/ref/raw-theme.png create mode 100644 tests/ref/raw-trimming.png create mode 100644 tests/ref/raw-typst-lang.png create mode 100644 tests/ref/rect-customization.png create mode 100644 tests/ref/rect-fill-stroke.png create mode 100644 tests/ref/rect-stroke.png create mode 100644 tests/ref/rect.png create mode 100644 tests/ref/ref-basic.png create mode 100644 tests/ref/ref-supplements.png create mode 100644 tests/ref/repeat-align-and-dir.png create mode 100644 tests/ref/repeat-basic.png create mode 100644 tests/ref/repeat-dots-rtl.png create mode 100644 tests/ref/repeat-empty.png create mode 100644 tests/ref/repeat-unboxed.png create mode 100644 tests/ref/repr-color.png create mode 100644 tests/ref/repr-literals.png create mode 100644 tests/ref/repr-misc.png create mode 100644 tests/ref/repr-numerical.png create mode 100644 tests/ref/return-in-nested-content-block.png create mode 100644 tests/ref/set-if.png create mode 100644 tests/ref/set-instantiation-site-markup.png create mode 100644 tests/ref/set-instantiation-site.png create mode 100644 tests/ref/set-scoped-in-code-block.png create mode 100644 tests/ref/set-text-override.png create mode 100644 tests/ref/set-vs-construct-1.png create mode 100644 tests/ref/set-vs-construct-2.png create mode 100644 tests/ref/set-vs-construct-3.png create mode 100644 tests/ref/set-vs-construct-4.png create mode 100644 tests/ref/shaping-emoji-bad-zwj.png create mode 100644 tests/ref/shaping-emoji-basic.png create mode 100644 tests/ref/shaping-font-fallback.png create mode 100644 tests/ref/shaping-forced-script-font-feature-enabled.png create mode 100644 tests/ref/shaping-forced-script-font-feature-inhibited.png create mode 100644 tests/ref/shaping-script-separation.png create mode 100644 tests/ref/shorthand-dashes.png create mode 100644 tests/ref/shorthand-ellipsis.png create mode 100644 tests/ref/shorthand-nbsp-and-shy-hyphen.png create mode 100644 tests/ref/shorthand-nbsp-width.png create mode 100644 tests/ref/shorthands-math.png create mode 100644 tests/ref/show-bare-basic.png create mode 100644 tests/ref/show-bare-content-block.png create mode 100644 tests/ref/show-bare-replace-with-content.png create mode 100644 tests/ref/show-bare-vs-set-text.png create mode 100644 tests/ref/show-function-order-with-set.png create mode 100644 tests/ref/show-function-set-on-it.png create mode 100644 tests/ref/show-in-show.png create mode 100644 tests/ref/show-multiple-rules.png create mode 100644 tests/ref/show-nested-scopes.png create mode 100644 tests/ref/show-recursive-identity.png create mode 100644 tests/ref/show-recursive-multiple.png create mode 100644 tests/ref/show-rule-in-function.png create mode 100644 tests/ref/show-selector-basic.png create mode 100644 tests/ref/show-selector-discard.png create mode 100644 tests/ref/show-selector-element-or-label.png create mode 100644 tests/ref/show-selector-or-elements-with-set.png create mode 100644 tests/ref/show-selector-realistic.png create mode 100644 tests/ref/show-selector-replace-and-show-set.png create mode 100644 tests/ref/show-selector-replace.png create mode 100644 tests/ref/show-selector-where.png create mode 100644 tests/ref/show-set-on-layoutable-element.png create mode 100644 tests/ref/show-set-on-same-element.png create mode 100644 tests/ref/show-set-override.png create mode 100644 tests/ref/show-set-same-element-and-order.png create mode 100644 tests/ref/show-set-same-element-matched-field.png create mode 100644 tests/ref/show-set-same-element-matching-interaction.png create mode 100644 tests/ref/show-set-same-element-synthesized-matched-field.png create mode 100644 tests/ref/show-set-text-order-adjacent-1.png create mode 100644 tests/ref/show-set-text-order-adjacent-2.png create mode 100644 tests/ref/show-set-text-order-contained-1.png create mode 100644 tests/ref/show-set-text-order-contained-2.png create mode 100644 tests/ref/show-set-text-order-contained-3.png create mode 100644 tests/ref/show-set-text-order-contained-4.png create mode 100644 tests/ref/show-set-text-order-overlapping-1.png create mode 100644 tests/ref/show-set-text-order-overlapping-2.png create mode 100644 tests/ref/show-set-vs-construct.png create mode 100644 tests/ref/show-set-where-override.png create mode 100644 tests/ref/show-text-basic.png create mode 100644 tests/ref/show-text-cyclic-raw.png create mode 100644 tests/ref/show-text-cyclic.png create mode 100644 tests/ref/show-text-exactly-once.png create mode 100644 tests/ref/show-text-get-text-on-it.png create mode 100644 tests/ref/show-text-in-other-show.png create mode 100644 tests/ref/show-text-indirectly-cyclic.png create mode 100644 tests/ref/show-text-path-resolving.png create mode 100644 tests/ref/show-text-regex-case-insensitive.png create mode 100644 tests/ref/show-text-regex-character-class.png create mode 100644 tests/ref/show-text-regex-word-boundary.png create mode 100644 tests/ref/show-text-regex.png create mode 100644 tests/ref/show-where-folding-stroke.png create mode 100644 tests/ref/show-where-folding-text-size.png create mode 100644 tests/ref/show-where-optional-field-raw.png create mode 100644 tests/ref/show-where-optional-field-text.png create mode 100644 tests/ref/show-where-resolving-hyphenate.png create mode 100644 tests/ref/show-where-resolving-length.png create mode 100644 tests/ref/smallcaps.png create mode 100644 tests/ref/smartquote-apostrophe.png create mode 100644 tests/ref/smartquote-custom-complex.png create mode 100644 tests/ref/smartquote-custom.png create mode 100644 tests/ref/smartquote-disable.png create mode 100644 tests/ref/smartquote-disabled-temporarily.png create mode 100644 tests/ref/smartquote-empty.png create mode 100644 tests/ref/smartquote-escape.png create mode 100644 tests/ref/smartquote-nesting.png create mode 100644 tests/ref/smartquote.png create mode 100644 tests/ref/space-collapsing-comments.png create mode 100644 tests/ref/space-collapsing-linebreaks.png create mode 100644 tests/ref/space-collapsing-stringy-linebreak.png create mode 100644 tests/ref/space-collapsing-with-h.png create mode 100644 tests/ref/space-collapsing.png create mode 100644 tests/ref/space-ideographic-kept.png create mode 100644 tests/ref/space-thin-kept.png create mode 100644 tests/ref/space-trailing-linebreak.png create mode 100644 tests/ref/spacing-h-and-v.png create mode 100644 tests/ref/spacing-rtl.png create mode 100644 tests/ref/square-auto-sized.png create mode 100644 tests/ref/square-base.png create mode 100644 tests/ref/square-circle-alignment.png create mode 100644 tests/ref/square-circle-overspecified.png create mode 100644 tests/ref/square-contents-overflow.png create mode 100644 tests/ref/square-height-limited-stack.png create mode 100644 tests/ref/square-height-limited.png create mode 100644 tests/ref/square-overflow.png create mode 100644 tests/ref/square-rect-rounded.png create mode 100644 tests/ref/square-relative-size.png create mode 100644 tests/ref/square-relatively-sized-child.png create mode 100644 tests/ref/square.png create mode 100644 tests/ref/stack-basic.png create mode 100644 tests/ref/stack-fr.png create mode 100644 tests/ref/stack-overflow.png create mode 100644 tests/ref/stack-rtl-align-and-fr.png create mode 100644 tests/ref/stack-spacing.png create mode 100644 tests/ref/state-basic.png create mode 100644 tests/ref/state-multiple-calls-same-key.png create mode 100644 tests/ref/state-nested.png create mode 100644 tests/ref/state-no-convergence.png create mode 100644 tests/ref/strike-background.png create mode 100644 tests/ref/strike-with.png create mode 100644 tests/ref/stroke-composition.png create mode 100644 tests/ref/stroke-folding.png create mode 100644 tests/ref/stroke-text.png create mode 100644 tests/ref/stroke-zero-thickness.png create mode 100644 tests/ref/strong-delta.png create mode 100644 tests/ref/strong-double-star-empty-hint.png create mode 100644 tests/ref/sub-super-non-typographic.png create mode 100644 tests/ref/sub-super.png create mode 100644 tests/ref/super-underline.png create mode 100644 tests/ref/symbol-constructor.png create mode 100644 tests/ref/symbol.png create mode 100644 tests/ref/table-align-array.png create mode 100644 tests/ref/table-cell-align-override.png create mode 100644 tests/ref/table-cell-folding.png create mode 100644 tests/ref/table-cell-override.png create mode 100644 tests/ref/table-cell-set.png create mode 100644 tests/ref/table-cell-show-and-override.png create mode 100644 tests/ref/table-cell-show-based-on-position.png create mode 100644 tests/ref/table-cell-show-emph.png create mode 100644 tests/ref/table-cell-show.png create mode 100644 tests/ref/table-cell-various-overrides.png create mode 100644 tests/ref/table-fill-basic.png create mode 100644 tests/ref/table-gutters.png create mode 100644 tests/ref/table-inset-fold.png create mode 100644 tests/ref/table-inset.png create mode 100644 tests/ref/table-newlines.png create mode 100644 tests/ref/table-stroke-vline-position-left-and-right.png create mode 100644 tests/ref/terms-built-in-loop.png create mode 100644 tests/ref/terms-constructor.png create mode 100644 tests/ref/terms-grid.png create mode 100644 tests/ref/terms-multiline.png create mode 100644 tests/ref/terms-rtl.png create mode 100644 tests/ref/terms-style-change-interrupted.png create mode 100644 tests/ref/terms-syntax-edge-cases.png create mode 100644 tests/ref/text-alternates-and-stylistic-sets.png create mode 100644 tests/ref/text-call-body.png create mode 100644 tests/ref/text-chinese-basic.png create mode 100644 tests/ref/text-cjk-latin-spacing.png create mode 100644 tests/ref/text-copy-paste-ligatures.png create mode 100644 tests/ref/text-edge.png create mode 100644 tests/ref/text-features.png create mode 100644 tests/ref/text-font-change-after-space.png create mode 100644 tests/ref/text-font-just-a-space.png create mode 100644 tests/ref/text-font-properties.png create mode 100644 tests/ref/text-kerning.png create mode 100644 tests/ref/text-lang-hyphenate.png create mode 100644 tests/ref/text-lang-region.png create mode 100644 tests/ref/text-lang-script-shaping.png create mode 100644 tests/ref/text-lang-shaping.png create mode 100644 tests/ref/text-lang-unknown-region.png create mode 100644 tests/ref/text-lang.png create mode 100644 tests/ref/text-ligatures.png create mode 100644 tests/ref/text-number-type.png create mode 100644 tests/ref/text-number-width.png create mode 100644 tests/ref/text-size-em-nesting.png create mode 100644 tests/ref/text-size-em.png create mode 100644 tests/ref/text-slashed-zero-and-fractions.png create mode 100644 tests/ref/text-spacing-relative.png create mode 100644 tests/ref/text-spacing.png create mode 100644 tests/ref/text-tracking-arabic.png create mode 100644 tests/ref/text-tracking-changed-temporarily.png create mode 100644 tests/ref/text-tracking-mark-placement.png create mode 100644 tests/ref/text-tracking-negative.png delete mode 100644 tests/ref/text/baseline.png delete mode 100644 tests/ref/text/chinese.png delete mode 100644 tests/ref/text/copy-paste.png delete mode 100644 tests/ref/text/deco.png delete mode 100644 tests/ref/text/edge.png delete mode 100644 tests/ref/text/em.png delete mode 100644 tests/ref/text/emoji.png delete mode 100644 tests/ref/text/emphasis.png delete mode 100644 tests/ref/text/escape.png delete mode 100644 tests/ref/text/fallback.png delete mode 100644 tests/ref/text/features.png delete mode 100644 tests/ref/text/font.png delete mode 100644 tests/ref/text/hyphenate.png delete mode 100644 tests/ref/text/lang-with-region.png delete mode 100644 tests/ref/text/lang.png delete mode 100644 tests/ref/text/linebreak-link.png delete mode 100644 tests/ref/text/linebreak-obj.png delete mode 100644 tests/ref/text/linebreak.png delete mode 100644 tests/ref/text/lorem.png delete mode 100644 tests/ref/text/microtype.png delete mode 100644 tests/ref/text/numbers.png delete mode 100644 tests/ref/text/quote-nesting.png delete mode 100644 tests/ref/text/quote.png delete mode 100644 tests/ref/text/quotes.png delete mode 100644 tests/ref/text/raw-align.png delete mode 100644 tests/ref/text/raw-code.png delete mode 100644 tests/ref/text/raw-line.png delete mode 100644 tests/ref/text/raw-syntaxes.png delete mode 100644 tests/ref/text/raw-tabs.png delete mode 100644 tests/ref/text/raw-theme.png delete mode 100644 tests/ref/text/raw.png delete mode 100644 tests/ref/text/shaping.png delete mode 100644 tests/ref/text/shift.png delete mode 100644 tests/ref/text/smartquotes.png delete mode 100644 tests/ref/text/space.png delete mode 100644 tests/ref/text/stroke.png delete mode 100644 tests/ref/text/symbol.png delete mode 100644 tests/ref/text/tracking-spacing.png create mode 100644 tests/ref/transform-rotate-and-scale.png create mode 100644 tests/ref/transform-rotate-origin.png create mode 100644 tests/ref/transform-rotate-relative-sizing.png create mode 100644 tests/ref/transform-rotate.png create mode 100644 tests/ref/transform-scale-origin.png create mode 100644 tests/ref/transform-scale-relative-sizing.png create mode 100644 tests/ref/transform-scale.png create mode 100644 tests/ref/transform-tex-logo.png create mode 100644 tests/ref/underline-background.png create mode 100644 tests/ref/underline-overline-strike.png create mode 100644 tests/ref/underline-stroke-folding.png delete mode 100644 tests/ref/visualize/gradient-conic.png delete mode 100644 tests/ref/visualize/gradient-dir.png delete mode 100644 tests/ref/visualize/gradient-hue-rotation.png delete mode 100644 tests/ref/visualize/gradient-math.png delete mode 100644 tests/ref/visualize/gradient-presets.png delete mode 100644 tests/ref/visualize/gradient-radial.png delete mode 100644 tests/ref/visualize/gradient-relative-conic.png delete mode 100644 tests/ref/visualize/gradient-relative-linear.png delete mode 100644 tests/ref/visualize/gradient-relative-radial.png delete mode 100644 tests/ref/visualize/gradient-repeat.png delete mode 100644 tests/ref/visualize/gradient-sharp.png delete mode 100644 tests/ref/visualize/gradient-stroke.png delete mode 100644 tests/ref/visualize/gradient-text-decorations.png delete mode 100644 tests/ref/visualize/gradient-text-other.png delete mode 100644 tests/ref/visualize/gradient-text.png delete mode 100644 tests/ref/visualize/gradient-transform.png delete mode 100644 tests/ref/visualize/image-scale.png delete mode 100644 tests/ref/visualize/image.png delete mode 100644 tests/ref/visualize/line.png delete mode 100644 tests/ref/visualize/path.png delete mode 100644 tests/ref/visualize/pattern-relative.png delete mode 100644 tests/ref/visualize/pattern-simple.png delete mode 100644 tests/ref/visualize/pattern-small.png delete mode 100644 tests/ref/visualize/pattern-spacing.png delete mode 100644 tests/ref/visualize/pattern-stroke.png delete mode 100644 tests/ref/visualize/pattern-text.png delete mode 100644 tests/ref/visualize/polygon.png delete mode 100644 tests/ref/visualize/shape-aspect.png delete mode 100644 tests/ref/visualize/shape-circle.png delete mode 100644 tests/ref/visualize/shape-ellipse.png delete mode 100644 tests/ref/visualize/shape-fill-stroke.png delete mode 100644 tests/ref/visualize/shape-rect.png delete mode 100644 tests/ref/visualize/shape-rounded.png delete mode 100644 tests/ref/visualize/shape-square.png delete mode 100644 tests/ref/visualize/stroke.png delete mode 100644 tests/ref/visualize/svg-text.png create mode 100644 tests/ref/while-loop-basic.png create mode 100644 tests/src/args.rs create mode 100644 tests/src/collect.rs create mode 100644 tests/src/logger.rs delete mode 100644 tests/src/metadata.rs create mode 100644 tests/src/run.rs create mode 100644 tests/src/world.rs create mode 100644 tests/suite/foundations/array.typ create mode 100644 tests/suite/foundations/assert.typ create mode 100644 tests/suite/foundations/bytes.typ create mode 100644 tests/suite/foundations/calc.typ create mode 100644 tests/suite/foundations/content.typ create mode 100644 tests/suite/foundations/context.typ create mode 100644 tests/suite/foundations/datetime.typ create mode 100644 tests/suite/foundations/dict.typ create mode 100644 tests/suite/foundations/duration.typ create mode 100644 tests/suite/foundations/eval.typ create mode 100644 tests/suite/foundations/float.typ create mode 100644 tests/suite/foundations/int.typ create mode 100644 tests/suite/foundations/label.typ create mode 100644 tests/suite/foundations/panic.typ create mode 100644 tests/suite/foundations/plugin.typ create mode 100644 tests/suite/foundations/repr.typ create mode 100644 tests/suite/foundations/str.typ create mode 100644 tests/suite/foundations/type.typ create mode 100644 tests/suite/foundations/version.typ create mode 100644 tests/suite/introspection/counter.typ create mode 100644 tests/suite/introspection/here.typ create mode 100644 tests/suite/introspection/locate.typ create mode 100644 tests/suite/introspection/query.typ create mode 100644 tests/suite/introspection/state.typ create mode 100644 tests/suite/layout/align.typ create mode 100644 tests/suite/layout/angle.typ create mode 100644 tests/suite/layout/clip.typ create mode 100644 tests/suite/layout/columns.typ create mode 100644 tests/suite/layout/container.typ create mode 100644 tests/suite/layout/dir.typ create mode 100644 tests/suite/layout/flow/flow.typ create mode 100644 tests/suite/layout/flow/invisibles.typ create mode 100644 tests/suite/layout/flow/orphan.typ create mode 100644 tests/suite/layout/grid/cell.typ create mode 100644 tests/suite/layout/grid/colspan.typ create mode 100644 tests/suite/layout/grid/footers.typ create mode 100644 tests/suite/layout/grid/grid.typ create mode 100644 tests/suite/layout/grid/headers.typ create mode 100644 tests/suite/layout/grid/positioning.typ create mode 100644 tests/suite/layout/grid/rowspan.typ create mode 100644 tests/suite/layout/grid/rtl.typ create mode 100644 tests/suite/layout/grid/stroke.typ create mode 100644 tests/suite/layout/grid/styling.typ create mode 100644 tests/suite/layout/hide.typ create mode 100644 tests/suite/layout/inline/baseline.typ create mode 100644 tests/suite/layout/inline/bidi.typ create mode 100644 tests/suite/layout/inline/cjk.typ create mode 100644 tests/suite/layout/inline/hyphenate.typ create mode 100644 tests/suite/layout/inline/justify.typ create mode 100644 tests/suite/layout/inline/linebreak.typ create mode 100644 tests/suite/layout/inline/overhang.typ create mode 100644 tests/suite/layout/inline/shaping.typ create mode 100644 tests/suite/layout/inline/text.typ create mode 100644 tests/suite/layout/layout.typ create mode 100644 tests/suite/layout/length.typ create mode 100644 tests/suite/layout/limits.typ create mode 100644 tests/suite/layout/measure.typ create mode 100644 tests/suite/layout/pad.typ create mode 100644 tests/suite/layout/page.typ create mode 100644 tests/suite/layout/pagebreak.typ create mode 100644 tests/suite/layout/place.typ create mode 100644 tests/suite/layout/relative.typ create mode 100644 tests/suite/layout/repeat.typ create mode 100644 tests/suite/layout/spacing.typ create mode 100644 tests/suite/layout/stack.typ create mode 100644 tests/suite/layout/table.typ create mode 100644 tests/suite/layout/transform.typ create mode 100644 tests/suite/loading/csv.typ create mode 100644 tests/suite/loading/json.typ create mode 100644 tests/suite/loading/read.typ create mode 100644 tests/suite/loading/toml.typ create mode 100644 tests/suite/loading/xml.typ create mode 100644 tests/suite/loading/yaml.typ create mode 100644 tests/suite/math/accent.typ create mode 100644 tests/suite/math/alignment.typ create mode 100644 tests/suite/math/attach.typ create mode 100644 tests/suite/math/cancel.typ create mode 100644 tests/suite/math/cases.typ create mode 100644 tests/suite/math/class.typ create mode 100644 tests/suite/math/delimited.typ create mode 100644 tests/suite/math/equation.typ create mode 100644 tests/suite/math/frac.typ create mode 100644 tests/suite/math/interactions.typ create mode 100644 tests/suite/math/mat.typ create mode 100644 tests/suite/math/multiline.typ create mode 100644 tests/suite/math/op.typ create mode 100644 tests/suite/math/primes.typ create mode 100644 tests/suite/math/root.typ create mode 100644 tests/suite/math/size.typ create mode 100644 tests/suite/math/spacing.typ create mode 100644 tests/suite/math/style.typ create mode 100644 tests/suite/math/syntax.typ create mode 100644 tests/suite/math/text.typ create mode 100644 tests/suite/math/underover.typ create mode 100644 tests/suite/math/vec.typ create mode 100644 tests/suite/model/bibliography.typ create mode 100644 tests/suite/model/cite.typ create mode 100644 tests/suite/model/document.typ create mode 100644 tests/suite/model/emph-strong.typ create mode 100644 tests/suite/model/enum.typ create mode 100644 tests/suite/model/figure.typ create mode 100644 tests/suite/model/footnote.typ create mode 100644 tests/suite/model/heading.typ create mode 100644 tests/suite/model/link.typ create mode 100644 tests/suite/model/list.typ create mode 100644 tests/suite/model/numbering.typ create mode 100644 tests/suite/model/outline.typ create mode 100644 tests/suite/model/par.typ create mode 100644 tests/suite/model/quote.typ create mode 100644 tests/suite/model/ref.typ create mode 100644 tests/suite/model/terms.typ create mode 100644 tests/suite/playground.typ create mode 100644 tests/suite/scripting/blocks.typ create mode 100644 tests/suite/scripting/call.typ create mode 100644 tests/suite/scripting/closure.typ create mode 100644 tests/suite/scripting/destructuring.typ create mode 100644 tests/suite/scripting/field.typ create mode 100644 tests/suite/scripting/for.typ create mode 100644 tests/suite/scripting/get-rule.typ create mode 100644 tests/suite/scripting/if.typ create mode 100644 tests/suite/scripting/import.typ create mode 100644 tests/suite/scripting/include.typ create mode 100644 tests/suite/scripting/let.typ create mode 100644 tests/suite/scripting/loop.typ create mode 100644 tests/suite/scripting/methods.typ create mode 100644 tests/suite/scripting/module.typ create mode 100644 tests/suite/scripting/modules/chap1.typ create mode 100644 tests/suite/scripting/modules/chap2.typ create mode 100644 tests/suite/scripting/modules/cycle1.typ create mode 100644 tests/suite/scripting/modules/cycle2.typ create mode 100644 tests/suite/scripting/ops.typ create mode 100644 tests/suite/scripting/params.typ create mode 100644 tests/suite/scripting/recursion.typ create mode 100644 tests/suite/scripting/return.typ create mode 100644 tests/suite/scripting/while.typ create mode 100644 tests/suite/styling/fold.typ create mode 100644 tests/suite/styling/set.typ create mode 100644 tests/suite/styling/show-set.typ create mode 100644 tests/suite/styling/show-text.typ create mode 100644 tests/suite/styling/show-where.typ create mode 100644 tests/suite/styling/show.typ create mode 100644 tests/suite/symbols/symbol.typ create mode 100644 tests/suite/syntax/backtracking.typ create mode 100644 tests/suite/syntax/comment.typ create mode 100644 tests/suite/syntax/embedded.typ create mode 100644 tests/suite/syntax/escape.typ create mode 100644 tests/suite/syntax/newlines.typ create mode 100644 tests/suite/syntax/numbers.typ create mode 100644 tests/suite/syntax/shorthand.typ create mode 100644 tests/suite/text/case.typ create mode 100644 tests/suite/text/coma.typ create mode 100644 tests/suite/text/copy-paste.typ create mode 100644 tests/suite/text/deco.typ create mode 100644 tests/suite/text/edge.typ create mode 100644 tests/suite/text/em.typ create mode 100644 tests/suite/text/font.typ create mode 100644 tests/suite/text/lang.typ create mode 100644 tests/suite/text/lorem.typ create mode 100644 tests/suite/text/raw.typ create mode 100644 tests/suite/text/shift.typ create mode 100644 tests/suite/text/smallcaps.typ create mode 100644 tests/suite/text/smartquote.typ create mode 100644 tests/suite/text/space.typ create mode 100644 tests/suite/visualize/circle.typ create mode 100644 tests/suite/visualize/color.typ create mode 100644 tests/suite/visualize/ellipse.typ create mode 100644 tests/suite/visualize/gradient.typ create mode 100644 tests/suite/visualize/image.typ create mode 100644 tests/suite/visualize/line.typ create mode 100644 tests/suite/visualize/path.typ create mode 100644 tests/suite/visualize/pattern.typ create mode 100644 tests/suite/visualize/polygon.typ create mode 100644 tests/suite/visualize/rect.typ create mode 100644 tests/suite/visualize/square.typ create mode 100644 tests/suite/visualize/stroke.typ delete mode 100644 tests/typ/autocomplete/showcase.typ delete mode 100644 tests/typ/bugs/1050-terms-indent.typ delete mode 100644 tests/typ/bugs/1240-stack-fr.typ delete mode 100644 tests/typ/bugs/1597-cite-footnote.typ delete mode 100644 tests/typ/bugs/2044-invalid-parsed-ident.typ delete mode 100644 tests/typ/bugs/2105-linebreak-tofu.typ delete mode 100644 tests/typ/bugs/2595-float-overlap.typ delete mode 100644 tests/typ/bugs/2650-cjk-latin-spacing-meta.typ delete mode 100644 tests/typ/bugs/2715-float-order.typ delete mode 100644 tests/typ/bugs/2821-missing-fields.typ delete mode 100644 tests/typ/bugs/2902-gradient-oklch-panic.typ delete mode 100644 tests/typ/bugs/3082-chinese-punctuation.typ delete mode 100644 tests/typ/bugs/3110-no-type-ctor-or-field.typ delete mode 100644 tests/typ/bugs/3154-array-dict-mut-entry.typ delete mode 100644 tests/typ/bugs/3232-dict-wrong-keys.typ delete mode 100644 tests/typ/bugs/3275-loop-errors.typ delete mode 100644 tests/typ/bugs/3363-json-large-number.typ delete mode 100644 tests/typ/bugs/3502-colon-space.typ delete mode 100644 tests/typ/bugs/3586-figure-caption-separator.typ delete mode 100644 tests/typ/bugs/3601-empty-raw.typ delete mode 100644 tests/typ/bugs/3641-float-loop.typ delete mode 100644 tests/typ/bugs/3650-italic-equation.typ delete mode 100644 tests/typ/bugs/3658-math-size.typ delete mode 100644 tests/typ/bugs/3662-pdf-smartquotes.typ delete mode 100644 tests/typ/bugs/3700-deformed-stroke.typ delete mode 100644 tests/typ/bugs/3841-tabs-in-raw-typ-code.typ delete mode 100644 tests/typ/bugs/870-image-rotation.typ delete mode 100644 tests/typ/bugs/args-sink.typ delete mode 100644 tests/typ/bugs/args-underscore.typ delete mode 100644 tests/typ/bugs/bibliography-math.typ delete mode 100644 tests/typ/bugs/bidi-tofus.typ delete mode 100644 tests/typ/bugs/block-width-box.typ delete mode 100644 tests/typ/bugs/cite-locate.typ delete mode 100644 tests/typ/bugs/cite-show-set.typ delete mode 100644 tests/typ/bugs/clamp-panic.typ delete mode 100644 tests/typ/bugs/columns-1.typ delete mode 100644 tests/typ/bugs/emoji-linebreak.typ delete mode 100644 tests/typ/bugs/equation-numbering-reference.typ delete mode 100644 tests/typ/bugs/flow-1.typ delete mode 100644 tests/typ/bugs/flow-2.typ delete mode 100644 tests/typ/bugs/flow-3.typ delete mode 100644 tests/typ/bugs/flow-4.typ delete mode 100644 tests/typ/bugs/flow-5.typ delete mode 100644 tests/typ/bugs/fold-vector.typ delete mode 100644 tests/typ/bugs/footnote-keep-multiple.typ delete mode 100644 tests/typ/bugs/footnote-list.typ delete mode 100644 tests/typ/bugs/gradient-cmyk-encode.typ delete mode 100644 tests/typ/bugs/grid-1.typ delete mode 100644 tests/typ/bugs/grid-2.typ delete mode 100644 tests/typ/bugs/grid-3.typ delete mode 100644 tests/typ/bugs/grid-4.typ delete mode 100644 tests/typ/bugs/hide-meta.typ delete mode 100644 tests/typ/bugs/int-constructor.typ delete mode 100644 tests/typ/bugs/justify-hanging-indent.typ delete mode 100644 tests/typ/bugs/label-fields-dict.typ delete mode 100644 tests/typ/bugs/layout-infinite-lengths.typ delete mode 100644 tests/typ/bugs/line-align.typ delete mode 100644 tests/typ/bugs/linebreak-no-justifiables.typ delete mode 100644 tests/typ/bugs/mat-aug-color.typ delete mode 100644 tests/typ/bugs/math-eval.typ delete mode 100644 tests/typ/bugs/math-number-spacing.typ delete mode 100644 tests/typ/bugs/math-realize.typ delete mode 100644 tests/typ/bugs/math-shift.typ delete mode 100644 tests/typ/bugs/math-text-break.typ delete mode 100644 tests/typ/bugs/measure-image.typ delete mode 100644 tests/typ/bugs/new-cm-svg.typ delete mode 100644 tests/typ/bugs/newline-mode.typ delete mode 100644 tests/typ/bugs/pagebreak-bibliography.typ delete mode 100644 tests/typ/bugs/pagebreak-numbering.typ delete mode 100644 tests/typ/bugs/pagebreak-set-style.typ delete mode 100644 tests/typ/bugs/parameter-pattern.typ delete mode 100644 tests/typ/bugs/parenthesized.typ delete mode 100644 tests/typ/bugs/place-base.typ delete mode 100644 tests/typ/bugs/place-pagebreak.typ delete mode 100644 tests/typ/bugs/place-spacing.typ delete mode 100644 tests/typ/bugs/raw-color-overwrite.typ delete mode 100644 tests/typ/bugs/smartquotes-in-outline.typ delete mode 100644 tests/typ/bugs/smartquotes-on-newline.typ delete mode 100644 tests/typ/bugs/spacing-behaviour.typ delete mode 100644 tests/typ/bugs/square-base.typ delete mode 100644 tests/typ/bugs/subelement-panic.typ delete mode 100644 tests/typ/bugs/table-lines.typ delete mode 100644 tests/typ/bugs/table-row-missing.typ delete mode 100644 tests/typ/coma.typ delete mode 100644 tests/typ/compiler/array.typ delete mode 100644 tests/typ/compiler/backtracking.typ delete mode 100644 tests/typ/compiler/block.typ delete mode 100644 tests/typ/compiler/break-continue.typ delete mode 100644 tests/typ/compiler/bytes.typ delete mode 100644 tests/typ/compiler/call.typ delete mode 100644 tests/typ/compiler/closure.typ delete mode 100644 tests/typ/compiler/color.typ delete mode 100644 tests/typ/compiler/comment.typ delete mode 100644 tests/typ/compiler/construct.typ delete mode 100644 tests/typ/compiler/content-field.typ delete mode 100644 tests/typ/compiler/delayed-error.typ delete mode 100644 tests/typ/compiler/dict.typ delete mode 100644 tests/typ/compiler/duration.typ delete mode 100644 tests/typ/compiler/embedded-expr.typ delete mode 100644 tests/typ/compiler/field.typ delete mode 100644 tests/typ/compiler/for.typ delete mode 100644 tests/typ/compiler/highlight.typ delete mode 100644 tests/typ/compiler/hint.typ delete mode 100644 tests/typ/compiler/if.typ delete mode 100644 tests/typ/compiler/import.typ delete mode 100644 tests/typ/compiler/include.typ delete mode 100644 tests/typ/compiler/label.typ delete mode 100644 tests/typ/compiler/let.typ delete mode 100644 tests/typ/compiler/methods.typ delete mode 100644 tests/typ/compiler/module.typ delete mode 100644 tests/typ/compiler/modules/chap1.typ delete mode 100644 tests/typ/compiler/modules/chap2.typ delete mode 100644 tests/typ/compiler/modules/cycle1.typ delete mode 100644 tests/typ/compiler/modules/cycle2.typ delete mode 100644 tests/typ/compiler/ops-assoc.typ delete mode 100644 tests/typ/compiler/ops-invalid.typ delete mode 100644 tests/typ/compiler/ops-prec.typ delete mode 100644 tests/typ/compiler/ops.typ delete mode 100644 tests/typ/compiler/packages.typ delete mode 100644 tests/typ/compiler/plugin-oob.typ delete mode 100644 tests/typ/compiler/plugin.typ delete mode 100644 tests/typ/compiler/raw.typ delete mode 100644 tests/typ/compiler/recursion.typ delete mode 100644 tests/typ/compiler/repr-color-gradient.typ delete mode 100644 tests/typ/compiler/repr.typ delete mode 100644 tests/typ/compiler/return.typ delete mode 100644 tests/typ/compiler/select-where-styles.typ delete mode 100644 tests/typ/compiler/selector-logical.typ delete mode 100644 tests/typ/compiler/set.typ delete mode 100644 tests/typ/compiler/shorthand.typ delete mode 100644 tests/typ/compiler/show-bare.typ delete mode 100644 tests/typ/compiler/show-node.typ delete mode 100644 tests/typ/compiler/show-recursive.typ delete mode 100644 tests/typ/compiler/show-selector-logical.typ delete mode 100644 tests/typ/compiler/show-selector.typ delete mode 100644 tests/typ/compiler/show-set-func.typ delete mode 100644 tests/typ/compiler/show-set-text.typ delete mode 100644 tests/typ/compiler/show-set.typ delete mode 100644 tests/typ/compiler/show-text.typ delete mode 100644 tests/typ/compiler/spread.typ delete mode 100644 tests/typ/compiler/string.typ delete mode 100644 tests/typ/compiler/type-compatibility.typ delete mode 100644 tests/typ/compiler/while.typ delete mode 100644 tests/typ/compute/calc.typ delete mode 100644 tests/typ/compute/construct.typ delete mode 100644 tests/typ/compute/data.typ delete mode 100644 tests/typ/compute/eval-path.typ delete mode 100644 tests/typ/compute/foundations.typ delete mode 100644 tests/typ/compute/version.typ delete mode 100644 tests/typ/empty.typ delete mode 100644 tests/typ/layout/align.typ delete mode 100644 tests/typ/layout/block-sizing.typ delete mode 100644 tests/typ/layout/block-spacing.typ delete mode 100644 tests/typ/layout/cjk-latin-spacing.typ delete mode 100644 tests/typ/layout/cjk-punctuation-adjustment.typ delete mode 100644 tests/typ/layout/clip.typ delete mode 100644 tests/typ/layout/code-indent-shrink.typ delete mode 100644 tests/typ/layout/columns.typ delete mode 100644 tests/typ/layout/container-fill.typ delete mode 100644 tests/typ/layout/container.typ delete mode 100644 tests/typ/layout/enum-align.typ delete mode 100644 tests/typ/layout/enum-numbering.typ delete mode 100644 tests/typ/layout/enum.typ delete mode 100644 tests/typ/layout/flow-orphan.typ delete mode 100644 tests/typ/layout/grid-1.typ delete mode 100644 tests/typ/layout/grid-2.typ delete mode 100644 tests/typ/layout/grid-3.typ delete mode 100644 tests/typ/layout/grid-4.typ delete mode 100644 tests/typ/layout/grid-5.typ delete mode 100644 tests/typ/layout/grid-auto-shrink.typ delete mode 100644 tests/typ/layout/grid-cell.typ delete mode 100644 tests/typ/layout/grid-colspan.typ delete mode 100644 tests/typ/layout/grid-footers-1.typ delete mode 100644 tests/typ/layout/grid-footers-2.typ delete mode 100644 tests/typ/layout/grid-footers-3.typ delete mode 100644 tests/typ/layout/grid-footers-4.typ delete mode 100644 tests/typ/layout/grid-footers-5.typ delete mode 100644 tests/typ/layout/grid-headers-1.typ delete mode 100644 tests/typ/layout/grid-headers-2.typ delete mode 100644 tests/typ/layout/grid-headers-3.typ delete mode 100644 tests/typ/layout/grid-headers-4.typ delete mode 100644 tests/typ/layout/grid-positioning.typ delete mode 100644 tests/typ/layout/grid-rowspan-basic.typ delete mode 100644 tests/typ/layout/grid-rowspan-split-1.typ delete mode 100644 tests/typ/layout/grid-rowspan-split-2.typ delete mode 100644 tests/typ/layout/grid-rowspan-split-3.typ delete mode 100644 tests/typ/layout/grid-rtl.typ delete mode 100644 tests/typ/layout/grid-stroke.typ delete mode 100644 tests/typ/layout/grid-styling.typ delete mode 100644 tests/typ/layout/hide.typ delete mode 100644 tests/typ/layout/list-attach.typ delete mode 100644 tests/typ/layout/list-marker.typ delete mode 100644 tests/typ/layout/list.typ delete mode 100644 tests/typ/layout/out-of-flow-in-block.typ delete mode 100644 tests/typ/layout/pad.typ delete mode 100644 tests/typ/layout/page-binding.typ delete mode 100644 tests/typ/layout/page-margin.typ delete mode 100644 tests/typ/layout/page-marginals.typ delete mode 100644 tests/typ/layout/page-number-align.typ delete mode 100644 tests/typ/layout/page-style.typ delete mode 100644 tests/typ/layout/page.typ delete mode 100644 tests/typ/layout/pagebreak-parity.typ delete mode 100644 tests/typ/layout/pagebreak-weak.typ delete mode 100644 tests/typ/layout/pagebreak.typ delete mode 100644 tests/typ/layout/par-bidi.typ delete mode 100644 tests/typ/layout/par-indent.typ delete mode 100644 tests/typ/layout/par-justify-cjk.typ delete mode 100644 tests/typ/layout/par-justify.typ delete mode 100644 tests/typ/layout/par-knuth.typ delete mode 100644 tests/typ/layout/par-simple.typ delete mode 100644 tests/typ/layout/par.typ delete mode 100644 tests/typ/layout/place-background.typ delete mode 100644 tests/typ/layout/place-float-auto.typ delete mode 100644 tests/typ/layout/place-float-columns.typ delete mode 100644 tests/typ/layout/place-float-figure.typ delete mode 100644 tests/typ/layout/place-nested.typ delete mode 100644 tests/typ/layout/place.typ delete mode 100644 tests/typ/layout/repeat.typ delete mode 100644 tests/typ/layout/spacing.typ delete mode 100644 tests/typ/layout/stack-1.typ delete mode 100644 tests/typ/layout/stack-2.typ delete mode 100644 tests/typ/layout/table-cell.typ delete mode 100644 tests/typ/layout/table.typ delete mode 100644 tests/typ/layout/terms.typ delete mode 100644 tests/typ/layout/transform-layout.typ delete mode 100644 tests/typ/layout/transform.typ delete mode 100644 tests/typ/lint/markup.typ delete mode 100644 tests/typ/math/accent.typ delete mode 100644 tests/typ/math/alignment.typ delete mode 100644 tests/typ/math/attach-p1.typ delete mode 100644 tests/typ/math/attach-p2.typ delete mode 100644 tests/typ/math/attach-p3.typ delete mode 100644 tests/typ/math/call.typ delete mode 100644 tests/typ/math/cancel.typ delete mode 100644 tests/typ/math/cases.typ delete mode 100644 tests/typ/math/class.typ delete mode 100644 tests/typ/math/content.typ delete mode 100644 tests/typ/math/delimited.typ delete mode 100644 tests/typ/math/equation-block-align.typ delete mode 100644 tests/typ/math/equation-number.typ delete mode 100644 tests/typ/math/equation-show.typ delete mode 100644 tests/typ/math/font-features.typ delete mode 100644 tests/typ/math/frac.typ delete mode 100644 tests/typ/math/linebreak.typ delete mode 100644 tests/typ/math/matrix-alignment.typ delete mode 100644 tests/typ/math/matrix-gaps.typ delete mode 100644 tests/typ/math/matrix.typ delete mode 100644 tests/typ/math/multiline.typ delete mode 100644 tests/typ/math/numbering.typ delete mode 100644 tests/typ/math/op.typ delete mode 100644 tests/typ/math/opticalsize.typ delete mode 100644 tests/typ/math/prime.typ delete mode 100644 tests/typ/math/root.typ delete mode 100644 tests/typ/math/spacing.typ delete mode 100644 tests/typ/math/style.typ delete mode 100644 tests/typ/math/syntax.typ delete mode 100644 tests/typ/math/unbalanced.typ delete mode 100644 tests/typ/math/underover.typ delete mode 100644 tests/typ/math/vec.typ delete mode 100644 tests/typ/meta/bibliography-full.typ delete mode 100644 tests/typ/meta/bibliography-ordering.typ delete mode 100644 tests/typ/meta/bibliography.typ delete mode 100644 tests/typ/meta/cite-footnote.typ delete mode 100644 tests/typ/meta/cite-form.typ delete mode 100644 tests/typ/meta/cite-group.typ delete mode 100644 tests/typ/meta/context-compatibility.typ delete mode 100644 tests/typ/meta/context.typ delete mode 100644 tests/typ/meta/counter-page.typ delete mode 100644 tests/typ/meta/counter.typ delete mode 100644 tests/typ/meta/document.typ delete mode 100644 tests/typ/meta/figure-caption.typ delete mode 100644 tests/typ/meta/figure-localization.typ delete mode 100644 tests/typ/meta/figure.typ delete mode 100644 tests/typ/meta/footnote-break.typ delete mode 100644 tests/typ/meta/footnote-columns.typ delete mode 100644 tests/typ/meta/footnote-container.typ delete mode 100644 tests/typ/meta/footnote-invariant.typ delete mode 100644 tests/typ/meta/footnote-refs.typ delete mode 100644 tests/typ/meta/footnote-table.typ delete mode 100644 tests/typ/meta/footnote.typ delete mode 100644 tests/typ/meta/heading.typ delete mode 100644 tests/typ/meta/link.typ delete mode 100644 tests/typ/meta/numbering.typ delete mode 100644 tests/typ/meta/outline-entry.typ delete mode 100644 tests/typ/meta/outline-first-par-indent.typ delete mode 100644 tests/typ/meta/outline-indent.typ delete mode 100644 tests/typ/meta/outline.typ delete mode 100644 tests/typ/meta/page-label.typ delete mode 100644 tests/typ/meta/query-before-after.typ delete mode 100644 tests/typ/meta/query-figure.typ delete mode 100644 tests/typ/meta/query-header.typ delete mode 100644 tests/typ/meta/ref.typ delete mode 100644 tests/typ/meta/state.typ delete mode 100644 tests/typ/text/baseline.typ delete mode 100644 tests/typ/text/case.typ delete mode 100644 tests/typ/text/chinese.typ delete mode 100644 tests/typ/text/copy-paste.typ delete mode 100644 tests/typ/text/deco.typ delete mode 100644 tests/typ/text/edge.typ delete mode 100644 tests/typ/text/em.typ delete mode 100644 tests/typ/text/emoji.typ delete mode 100644 tests/typ/text/emphasis.typ delete mode 100644 tests/typ/text/escape.typ delete mode 100644 tests/typ/text/fallback.typ delete mode 100644 tests/typ/text/features.typ delete mode 100644 tests/typ/text/font.typ delete mode 100644 tests/typ/text/hyphenate.typ delete mode 100644 tests/typ/text/lang-with-region.typ delete mode 100644 tests/typ/text/lang.typ delete mode 100644 tests/typ/text/linebreak-link.typ delete mode 100644 tests/typ/text/linebreak-obj.typ delete mode 100644 tests/typ/text/linebreak.typ delete mode 100644 tests/typ/text/lorem.typ delete mode 100644 tests/typ/text/microtype.typ delete mode 100644 tests/typ/text/numbers.typ delete mode 100644 tests/typ/text/quote-nesting.typ delete mode 100644 tests/typ/text/quote.typ delete mode 100644 tests/typ/text/quotes.typ delete mode 100644 tests/typ/text/raw-align.typ delete mode 100644 tests/typ/text/raw-code.typ delete mode 100644 tests/typ/text/raw-line.typ delete mode 100644 tests/typ/text/raw-syntaxes.typ delete mode 100644 tests/typ/text/raw-tabs.typ delete mode 100644 tests/typ/text/raw-theme.typ delete mode 100644 tests/typ/text/raw.typ delete mode 100644 tests/typ/text/shaping.typ delete mode 100644 tests/typ/text/shift.typ delete mode 100644 tests/typ/text/smartquotes.typ delete mode 100644 tests/typ/text/space.typ delete mode 100644 tests/typ/text/stroke.typ delete mode 100644 tests/typ/text/symbol.typ delete mode 100644 tests/typ/text/tracking-spacing.typ delete mode 100644 tests/typ/visualize/gradient-conic.typ delete mode 100644 tests/typ/visualize/gradient-dir.typ delete mode 100644 tests/typ/visualize/gradient-hue-rotation.typ delete mode 100644 tests/typ/visualize/gradient-math.typ delete mode 100644 tests/typ/visualize/gradient-presets.typ delete mode 100644 tests/typ/visualize/gradient-radial.typ delete mode 100644 tests/typ/visualize/gradient-relative-conic.typ delete mode 100644 tests/typ/visualize/gradient-relative-linear.typ delete mode 100644 tests/typ/visualize/gradient-relative-radial.typ delete mode 100644 tests/typ/visualize/gradient-repeat.typ delete mode 100644 tests/typ/visualize/gradient-sharp.typ delete mode 100644 tests/typ/visualize/gradient-stroke.typ delete mode 100644 tests/typ/visualize/gradient-text-decorations.typ delete mode 100644 tests/typ/visualize/gradient-text-other.typ delete mode 100644 tests/typ/visualize/gradient-text.typ delete mode 100644 tests/typ/visualize/gradient-transform.typ delete mode 100644 tests/typ/visualize/image-scale.typ delete mode 100644 tests/typ/visualize/image.typ delete mode 100644 tests/typ/visualize/line.typ delete mode 100644 tests/typ/visualize/path.typ delete mode 100644 tests/typ/visualize/pattern-relative.typ delete mode 100644 tests/typ/visualize/pattern-simple.typ delete mode 100644 tests/typ/visualize/pattern-small.typ delete mode 100644 tests/typ/visualize/pattern-spacing.typ delete mode 100644 tests/typ/visualize/pattern-stroke.typ delete mode 100644 tests/typ/visualize/pattern-text.typ delete mode 100644 tests/typ/visualize/polygon.typ delete mode 100644 tests/typ/visualize/shape-aspect.typ delete mode 100644 tests/typ/visualize/shape-circle.typ delete mode 100644 tests/typ/visualize/shape-ellipse.typ delete mode 100644 tests/typ/visualize/shape-fill-stroke.typ delete mode 100644 tests/typ/visualize/shape-rect.typ delete mode 100644 tests/typ/visualize/shape-rounded.typ delete mode 100644 tests/typ/visualize/shape-square.typ delete mode 100644 tests/typ/visualize/stroke.typ delete mode 100644 tests/typ/visualize/svg-text.typ delete mode 100644 tools/test-helper/extension.js create mode 100644 tools/test-helper/src/extension.ts create mode 100644 tools/test-helper/tsconfig.json diff --git a/.gitignore b/.gitignore index c17c6399..a1915f4a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,11 +6,8 @@ desktop.ini .DS_Store # Tests and benchmarks -tests/png -tests/pdf -tests/svg -tests/target -tests/typ/**/*.pdf +tests/store +tests/suite/**/*.pdf tests/fuzz/target tests/fuzz/corpus tests/fuzz/artifacts @@ -23,6 +20,7 @@ tarpaulin-report.html # Node node_modules +tools/test-helper/dist package-lock.json # Nix diff --git a/Cargo.lock b/Cargo.lock index 8215e9e4..066f2381 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2675,8 +2675,11 @@ dependencies = [ "ecow", "if_chain", "log", + "once_cell", "serde", "typst", + "typst-assets", + "typst-dev-assets", "unscanny", ] @@ -2773,13 +2776,13 @@ dependencies = [ "ecow", "once_cell", "oxipng", + "parking_lot", "rayon", "tiny-skia", "ttf-parser", "typst", "typst-assets", "typst-dev-assets", - "typst-ide", "typst-pdf", "typst-render", "typst-svg", diff --git a/crates/typst-cli/src/world.rs b/crates/typst-cli/src/world.rs index 4e0bcd54..711fd025 100644 --- a/crates/typst-cli/src/world.rs +++ b/crates/typst-cli/src/world.rs @@ -226,7 +226,7 @@ struct FileSlot { } impl FileSlot { - /// Create a new path slot. + /// Create a new file slot. fn new(id: FileId) -> Self { Self { id, file: SlotCell::new(), source: SlotCell::new() } } diff --git a/crates/typst-ide/Cargo.toml b/crates/typst-ide/Cargo.toml index 45a83d55..01f7a106 100644 --- a/crates/typst-ide/Cargo.toml +++ b/crates/typst-ide/Cargo.toml @@ -21,5 +21,10 @@ log = { workspace = true } serde = { workspace = true } unscanny = { workspace = true } +[dev-dependencies] +typst-assets = { workspace = true } +typst-dev-assets = { workspace = true } +once_cell = { workspace = true } + [lints] workspace = true diff --git a/crates/typst-ide/src/complete.rs b/crates/typst-ide/src/complete.rs index 4e4b8918..e87cf23e 100644 --- a/crates/typst-ide/src/complete.rs +++ b/crates/typst-ide/src/complete.rs @@ -1403,3 +1403,34 @@ impl<'a> CompletionContext<'a> { } } } + +#[cfg(test)] +mod tests { + use typst::eval::Tracer; + + use super::autocomplete; + use crate::tests::TestWorld; + + #[track_caller] + fn test(text: &str, cursor: usize, contains: &[&str], excludes: &[&str]) { + let world = TestWorld::new(text); + let doc = typst::compile(&world, &mut Tracer::new()).ok(); + let (_, completions) = + autocomplete(&world, doc.as_ref(), &world.main, cursor, true) + .unwrap_or_default(); + + let labels: Vec<_> = completions.iter().map(|c| c.label.as_str()).collect(); + for item in contains { + assert!(labels.contains(item), "{item:?} was not contained in {labels:?}"); + } + for item in excludes { + assert!(!labels.contains(item), "{item:?} was not excluded in {labels:?}"); + } + } + + #[test] + fn test_autocomplete() { + test("#i", 2, &["int", "if conditional"], &["foo"]); + test("#().", 4, &["insert", "remove", "len", "all"], &["foo"]); + } +} diff --git a/crates/typst-ide/src/lib.rs b/crates/typst-ide/src/lib.rs index bbfd56d9..3967aaad 100644 --- a/crates/typst-ide/src/lib.rs +++ b/crates/typst-ide/src/lib.rs @@ -90,3 +90,88 @@ fn summarize_font_family<'a>(variants: impl Iterator) -> Ec detail } + +#[cfg(test)] +mod tests { + use comemo::Prehashed; + use once_cell::sync::Lazy; + use typst::diag::{FileError, FileResult}; + use typst::foundations::{Bytes, Datetime}; + use typst::syntax::{FileId, Source}; + use typst::text::{Font, FontBook}; + use typst::{Library, World}; + + /// A world for IDE testing. + pub struct TestWorld { + pub main: Source, + base: &'static TestBase, + } + + impl TestWorld { + /// Create a new world for a single test. + /// + /// This is cheap because the shared base for all test runs is lazily + /// initialized just once. + pub fn new(text: &str) -> Self { + static BASE: Lazy = Lazy::new(TestBase::default); + let main = Source::detached(text); + Self { main, base: &*BASE } + } + } + + impl World for TestWorld { + fn library(&self) -> &Prehashed { + &self.base.library + } + + fn book(&self) -> &Prehashed { + &self.base.book + } + + fn main(&self) -> Source { + self.main.clone() + } + + fn source(&self, id: FileId) -> FileResult { + if id == self.main.id() { + Ok(self.main.clone()) + } else { + Err(FileError::NotFound(id.vpath().as_rootless_path().into())) + } + } + + fn file(&self, id: FileId) -> FileResult { + Err(FileError::NotFound(id.vpath().as_rootless_path().into())) + } + + fn font(&self, index: usize) -> Option { + Some(self.base.fonts[index].clone()) + } + + fn today(&self, _: Option) -> Option { + None + } + } + + /// Shared foundation of all test worlds. + struct TestBase { + library: Prehashed, + book: Prehashed, + fonts: Vec, + } + + impl Default for TestBase { + fn default() -> Self { + let fonts: Vec<_> = typst_assets::fonts() + .chain(typst_dev_assets::fonts()) + .flat_map(|data| Font::iter(Bytes::from_static(data))) + .collect(); + + Self { + library: Prehashed::new(Library::default()), + book: Prehashed::new(FontBook::from_fonts(&fonts)), + fonts, + } + } + } +} diff --git a/crates/typst-pdf/src/page.rs b/crates/typst-pdf/src/page.rs index c31d1204..42358db5 100644 --- a/crates/typst-pdf/src/page.rs +++ b/crates/typst-pdf/src/page.rs @@ -377,7 +377,7 @@ pub struct EncodedPage { } /// Represents a resource being used in a PDF page by its name. -#[derive(Debug, Clone, PartialEq, Eq, Hash)] +#[derive(Debug, Clone, PartialEq, Eq, Hash, Ord, PartialOrd)] pub struct PageResource { kind: ResourceKind, name: EcoString, @@ -390,7 +390,7 @@ impl PageResource { } /// A kind of resource being used in a PDF page. -#[derive(Debug, Clone, PartialEq, Eq, Hash)] +#[derive(Debug, Clone, PartialEq, Eq, Hash, Ord, PartialOrd)] pub enum ResourceKind { XObject, Font, diff --git a/crates/typst-pdf/src/pattern.rs b/crates/typst-pdf/src/pattern.rs index 6dfb0f66..5d5942bc 100644 --- a/crates/typst-pdf/src/pattern.rs +++ b/crates/typst-pdf/src/pattern.rs @@ -118,13 +118,15 @@ fn register_pattern( // Render the body. let (_, content) = construct_page(ctx.parent, pattern.frame()); - let pdf_pattern = PdfPattern { + let mut pdf_pattern = PdfPattern { transform, pattern: pattern.clone(), content: content.content.wait().clone(), resources: content.resources.into_iter().collect(), }; + pdf_pattern.resources.sort(); + ctx.parent.pattern_map.insert(pdf_pattern) } diff --git a/crates/typst-render/src/lib.rs b/crates/typst-render/src/lib.rs index fdacb597..28302180 100644 --- a/crates/typst-render/src/lib.rs +++ b/crates/typst-render/src/lib.rs @@ -42,13 +42,13 @@ pub fn render(frame: &Frame, pixel_per_pt: f32, fill: Color) -> sk::Pixmap { /// Export a document with potentially multiple pages into a single raster image. /// -/// The padding will be added around and between the individual frames. +/// The gap will be added between the individual frames. pub fn render_merged( document: &Document, pixel_per_pt: f32, frame_fill: Color, - padding: Abs, - padding_fill: Color, + gap: Abs, + gap_fill: Color, ) -> sk::Pixmap { let pixmaps: Vec<_> = document .pages @@ -56,19 +56,18 @@ pub fn render_merged( .map(|page| render(&page.frame, pixel_per_pt, frame_fill)) .collect(); - let padding = (pixel_per_pt * padding.to_f32()).round() as u32; - let pxw = - 2 * padding + pixmaps.iter().map(sk::Pixmap::width).max().unwrap_or_default(); - let pxh = - padding + pixmaps.iter().map(|pixmap| pixmap.height() + padding).sum::(); + let gap = (pixel_per_pt * gap.to_f32()).round() as u32; + let pxw = pixmaps.iter().map(sk::Pixmap::width).max().unwrap_or_default(); + let pxh = pixmaps.iter().map(|pixmap| pixmap.height()).sum::() + + gap * pixmaps.len().saturating_sub(1) as u32; let mut canvas = sk::Pixmap::new(pxw, pxh).unwrap(); - canvas.fill(to_sk_color(padding_fill)); + canvas.fill(to_sk_color(gap_fill)); - let [x, mut y] = [padding; 2]; + let mut y = 0; for pixmap in pixmaps { canvas.draw_pixmap( - x as i32, + 0, y as i32, pixmap.as_ref(), &sk::PixmapPaint::default(), @@ -76,7 +75,7 @@ pub fn render_merged( None, ); - y += pixmap.height() + padding; + y += pixmap.height() + gap; } canvas diff --git a/crates/typst/src/model/footnote.rs b/crates/typst/src/model/footnote.rs index 44942341..4945ebb1 100644 --- a/crates/typst/src/model/footnote.rs +++ b/crates/typst/src/model/footnote.rs @@ -167,11 +167,6 @@ cast! { /// This function is not intended to be called directly. Instead, it is used /// in set and show rules to customize footnote listings. /// -/// _Note:_ Set and show rules for `footnote.entry` must be defined at the -/// beginning of the document in order to work correctly. -/// See [here](https://github.com/typst/typst/issues/1348#issuecomment-1566316463) -/// for more information. -/// /// ```example /// #show footnote.entry: set text(red) /// @@ -179,6 +174,12 @@ cast! { /// #footnote[It's down here] /// has red text! /// ``` +/// +/// _Note:_ Set and show rules for `footnote.entry` must be defined at the +/// beginning of the document in order to work correctly. See [here][issue] for +/// more information. +/// +/// [issue]: https://github.com/typst/typst/issues/1467#issuecomment-1588799440 #[elem(name = "entry", title = "Footnote Entry", Show, ShowSet)] pub struct FootnoteEntry { /// The footnote for this entry. It's location can be used to determine diff --git a/tests/Cargo.toml b/tests/Cargo.toml index 1f650c97..62e7a493 100644 --- a/tests/Cargo.toml +++ b/tests/Cargo.toml @@ -6,29 +6,29 @@ authors = { workspace = true } edition = { workspace = true } publish = false -[dev-dependencies] +[[test]] +name = "tests" +path = "src/tests.rs" +harness = false + +[dependencies] typst = { workspace = true } typst-assets = { workspace = true, features = ["fonts"] } typst-dev-assets = { workspace = true } typst-pdf = { workspace = true } typst-render = { workspace = true } typst-svg = { workspace = true } -typst-ide = { workspace = true } clap = { workspace = true } comemo = { workspace = true } ecow = { workspace = true } once_cell = { workspace = true } oxipng = { workspace = true } +parking_lot = { workspace = true } rayon = { workspace = true } tiny-skia = { workspace = true } ttf-parser = { workspace = true } unscanny = { workspace = true } walkdir = { workspace = true } -[[test]] -name = "tests" -path = "src/tests.rs" -harness = false - [lints] workspace = true diff --git a/tests/README.md b/tests/README.md index 68b72f2d..6cc79217 100644 --- a/tests/README.md +++ b/tests/README.md @@ -3,13 +3,10 @@ ## Directory structure Top level directory structure: - `src`: Testing code. -- `typ`: Input files. The tests in `compiler` specifically test the compiler - while the others test the standard library (but also the compiler - indirectly). +- `suite`: Input files. Mostly organize in parallel to the code. - `ref`: Reference images which the output is compared with to determine whether a test passed or failed. -- `png`: PNG files produced by tests. -- `pdf`: PDF files produced by tests. +- `store`: Store for PNG, PDF, and SVG output files produced by the tests. ## Running the tests Running all tests (including unit tests): @@ -37,11 +34,6 @@ Running a test with the exact filename `page.typ`. testit --exact page.typ ``` -Debug-printing the layout trees for all executed tests. -```bash -testit --debug empty.typ -``` - To make the integration tests go faster they don't generate PDFs by default. Pass the `--pdf` flag to generate those. Mind that PDFs are not tested automatically at the moment, so you should always check the output manually when @@ -50,18 +42,48 @@ making changes. testit --pdf ``` -## Update expected images +## Writing tests +The syntax for an individual test is `--- {name} ---` followed by some Typst +code that should be tested. The name must be globally unique in the test suite, +so that tests can be easily migrated across files. + +There are, broadly speaking, three kinds of tests: + +- Tests that just ensure that the code runs successfully: Those typically make + use of `test` or `assert.eq` (both are very similar, `test` is just shorter) + to ensure certain properties hold when executing the Typst code. + +- Tests that ensure the code fails with a particular error: Those have inline + annotations like `// Error: 2-7 thing was wrong`. An annotation can be + either an "Error", a "Warning", or a "Hint". The range designates where + in the next non-comment line the error is and after it follows the message. + If you the error is in a line further below, you can also write ranges like + `3:2-3:7` to indicate the 2-7 column in the 3rd non-comment line. + +- Tests that ensure certain visual output is produced: Those render the result + of the test with the `typst-render` crate and compare against a reference + image stored in the repository. The test runner automatically detects whether + a test has visual output and requires a reference image in this case. + + To prevent bloat, it is important that the test images are kept as small as + possible. To that effect, the test runner enforces a maximum size of 20 KiB. + If truly necessary, this limit can however be lifted by adding `// LARGE` as + the first line of a test. + +If you have the choice between writing a test using assertions or using +reference images, prefer assertions. This makes the test easier to understand +in isolation and prevents bloat due to images. + +## Updating reference images If you created a new test or fixed a bug in an existing test, you need to update -the reference image used for comparison. For this, you can use the -`UPDATE_EXPECT` environment variable or the `--update` flag: +the reference image used for comparison. For this, you can use the `--update` +flag: ```bash testit mytest --update ``` If you use the VS Code test helper extension (see the `tools` folder), you can -alternatively use the checkmark button to update the reference image. In that -case you should also install `oxipng` on your system so that the test helper -can optimize the reference images. +alternatively use the save button to update the reference image. ## Making an alias If you want to have a quicker way to run the tests, consider adding a shortcut diff --git a/tests/ref/align-center-in-flow.png b/tests/ref/align-center-in-flow.png new file mode 100644 index 00000000..ecfe49dc Binary files /dev/null and b/tests/ref/align-center-in-flow.png differ diff --git a/tests/ref/align-in-stack.png b/tests/ref/align-in-stack.png new file mode 100644 index 00000000..556721ab Binary files /dev/null and b/tests/ref/align-in-stack.png differ diff --git a/tests/ref/align-right.png b/tests/ref/align-right.png new file mode 100644 index 00000000..edab8851 Binary files /dev/null and b/tests/ref/align-right.png differ diff --git a/tests/ref/align-start-and-end.png b/tests/ref/align-start-and-end.png new file mode 100644 index 00000000..cf3faeae Binary files /dev/null and b/tests/ref/align-start-and-end.png differ diff --git a/tests/ref/array-basic-syntax.png b/tests/ref/array-basic-syntax.png new file mode 100644 index 00000000..6eb95305 Binary files /dev/null and b/tests/ref/array-basic-syntax.png differ diff --git a/tests/ref/array-insert-and-remove.png b/tests/ref/array-insert-and-remove.png new file mode 100644 index 00000000..ea4b8cf2 Binary files /dev/null and b/tests/ref/array-insert-and-remove.png differ diff --git a/tests/ref/array-join-content.png b/tests/ref/array-join-content.png new file mode 100644 index 00000000..4d08142e Binary files /dev/null and b/tests/ref/array-join-content.png differ diff --git a/tests/ref/baseline-box.png b/tests/ref/baseline-box.png new file mode 100644 index 00000000..8d7627c6 Binary files /dev/null and b/tests/ref/baseline-box.png differ diff --git a/tests/ref/baseline-text.png b/tests/ref/baseline-text.png new file mode 100644 index 00000000..72beac79 Binary files /dev/null and b/tests/ref/baseline-text.png differ diff --git a/tests/ref/bibliography-basic.png b/tests/ref/bibliography-basic.png new file mode 100644 index 00000000..eeb773bf Binary files /dev/null and b/tests/ref/bibliography-basic.png differ diff --git a/tests/ref/bibliography-before-content.png b/tests/ref/bibliography-before-content.png new file mode 100644 index 00000000..806daa08 Binary files /dev/null and b/tests/ref/bibliography-before-content.png differ diff --git a/tests/ref/bibliography-full.png b/tests/ref/bibliography-full.png new file mode 100644 index 00000000..1da15d16 Binary files /dev/null and b/tests/ref/bibliography-full.png differ diff --git a/tests/ref/bibliography-math.png b/tests/ref/bibliography-math.png new file mode 100644 index 00000000..3fc36efc Binary files /dev/null and b/tests/ref/bibliography-math.png differ diff --git a/tests/ref/bibliography-multiple-files.png b/tests/ref/bibliography-multiple-files.png new file mode 100644 index 00000000..1293ba22 Binary files /dev/null and b/tests/ref/bibliography-multiple-files.png differ diff --git a/tests/ref/bibliography-ordering.png b/tests/ref/bibliography-ordering.png new file mode 100644 index 00000000..b1e14c9a Binary files /dev/null and b/tests/ref/bibliography-ordering.png differ diff --git a/tests/ref/bidi-consecutive-embedded-ltr-runs.png b/tests/ref/bidi-consecutive-embedded-ltr-runs.png new file mode 100644 index 00000000..dbaaff07 Binary files /dev/null and b/tests/ref/bidi-consecutive-embedded-ltr-runs.png differ diff --git a/tests/ref/bidi-consecutive-embedded-rtl-runs.png b/tests/ref/bidi-consecutive-embedded-rtl-runs.png new file mode 100644 index 00000000..4cf62d3e Binary files /dev/null and b/tests/ref/bidi-consecutive-embedded-rtl-runs.png differ diff --git a/tests/ref/bidi-en-he-top-level.png b/tests/ref/bidi-en-he-top-level.png new file mode 100644 index 00000000..abab54f4 Binary files /dev/null and b/tests/ref/bidi-en-he-top-level.png differ diff --git a/tests/ref/bidi-explicit-dir.png b/tests/ref/bidi-explicit-dir.png new file mode 100644 index 00000000..8b813be0 Binary files /dev/null and b/tests/ref/bidi-explicit-dir.png differ diff --git a/tests/ref/bidi-manual-linebreak.png b/tests/ref/bidi-manual-linebreak.png new file mode 100644 index 00000000..4d0eb6f8 Binary files /dev/null and b/tests/ref/bidi-manual-linebreak.png differ diff --git a/tests/ref/bidi-nesting.png b/tests/ref/bidi-nesting.png new file mode 100644 index 00000000..e18d6c0a Binary files /dev/null and b/tests/ref/bidi-nesting.png differ diff --git a/tests/ref/bidi-obj.png b/tests/ref/bidi-obj.png new file mode 100644 index 00000000..8cc41528 Binary files /dev/null and b/tests/ref/bidi-obj.png differ diff --git a/tests/ref/bidi-raw.png b/tests/ref/bidi-raw.png new file mode 100644 index 00000000..24503ee9 Binary files /dev/null and b/tests/ref/bidi-raw.png differ diff --git a/tests/ref/bidi-spacing.png b/tests/ref/bidi-spacing.png new file mode 100644 index 00000000..44ede76f Binary files /dev/null and b/tests/ref/bidi-spacing.png differ diff --git a/tests/ref/bidi-whitespace-reset.png b/tests/ref/bidi-whitespace-reset.png new file mode 100644 index 00000000..7d64012f Binary files /dev/null and b/tests/ref/bidi-whitespace-reset.png differ diff --git a/tests/ref/block-box-fill.png b/tests/ref/block-box-fill.png new file mode 100644 index 00000000..fe4f7258 Binary files /dev/null and b/tests/ref/block-box-fill.png differ diff --git a/tests/ref/block-clip-svg-glyphs.png b/tests/ref/block-clip-svg-glyphs.png new file mode 100644 index 00000000..d8db5b61 Binary files /dev/null and b/tests/ref/block-clip-svg-glyphs.png differ diff --git a/tests/ref/block-clip-text.png b/tests/ref/block-clip-text.png new file mode 100644 index 00000000..7cd86ddb Binary files /dev/null and b/tests/ref/block-clip-text.png differ diff --git a/tests/ref/block-clipping-multiple-pages.png b/tests/ref/block-clipping-multiple-pages.png new file mode 100644 index 00000000..9c9aa89b Binary files /dev/null and b/tests/ref/block-clipping-multiple-pages.png differ diff --git a/tests/ref/block-fixed-height.png b/tests/ref/block-fixed-height.png new file mode 100644 index 00000000..95c3be1e Binary files /dev/null and b/tests/ref/block-fixed-height.png differ diff --git a/tests/ref/block-multiple-pages.png b/tests/ref/block-multiple-pages.png new file mode 100644 index 00000000..c2f192bd Binary files /dev/null and b/tests/ref/block-multiple-pages.png differ diff --git a/tests/ref/block-sizing.png b/tests/ref/block-sizing.png new file mode 100644 index 00000000..76cb04df Binary files /dev/null and b/tests/ref/block-sizing.png differ diff --git a/tests/ref/block-spacing-basic.png b/tests/ref/block-spacing-basic.png new file mode 100644 index 00000000..875410ac Binary files /dev/null and b/tests/ref/block-spacing-basic.png differ diff --git a/tests/ref/block-spacing-collapse-text-style.png b/tests/ref/block-spacing-collapse-text-style.png new file mode 100644 index 00000000..6c631457 Binary files /dev/null and b/tests/ref/block-spacing-collapse-text-style.png differ diff --git a/tests/ref/block-spacing-maximum.png b/tests/ref/block-spacing-maximum.png new file mode 100644 index 00000000..755b1cc3 Binary files /dev/null and b/tests/ref/block-spacing-maximum.png differ diff --git a/tests/ref/block-spacing-table.png b/tests/ref/block-spacing-table.png new file mode 100644 index 00000000..1591acb7 Binary files /dev/null and b/tests/ref/block-spacing-table.png differ diff --git a/tests/ref/box-clip-radius-without-stroke.png b/tests/ref/box-clip-radius-without-stroke.png new file mode 100644 index 00000000..12137358 Binary files /dev/null and b/tests/ref/box-clip-radius-without-stroke.png differ diff --git a/tests/ref/box-clip-radius.png b/tests/ref/box-clip-radius.png new file mode 100644 index 00000000..da20fa5b Binary files /dev/null and b/tests/ref/box-clip-radius.png differ diff --git a/tests/ref/box-clip-rect.png b/tests/ref/box-clip-rect.png new file mode 100644 index 00000000..49a4e4ab Binary files /dev/null and b/tests/ref/box-clip-rect.png differ diff --git a/tests/ref/box-layoutable-child.png b/tests/ref/box-layoutable-child.png new file mode 100644 index 00000000..a1960a24 Binary files /dev/null and b/tests/ref/box-layoutable-child.png differ diff --git a/tests/ref/box-width-fr.png b/tests/ref/box-width-fr.png new file mode 100644 index 00000000..30d48163 Binary files /dev/null and b/tests/ref/box-width-fr.png differ diff --git a/tests/ref/box.png b/tests/ref/box.png new file mode 100644 index 00000000..fde288a8 Binary files /dev/null and b/tests/ref/box.png differ diff --git a/tests/ref/bugs/1050-terms-indent.png b/tests/ref/bugs/1050-terms-indent.png deleted file mode 100644 index 58a7feae..00000000 Binary files a/tests/ref/bugs/1050-terms-indent.png and /dev/null differ diff --git a/tests/ref/bugs/1240-stack-fr.png b/tests/ref/bugs/1240-stack-fr.png deleted file mode 100644 index 29df5d44..00000000 Binary files a/tests/ref/bugs/1240-stack-fr.png and /dev/null differ diff --git a/tests/ref/bugs/1597-cite-footnote.png b/tests/ref/bugs/1597-cite-footnote.png deleted file mode 100644 index c2e219f2..00000000 Binary files a/tests/ref/bugs/1597-cite-footnote.png and /dev/null differ diff --git a/tests/ref/bugs/2044-invalid-parsed-ident.png b/tests/ref/bugs/2044-invalid-parsed-ident.png deleted file mode 100644 index 327150e7..00000000 Binary files a/tests/ref/bugs/2044-invalid-parsed-ident.png and /dev/null differ diff --git a/tests/ref/bugs/2105-linebreak-tofu.png b/tests/ref/bugs/2105-linebreak-tofu.png deleted file mode 100644 index 78f937eb..00000000 Binary files a/tests/ref/bugs/2105-linebreak-tofu.png and /dev/null differ diff --git a/tests/ref/bugs/2595-float-overlap.png b/tests/ref/bugs/2595-float-overlap.png deleted file mode 100644 index 6d8eaf94..00000000 Binary files a/tests/ref/bugs/2595-float-overlap.png and /dev/null differ diff --git a/tests/ref/bugs/2650-cjk-latin-spacing-meta.png b/tests/ref/bugs/2650-cjk-latin-spacing-meta.png deleted file mode 100644 index 35ff0e62..00000000 Binary files a/tests/ref/bugs/2650-cjk-latin-spacing-meta.png and /dev/null differ diff --git a/tests/ref/bugs/2715-float-order.png b/tests/ref/bugs/2715-float-order.png deleted file mode 100644 index 0a4f8812..00000000 Binary files a/tests/ref/bugs/2715-float-order.png and /dev/null differ diff --git a/tests/ref/bugs/3082-chinese-punctuation.png b/tests/ref/bugs/3082-chinese-punctuation.png deleted file mode 100644 index c187d495..00000000 Binary files a/tests/ref/bugs/3082-chinese-punctuation.png and /dev/null differ diff --git a/tests/ref/bugs/3641-float-loop.png b/tests/ref/bugs/3641-float-loop.png deleted file mode 100644 index 092b2ff5..00000000 Binary files a/tests/ref/bugs/3641-float-loop.png and /dev/null differ diff --git a/tests/ref/bugs/3650-italic-equation.png b/tests/ref/bugs/3650-italic-equation.png deleted file mode 100644 index 41f071ab..00000000 Binary files a/tests/ref/bugs/3650-italic-equation.png and /dev/null differ diff --git a/tests/ref/bugs/3658-math-size.png b/tests/ref/bugs/3658-math-size.png deleted file mode 100644 index 94c8d388..00000000 Binary files a/tests/ref/bugs/3658-math-size.png and /dev/null differ diff --git a/tests/ref/bugs/3662-pdf-smartquotes.png b/tests/ref/bugs/3662-pdf-smartquotes.png deleted file mode 100644 index c272a8ff..00000000 Binary files a/tests/ref/bugs/3662-pdf-smartquotes.png and /dev/null differ diff --git a/tests/ref/bugs/3700-deformed-stroke.png b/tests/ref/bugs/3700-deformed-stroke.png deleted file mode 100644 index f1db2836..00000000 Binary files a/tests/ref/bugs/3700-deformed-stroke.png and /dev/null differ diff --git a/tests/ref/bugs/3841-tabs-in-raw-typ-code.png b/tests/ref/bugs/3841-tabs-in-raw-typ-code.png deleted file mode 100644 index 37dab136..00000000 Binary files a/tests/ref/bugs/3841-tabs-in-raw-typ-code.png and /dev/null differ diff --git a/tests/ref/bugs/870-image-rotation.png b/tests/ref/bugs/870-image-rotation.png deleted file mode 100644 index 83d9267d..00000000 Binary files a/tests/ref/bugs/870-image-rotation.png and /dev/null differ diff --git a/tests/ref/bugs/args-sink.png b/tests/ref/bugs/args-sink.png deleted file mode 100644 index 564c59a2..00000000 Binary files a/tests/ref/bugs/args-sink.png and /dev/null differ diff --git a/tests/ref/bugs/bibliography-math.png b/tests/ref/bugs/bibliography-math.png deleted file mode 100644 index 0ab308dc..00000000 Binary files a/tests/ref/bugs/bibliography-math.png and /dev/null differ diff --git a/tests/ref/bugs/bidi-tofus.png b/tests/ref/bugs/bidi-tofus.png deleted file mode 100644 index 1b7a7d8b..00000000 Binary files a/tests/ref/bugs/bidi-tofus.png and /dev/null differ diff --git a/tests/ref/bugs/block-width-box.png b/tests/ref/bugs/block-width-box.png deleted file mode 100644 index 9cb27a5d..00000000 Binary files a/tests/ref/bugs/block-width-box.png and /dev/null differ diff --git a/tests/ref/bugs/cite-locate.png b/tests/ref/bugs/cite-locate.png deleted file mode 100644 index bd31df7d..00000000 Binary files a/tests/ref/bugs/cite-locate.png and /dev/null differ diff --git a/tests/ref/bugs/cite-show-set.png b/tests/ref/bugs/cite-show-set.png deleted file mode 100644 index 566186a4..00000000 Binary files a/tests/ref/bugs/cite-show-set.png and /dev/null differ diff --git a/tests/ref/bugs/clamp-panic.png b/tests/ref/bugs/clamp-panic.png deleted file mode 100644 index c0c4912e..00000000 Binary files a/tests/ref/bugs/clamp-panic.png and /dev/null differ diff --git a/tests/ref/bugs/columns-1.png b/tests/ref/bugs/columns-1.png deleted file mode 100644 index 4b462b60..00000000 Binary files a/tests/ref/bugs/columns-1.png and /dev/null differ diff --git a/tests/ref/bugs/emoji-linebreak.png b/tests/ref/bugs/emoji-linebreak.png deleted file mode 100644 index 6944233d..00000000 Binary files a/tests/ref/bugs/emoji-linebreak.png and /dev/null differ diff --git a/tests/ref/bugs/flow-1.png b/tests/ref/bugs/flow-1.png deleted file mode 100644 index 662a7b14..00000000 Binary files a/tests/ref/bugs/flow-1.png and /dev/null differ diff --git a/tests/ref/bugs/flow-2.png b/tests/ref/bugs/flow-2.png deleted file mode 100644 index c7ece308..00000000 Binary files a/tests/ref/bugs/flow-2.png and /dev/null differ diff --git a/tests/ref/bugs/flow-3.png b/tests/ref/bugs/flow-3.png deleted file mode 100644 index 25acc06d..00000000 Binary files a/tests/ref/bugs/flow-3.png and /dev/null differ diff --git a/tests/ref/bugs/flow-4.png b/tests/ref/bugs/flow-4.png deleted file mode 100644 index 2adcbe15..00000000 Binary files a/tests/ref/bugs/flow-4.png and /dev/null differ diff --git a/tests/ref/bugs/flow-5.png b/tests/ref/bugs/flow-5.png deleted file mode 100644 index 648c8c44..00000000 Binary files a/tests/ref/bugs/flow-5.png and /dev/null differ diff --git a/tests/ref/bugs/fold-vector.png b/tests/ref/bugs/fold-vector.png deleted file mode 100644 index d8503a8e..00000000 Binary files a/tests/ref/bugs/fold-vector.png and /dev/null differ diff --git a/tests/ref/bugs/footnote-keep-multiple.png b/tests/ref/bugs/footnote-keep-multiple.png deleted file mode 100644 index f3b67a74..00000000 Binary files a/tests/ref/bugs/footnote-keep-multiple.png and /dev/null differ diff --git a/tests/ref/bugs/footnote-list.png b/tests/ref/bugs/footnote-list.png deleted file mode 100644 index 1b56f227..00000000 Binary files a/tests/ref/bugs/footnote-list.png and /dev/null differ diff --git a/tests/ref/bugs/gradient-cmyk-encode.png b/tests/ref/bugs/gradient-cmyk-encode.png deleted file mode 100644 index 5002442f..00000000 Binary files a/tests/ref/bugs/gradient-cmyk-encode.png and /dev/null differ diff --git a/tests/ref/bugs/grid-1.png b/tests/ref/bugs/grid-1.png deleted file mode 100644 index f60ad7f4..00000000 Binary files a/tests/ref/bugs/grid-1.png and /dev/null differ diff --git a/tests/ref/bugs/grid-2.png b/tests/ref/bugs/grid-2.png deleted file mode 100644 index 882e0d6a..00000000 Binary files a/tests/ref/bugs/grid-2.png and /dev/null differ diff --git a/tests/ref/bugs/grid-3.png b/tests/ref/bugs/grid-3.png deleted file mode 100644 index 6b5ae649..00000000 Binary files a/tests/ref/bugs/grid-3.png and /dev/null differ diff --git a/tests/ref/bugs/grid-4.png b/tests/ref/bugs/grid-4.png deleted file mode 100644 index 475f561e..00000000 Binary files a/tests/ref/bugs/grid-4.png and /dev/null differ diff --git a/tests/ref/bugs/hide-meta.png b/tests/ref/bugs/hide-meta.png deleted file mode 100644 index 76b4671a..00000000 Binary files a/tests/ref/bugs/hide-meta.png and /dev/null differ diff --git a/tests/ref/bugs/justify-hanging-indent.png b/tests/ref/bugs/justify-hanging-indent.png deleted file mode 100644 index 015cc44e..00000000 Binary files a/tests/ref/bugs/justify-hanging-indent.png and /dev/null differ diff --git a/tests/ref/bugs/line-align.png b/tests/ref/bugs/line-align.png deleted file mode 100644 index 1117ed6b..00000000 Binary files a/tests/ref/bugs/line-align.png and /dev/null differ diff --git a/tests/ref/bugs/linebreak-no-justifiables.png b/tests/ref/bugs/linebreak-no-justifiables.png deleted file mode 100644 index 3f934592..00000000 Binary files a/tests/ref/bugs/linebreak-no-justifiables.png and /dev/null differ diff --git a/tests/ref/bugs/mat-aug-color.png b/tests/ref/bugs/mat-aug-color.png deleted file mode 100644 index 472c1968..00000000 Binary files a/tests/ref/bugs/mat-aug-color.png and /dev/null differ diff --git a/tests/ref/bugs/math-eval.png b/tests/ref/bugs/math-eval.png deleted file mode 100644 index b673e503..00000000 Binary files a/tests/ref/bugs/math-eval.png and /dev/null differ diff --git a/tests/ref/bugs/math-hide.png b/tests/ref/bugs/math-hide.png deleted file mode 100644 index 7ac5d2f1..00000000 Binary files a/tests/ref/bugs/math-hide.png and /dev/null differ diff --git a/tests/ref/bugs/math-number-spacing.png b/tests/ref/bugs/math-number-spacing.png deleted file mode 100644 index 5ec65df3..00000000 Binary files a/tests/ref/bugs/math-number-spacing.png and /dev/null differ diff --git a/tests/ref/bugs/math-realize.png b/tests/ref/bugs/math-realize.png deleted file mode 100644 index e972e099..00000000 Binary files a/tests/ref/bugs/math-realize.png and /dev/null differ diff --git a/tests/ref/bugs/math-shift.png b/tests/ref/bugs/math-shift.png deleted file mode 100644 index d6a2ef3b..00000000 Binary files a/tests/ref/bugs/math-shift.png and /dev/null differ diff --git a/tests/ref/bugs/math-text-break.png b/tests/ref/bugs/math-text-break.png deleted file mode 100644 index 768ca65f..00000000 Binary files a/tests/ref/bugs/math-text-break.png and /dev/null differ diff --git a/tests/ref/bugs/new-cm-svg.png b/tests/ref/bugs/new-cm-svg.png deleted file mode 100644 index d75a6dbb..00000000 Binary files a/tests/ref/bugs/new-cm-svg.png and /dev/null differ diff --git a/tests/ref/bugs/newline-mode.png b/tests/ref/bugs/newline-mode.png deleted file mode 100644 index d4b6c6d8..00000000 Binary files a/tests/ref/bugs/newline-mode.png and /dev/null differ diff --git a/tests/ref/bugs/pagebreak-bibliography.png b/tests/ref/bugs/pagebreak-bibliography.png deleted file mode 100644 index 43de1574..00000000 Binary files a/tests/ref/bugs/pagebreak-bibliography.png and /dev/null differ diff --git a/tests/ref/bugs/pagebreak-numbering.png b/tests/ref/bugs/pagebreak-numbering.png deleted file mode 100644 index 96f047a8..00000000 Binary files a/tests/ref/bugs/pagebreak-numbering.png and /dev/null differ diff --git a/tests/ref/bugs/pagebreak-set-style.png b/tests/ref/bugs/pagebreak-set-style.png deleted file mode 100644 index f81b8c2f..00000000 Binary files a/tests/ref/bugs/pagebreak-set-style.png and /dev/null differ diff --git a/tests/ref/bugs/place-base.png b/tests/ref/bugs/place-base.png deleted file mode 100644 index 4442b173..00000000 Binary files a/tests/ref/bugs/place-base.png and /dev/null differ diff --git a/tests/ref/bugs/place-nested.png b/tests/ref/bugs/place-nested.png deleted file mode 100644 index b59dc5d3..00000000 Binary files a/tests/ref/bugs/place-nested.png and /dev/null differ diff --git a/tests/ref/bugs/place-pagebreak.png b/tests/ref/bugs/place-pagebreak.png deleted file mode 100644 index 2aa3d6b0..00000000 Binary files a/tests/ref/bugs/place-pagebreak.png and /dev/null differ diff --git a/tests/ref/bugs/place-spacing.png b/tests/ref/bugs/place-spacing.png deleted file mode 100644 index d14ce6ec..00000000 Binary files a/tests/ref/bugs/place-spacing.png and /dev/null differ diff --git a/tests/ref/bugs/raw-color-overwrite.png b/tests/ref/bugs/raw-color-overwrite.png deleted file mode 100644 index b01d86a4..00000000 Binary files a/tests/ref/bugs/raw-color-overwrite.png and /dev/null differ diff --git a/tests/ref/bugs/smartquotes-in-outline.png b/tests/ref/bugs/smartquotes-in-outline.png deleted file mode 100644 index 8a2cbc6a..00000000 Binary files a/tests/ref/bugs/smartquotes-in-outline.png and /dev/null differ diff --git a/tests/ref/bugs/smartquotes-on-newline.png b/tests/ref/bugs/smartquotes-on-newline.png deleted file mode 100644 index fdf4623a..00000000 Binary files a/tests/ref/bugs/smartquotes-on-newline.png and /dev/null differ diff --git a/tests/ref/bugs/spacing-behaviour.png b/tests/ref/bugs/spacing-behaviour.png deleted file mode 100644 index 08fcfa73..00000000 Binary files a/tests/ref/bugs/spacing-behaviour.png and /dev/null differ diff --git a/tests/ref/bugs/square-base.png b/tests/ref/bugs/square-base.png deleted file mode 100644 index 290ee54e..00000000 Binary files a/tests/ref/bugs/square-base.png and /dev/null differ diff --git a/tests/ref/bugs/table-lines.png b/tests/ref/bugs/table-lines.png deleted file mode 100644 index 600391cb..00000000 Binary files a/tests/ref/bugs/table-lines.png and /dev/null differ diff --git a/tests/ref/bugs/table-row-missing.png b/tests/ref/bugs/table-row-missing.png deleted file mode 100644 index 90c46d32..00000000 Binary files a/tests/ref/bugs/table-row-missing.png and /dev/null differ diff --git a/tests/ref/call-basic.png b/tests/ref/call-basic.png new file mode 100644 index 00000000..9016e9e8 Binary files /dev/null and b/tests/ref/call-basic.png differ diff --git a/tests/ref/circle-auto-sizing.png b/tests/ref/circle-auto-sizing.png new file mode 100644 index 00000000..377dbe1d Binary files /dev/null and b/tests/ref/circle-auto-sizing.png differ diff --git a/tests/ref/circle-directly-in-rect.png b/tests/ref/circle-directly-in-rect.png new file mode 100644 index 00000000..cb74496d Binary files /dev/null and b/tests/ref/circle-directly-in-rect.png differ diff --git a/tests/ref/circle-relative-sizing.png b/tests/ref/circle-relative-sizing.png new file mode 100644 index 00000000..efff34cf Binary files /dev/null and b/tests/ref/circle-relative-sizing.png differ diff --git a/tests/ref/circle-sizing-options.png b/tests/ref/circle-sizing-options.png new file mode 100644 index 00000000..778a8249 Binary files /dev/null and b/tests/ref/circle-sizing-options.png differ diff --git a/tests/ref/circle.png b/tests/ref/circle.png new file mode 100644 index 00000000..8a86e194 Binary files /dev/null and b/tests/ref/circle.png differ diff --git a/tests/ref/cite-footnote.png b/tests/ref/cite-footnote.png new file mode 100644 index 00000000..5bc6433e Binary files /dev/null and b/tests/ref/cite-footnote.png differ diff --git a/tests/ref/cite-form.png b/tests/ref/cite-form.png new file mode 100644 index 00000000..c35a3573 Binary files /dev/null and b/tests/ref/cite-form.png differ diff --git a/tests/ref/cite-group.png b/tests/ref/cite-group.png new file mode 100644 index 00000000..70feb4e1 Binary files /dev/null and b/tests/ref/cite-group.png differ diff --git a/tests/ref/cite-grouping-and-ordering.png b/tests/ref/cite-grouping-and-ordering.png new file mode 100644 index 00000000..6a70539d Binary files /dev/null and b/tests/ref/cite-grouping-and-ordering.png differ diff --git a/tests/ref/cjk-punctuation-adjustment-1.png b/tests/ref/cjk-punctuation-adjustment-1.png new file mode 100644 index 00000000..a68274cf Binary files /dev/null and b/tests/ref/cjk-punctuation-adjustment-1.png differ diff --git a/tests/ref/cjk-punctuation-adjustment-2.png b/tests/ref/cjk-punctuation-adjustment-2.png new file mode 100644 index 00000000..925c0f3c Binary files /dev/null and b/tests/ref/cjk-punctuation-adjustment-2.png differ diff --git a/tests/ref/cjk-punctuation-adjustment-3.png b/tests/ref/cjk-punctuation-adjustment-3.png new file mode 100644 index 00000000..e5eb70a9 Binary files /dev/null and b/tests/ref/cjk-punctuation-adjustment-3.png differ diff --git a/tests/ref/closure-capture-in-lvalue.png b/tests/ref/closure-capture-in-lvalue.png new file mode 100644 index 00000000..5f3ab035 Binary files /dev/null and b/tests/ref/closure-capture-in-lvalue.png differ diff --git a/tests/ref/closure-path-resolve-in-layout-phase.png b/tests/ref/closure-path-resolve-in-layout-phase.png new file mode 100644 index 00000000..e56e23a0 Binary files /dev/null and b/tests/ref/closure-path-resolve-in-layout-phase.png differ diff --git a/tests/ref/closure-without-params-non-atomic.png b/tests/ref/closure-without-params-non-atomic.png new file mode 100644 index 00000000..7d01ea3c Binary files /dev/null and b/tests/ref/closure-without-params-non-atomic.png differ diff --git a/tests/ref/code-block-basic-syntax.png b/tests/ref/code-block-basic-syntax.png new file mode 100644 index 00000000..7b2e6045 Binary files /dev/null and b/tests/ref/code-block-basic-syntax.png differ diff --git a/tests/ref/color-cmyk-ops.png b/tests/ref/color-cmyk-ops.png new file mode 100644 index 00000000..4f799efa Binary files /dev/null and b/tests/ref/color-cmyk-ops.png differ diff --git a/tests/ref/color-luma.png b/tests/ref/color-luma.png new file mode 100644 index 00000000..7bacc744 Binary files /dev/null and b/tests/ref/color-luma.png differ diff --git a/tests/ref/color-outside-srgb-gamut.png b/tests/ref/color-outside-srgb-gamut.png new file mode 100644 index 00000000..3a2806c5 Binary files /dev/null and b/tests/ref/color-outside-srgb-gamut.png differ diff --git a/tests/ref/color-rotate-hue.png b/tests/ref/color-rotate-hue.png new file mode 100644 index 00000000..a2139714 Binary files /dev/null and b/tests/ref/color-rotate-hue.png differ diff --git a/tests/ref/color-saturation.png b/tests/ref/color-saturation.png new file mode 100644 index 00000000..ccac4828 Binary files /dev/null and b/tests/ref/color-saturation.png differ diff --git a/tests/ref/color-spaces.png b/tests/ref/color-spaces.png new file mode 100644 index 00000000..ade861cc Binary files /dev/null and b/tests/ref/color-spaces.png differ diff --git a/tests/ref/columns-colbreak-after-place.png b/tests/ref/columns-colbreak-after-place.png new file mode 100644 index 00000000..f6a8a63d Binary files /dev/null and b/tests/ref/columns-colbreak-after-place.png differ diff --git a/tests/ref/columns-empty-second-column.png b/tests/ref/columns-empty-second-column.png new file mode 100644 index 00000000..a00d5fb2 Binary files /dev/null and b/tests/ref/columns-empty-second-column.png differ diff --git a/tests/ref/columns-in-auto-sized-rect.png b/tests/ref/columns-in-auto-sized-rect.png new file mode 100644 index 00000000..00088b7e Binary files /dev/null and b/tests/ref/columns-in-auto-sized-rect.png differ diff --git a/tests/ref/columns-in-fixed-size-rect.png b/tests/ref/columns-in-fixed-size-rect.png new file mode 100644 index 00000000..28cb97cb Binary files /dev/null and b/tests/ref/columns-in-fixed-size-rect.png differ diff --git a/tests/ref/columns-more-with-gutter.png b/tests/ref/columns-more-with-gutter.png new file mode 100644 index 00000000..e89c6a0b Binary files /dev/null and b/tests/ref/columns-more-with-gutter.png differ diff --git a/tests/ref/columns-one.png b/tests/ref/columns-one.png new file mode 100644 index 00000000..02abf659 Binary files /dev/null and b/tests/ref/columns-one.png differ diff --git a/tests/ref/columns-page-height-auto.png b/tests/ref/columns-page-height-auto.png new file mode 100644 index 00000000..9b3f1f85 Binary files /dev/null and b/tests/ref/columns-page-height-auto.png differ diff --git a/tests/ref/columns-page-width-auto.png b/tests/ref/columns-page-width-auto.png new file mode 100644 index 00000000..04d88bc1 Binary files /dev/null and b/tests/ref/columns-page-width-auto.png differ diff --git a/tests/ref/columns-rtl.png b/tests/ref/columns-rtl.png new file mode 100644 index 00000000..7efa57f5 Binary files /dev/null and b/tests/ref/columns-rtl.png differ diff --git a/tests/ref/columns-set-page-colbreak-pagebreak.png b/tests/ref/columns-set-page-colbreak-pagebreak.png new file mode 100644 index 00000000..48d2fd7b Binary files /dev/null and b/tests/ref/columns-set-page-colbreak-pagebreak.png differ diff --git a/tests/ref/columns-set-page.png b/tests/ref/columns-set-page.png new file mode 100644 index 00000000..42b5bea7 Binary files /dev/null and b/tests/ref/columns-set-page.png differ diff --git a/tests/ref/coma.png b/tests/ref/coma.png index fc0f6ba1..96f9e4d9 100644 Binary files a/tests/ref/coma.png and b/tests/ref/coma.png differ diff --git a/tests/ref/comment-end-of-line.png b/tests/ref/comment-end-of-line.png new file mode 100644 index 00000000..94da23cb Binary files /dev/null and b/tests/ref/comment-end-of-line.png differ diff --git a/tests/ref/comments.png b/tests/ref/comments.png new file mode 100644 index 00000000..892ff5e4 Binary files /dev/null and b/tests/ref/comments.png differ diff --git a/tests/ref/compiler/array.png b/tests/ref/compiler/array.png deleted file mode 100644 index 9b6bf8b3..00000000 Binary files a/tests/ref/compiler/array.png and /dev/null differ diff --git a/tests/ref/compiler/block.png b/tests/ref/compiler/block.png deleted file mode 100644 index 21a38de2..00000000 Binary files a/tests/ref/compiler/block.png and /dev/null differ diff --git a/tests/ref/compiler/break-continue.png b/tests/ref/compiler/break-continue.png deleted file mode 100644 index 9751d395..00000000 Binary files a/tests/ref/compiler/break-continue.png and /dev/null differ diff --git a/tests/ref/compiler/call.png b/tests/ref/compiler/call.png deleted file mode 100644 index 2c5d1e78..00000000 Binary files a/tests/ref/compiler/call.png and /dev/null differ diff --git a/tests/ref/compiler/closure.png b/tests/ref/compiler/closure.png deleted file mode 100644 index 07c171c5..00000000 Binary files a/tests/ref/compiler/closure.png and /dev/null differ diff --git a/tests/ref/compiler/color.png b/tests/ref/compiler/color.png deleted file mode 100644 index 2b416f64..00000000 Binary files a/tests/ref/compiler/color.png and /dev/null differ diff --git a/tests/ref/compiler/comment.png b/tests/ref/compiler/comment.png deleted file mode 100644 index 608df6ea..00000000 Binary files a/tests/ref/compiler/comment.png and /dev/null differ diff --git a/tests/ref/compiler/construct.png b/tests/ref/compiler/construct.png deleted file mode 100644 index f1acf665..00000000 Binary files a/tests/ref/compiler/construct.png and /dev/null differ diff --git a/tests/ref/compiler/content-field.png b/tests/ref/compiler/content-field.png deleted file mode 100644 index 3095ba8c..00000000 Binary files a/tests/ref/compiler/content-field.png and /dev/null differ diff --git a/tests/ref/compiler/dict.png b/tests/ref/compiler/dict.png deleted file mode 100644 index c97b2dbf..00000000 Binary files a/tests/ref/compiler/dict.png and /dev/null differ diff --git a/tests/ref/compiler/for.png b/tests/ref/compiler/for.png deleted file mode 100644 index 5608248f..00000000 Binary files a/tests/ref/compiler/for.png and /dev/null differ diff --git a/tests/ref/compiler/highlight.png b/tests/ref/compiler/highlight.png deleted file mode 100644 index ccbbc056..00000000 Binary files a/tests/ref/compiler/highlight.png and /dev/null differ diff --git a/tests/ref/compiler/if.png b/tests/ref/compiler/if.png deleted file mode 100644 index bd3adc88..00000000 Binary files a/tests/ref/compiler/if.png and /dev/null differ diff --git a/tests/ref/compiler/import.png b/tests/ref/compiler/import.png deleted file mode 100644 index 5c6132d2..00000000 Binary files a/tests/ref/compiler/import.png and /dev/null differ diff --git a/tests/ref/compiler/include.png b/tests/ref/compiler/include.png deleted file mode 100644 index 7fdb0310..00000000 Binary files a/tests/ref/compiler/include.png and /dev/null differ diff --git a/tests/ref/compiler/label.png b/tests/ref/compiler/label.png deleted file mode 100644 index 21764f97..00000000 Binary files a/tests/ref/compiler/label.png and /dev/null differ diff --git a/tests/ref/compiler/let.png b/tests/ref/compiler/let.png deleted file mode 100644 index 4423fe0a..00000000 Binary files a/tests/ref/compiler/let.png and /dev/null differ diff --git a/tests/ref/compiler/ops.png b/tests/ref/compiler/ops.png deleted file mode 100644 index 51fb9d1a..00000000 Binary files a/tests/ref/compiler/ops.png and /dev/null differ diff --git a/tests/ref/compiler/repr-color-gradient.png b/tests/ref/compiler/repr-color-gradient.png deleted file mode 100644 index 11bde774..00000000 Binary files a/tests/ref/compiler/repr-color-gradient.png and /dev/null differ diff --git a/tests/ref/compiler/repr.png b/tests/ref/compiler/repr.png deleted file mode 100644 index c90cc3cd..00000000 Binary files a/tests/ref/compiler/repr.png and /dev/null differ diff --git a/tests/ref/compiler/return.png b/tests/ref/compiler/return.png deleted file mode 100644 index e8fa3ab2..00000000 Binary files a/tests/ref/compiler/return.png and /dev/null differ diff --git a/tests/ref/compiler/select-where-styles.png b/tests/ref/compiler/select-where-styles.png deleted file mode 100644 index ffdc4bab..00000000 Binary files a/tests/ref/compiler/select-where-styles.png and /dev/null differ diff --git a/tests/ref/compiler/selector-logical.png b/tests/ref/compiler/selector-logical.png deleted file mode 100644 index eafa93c8..00000000 Binary files a/tests/ref/compiler/selector-logical.png and /dev/null differ diff --git a/tests/ref/compiler/set.png b/tests/ref/compiler/set.png deleted file mode 100644 index 26409396..00000000 Binary files a/tests/ref/compiler/set.png and /dev/null differ diff --git a/tests/ref/compiler/shorthand.png b/tests/ref/compiler/shorthand.png deleted file mode 100644 index 4507177b..00000000 Binary files a/tests/ref/compiler/shorthand.png and /dev/null differ diff --git a/tests/ref/compiler/show-bare.png b/tests/ref/compiler/show-bare.png deleted file mode 100644 index c6a1e101..00000000 Binary files a/tests/ref/compiler/show-bare.png and /dev/null differ diff --git a/tests/ref/compiler/show-node.png b/tests/ref/compiler/show-node.png deleted file mode 100644 index 396e5429..00000000 Binary files a/tests/ref/compiler/show-node.png and /dev/null differ diff --git a/tests/ref/compiler/show-recursive.png b/tests/ref/compiler/show-recursive.png deleted file mode 100644 index a5a153c0..00000000 Binary files a/tests/ref/compiler/show-recursive.png and /dev/null differ diff --git a/tests/ref/compiler/show-selector-logical.png b/tests/ref/compiler/show-selector-logical.png deleted file mode 100644 index a7a80053..00000000 Binary files a/tests/ref/compiler/show-selector-logical.png and /dev/null differ diff --git a/tests/ref/compiler/show-selector.png b/tests/ref/compiler/show-selector.png deleted file mode 100644 index 52e99c9a..00000000 Binary files a/tests/ref/compiler/show-selector.png and /dev/null differ diff --git a/tests/ref/compiler/show-set-func.png b/tests/ref/compiler/show-set-func.png deleted file mode 100644 index c5ff2489..00000000 Binary files a/tests/ref/compiler/show-set-func.png and /dev/null differ diff --git a/tests/ref/compiler/show-set-text.png b/tests/ref/compiler/show-set-text.png deleted file mode 100644 index 27803e8a..00000000 Binary files a/tests/ref/compiler/show-set-text.png and /dev/null differ diff --git a/tests/ref/compiler/show-set.png b/tests/ref/compiler/show-set.png deleted file mode 100644 index e87fc600..00000000 Binary files a/tests/ref/compiler/show-set.png and /dev/null differ diff --git a/tests/ref/compiler/show-text.png b/tests/ref/compiler/show-text.png deleted file mode 100644 index 2026cc35..00000000 Binary files a/tests/ref/compiler/show-text.png and /dev/null differ diff --git a/tests/ref/compiler/while.png b/tests/ref/compiler/while.png deleted file mode 100644 index d0f86473..00000000 Binary files a/tests/ref/compiler/while.png and /dev/null differ diff --git a/tests/ref/compute/construct.png b/tests/ref/compute/construct.png deleted file mode 100644 index e1717473..00000000 Binary files a/tests/ref/compute/construct.png and /dev/null differ diff --git a/tests/ref/compute/data.png b/tests/ref/compute/data.png deleted file mode 100644 index 2dab6875..00000000 Binary files a/tests/ref/compute/data.png and /dev/null differ diff --git a/tests/ref/compute/eval-path.png b/tests/ref/compute/eval-path.png deleted file mode 100644 index c59dd2aa..00000000 Binary files a/tests/ref/compute/eval-path.png and /dev/null differ diff --git a/tests/ref/compute/foundations.png b/tests/ref/compute/foundations.png deleted file mode 100644 index 5d6ba744..00000000 Binary files a/tests/ref/compute/foundations.png and /dev/null differ diff --git a/tests/ref/content-field-materialized-heading.png b/tests/ref/content-field-materialized-heading.png new file mode 100644 index 00000000..72201627 Binary files /dev/null and b/tests/ref/content-field-materialized-heading.png differ diff --git a/tests/ref/content-field-materialized-query.png b/tests/ref/content-field-materialized-query.png new file mode 100644 index 00000000..2d2a1480 Binary files /dev/null and b/tests/ref/content-field-materialized-query.png differ diff --git a/tests/ref/content-field-materialized-table.png b/tests/ref/content-field-materialized-table.png new file mode 100644 index 00000000..09efe753 Binary files /dev/null and b/tests/ref/content-field-materialized-table.png differ diff --git a/tests/ref/content-fields-complex.png b/tests/ref/content-fields-complex.png new file mode 100644 index 00000000..624a8b33 Binary files /dev/null and b/tests/ref/content-fields-complex.png differ diff --git a/tests/ref/content-label-field-access.png b/tests/ref/content-label-field-access.png new file mode 100644 index 00000000..bdb7c0f2 Binary files /dev/null and b/tests/ref/content-label-field-access.png differ diff --git a/tests/ref/content-label-fields-method.png b/tests/ref/content-label-fields-method.png new file mode 100644 index 00000000..bdb7c0f2 Binary files /dev/null and b/tests/ref/content-label-fields-method.png differ diff --git a/tests/ref/content-label-has-method.png b/tests/ref/content-label-has-method.png new file mode 100644 index 00000000..bdb7c0f2 Binary files /dev/null and b/tests/ref/content-label-has-method.png differ diff --git a/tests/ref/context-compatibility-locate.png b/tests/ref/context-compatibility-locate.png new file mode 100644 index 00000000..4c8944ab Binary files /dev/null and b/tests/ref/context-compatibility-locate.png differ diff --git a/tests/ref/context-compatibility-styling.png b/tests/ref/context-compatibility-styling.png new file mode 100644 index 00000000..aee16c3a Binary files /dev/null and b/tests/ref/context-compatibility-styling.png differ diff --git a/tests/ref/counter-basic-1.png b/tests/ref/counter-basic-1.png new file mode 100644 index 00000000..92282594 Binary files /dev/null and b/tests/ref/counter-basic-1.png differ diff --git a/tests/ref/counter-figure.png b/tests/ref/counter-figure.png new file mode 100644 index 00000000..5e4a4a5f Binary files /dev/null and b/tests/ref/counter-figure.png differ diff --git a/tests/ref/counter-heading.png b/tests/ref/counter-heading.png new file mode 100644 index 00000000..96dafd6a Binary files /dev/null and b/tests/ref/counter-heading.png differ diff --git a/tests/ref/counter-label.png b/tests/ref/counter-label.png new file mode 100644 index 00000000..6fea90df Binary files /dev/null and b/tests/ref/counter-label.png differ diff --git a/tests/ref/counter-page.png b/tests/ref/counter-page.png new file mode 100644 index 00000000..be1653eb Binary files /dev/null and b/tests/ref/counter-page.png differ diff --git a/tests/ref/csv.png b/tests/ref/csv.png new file mode 100644 index 00000000..fd0c9a1c Binary files /dev/null and b/tests/ref/csv.png differ diff --git a/tests/ref/destructuring-during-loop-continue.png b/tests/ref/destructuring-during-loop-continue.png new file mode 100644 index 00000000..9ea8e3c1 Binary files /dev/null and b/tests/ref/destructuring-during-loop-continue.png differ diff --git a/tests/ref/dict-basic-methods.png b/tests/ref/dict-basic-methods.png new file mode 100644 index 00000000..20410cc3 Binary files /dev/null and b/tests/ref/dict-basic-methods.png differ diff --git a/tests/ref/dict-basic-syntax.png b/tests/ref/dict-basic-syntax.png new file mode 100644 index 00000000..02effef6 Binary files /dev/null and b/tests/ref/dict-basic-syntax.png differ diff --git a/tests/ref/dict-from-module.png b/tests/ref/dict-from-module.png new file mode 100644 index 00000000..7fd6eec3 Binary files /dev/null and b/tests/ref/dict-from-module.png differ diff --git a/tests/ref/dict-remove-order.png b/tests/ref/dict-remove-order.png new file mode 100644 index 00000000..20410cc3 Binary files /dev/null and b/tests/ref/dict-remove-order.png differ diff --git a/tests/ref/document-set-title.png b/tests/ref/document-set-title.png new file mode 100644 index 00000000..74bcfe19 Binary files /dev/null and b/tests/ref/document-set-title.png differ diff --git a/tests/ref/ellipse-auto-sizing.png b/tests/ref/ellipse-auto-sizing.png new file mode 100644 index 00000000..ed201521 Binary files /dev/null and b/tests/ref/ellipse-auto-sizing.png differ diff --git a/tests/ref/ellipse.png b/tests/ref/ellipse.png new file mode 100644 index 00000000..0f4e92ca Binary files /dev/null and b/tests/ref/ellipse.png differ diff --git a/tests/ref/emph-and-strong-call-in-word.png b/tests/ref/emph-and-strong-call-in-word.png new file mode 100644 index 00000000..4720f994 Binary files /dev/null and b/tests/ref/emph-and-strong-call-in-word.png differ diff --git a/tests/ref/emph-double-underscore-empty-hint.png b/tests/ref/emph-double-underscore-empty-hint.png new file mode 100644 index 00000000..a940dfb6 Binary files /dev/null and b/tests/ref/emph-double-underscore-empty-hint.png differ diff --git a/tests/ref/emph-syntax.png b/tests/ref/emph-syntax.png new file mode 100644 index 00000000..66f117a8 Binary files /dev/null and b/tests/ref/emph-syntax.png differ diff --git a/tests/ref/empty.png b/tests/ref/empty.png deleted file mode 100644 index db3a6695..00000000 Binary files a/tests/ref/empty.png and /dev/null differ diff --git a/tests/ref/enum-built-in-loop.png b/tests/ref/enum-built-in-loop.png new file mode 100644 index 00000000..298518da Binary files /dev/null and b/tests/ref/enum-built-in-loop.png differ diff --git a/tests/ref/enum-function-call.png b/tests/ref/enum-function-call.png new file mode 100644 index 00000000..a451f27c Binary files /dev/null and b/tests/ref/enum-function-call.png differ diff --git a/tests/ref/enum-number-align-2d.png b/tests/ref/enum-number-align-2d.png new file mode 100644 index 00000000..e205844f Binary files /dev/null and b/tests/ref/enum-number-align-2d.png differ diff --git a/tests/ref/enum-number-align-default.png b/tests/ref/enum-number-align-default.png new file mode 100644 index 00000000..c47f9001 Binary files /dev/null and b/tests/ref/enum-number-align-default.png differ diff --git a/tests/ref/enum-number-align-specified.png b/tests/ref/enum-number-align-specified.png new file mode 100644 index 00000000..b2f2d619 Binary files /dev/null and b/tests/ref/enum-number-align-specified.png differ diff --git a/tests/ref/enum-number-align-unaffected.png b/tests/ref/enum-number-align-unaffected.png new file mode 100644 index 00000000..3abcaaab Binary files /dev/null and b/tests/ref/enum-number-align-unaffected.png differ diff --git a/tests/ref/enum-number-align-unfolded.png b/tests/ref/enum-number-align-unfolded.png new file mode 100644 index 00000000..8c4f2943 Binary files /dev/null and b/tests/ref/enum-number-align-unfolded.png differ diff --git a/tests/ref/enum-number-override-nested.png b/tests/ref/enum-number-override-nested.png new file mode 100644 index 00000000..22bb7611 Binary files /dev/null and b/tests/ref/enum-number-override-nested.png differ diff --git a/tests/ref/enum-number-override.png b/tests/ref/enum-number-override.png new file mode 100644 index 00000000..65c0f9d8 Binary files /dev/null and b/tests/ref/enum-number-override.png differ diff --git a/tests/ref/enum-numbering-closure-nested-complex.png b/tests/ref/enum-numbering-closure-nested-complex.png new file mode 100644 index 00000000..a756f37c Binary files /dev/null and b/tests/ref/enum-numbering-closure-nested-complex.png differ diff --git a/tests/ref/enum-numbering-closure-nested.png b/tests/ref/enum-numbering-closure-nested.png new file mode 100644 index 00000000..25a5c42d Binary files /dev/null and b/tests/ref/enum-numbering-closure-nested.png differ diff --git a/tests/ref/enum-numbering-closure.png b/tests/ref/enum-numbering-closure.png new file mode 100644 index 00000000..bf86f554 Binary files /dev/null and b/tests/ref/enum-numbering-closure.png differ diff --git a/tests/ref/enum-numbering-full.png b/tests/ref/enum-numbering-full.png new file mode 100644 index 00000000..46449e57 Binary files /dev/null and b/tests/ref/enum-numbering-full.png differ diff --git a/tests/ref/enum-numbering-pattern.png b/tests/ref/enum-numbering-pattern.png new file mode 100644 index 00000000..4ecb9e4a Binary files /dev/null and b/tests/ref/enum-numbering-pattern.png differ diff --git a/tests/ref/enum-syntax-at-start.png b/tests/ref/enum-syntax-at-start.png new file mode 100644 index 00000000..ce9f3967 Binary files /dev/null and b/tests/ref/enum-syntax-at-start.png differ diff --git a/tests/ref/enum-syntax-edge-cases.png b/tests/ref/enum-syntax-edge-cases.png new file mode 100644 index 00000000..496dc8e3 Binary files /dev/null and b/tests/ref/enum-syntax-edge-cases.png differ diff --git a/tests/ref/escape.png b/tests/ref/escape.png new file mode 100644 index 00000000..0b49606c Binary files /dev/null and b/tests/ref/escape.png differ diff --git a/tests/ref/eval-in-show-rule.png b/tests/ref/eval-in-show-rule.png new file mode 100644 index 00000000..91a03868 Binary files /dev/null and b/tests/ref/eval-in-show-rule.png differ diff --git a/tests/ref/eval-mode.png b/tests/ref/eval-mode.png new file mode 100644 index 00000000..94357ff4 Binary files /dev/null and b/tests/ref/eval-mode.png differ diff --git a/tests/ref/eval-path-resolve-in-show-rule.png b/tests/ref/eval-path-resolve-in-show-rule.png new file mode 100644 index 00000000..cf5c183a Binary files /dev/null and b/tests/ref/eval-path-resolve-in-show-rule.png differ diff --git a/tests/ref/eval-path-resolve.png b/tests/ref/eval-path-resolve.png new file mode 100644 index 00000000..cf5c183a Binary files /dev/null and b/tests/ref/eval-path-resolve.png differ diff --git a/tests/ref/field-function.png b/tests/ref/field-function.png new file mode 100644 index 00000000..261fb395 Binary files /dev/null and b/tests/ref/field-function.png differ diff --git a/tests/ref/figure-and-caption-show.png b/tests/ref/figure-and-caption-show.png new file mode 100644 index 00000000..daf8f2b6 Binary files /dev/null and b/tests/ref/figure-and-caption-show.png differ diff --git a/tests/ref/figure-basic.png b/tests/ref/figure-basic.png new file mode 100644 index 00000000..22a841db Binary files /dev/null and b/tests/ref/figure-basic.png differ diff --git a/tests/ref/figure-breakable.png b/tests/ref/figure-breakable.png new file mode 100644 index 00000000..40cb3ec5 Binary files /dev/null and b/tests/ref/figure-breakable.png differ diff --git a/tests/ref/figure-caption-separator.png b/tests/ref/figure-caption-separator.png new file mode 100644 index 00000000..e645f01f Binary files /dev/null and b/tests/ref/figure-caption-separator.png differ diff --git a/tests/ref/figure-caption-show.png b/tests/ref/figure-caption-show.png new file mode 100644 index 00000000..4ed6443a Binary files /dev/null and b/tests/ref/figure-caption-show.png differ diff --git a/tests/ref/figure-caption-where-selector.png b/tests/ref/figure-caption-where-selector.png new file mode 100644 index 00000000..08eb46f6 Binary files /dev/null and b/tests/ref/figure-caption-where-selector.png differ diff --git a/tests/ref/figure-localization-fr.png b/tests/ref/figure-localization-fr.png new file mode 100644 index 00000000..665b3552 Binary files /dev/null and b/tests/ref/figure-localization-fr.png differ diff --git a/tests/ref/figure-localization-gr.png b/tests/ref/figure-localization-gr.png new file mode 100644 index 00000000..46b52b05 Binary files /dev/null and b/tests/ref/figure-localization-gr.png differ diff --git a/tests/ref/figure-localization-ru.png b/tests/ref/figure-localization-ru.png new file mode 100644 index 00000000..102df597 Binary files /dev/null and b/tests/ref/figure-localization-ru.png differ diff --git a/tests/ref/figure-localization-zh.png b/tests/ref/figure-localization-zh.png new file mode 100644 index 00000000..f7625b1b Binary files /dev/null and b/tests/ref/figure-localization-zh.png differ diff --git a/tests/ref/figure-table.png b/tests/ref/figure-table.png new file mode 100644 index 00000000..9a09f659 Binary files /dev/null and b/tests/ref/figure-table.png differ diff --git a/tests/ref/figure-theorem.png b/tests/ref/figure-theorem.png new file mode 100644 index 00000000..10d6eeac Binary files /dev/null and b/tests/ref/figure-theorem.png differ diff --git a/tests/ref/float-display.png b/tests/ref/float-display.png new file mode 100644 index 00000000..6c33b372 Binary files /dev/null and b/tests/ref/float-display.png differ diff --git a/tests/ref/float-repr.png b/tests/ref/float-repr.png new file mode 100644 index 00000000..8b510969 Binary files /dev/null and b/tests/ref/float-repr.png differ diff --git a/tests/ref/flow-first-region-counter-update-and-placed.png b/tests/ref/flow-first-region-counter-update-and-placed.png new file mode 100644 index 00000000..21316719 Binary files /dev/null and b/tests/ref/flow-first-region-counter-update-and-placed.png differ diff --git a/tests/ref/flow-first-region-counter-update-placed-and-line.png b/tests/ref/flow-first-region-counter-update-placed-and-line.png new file mode 100644 index 00000000..95ca518e Binary files /dev/null and b/tests/ref/flow-first-region-counter-update-placed-and-line.png differ diff --git a/tests/ref/flow-first-region-counter-update.png b/tests/ref/flow-first-region-counter-update.png new file mode 100644 index 00000000..8e883335 Binary files /dev/null and b/tests/ref/flow-first-region-counter-update.png differ diff --git a/tests/ref/flow-first-region-no-item.png b/tests/ref/flow-first-region-no-item.png new file mode 100644 index 00000000..e888898c Binary files /dev/null and b/tests/ref/flow-first-region-no-item.png differ diff --git a/tests/ref/flow-first-region-placed.png b/tests/ref/flow-first-region-placed.png new file mode 100644 index 00000000..cae4aa32 Binary files /dev/null and b/tests/ref/flow-first-region-placed.png differ diff --git a/tests/ref/flow-first-region-zero-sized-item.png b/tests/ref/flow-first-region-zero-sized-item.png new file mode 100644 index 00000000..2e75fcfe Binary files /dev/null and b/tests/ref/flow-first-region-zero-sized-item.png differ diff --git a/tests/ref/flow-fr.png b/tests/ref/flow-fr.png new file mode 100644 index 00000000..b09a9604 Binary files /dev/null and b/tests/ref/flow-fr.png differ diff --git a/tests/ref/flow-heading-no-orphan.png b/tests/ref/flow-heading-no-orphan.png new file mode 100644 index 00000000..87789ea1 Binary files /dev/null and b/tests/ref/flow-heading-no-orphan.png differ diff --git a/tests/ref/flow-par-no-orphan-and-widow-lines.png b/tests/ref/flow-par-no-orphan-and-widow-lines.png new file mode 100644 index 00000000..cace5d44 Binary files /dev/null and b/tests/ref/flow-par-no-orphan-and-widow-lines.png differ diff --git a/tests/ref/fold-vec-order-meta.png b/tests/ref/fold-vec-order-meta.png new file mode 100644 index 00000000..36e3cd51 Binary files /dev/null and b/tests/ref/fold-vec-order-meta.png differ diff --git a/tests/ref/fold-vec-order-text-decos.png b/tests/ref/fold-vec-order-text-decos.png new file mode 100644 index 00000000..62c9e1af Binary files /dev/null and b/tests/ref/fold-vec-order-text-decos.png differ diff --git a/tests/ref/fold-vec-order-text-features.png b/tests/ref/fold-vec-order-text-features.png new file mode 100644 index 00000000..f2ff6f25 Binary files /dev/null and b/tests/ref/fold-vec-order-text-features.png differ diff --git a/tests/ref/footnote-basic.png b/tests/ref/footnote-basic.png new file mode 100644 index 00000000..3562438b Binary files /dev/null and b/tests/ref/footnote-basic.png differ diff --git a/tests/ref/footnote-break-across-pages.png b/tests/ref/footnote-break-across-pages.png new file mode 100644 index 00000000..8ec55418 Binary files /dev/null and b/tests/ref/footnote-break-across-pages.png differ diff --git a/tests/ref/footnote-duplicate.png b/tests/ref/footnote-duplicate.png new file mode 100644 index 00000000..7c83b8de Binary files /dev/null and b/tests/ref/footnote-duplicate.png differ diff --git a/tests/ref/footnote-entry.png b/tests/ref/footnote-entry.png new file mode 100644 index 00000000..e62315c4 Binary files /dev/null and b/tests/ref/footnote-entry.png differ diff --git a/tests/ref/footnote-in-caption.png b/tests/ref/footnote-in-caption.png new file mode 100644 index 00000000..8d548c59 Binary files /dev/null and b/tests/ref/footnote-in-caption.png differ diff --git a/tests/ref/footnote-in-columns.png b/tests/ref/footnote-in-columns.png new file mode 100644 index 00000000..e16b4ebc Binary files /dev/null and b/tests/ref/footnote-in-columns.png differ diff --git a/tests/ref/footnote-in-table.png b/tests/ref/footnote-in-table.png new file mode 100644 index 00000000..0fd0acc7 Binary files /dev/null and b/tests/ref/footnote-in-table.png differ diff --git a/tests/ref/footnote-invariant.png b/tests/ref/footnote-invariant.png new file mode 100644 index 00000000..c49c268d Binary files /dev/null and b/tests/ref/footnote-invariant.png differ diff --git a/tests/ref/footnote-nested-same-frame.png b/tests/ref/footnote-nested-same-frame.png new file mode 100644 index 00000000..b22276d5 Binary files /dev/null and b/tests/ref/footnote-nested-same-frame.png differ diff --git a/tests/ref/footnote-nested.png b/tests/ref/footnote-nested.png new file mode 100644 index 00000000..fecf2e8d Binary files /dev/null and b/tests/ref/footnote-nested.png differ diff --git a/tests/ref/footnote-ref-call.png b/tests/ref/footnote-ref-call.png new file mode 100644 index 00000000..3c795302 Binary files /dev/null and b/tests/ref/footnote-ref-call.png differ diff --git a/tests/ref/footnote-ref-forward.png b/tests/ref/footnote-ref-forward.png new file mode 100644 index 00000000..e67671be Binary files /dev/null and b/tests/ref/footnote-ref-forward.png differ diff --git a/tests/ref/footnote-ref-in-footnote.png b/tests/ref/footnote-ref-in-footnote.png new file mode 100644 index 00000000..4718a088 Binary files /dev/null and b/tests/ref/footnote-ref-in-footnote.png differ diff --git a/tests/ref/footnote-ref-multiple.png b/tests/ref/footnote-ref-multiple.png new file mode 100644 index 00000000..fc6f11cf Binary files /dev/null and b/tests/ref/footnote-ref-multiple.png differ diff --git a/tests/ref/footnote-ref.png b/tests/ref/footnote-ref.png new file mode 100644 index 00000000..517d997a Binary files /dev/null and b/tests/ref/footnote-ref.png differ diff --git a/tests/ref/footnote-space-collapsing.png b/tests/ref/footnote-space-collapsing.png new file mode 100644 index 00000000..d7d02704 Binary files /dev/null and b/tests/ref/footnote-space-collapsing.png differ diff --git a/tests/ref/footnote-styling.png b/tests/ref/footnote-styling.png new file mode 100644 index 00000000..fd7684af Binary files /dev/null and b/tests/ref/footnote-styling.png differ diff --git a/tests/ref/for-loop-basic.png b/tests/ref/for-loop-basic.png new file mode 100644 index 00000000..42d611ef Binary files /dev/null and b/tests/ref/for-loop-basic.png differ diff --git a/tests/ref/gradient-conic-angled.png b/tests/ref/gradient-conic-angled.png new file mode 100644 index 00000000..163366e6 Binary files /dev/null and b/tests/ref/gradient-conic-angled.png differ diff --git a/tests/ref/gradient-conic-center-shifted-1.png b/tests/ref/gradient-conic-center-shifted-1.png new file mode 100644 index 00000000..5964b124 Binary files /dev/null and b/tests/ref/gradient-conic-center-shifted-1.png differ diff --git a/tests/ref/gradient-conic-center-shifted-2.png b/tests/ref/gradient-conic-center-shifted-2.png new file mode 100644 index 00000000..53e5da98 Binary files /dev/null and b/tests/ref/gradient-conic-center-shifted-2.png differ diff --git a/tests/ref/gradient-conic-hsl.png b/tests/ref/gradient-conic-hsl.png new file mode 100644 index 00000000..321a3b07 Binary files /dev/null and b/tests/ref/gradient-conic-hsl.png differ diff --git a/tests/ref/gradient-conic-hsv.png b/tests/ref/gradient-conic-hsv.png new file mode 100644 index 00000000..648e1fb5 Binary files /dev/null and b/tests/ref/gradient-conic-hsv.png differ diff --git a/tests/ref/gradient-conic-oklab.png b/tests/ref/gradient-conic-oklab.png new file mode 100644 index 00000000..e567eacc Binary files /dev/null and b/tests/ref/gradient-conic-oklab.png differ diff --git a/tests/ref/gradient-conic-oklch.png b/tests/ref/gradient-conic-oklch.png new file mode 100644 index 00000000..f712defa Binary files /dev/null and b/tests/ref/gradient-conic-oklch.png differ diff --git a/tests/ref/gradient-conic-relative-parent.png b/tests/ref/gradient-conic-relative-parent.png new file mode 100644 index 00000000..1685ca44 Binary files /dev/null and b/tests/ref/gradient-conic-relative-parent.png differ diff --git a/tests/ref/gradient-conic-relative-self.png b/tests/ref/gradient-conic-relative-self.png new file mode 100644 index 00000000..108fe43a Binary files /dev/null and b/tests/ref/gradient-conic-relative-self.png differ diff --git a/tests/ref/gradient-conic-stroke.png b/tests/ref/gradient-conic-stroke.png new file mode 100644 index 00000000..ae631fd4 Binary files /dev/null and b/tests/ref/gradient-conic-stroke.png differ diff --git a/tests/ref/gradient-conic-text.png b/tests/ref/gradient-conic-text.png new file mode 100644 index 00000000..1abef3cb Binary files /dev/null and b/tests/ref/gradient-conic-text.png differ diff --git a/tests/ref/gradient-conic.png b/tests/ref/gradient-conic.png new file mode 100644 index 00000000..0f5f5bad Binary files /dev/null and b/tests/ref/gradient-conic.png differ diff --git a/tests/ref/gradient-fill-and-stroke.png b/tests/ref/gradient-fill-and-stroke.png new file mode 100644 index 00000000..78563517 Binary files /dev/null and b/tests/ref/gradient-fill-and-stroke.png differ diff --git a/tests/ref/gradient-linear-angled.png b/tests/ref/gradient-linear-angled.png new file mode 100644 index 00000000..b195b128 Binary files /dev/null and b/tests/ref/gradient-linear-angled.png differ diff --git a/tests/ref/gradient-linear-hsl.png b/tests/ref/gradient-linear-hsl.png new file mode 100644 index 00000000..7bfe958b Binary files /dev/null and b/tests/ref/gradient-linear-hsl.png differ diff --git a/tests/ref/gradient-linear-hsv.png b/tests/ref/gradient-linear-hsv.png new file mode 100644 index 00000000..56b446f2 Binary files /dev/null and b/tests/ref/gradient-linear-hsv.png differ diff --git a/tests/ref/gradient-linear-line.png b/tests/ref/gradient-linear-line.png new file mode 100644 index 00000000..d32aba89 Binary files /dev/null and b/tests/ref/gradient-linear-line.png differ diff --git a/tests/ref/gradient-linear-oklab.png b/tests/ref/gradient-linear-oklab.png new file mode 100644 index 00000000..6f963c77 Binary files /dev/null and b/tests/ref/gradient-linear-oklab.png differ diff --git a/tests/ref/gradient-linear-oklch.png b/tests/ref/gradient-linear-oklch.png new file mode 100644 index 00000000..394d0935 Binary files /dev/null and b/tests/ref/gradient-linear-oklch.png differ diff --git a/tests/ref/gradient-linear-relative-parent.png b/tests/ref/gradient-linear-relative-parent.png new file mode 100644 index 00000000..2ad1286e Binary files /dev/null and b/tests/ref/gradient-linear-relative-parent.png differ diff --git a/tests/ref/gradient-linear-relative-self.png b/tests/ref/gradient-linear-relative-self.png new file mode 100644 index 00000000..d573a892 Binary files /dev/null and b/tests/ref/gradient-linear-relative-self.png differ diff --git a/tests/ref/gradient-linear-repeat-and-mirror-1.png b/tests/ref/gradient-linear-repeat-and-mirror-1.png new file mode 100644 index 00000000..9640d5e2 Binary files /dev/null and b/tests/ref/gradient-linear-repeat-and-mirror-1.png differ diff --git a/tests/ref/gradient-linear-repeat-and-mirror-2.png b/tests/ref/gradient-linear-repeat-and-mirror-2.png new file mode 100644 index 00000000..98cf2543 Binary files /dev/null and b/tests/ref/gradient-linear-repeat-and-mirror-2.png differ diff --git a/tests/ref/gradient-linear-repeat-and-mirror-3.png b/tests/ref/gradient-linear-repeat-and-mirror-3.png new file mode 100644 index 00000000..641e54c9 Binary files /dev/null and b/tests/ref/gradient-linear-repeat-and-mirror-3.png differ diff --git a/tests/ref/gradient-linear-sharp-and-repeat.png b/tests/ref/gradient-linear-sharp-and-repeat.png new file mode 100644 index 00000000..e46af7a0 Binary files /dev/null and b/tests/ref/gradient-linear-sharp-and-repeat.png differ diff --git a/tests/ref/gradient-linear-sharp-and-smooth.png b/tests/ref/gradient-linear-sharp-and-smooth.png new file mode 100644 index 00000000..5bd74d24 Binary files /dev/null and b/tests/ref/gradient-linear-sharp-and-smooth.png differ diff --git a/tests/ref/gradient-linear-sharp-repeat-and-mirror.png b/tests/ref/gradient-linear-sharp-repeat-and-mirror.png new file mode 100644 index 00000000..5b4b9817 Binary files /dev/null and b/tests/ref/gradient-linear-sharp-repeat-and-mirror.png differ diff --git a/tests/ref/gradient-linear-sharp.png b/tests/ref/gradient-linear-sharp.png new file mode 100644 index 00000000..4d63884f Binary files /dev/null and b/tests/ref/gradient-linear-sharp.png differ diff --git a/tests/ref/gradient-linear-stroke.png b/tests/ref/gradient-linear-stroke.png new file mode 100644 index 00000000..490ffec2 Binary files /dev/null and b/tests/ref/gradient-linear-stroke.png differ diff --git a/tests/ref/gradient-math-cancel.png b/tests/ref/gradient-math-cancel.png new file mode 100644 index 00000000..0769d6d3 Binary files /dev/null and b/tests/ref/gradient-math-cancel.png differ diff --git a/tests/ref/gradient-math-conic.png b/tests/ref/gradient-math-conic.png new file mode 100644 index 00000000..88ff7a85 Binary files /dev/null and b/tests/ref/gradient-math-conic.png differ diff --git a/tests/ref/gradient-math-dir.png b/tests/ref/gradient-math-dir.png new file mode 100644 index 00000000..5ed19182 Binary files /dev/null and b/tests/ref/gradient-math-dir.png differ diff --git a/tests/ref/gradient-math-frac.png b/tests/ref/gradient-math-frac.png new file mode 100644 index 00000000..1316dc47 Binary files /dev/null and b/tests/ref/gradient-math-frac.png differ diff --git a/tests/ref/gradient-math-mat.png b/tests/ref/gradient-math-mat.png new file mode 100644 index 00000000..aa3332b9 Binary files /dev/null and b/tests/ref/gradient-math-mat.png differ diff --git a/tests/ref/gradient-math-misc.png b/tests/ref/gradient-math-misc.png new file mode 100644 index 00000000..b8fbdd74 Binary files /dev/null and b/tests/ref/gradient-math-misc.png differ diff --git a/tests/ref/gradient-math-radial.png b/tests/ref/gradient-math-radial.png new file mode 100644 index 00000000..c9b966b2 Binary files /dev/null and b/tests/ref/gradient-math-radial.png differ diff --git a/tests/ref/gradient-math-root.png b/tests/ref/gradient-math-root.png new file mode 100644 index 00000000..4c2e4272 Binary files /dev/null and b/tests/ref/gradient-math-root.png differ diff --git a/tests/ref/gradient-math-underover.png b/tests/ref/gradient-math-underover.png new file mode 100644 index 00000000..89098051 Binary files /dev/null and b/tests/ref/gradient-math-underover.png differ diff --git a/tests/ref/gradient-presets.png b/tests/ref/gradient-presets.png new file mode 100644 index 00000000..0c7fabdd Binary files /dev/null and b/tests/ref/gradient-presets.png differ diff --git a/tests/ref/gradient-radial-center.png b/tests/ref/gradient-radial-center.png new file mode 100644 index 00000000..e89e1f30 Binary files /dev/null and b/tests/ref/gradient-radial-center.png differ diff --git a/tests/ref/gradient-radial-focal-center-and-radius.png b/tests/ref/gradient-radial-focal-center-and-radius.png new file mode 100644 index 00000000..4bc8a5d6 Binary files /dev/null and b/tests/ref/gradient-radial-focal-center-and-radius.png differ diff --git a/tests/ref/gradient-radial-hsl.png b/tests/ref/gradient-radial-hsl.png new file mode 100644 index 00000000..4a2ded18 Binary files /dev/null and b/tests/ref/gradient-radial-hsl.png differ diff --git a/tests/ref/gradient-radial-radius.png b/tests/ref/gradient-radial-radius.png new file mode 100644 index 00000000..1037e63f Binary files /dev/null and b/tests/ref/gradient-radial-radius.png differ diff --git a/tests/ref/gradient-radial-relative-parent.png b/tests/ref/gradient-radial-relative-parent.png new file mode 100644 index 00000000..f8addbe0 Binary files /dev/null and b/tests/ref/gradient-radial-relative-parent.png differ diff --git a/tests/ref/gradient-radial-relative-self.png b/tests/ref/gradient-radial-relative-self.png new file mode 100644 index 00000000..f5fc6836 Binary files /dev/null and b/tests/ref/gradient-radial-relative-self.png differ diff --git a/tests/ref/gradient-radial-text.png b/tests/ref/gradient-radial-text.png new file mode 100644 index 00000000..6da09878 Binary files /dev/null and b/tests/ref/gradient-radial-text.png differ diff --git a/tests/ref/gradient-repr.png b/tests/ref/gradient-repr.png new file mode 100644 index 00000000..04908e59 Binary files /dev/null and b/tests/ref/gradient-repr.png differ diff --git a/tests/ref/gradient-text-decoration.png b/tests/ref/gradient-text-decoration.png new file mode 100644 index 00000000..d1713c99 Binary files /dev/null and b/tests/ref/gradient-text-decoration.png differ diff --git a/tests/ref/gradient-text-dir.png b/tests/ref/gradient-text-dir.png new file mode 100644 index 00000000..eab56d66 Binary files /dev/null and b/tests/ref/gradient-text-dir.png differ diff --git a/tests/ref/gradient-text-global.png b/tests/ref/gradient-text-global.png new file mode 100644 index 00000000..7892fbb2 Binary files /dev/null and b/tests/ref/gradient-text-global.png differ diff --git a/tests/ref/gradient-text-in-container.png b/tests/ref/gradient-text-in-container.png new file mode 100644 index 00000000..9122a556 Binary files /dev/null and b/tests/ref/gradient-text-in-container.png differ diff --git a/tests/ref/gradient-text-rotate.png b/tests/ref/gradient-text-rotate.png new file mode 100644 index 00000000..a32cacf8 Binary files /dev/null and b/tests/ref/gradient-text-rotate.png differ diff --git a/tests/ref/gradient-transformed.png b/tests/ref/gradient-transformed.png new file mode 100644 index 00000000..2ad1286e Binary files /dev/null and b/tests/ref/gradient-transformed.png differ diff --git a/tests/ref/grid-align.png b/tests/ref/grid-align.png new file mode 100644 index 00000000..f85abf69 Binary files /dev/null and b/tests/ref/grid-align.png differ diff --git a/tests/ref/grid-auto-shrink.png b/tests/ref/grid-auto-shrink.png new file mode 100644 index 00000000..27813e26 Binary files /dev/null and b/tests/ref/grid-auto-shrink.png differ diff --git a/tests/ref/grid-breaking-expand-vertically.png b/tests/ref/grid-breaking-expand-vertically.png new file mode 100644 index 00000000..14434d7c Binary files /dev/null and b/tests/ref/grid-breaking-expand-vertically.png differ diff --git a/tests/ref/grid-calendar.png b/tests/ref/grid-calendar.png new file mode 100644 index 00000000..0609b84f Binary files /dev/null and b/tests/ref/grid-calendar.png differ diff --git a/tests/ref/grid-cell-align-override.png b/tests/ref/grid-cell-align-override.png new file mode 100644 index 00000000..8ffde97f Binary files /dev/null and b/tests/ref/grid-cell-align-override.png differ diff --git a/tests/ref/grid-cell-breaking.png b/tests/ref/grid-cell-breaking.png new file mode 100644 index 00000000..c91a3993 Binary files /dev/null and b/tests/ref/grid-cell-breaking.png differ diff --git a/tests/ref/grid-cell-folding.png b/tests/ref/grid-cell-folding.png new file mode 100644 index 00000000..ce1108c6 Binary files /dev/null and b/tests/ref/grid-cell-folding.png differ diff --git a/tests/ref/grid-cell-override-in-header-and-footer-with-gutter.png b/tests/ref/grid-cell-override-in-header-and-footer-with-gutter.png new file mode 100644 index 00000000..a475bf90 Binary files /dev/null and b/tests/ref/grid-cell-override-in-header-and-footer-with-gutter.png differ diff --git a/tests/ref/grid-cell-override-in-header-and-footer.png b/tests/ref/grid-cell-override-in-header-and-footer.png new file mode 100644 index 00000000..4d31e379 Binary files /dev/null and b/tests/ref/grid-cell-override-in-header-and-footer.png differ diff --git a/tests/ref/grid-cell-override.png b/tests/ref/grid-cell-override.png new file mode 100644 index 00000000..d6f37d63 Binary files /dev/null and b/tests/ref/grid-cell-override.png differ diff --git a/tests/ref/grid-cell-position-automatic-skip-manual.png b/tests/ref/grid-cell-position-automatic-skip-manual.png new file mode 100644 index 00000000..ec615c97 Binary files /dev/null and b/tests/ref/grid-cell-position-automatic-skip-manual.png differ diff --git a/tests/ref/grid-cell-position-extra-rows.png b/tests/ref/grid-cell-position-extra-rows.png new file mode 100644 index 00000000..4d73c3f7 Binary files /dev/null and b/tests/ref/grid-cell-position-extra-rows.png differ diff --git a/tests/ref/grid-cell-position-out-of-order.png b/tests/ref/grid-cell-position-out-of-order.png new file mode 100644 index 00000000..d6bdad46 Binary files /dev/null and b/tests/ref/grid-cell-position-out-of-order.png differ diff --git a/tests/ref/grid-cell-position-partial.png b/tests/ref/grid-cell-position-partial.png new file mode 100644 index 00000000..3012c5b5 Binary files /dev/null and b/tests/ref/grid-cell-position-partial.png differ diff --git a/tests/ref/grid-cell-set.png b/tests/ref/grid-cell-set.png new file mode 100644 index 00000000..8795e53e Binary files /dev/null and b/tests/ref/grid-cell-set.png differ diff --git a/tests/ref/grid-cell-show-and-override.png b/tests/ref/grid-cell-show-and-override.png new file mode 100644 index 00000000..6af55596 Binary files /dev/null and b/tests/ref/grid-cell-show-and-override.png differ diff --git a/tests/ref/grid-cell-show-based-on-position.png b/tests/ref/grid-cell-show-based-on-position.png new file mode 100644 index 00000000..26ad6284 Binary files /dev/null and b/tests/ref/grid-cell-show-based-on-position.png differ diff --git a/tests/ref/grid-cell-show-emph.png b/tests/ref/grid-cell-show-emph.png new file mode 100644 index 00000000..bfc03d6d Binary files /dev/null and b/tests/ref/grid-cell-show-emph.png differ diff --git a/tests/ref/grid-cell-show-x-y.png b/tests/ref/grid-cell-show-x-y.png new file mode 100644 index 00000000..0fb4c2c5 Binary files /dev/null and b/tests/ref/grid-cell-show-x-y.png differ diff --git a/tests/ref/grid-cell-show.png b/tests/ref/grid-cell-show.png new file mode 100644 index 00000000..9ac6d269 Binary files /dev/null and b/tests/ref/grid-cell-show.png differ diff --git a/tests/ref/grid-cell-various-overrides.png b/tests/ref/grid-cell-various-overrides.png new file mode 100644 index 00000000..74490e84 Binary files /dev/null and b/tests/ref/grid-cell-various-overrides.png differ diff --git a/tests/ref/grid-colspan-gutter.png b/tests/ref/grid-colspan-gutter.png new file mode 100644 index 00000000..2ba9c217 Binary files /dev/null and b/tests/ref/grid-colspan-gutter.png differ diff --git a/tests/ref/grid-colspan-multiple-regions.png b/tests/ref/grid-colspan-multiple-regions.png new file mode 100644 index 00000000..22811aca Binary files /dev/null and b/tests/ref/grid-colspan-multiple-regions.png differ diff --git a/tests/ref/grid-colspan-over-all-fr-columns-page-width-auto.png b/tests/ref/grid-colspan-over-all-fr-columns-page-width-auto.png new file mode 100644 index 00000000..b5cf6cac Binary files /dev/null and b/tests/ref/grid-colspan-over-all-fr-columns-page-width-auto.png differ diff --git a/tests/ref/grid-colspan-over-all-fr-columns.png b/tests/ref/grid-colspan-over-all-fr-columns.png new file mode 100644 index 00000000..c152f3cc Binary files /dev/null and b/tests/ref/grid-colspan-over-all-fr-columns.png differ diff --git a/tests/ref/grid-colspan-over-some-fr-columns.png b/tests/ref/grid-colspan-over-some-fr-columns.png new file mode 100644 index 00000000..5d8157c2 Binary files /dev/null and b/tests/ref/grid-colspan-over-some-fr-columns.png differ diff --git a/tests/ref/grid-colspan-thick-stroke.png b/tests/ref/grid-colspan-thick-stroke.png new file mode 100644 index 00000000..7348551e Binary files /dev/null and b/tests/ref/grid-colspan-thick-stroke.png differ diff --git a/tests/ref/grid-colspan.png b/tests/ref/grid-colspan.png new file mode 100644 index 00000000..419d23b2 Binary files /dev/null and b/tests/ref/grid-colspan.png differ diff --git a/tests/ref/grid-column-sizing-auto-base.png b/tests/ref/grid-column-sizing-auto-base.png new file mode 100644 index 00000000..75664027 Binary files /dev/null and b/tests/ref/grid-column-sizing-auto-base.png differ diff --git a/tests/ref/grid-column-sizing-fr-base.png b/tests/ref/grid-column-sizing-fr-base.png new file mode 100644 index 00000000..d4a44be7 Binary files /dev/null and b/tests/ref/grid-column-sizing-fr-base.png differ diff --git a/tests/ref/grid-column-sizing-mixed-base.png b/tests/ref/grid-column-sizing-mixed-base.png new file mode 100644 index 00000000..dc92564d Binary files /dev/null and b/tests/ref/grid-column-sizing-mixed-base.png differ diff --git a/tests/ref/grid-columns-sizings-rect.png b/tests/ref/grid-columns-sizings-rect.png new file mode 100644 index 00000000..9381103d Binary files /dev/null and b/tests/ref/grid-columns-sizings-rect.png differ diff --git a/tests/ref/grid-complete-rows.png b/tests/ref/grid-complete-rows.png new file mode 100644 index 00000000..192aa911 Binary files /dev/null and b/tests/ref/grid-complete-rows.png differ diff --git a/tests/ref/grid-consecutive-rows-breaking.png b/tests/ref/grid-consecutive-rows-breaking.png new file mode 100644 index 00000000..6000271d Binary files /dev/null and b/tests/ref/grid-consecutive-rows-breaking.png differ diff --git a/tests/ref/grid-exam.png b/tests/ref/grid-exam.png new file mode 100644 index 00000000..97edd52e Binary files /dev/null and b/tests/ref/grid-exam.png differ diff --git a/tests/ref/grid-fill-func.png b/tests/ref/grid-fill-func.png new file mode 100644 index 00000000..388a52df Binary files /dev/null and b/tests/ref/grid-fill-func.png differ diff --git a/tests/ref/grid-finance.png b/tests/ref/grid-finance.png new file mode 100644 index 00000000..2ea48594 Binary files /dev/null and b/tests/ref/grid-finance.png differ diff --git a/tests/ref/grid-footer-bare-1.png b/tests/ref/grid-footer-bare-1.png new file mode 100644 index 00000000..e8c8b21a Binary files /dev/null and b/tests/ref/grid-footer-bare-1.png differ diff --git a/tests/ref/grid-footer-bare-2.png b/tests/ref/grid-footer-bare-2.png new file mode 100644 index 00000000..bad6a3dd Binary files /dev/null and b/tests/ref/grid-footer-bare-2.png differ diff --git a/tests/ref/grid-footer-below-rowspans.png b/tests/ref/grid-footer-below-rowspans.png new file mode 100644 index 00000000..5c3a2b26 Binary files /dev/null and b/tests/ref/grid-footer-below-rowspans.png differ diff --git a/tests/ref/grid-footer-cell-with-y.png b/tests/ref/grid-footer-cell-with-y.png new file mode 100644 index 00000000..3237ea69 Binary files /dev/null and b/tests/ref/grid-footer-cell-with-y.png differ diff --git a/tests/ref/grid-footer-expand.png b/tests/ref/grid-footer-expand.png new file mode 100644 index 00000000..118765d5 Binary files /dev/null and b/tests/ref/grid-footer-expand.png differ diff --git a/tests/ref/grid-footer-gutter-and-no-repeat.png b/tests/ref/grid-footer-gutter-and-no-repeat.png new file mode 100644 index 00000000..ea36ae03 Binary files /dev/null and b/tests/ref/grid-footer-gutter-and-no-repeat.png differ diff --git a/tests/ref/grid-footer-hline-and-vline-1.png b/tests/ref/grid-footer-hline-and-vline-1.png new file mode 100644 index 00000000..a4d9a681 Binary files /dev/null and b/tests/ref/grid-footer-hline-and-vline-1.png differ diff --git a/tests/ref/grid-footer-hline-and-vline-2.png b/tests/ref/grid-footer-hline-and-vline-2.png new file mode 100644 index 00000000..0ad2bacc Binary files /dev/null and b/tests/ref/grid-footer-hline-and-vline-2.png differ diff --git a/tests/ref/grid-footer-relative-row-sizes.png b/tests/ref/grid-footer-relative-row-sizes.png new file mode 100644 index 00000000..b533f13f Binary files /dev/null and b/tests/ref/grid-footer-relative-row-sizes.png differ diff --git a/tests/ref/grid-footer-rowspan.png b/tests/ref/grid-footer-rowspan.png new file mode 100644 index 00000000..369e4d07 Binary files /dev/null and b/tests/ref/grid-footer-rowspan.png differ diff --git a/tests/ref/grid-footer-stroke-edge-cases.png b/tests/ref/grid-footer-stroke-edge-cases.png new file mode 100644 index 00000000..c3db98e7 Binary files /dev/null and b/tests/ref/grid-footer-stroke-edge-cases.png differ diff --git a/tests/ref/grid-footer-top-stroke.png b/tests/ref/grid-footer-top-stroke.png new file mode 100644 index 00000000..ff9aa9f0 Binary files /dev/null and b/tests/ref/grid-footer-top-stroke.png differ diff --git a/tests/ref/grid-footer.png b/tests/ref/grid-footer.png new file mode 100644 index 00000000..196563c7 Binary files /dev/null and b/tests/ref/grid-footer.png differ diff --git a/tests/ref/grid-funcs-gutter.png b/tests/ref/grid-funcs-gutter.png new file mode 100644 index 00000000..ee6723ef Binary files /dev/null and b/tests/ref/grid-funcs-gutter.png differ diff --git a/tests/ref/grid-gutter-fr.png b/tests/ref/grid-gutter-fr.png new file mode 100644 index 00000000..2fce6949 Binary files /dev/null and b/tests/ref/grid-gutter-fr.png differ diff --git a/tests/ref/grid-header-and-footer-containing-rowspan.png b/tests/ref/grid-header-and-footer-containing-rowspan.png new file mode 100644 index 00000000..705d72a4 Binary files /dev/null and b/tests/ref/grid-header-and-footer-containing-rowspan.png differ diff --git a/tests/ref/grid-header-and-footer-empty.png b/tests/ref/grid-header-and-footer-empty.png new file mode 100644 index 00000000..c4e7bb0e Binary files /dev/null and b/tests/ref/grid-header-and-footer-empty.png differ diff --git a/tests/ref/grid-header-and-footer-lack-of-space.png b/tests/ref/grid-header-and-footer-lack-of-space.png new file mode 100644 index 00000000..78705776 Binary files /dev/null and b/tests/ref/grid-header-and-footer-lack-of-space.png differ diff --git a/tests/ref/grid-header-and-footer-orphan-prevention.png b/tests/ref/grid-header-and-footer-orphan-prevention.png new file mode 100644 index 00000000..8253b657 Binary files /dev/null and b/tests/ref/grid-header-and-footer-orphan-prevention.png differ diff --git a/tests/ref/grid-header-and-rowspan-non-contiguous-1.png b/tests/ref/grid-header-and-rowspan-non-contiguous-1.png new file mode 100644 index 00000000..d5088a12 Binary files /dev/null and b/tests/ref/grid-header-and-rowspan-non-contiguous-1.png differ diff --git a/tests/ref/grid-header-and-rowspan-non-contiguous-2.png b/tests/ref/grid-header-and-rowspan-non-contiguous-2.png new file mode 100644 index 00000000..4894d141 Binary files /dev/null and b/tests/ref/grid-header-and-rowspan-non-contiguous-2.png differ diff --git a/tests/ref/grid-header-and-rowspan-non-contiguous-3.png b/tests/ref/grid-header-and-rowspan-non-contiguous-3.png new file mode 100644 index 00000000..36e9a3c3 Binary files /dev/null and b/tests/ref/grid-header-and-rowspan-non-contiguous-3.png differ diff --git a/tests/ref/grid-header-block-with-fixed-height.png b/tests/ref/grid-header-block-with-fixed-height.png new file mode 100644 index 00000000..b7f2eedb Binary files /dev/null and b/tests/ref/grid-header-block-with-fixed-height.png differ diff --git a/tests/ref/grid-header-cell-with-y.png b/tests/ref/grid-header-cell-with-y.png new file mode 100644 index 00000000..e54e35fa Binary files /dev/null and b/tests/ref/grid-header-cell-with-y.png differ diff --git a/tests/ref/grid-header-containing-rowspan.png b/tests/ref/grid-header-containing-rowspan.png new file mode 100644 index 00000000..3cabff9e Binary files /dev/null and b/tests/ref/grid-header-containing-rowspan.png differ diff --git a/tests/ref/grid-header-empty.png b/tests/ref/grid-header-empty.png new file mode 100644 index 00000000..20e4d92c Binary files /dev/null and b/tests/ref/grid-header-empty.png differ diff --git a/tests/ref/grid-header-expand.png b/tests/ref/grid-header-expand.png new file mode 100644 index 00000000..46572441 Binary files /dev/null and b/tests/ref/grid-header-expand.png differ diff --git a/tests/ref/grid-header-footer-and-rowspan-non-contiguous-1.png b/tests/ref/grid-header-footer-and-rowspan-non-contiguous-1.png new file mode 100644 index 00000000..e7b153c8 Binary files /dev/null and b/tests/ref/grid-header-footer-and-rowspan-non-contiguous-1.png differ diff --git a/tests/ref/grid-header-footer-and-rowspan-non-contiguous-2.png b/tests/ref/grid-header-footer-and-rowspan-non-contiguous-2.png new file mode 100644 index 00000000..525475ac Binary files /dev/null and b/tests/ref/grid-header-footer-and-rowspan-non-contiguous-2.png differ diff --git a/tests/ref/grid-header-footer-block-with-fixed-height.png b/tests/ref/grid-header-footer-block-with-fixed-height.png new file mode 100644 index 00000000..1f2e7c20 Binary files /dev/null and b/tests/ref/grid-header-footer-block-with-fixed-height.png differ diff --git a/tests/ref/grid-header-hline-and-vline.png b/tests/ref/grid-header-hline-and-vline.png new file mode 100644 index 00000000..a01fc00b Binary files /dev/null and b/tests/ref/grid-header-hline-and-vline.png differ diff --git a/tests/ref/grid-header-hline-bottom-manually.png b/tests/ref/grid-header-hline-bottom-manually.png new file mode 100644 index 00000000..d944f7b5 Binary files /dev/null and b/tests/ref/grid-header-hline-bottom-manually.png differ diff --git a/tests/ref/grid-header-hline-bottom.png b/tests/ref/grid-header-hline-bottom.png new file mode 100644 index 00000000..f1361242 Binary files /dev/null and b/tests/ref/grid-header-hline-bottom.png differ diff --git a/tests/ref/grid-header-lack-of-space.png b/tests/ref/grid-header-lack-of-space.png new file mode 100644 index 00000000..4d2b483f Binary files /dev/null and b/tests/ref/grid-header-lack-of-space.png differ diff --git a/tests/ref/grid-header-last-child.png b/tests/ref/grid-header-last-child.png new file mode 100644 index 00000000..4fa1ff7c Binary files /dev/null and b/tests/ref/grid-header-last-child.png differ diff --git a/tests/ref/grid-header-nested.png b/tests/ref/grid-header-nested.png new file mode 100644 index 00000000..9078090f Binary files /dev/null and b/tests/ref/grid-header-nested.png differ diff --git a/tests/ref/grid-header-orphan-prevention.png b/tests/ref/grid-header-orphan-prevention.png new file mode 100644 index 00000000..fa903e42 Binary files /dev/null and b/tests/ref/grid-header-orphan-prevention.png differ diff --git a/tests/ref/grid-header-relative-row-sizes.png b/tests/ref/grid-header-relative-row-sizes.png new file mode 100644 index 00000000..69ed1d1e Binary files /dev/null and b/tests/ref/grid-header-relative-row-sizes.png differ diff --git a/tests/ref/grid-header-rowspan-base.png b/tests/ref/grid-header-rowspan-base.png new file mode 100644 index 00000000..1ab83591 Binary files /dev/null and b/tests/ref/grid-header-rowspan-base.png differ diff --git a/tests/ref/grid-header-stroke-edge-cases.png b/tests/ref/grid-header-stroke-edge-cases.png new file mode 100644 index 00000000..b86eb632 Binary files /dev/null and b/tests/ref/grid-header-stroke-edge-cases.png differ diff --git a/tests/ref/grid-headers-gutter.png b/tests/ref/grid-headers-gutter.png new file mode 100644 index 00000000..c2a48a66 Binary files /dev/null and b/tests/ref/grid-headers-gutter.png differ diff --git a/tests/ref/grid-headers-no-repeat.png b/tests/ref/grid-headers-no-repeat.png new file mode 100644 index 00000000..32d281a1 Binary files /dev/null and b/tests/ref/grid-headers-no-repeat.png differ diff --git a/tests/ref/grid-headers.png b/tests/ref/grid-headers.png new file mode 100644 index 00000000..13e88dbe Binary files /dev/null and b/tests/ref/grid-headers.png differ diff --git a/tests/ref/grid-inset-folding.png b/tests/ref/grid-inset-folding.png new file mode 100644 index 00000000..7f994264 Binary files /dev/null and b/tests/ref/grid-inset-folding.png differ diff --git a/tests/ref/grid-inset.png b/tests/ref/grid-inset.png new file mode 100644 index 00000000..d31197d0 Binary files /dev/null and b/tests/ref/grid-inset.png differ diff --git a/tests/ref/grid-nested-breaking.png b/tests/ref/grid-nested-breaking.png new file mode 100644 index 00000000..b203c230 Binary files /dev/null and b/tests/ref/grid-nested-breaking.png differ diff --git a/tests/ref/grid-nested-footers.png b/tests/ref/grid-nested-footers.png new file mode 100644 index 00000000..1af85a00 Binary files /dev/null and b/tests/ref/grid-nested-footers.png differ diff --git a/tests/ref/grid-nested-headers.png b/tests/ref/grid-nested-headers.png new file mode 100644 index 00000000..e714dcc4 Binary files /dev/null and b/tests/ref/grid-nested-headers.png differ diff --git a/tests/ref/grid-nested-with-footers.png b/tests/ref/grid-nested-with-footers.png new file mode 100644 index 00000000..5ceae877 Binary files /dev/null and b/tests/ref/grid-nested-with-footers.png differ diff --git a/tests/ref/grid-nested-with-headers.png b/tests/ref/grid-nested-with-headers.png new file mode 100644 index 00000000..6b7ef14b Binary files /dev/null and b/tests/ref/grid-nested-with-headers.png differ diff --git a/tests/ref/grid-row-sizing-manual-align.png b/tests/ref/grid-row-sizing-manual-align.png new file mode 100644 index 00000000..68b0911e Binary files /dev/null and b/tests/ref/grid-row-sizing-manual-align.png differ diff --git a/tests/ref/grid-rowspan-block-full-height.png b/tests/ref/grid-rowspan-block-full-height.png new file mode 100644 index 00000000..078cbda4 Binary files /dev/null and b/tests/ref/grid-rowspan-block-full-height.png differ diff --git a/tests/ref/grid-rowspan-block-overflow.png b/tests/ref/grid-rowspan-block-overflow.png new file mode 100644 index 00000000..78e26d72 Binary files /dev/null and b/tests/ref/grid-rowspan-block-overflow.png differ diff --git a/tests/ref/grid-rowspan-cell-coordinates.png b/tests/ref/grid-rowspan-cell-coordinates.png new file mode 100644 index 00000000..ebe19fd4 Binary files /dev/null and b/tests/ref/grid-rowspan-cell-coordinates.png differ diff --git a/tests/ref/grid-rowspan-cell-order.png b/tests/ref/grid-rowspan-cell-order.png new file mode 100644 index 00000000..c9b1f554 Binary files /dev/null and b/tests/ref/grid-rowspan-cell-order.png differ diff --git a/tests/ref/grid-rowspan-excessive-gutter.png b/tests/ref/grid-rowspan-excessive-gutter.png new file mode 100644 index 00000000..8688364c Binary files /dev/null and b/tests/ref/grid-rowspan-excessive-gutter.png differ diff --git a/tests/ref/grid-rowspan-excessive.png b/tests/ref/grid-rowspan-excessive.png new file mode 100644 index 00000000..1e6b4128 Binary files /dev/null and b/tests/ref/grid-rowspan-excessive.png differ diff --git a/tests/ref/grid-rowspan-fixed-size.png b/tests/ref/grid-rowspan-fixed-size.png new file mode 100644 index 00000000..c9ae3fa1 Binary files /dev/null and b/tests/ref/grid-rowspan-fixed-size.png differ diff --git a/tests/ref/grid-rowspan-gutter.png b/tests/ref/grid-rowspan-gutter.png new file mode 100644 index 00000000..b37a1cab Binary files /dev/null and b/tests/ref/grid-rowspan-gutter.png differ diff --git a/tests/ref/grid-rowspan-in-all-columns-stroke-gutter.png b/tests/ref/grid-rowspan-in-all-columns-stroke-gutter.png new file mode 100644 index 00000000..edad2f01 Binary files /dev/null and b/tests/ref/grid-rowspan-in-all-columns-stroke-gutter.png differ diff --git a/tests/ref/grid-rowspan-in-all-columns-stroke.png b/tests/ref/grid-rowspan-in-all-columns-stroke.png new file mode 100644 index 00000000..135d1911 Binary files /dev/null and b/tests/ref/grid-rowspan-in-all-columns-stroke.png differ diff --git a/tests/ref/grid-rowspan-over-auto-row.png b/tests/ref/grid-rowspan-over-auto-row.png new file mode 100644 index 00000000..45037382 Binary files /dev/null and b/tests/ref/grid-rowspan-over-auto-row.png differ diff --git a/tests/ref/grid-rowspan-over-fr-row-at-end.png b/tests/ref/grid-rowspan-over-fr-row-at-end.png new file mode 100644 index 00000000..1cf8b9fc Binary files /dev/null and b/tests/ref/grid-rowspan-over-fr-row-at-end.png differ diff --git a/tests/ref/grid-rowspan-over-fr-row-at-start.png b/tests/ref/grid-rowspan-over-fr-row-at-start.png new file mode 100644 index 00000000..577db916 Binary files /dev/null and b/tests/ref/grid-rowspan-over-fr-row-at-start.png differ diff --git a/tests/ref/grid-rowspan-split-1.png b/tests/ref/grid-rowspan-split-1.png new file mode 100644 index 00000000..e99b105f Binary files /dev/null and b/tests/ref/grid-rowspan-split-1.png differ diff --git a/tests/ref/grid-rowspan-split-10.png b/tests/ref/grid-rowspan-split-10.png new file mode 100644 index 00000000..0b907e7d Binary files /dev/null and b/tests/ref/grid-rowspan-split-10.png differ diff --git a/tests/ref/grid-rowspan-split-11.png b/tests/ref/grid-rowspan-split-11.png new file mode 100644 index 00000000..202665d6 Binary files /dev/null and b/tests/ref/grid-rowspan-split-11.png differ diff --git a/tests/ref/grid-rowspan-split-12.png b/tests/ref/grid-rowspan-split-12.png new file mode 100644 index 00000000..3d8985f2 Binary files /dev/null and b/tests/ref/grid-rowspan-split-12.png differ diff --git a/tests/ref/grid-rowspan-split-13.png b/tests/ref/grid-rowspan-split-13.png new file mode 100644 index 00000000..f4e9d694 Binary files /dev/null and b/tests/ref/grid-rowspan-split-13.png differ diff --git a/tests/ref/grid-rowspan-split-14.png b/tests/ref/grid-rowspan-split-14.png new file mode 100644 index 00000000..1500a89b Binary files /dev/null and b/tests/ref/grid-rowspan-split-14.png differ diff --git a/tests/ref/grid-rowspan-split-15.png b/tests/ref/grid-rowspan-split-15.png new file mode 100644 index 00000000..445f0a95 Binary files /dev/null and b/tests/ref/grid-rowspan-split-15.png differ diff --git a/tests/ref/grid-rowspan-split-16.png b/tests/ref/grid-rowspan-split-16.png new file mode 100644 index 00000000..fff83aeb Binary files /dev/null and b/tests/ref/grid-rowspan-split-16.png differ diff --git a/tests/ref/grid-rowspan-split-17.png b/tests/ref/grid-rowspan-split-17.png new file mode 100644 index 00000000..2224c194 Binary files /dev/null and b/tests/ref/grid-rowspan-split-17.png differ diff --git a/tests/ref/grid-rowspan-split-2.png b/tests/ref/grid-rowspan-split-2.png new file mode 100644 index 00000000..43a5eed7 Binary files /dev/null and b/tests/ref/grid-rowspan-split-2.png differ diff --git a/tests/ref/grid-rowspan-split-3.png b/tests/ref/grid-rowspan-split-3.png new file mode 100644 index 00000000..0d7c3359 Binary files /dev/null and b/tests/ref/grid-rowspan-split-3.png differ diff --git a/tests/ref/grid-rowspan-split-4.png b/tests/ref/grid-rowspan-split-4.png new file mode 100644 index 00000000..2af887bb Binary files /dev/null and b/tests/ref/grid-rowspan-split-4.png differ diff --git a/tests/ref/grid-rowspan-split-5.png b/tests/ref/grid-rowspan-split-5.png new file mode 100644 index 00000000..3aa79cda Binary files /dev/null and b/tests/ref/grid-rowspan-split-5.png differ diff --git a/tests/ref/grid-rowspan-split-6.png b/tests/ref/grid-rowspan-split-6.png new file mode 100644 index 00000000..fbf5bf28 Binary files /dev/null and b/tests/ref/grid-rowspan-split-6.png differ diff --git a/tests/ref/grid-rowspan-split-7.png b/tests/ref/grid-rowspan-split-7.png new file mode 100644 index 00000000..00e03f02 Binary files /dev/null and b/tests/ref/grid-rowspan-split-7.png differ diff --git a/tests/ref/grid-rowspan-split-8.png b/tests/ref/grid-rowspan-split-8.png new file mode 100644 index 00000000..405b5423 Binary files /dev/null and b/tests/ref/grid-rowspan-split-8.png differ diff --git a/tests/ref/grid-rowspan-split-9.png b/tests/ref/grid-rowspan-split-9.png new file mode 100644 index 00000000..5346be71 Binary files /dev/null and b/tests/ref/grid-rowspan-split-9.png differ diff --git a/tests/ref/grid-rowspan-unbreakable-1.png b/tests/ref/grid-rowspan-unbreakable-1.png new file mode 100644 index 00000000..6112c069 Binary files /dev/null and b/tests/ref/grid-rowspan-unbreakable-1.png differ diff --git a/tests/ref/grid-rowspan-unbreakable-2.png b/tests/ref/grid-rowspan-unbreakable-2.png new file mode 100644 index 00000000..8e4a222a Binary files /dev/null and b/tests/ref/grid-rowspan-unbreakable-2.png differ diff --git a/tests/ref/grid-rowspan.png b/tests/ref/grid-rowspan.png new file mode 100644 index 00000000..87ad4180 Binary files /dev/null and b/tests/ref/grid-rowspan.png differ diff --git a/tests/ref/grid-rtl-colspan-stroke.png b/tests/ref/grid-rtl-colspan-stroke.png new file mode 100644 index 00000000..248a575c Binary files /dev/null and b/tests/ref/grid-rtl-colspan-stroke.png differ diff --git a/tests/ref/grid-rtl-colspan.png b/tests/ref/grid-rtl-colspan.png new file mode 100644 index 00000000..886e276d Binary files /dev/null and b/tests/ref/grid-rtl-colspan.png differ diff --git a/tests/ref/grid-rtl-complex.png b/tests/ref/grid-rtl-complex.png new file mode 100644 index 00000000..a4177548 Binary files /dev/null and b/tests/ref/grid-rtl-complex.png differ diff --git a/tests/ref/grid-rtl-header.png b/tests/ref/grid-rtl-header.png new file mode 100644 index 00000000..1ed532c3 Binary files /dev/null and b/tests/ref/grid-rtl-header.png differ diff --git a/tests/ref/grid-rtl-multiple-regions.png b/tests/ref/grid-rtl-multiple-regions.png new file mode 100644 index 00000000..a9ec7340 Binary files /dev/null and b/tests/ref/grid-rtl-multiple-regions.png differ diff --git a/tests/ref/grid-rtl-rowspan.png b/tests/ref/grid-rtl-rowspan.png new file mode 100644 index 00000000..2465164b Binary files /dev/null and b/tests/ref/grid-rtl-rowspan.png differ diff --git a/tests/ref/grid-rtl-vline-position.png b/tests/ref/grid-rtl-vline-position.png new file mode 100644 index 00000000..3612fc9f Binary files /dev/null and b/tests/ref/grid-rtl-vline-position.png differ diff --git a/tests/ref/grid-rtl.png b/tests/ref/grid-rtl.png new file mode 100644 index 00000000..c40fc588 Binary files /dev/null and b/tests/ref/grid-rtl.png differ diff --git a/tests/ref/grid-same-row-multiple-columns-breaking.png b/tests/ref/grid-same-row-multiple-columns-breaking.png new file mode 100644 index 00000000..b440f336 Binary files /dev/null and b/tests/ref/grid-same-row-multiple-columns-breaking.png differ diff --git a/tests/ref/grid-stroke-array.png b/tests/ref/grid-stroke-array.png new file mode 100644 index 00000000..6f8e28b0 Binary files /dev/null and b/tests/ref/grid-stroke-array.png differ diff --git a/tests/ref/grid-stroke-automatically-positioned-lines.png b/tests/ref/grid-stroke-automatically-positioned-lines.png new file mode 100644 index 00000000..2118112c Binary files /dev/null and b/tests/ref/grid-stroke-automatically-positioned-lines.png differ diff --git a/tests/ref/grid-stroke-border-partial.png b/tests/ref/grid-stroke-border-partial.png new file mode 100644 index 00000000..ffd8835f Binary files /dev/null and b/tests/ref/grid-stroke-border-partial.png differ diff --git a/tests/ref/grid-stroke-complex.png b/tests/ref/grid-stroke-complex.png new file mode 100644 index 00000000..e68fd5f3 Binary files /dev/null and b/tests/ref/grid-stroke-complex.png differ diff --git a/tests/ref/grid-stroke-field-in-show.png b/tests/ref/grid-stroke-field-in-show.png new file mode 100644 index 00000000..695868c0 Binary files /dev/null and b/tests/ref/grid-stroke-field-in-show.png differ diff --git a/tests/ref/grid-stroke-folding.png b/tests/ref/grid-stroke-folding.png new file mode 100644 index 00000000..0f2d5960 Binary files /dev/null and b/tests/ref/grid-stroke-folding.png differ diff --git a/tests/ref/grid-stroke-func.png b/tests/ref/grid-stroke-func.png new file mode 100644 index 00000000..954e90df Binary files /dev/null and b/tests/ref/grid-stroke-func.png differ diff --git a/tests/ref/grid-stroke-hline-position-bottom-gutter.png b/tests/ref/grid-stroke-hline-position-bottom-gutter.png new file mode 100644 index 00000000..23c7def4 Binary files /dev/null and b/tests/ref/grid-stroke-hline-position-bottom-gutter.png differ diff --git a/tests/ref/grid-stroke-hline-position-bottom.png b/tests/ref/grid-stroke-hline-position-bottom.png new file mode 100644 index 00000000..25c003c8 Binary files /dev/null and b/tests/ref/grid-stroke-hline-position-bottom.png differ diff --git a/tests/ref/grid-stroke-hline-rowspan.png b/tests/ref/grid-stroke-hline-rowspan.png new file mode 100644 index 00000000..2faf7079 Binary files /dev/null and b/tests/ref/grid-stroke-hline-rowspan.png differ diff --git a/tests/ref/grid-stroke-manually-positioned-lines.png b/tests/ref/grid-stroke-manually-positioned-lines.png new file mode 100644 index 00000000..a8a75ee0 Binary files /dev/null and b/tests/ref/grid-stroke-manually-positioned-lines.png differ diff --git a/tests/ref/grid-stroke-none.png b/tests/ref/grid-stroke-none.png new file mode 100644 index 00000000..3f978bd3 Binary files /dev/null and b/tests/ref/grid-stroke-none.png differ diff --git a/tests/ref/grid-stroke-pattern.png b/tests/ref/grid-stroke-pattern.png new file mode 100644 index 00000000..15e846ea Binary files /dev/null and b/tests/ref/grid-stroke-pattern.png differ diff --git a/tests/ref/grid-stroke-priority-cell.png b/tests/ref/grid-stroke-priority-cell.png new file mode 100644 index 00000000..2c28e9e8 Binary files /dev/null and b/tests/ref/grid-stroke-priority-cell.png differ diff --git a/tests/ref/grid-stroke-priority-line-cell.png b/tests/ref/grid-stroke-priority-line-cell.png new file mode 100644 index 00000000..064dc1c9 Binary files /dev/null and b/tests/ref/grid-stroke-priority-line-cell.png differ diff --git a/tests/ref/grid-stroke-priority-line.png b/tests/ref/grid-stroke-priority-line.png new file mode 100644 index 00000000..1bcaa2ee Binary files /dev/null and b/tests/ref/grid-stroke-priority-line.png differ diff --git a/tests/ref/grid-stroke-set-on-cell-and-line.png b/tests/ref/grid-stroke-set-on-cell-and-line.png new file mode 100644 index 00000000..d43752f0 Binary files /dev/null and b/tests/ref/grid-stroke-set-on-cell-and-line.png differ diff --git a/tests/ref/grid-stroke-vline-colspan.png b/tests/ref/grid-stroke-vline-colspan.png new file mode 100644 index 00000000..7b381437 Binary files /dev/null and b/tests/ref/grid-stroke-vline-colspan.png differ diff --git a/tests/ref/grid-stroke-vline-position-left-and-right.png b/tests/ref/grid-stroke-vline-position-left-and-right.png new file mode 100644 index 00000000..852fcf29 Binary files /dev/null and b/tests/ref/grid-stroke-vline-position-left-and-right.png differ diff --git a/tests/ref/grid-trailing-linebreak-region-overflow.png b/tests/ref/grid-trailing-linebreak-region-overflow.png new file mode 100644 index 00000000..4f7bc852 Binary files /dev/null and b/tests/ref/grid-trailing-linebreak-region-overflow.png differ diff --git a/tests/ref/heading-basic.png b/tests/ref/heading-basic.png new file mode 100644 index 00000000..74a8f2ce Binary files /dev/null and b/tests/ref/heading-basic.png differ diff --git a/tests/ref/heading-block.png b/tests/ref/heading-block.png new file mode 100644 index 00000000..595f18f5 Binary files /dev/null and b/tests/ref/heading-block.png differ diff --git a/tests/ref/heading-offset-and-level.png b/tests/ref/heading-offset-and-level.png new file mode 100644 index 00000000..9277e770 Binary files /dev/null and b/tests/ref/heading-offset-and-level.png differ diff --git a/tests/ref/heading-offset.png b/tests/ref/heading-offset.png new file mode 100644 index 00000000..3a3670cc Binary files /dev/null and b/tests/ref/heading-offset.png differ diff --git a/tests/ref/heading-show-where.png b/tests/ref/heading-show-where.png new file mode 100644 index 00000000..609e6ec9 Binary files /dev/null and b/tests/ref/heading-show-where.png differ diff --git a/tests/ref/heading-syntax-at-start.png b/tests/ref/heading-syntax-at-start.png new file mode 100644 index 00000000..29b824e0 Binary files /dev/null and b/tests/ref/heading-syntax-at-start.png differ diff --git a/tests/ref/heading-syntax-edge-cases.png b/tests/ref/heading-syntax-edge-cases.png new file mode 100644 index 00000000..372e1a65 Binary files /dev/null and b/tests/ref/heading-syntax-edge-cases.png differ diff --git a/tests/ref/hide-image.png b/tests/ref/hide-image.png new file mode 100644 index 00000000..78bc690c Binary files /dev/null and b/tests/ref/hide-image.png differ diff --git a/tests/ref/hide-line.png b/tests/ref/hide-line.png new file mode 100644 index 00000000..7d8fa6cd Binary files /dev/null and b/tests/ref/hide-line.png differ diff --git a/tests/ref/hide-list.png b/tests/ref/hide-list.png new file mode 100644 index 00000000..055f7b66 Binary files /dev/null and b/tests/ref/hide-list.png differ diff --git a/tests/ref/hide-polygon.png b/tests/ref/hide-polygon.png new file mode 100644 index 00000000..5c74eb41 Binary files /dev/null and b/tests/ref/hide-polygon.png differ diff --git a/tests/ref/hide-rect.png b/tests/ref/hide-rect.png new file mode 100644 index 00000000..62372c21 Binary files /dev/null and b/tests/ref/hide-rect.png differ diff --git a/tests/ref/hide-table.png b/tests/ref/hide-table.png new file mode 100644 index 00000000..e3d890d7 Binary files /dev/null and b/tests/ref/hide-table.png differ diff --git a/tests/ref/hide-text.png b/tests/ref/hide-text.png new file mode 100644 index 00000000..1136038c Binary files /dev/null and b/tests/ref/hide-text.png differ diff --git a/tests/ref/highlight-bounds.png b/tests/ref/highlight-bounds.png new file mode 100644 index 00000000..ed868c29 Binary files /dev/null and b/tests/ref/highlight-bounds.png differ diff --git a/tests/ref/highlight-edges-bounds.png b/tests/ref/highlight-edges-bounds.png new file mode 100644 index 00000000..f78f3cc3 Binary files /dev/null and b/tests/ref/highlight-edges-bounds.png differ diff --git a/tests/ref/highlight-edges.png b/tests/ref/highlight-edges.png new file mode 100644 index 00000000..ca48707f Binary files /dev/null and b/tests/ref/highlight-edges.png differ diff --git a/tests/ref/highlight-radius.png b/tests/ref/highlight-radius.png new file mode 100644 index 00000000..3baa3e6d Binary files /dev/null and b/tests/ref/highlight-radius.png differ diff --git a/tests/ref/highlight-stroke.png b/tests/ref/highlight-stroke.png new file mode 100644 index 00000000..5a8ad3b5 Binary files /dev/null and b/tests/ref/highlight-stroke.png differ diff --git a/tests/ref/highlight.png b/tests/ref/highlight.png new file mode 100644 index 00000000..0047b7f4 Binary files /dev/null and b/tests/ref/highlight.png differ diff --git a/tests/ref/hyphenate-between-shape-runs.png b/tests/ref/hyphenate-between-shape-runs.png new file mode 100644 index 00000000..a365af24 Binary files /dev/null and b/tests/ref/hyphenate-between-shape-runs.png differ diff --git a/tests/ref/hyphenate-off-temporarily.png b/tests/ref/hyphenate-off-temporarily.png new file mode 100644 index 00000000..48e3caa9 Binary files /dev/null and b/tests/ref/hyphenate-off-temporarily.png differ diff --git a/tests/ref/hyphenate-punctuation.png b/tests/ref/hyphenate-punctuation.png new file mode 100644 index 00000000..897a15a0 Binary files /dev/null and b/tests/ref/hyphenate-punctuation.png differ diff --git a/tests/ref/hyphenate-shy.png b/tests/ref/hyphenate-shy.png new file mode 100644 index 00000000..a548c711 Binary files /dev/null and b/tests/ref/hyphenate-shy.png differ diff --git a/tests/ref/hyphenate.png b/tests/ref/hyphenate.png new file mode 100644 index 00000000..c01c9021 Binary files /dev/null and b/tests/ref/hyphenate.png differ diff --git a/tests/ref/if-condition-complex.png b/tests/ref/if-condition-complex.png new file mode 100644 index 00000000..4cbebc5e Binary files /dev/null and b/tests/ref/if-condition-complex.png differ diff --git a/tests/ref/if-markup.png b/tests/ref/if-markup.png new file mode 100644 index 00000000..57eb47da Binary files /dev/null and b/tests/ref/if-markup.png differ diff --git a/tests/ref/image-baseline-with-box.png b/tests/ref/image-baseline-with-box.png new file mode 100644 index 00000000..41128069 Binary files /dev/null and b/tests/ref/image-baseline-with-box.png differ diff --git a/tests/ref/image-decode-detect-format.png b/tests/ref/image-decode-detect-format.png new file mode 100644 index 00000000..6f12e8b4 Binary files /dev/null and b/tests/ref/image-decode-detect-format.png differ diff --git a/tests/ref/image-decode-specify-format.png b/tests/ref/image-decode-specify-format.png new file mode 100644 index 00000000..6f12e8b4 Binary files /dev/null and b/tests/ref/image-decode-specify-format.png differ diff --git a/tests/ref/image-decode-svg.png b/tests/ref/image-decode-svg.png new file mode 100644 index 00000000..b7cfcb17 Binary files /dev/null and b/tests/ref/image-decode-svg.png differ diff --git a/tests/ref/image-fit.png b/tests/ref/image-fit.png new file mode 100644 index 00000000..5a3bdec1 Binary files /dev/null and b/tests/ref/image-fit.png differ diff --git a/tests/ref/image-jump-to-next-page.png b/tests/ref/image-jump-to-next-page.png new file mode 100644 index 00000000..d8f03b3f Binary files /dev/null and b/tests/ref/image-jump-to-next-page.png differ diff --git a/tests/ref/image-natural-dpi-sizing.png b/tests/ref/image-natural-dpi-sizing.png new file mode 100644 index 00000000..3b9f3fa5 Binary files /dev/null and b/tests/ref/image-natural-dpi-sizing.png differ diff --git a/tests/ref/image-rgba-png-and-jpeg.png b/tests/ref/image-rgba-png-and-jpeg.png new file mode 100644 index 00000000..60127170 Binary files /dev/null and b/tests/ref/image-rgba-png-and-jpeg.png differ diff --git a/tests/ref/image-sizing.png b/tests/ref/image-sizing.png new file mode 100644 index 00000000..7419de14 Binary files /dev/null and b/tests/ref/image-sizing.png differ diff --git a/tests/ref/image-svg-complex.png b/tests/ref/image-svg-complex.png new file mode 100644 index 00000000..1ac45477 Binary files /dev/null and b/tests/ref/image-svg-complex.png differ diff --git a/tests/ref/image-svg-text-font.png b/tests/ref/image-svg-text-font.png new file mode 100644 index 00000000..2e3b0a0f Binary files /dev/null and b/tests/ref/image-svg-text-font.png differ diff --git a/tests/ref/image-svg-text.png b/tests/ref/image-svg-text.png new file mode 100644 index 00000000..2e41f905 Binary files /dev/null and b/tests/ref/image-svg-text.png differ diff --git a/tests/ref/import-basic.png b/tests/ref/import-basic.png new file mode 100644 index 00000000..674c4ecf Binary files /dev/null and b/tests/ref/import-basic.png differ diff --git a/tests/ref/import-from-function-scope.png b/tests/ref/import-from-function-scope.png new file mode 100644 index 00000000..f6169d8c Binary files /dev/null and b/tests/ref/import-from-function-scope.png differ diff --git a/tests/ref/import-source-field-access.png b/tests/ref/import-source-field-access.png new file mode 100644 index 00000000..e42bf209 Binary files /dev/null and b/tests/ref/import-source-field-access.png differ diff --git a/tests/ref/include-file.png b/tests/ref/include-file.png new file mode 100644 index 00000000..57c3aca1 Binary files /dev/null and b/tests/ref/include-file.png differ diff --git a/tests/ref/int-display.png b/tests/ref/int-display.png new file mode 100644 index 00000000..bfb04648 Binary files /dev/null and b/tests/ref/int-display.png differ diff --git a/tests/ref/int-repr.png b/tests/ref/int-repr.png new file mode 100644 index 00000000..a2ee4ee0 Binary files /dev/null and b/tests/ref/int-repr.png differ diff --git a/tests/ref/issue-1041-smartquotes-in-outline.png b/tests/ref/issue-1041-smartquotes-in-outline.png new file mode 100644 index 00000000..29ba4065 Binary files /dev/null and b/tests/ref/issue-1041-smartquotes-in-outline.png differ diff --git a/tests/ref/issue-1050-terms-indent.png b/tests/ref/issue-1050-terms-indent.png new file mode 100644 index 00000000..ca0521c7 Binary files /dev/null and b/tests/ref/issue-1050-terms-indent.png differ diff --git a/tests/ref/issue-1052-math-number-spacing.png b/tests/ref/issue-1052-math-number-spacing.png new file mode 100644 index 00000000..79df2c9f Binary files /dev/null and b/tests/ref/issue-1052-math-number-spacing.png differ diff --git a/tests/ref/issue-1216-clamp-panic.png b/tests/ref/issue-1216-clamp-panic.png new file mode 100644 index 00000000..d51f134c Binary files /dev/null and b/tests/ref/issue-1216-clamp-panic.png differ diff --git a/tests/ref/issue-1240-stack-h-fr.png b/tests/ref/issue-1240-stack-h-fr.png new file mode 100644 index 00000000..ae1ba41e Binary files /dev/null and b/tests/ref/issue-1240-stack-h-fr.png differ diff --git a/tests/ref/issue-1240-stack-v-fr.png b/tests/ref/issue-1240-stack-v-fr.png new file mode 100644 index 00000000..a9ac36e8 Binary files /dev/null and b/tests/ref/issue-1240-stack-v-fr.png differ diff --git a/tests/ref/issue-1368-place-pagebreak.png b/tests/ref/issue-1368-place-pagebreak.png new file mode 100644 index 00000000..920cd203 Binary files /dev/null and b/tests/ref/issue-1368-place-pagebreak.png differ diff --git a/tests/ref/issue-1373-bidi-tofus.png b/tests/ref/issue-1373-bidi-tofus.png new file mode 100644 index 00000000..783eb473 Binary files /dev/null and b/tests/ref/issue-1373-bidi-tofus.png differ diff --git a/tests/ref/issue-1388-table-row-missing.png b/tests/ref/issue-1388-table-row-missing.png new file mode 100644 index 00000000..dd08eb46 Binary files /dev/null and b/tests/ref/issue-1388-table-row-missing.png differ diff --git a/tests/ref/issue-1398-line-align.png b/tests/ref/issue-1398-line-align.png new file mode 100644 index 00000000..778aa72c Binary files /dev/null and b/tests/ref/issue-1398-line-align.png differ diff --git a/tests/ref/issue-1433-footnote-in-list.png b/tests/ref/issue-1433-footnote-in-list.png new file mode 100644 index 00000000..28a6e77f Binary files /dev/null and b/tests/ref/issue-1433-footnote-in-list.png differ diff --git a/tests/ref/issue-1540-smartquotes-across-newlines.png b/tests/ref/issue-1540-smartquotes-across-newlines.png new file mode 100644 index 00000000..10fe7337 Binary files /dev/null and b/tests/ref/issue-1540-smartquotes-across-newlines.png differ diff --git a/tests/ref/issue-1597-cite-footnote.png b/tests/ref/issue-1597-cite-footnote.png new file mode 100644 index 00000000..bdd9f225 Binary files /dev/null and b/tests/ref/issue-1597-cite-footnote.png differ diff --git a/tests/ref/issue-1825-rect-overflow.png b/tests/ref/issue-1825-rect-overflow.png new file mode 100644 index 00000000..70f09e12 Binary files /dev/null and b/tests/ref/issue-1825-rect-overflow.png differ diff --git a/tests/ref/issue-183-table-lines.png b/tests/ref/issue-183-table-lines.png new file mode 100644 index 00000000..e4369262 Binary files /dev/null and b/tests/ref/issue-183-table-lines.png differ diff --git a/tests/ref/issue-1948-math-text-break.png b/tests/ref/issue-1948-math-text-break.png new file mode 100644 index 00000000..6e3e9e85 Binary files /dev/null and b/tests/ref/issue-1948-math-text-break.png differ diff --git a/tests/ref/issue-2044-invalid-parsed-ident.png b/tests/ref/issue-2044-invalid-parsed-ident.png new file mode 100644 index 00000000..7e37ce2c Binary files /dev/null and b/tests/ref/issue-2044-invalid-parsed-ident.png differ diff --git a/tests/ref/issue-2051-new-cm-svg.png b/tests/ref/issue-2051-new-cm-svg.png new file mode 100644 index 00000000..65352860 Binary files /dev/null and b/tests/ref/issue-2051-new-cm-svg.png differ diff --git a/tests/ref/issue-2055-math-eval.png b/tests/ref/issue-2055-math-eval.png new file mode 100644 index 00000000..168b8913 Binary files /dev/null and b/tests/ref/issue-2055-math-eval.png differ diff --git a/tests/ref/issue-2095-pagebreak-numbering.png b/tests/ref/issue-2095-pagebreak-numbering.png new file mode 100644 index 00000000..e3a515b7 Binary files /dev/null and b/tests/ref/issue-2095-pagebreak-numbering.png differ diff --git a/tests/ref/issue-2105-linebreak-tofu.png b/tests/ref/issue-2105-linebreak-tofu.png new file mode 100644 index 00000000..197412b9 Binary files /dev/null and b/tests/ref/issue-2105-linebreak-tofu.png differ diff --git a/tests/ref/issue-2128-block-width-box.png b/tests/ref/issue-2128-block-width-box.png new file mode 100644 index 00000000..40fe6b4f Binary files /dev/null and b/tests/ref/issue-2128-block-width-box.png differ diff --git a/tests/ref/issue-2134-pagebreak-bibliography.png b/tests/ref/issue-2134-pagebreak-bibliography.png new file mode 100644 index 00000000..ad0fb165 Binary files /dev/null and b/tests/ref/issue-2134-pagebreak-bibliography.png differ diff --git a/tests/ref/issue-2162-pagebreak-set-style.png b/tests/ref/issue-2162-pagebreak-set-style.png new file mode 100644 index 00000000..4ea6f56f Binary files /dev/null and b/tests/ref/issue-2162-pagebreak-set-style.png differ diff --git a/tests/ref/issue-2199-place-spacing-bottom.png b/tests/ref/issue-2199-place-spacing-bottom.png new file mode 100644 index 00000000..1f27559b Binary files /dev/null and b/tests/ref/issue-2199-place-spacing-bottom.png differ diff --git a/tests/ref/issue-2199-place-spacing-default.png b/tests/ref/issue-2199-place-spacing-default.png new file mode 100644 index 00000000..565a8302 Binary files /dev/null and b/tests/ref/issue-2199-place-spacing-default.png differ diff --git a/tests/ref/issue-2214-baseline-math.png b/tests/ref/issue-2214-baseline-math.png new file mode 100644 index 00000000..9a3e6f3c Binary files /dev/null and b/tests/ref/issue-2214-baseline-math.png differ diff --git a/tests/ref/issue-2259-raw-color-overwrite.png b/tests/ref/issue-2259-raw-color-overwrite.png new file mode 100644 index 00000000..9cf42c43 Binary files /dev/null and b/tests/ref/issue-2259-raw-color-overwrite.png differ diff --git a/tests/ref/issue-2268-mat-augment-color.png b/tests/ref/issue-2268-mat-augment-color.png new file mode 100644 index 00000000..5aca29ca Binary files /dev/null and b/tests/ref/issue-2268-mat-augment-color.png differ diff --git a/tests/ref/issue-2419-justify-hanging-indent.png b/tests/ref/issue-2419-justify-hanging-indent.png new file mode 100644 index 00000000..bb478ba4 Binary files /dev/null and b/tests/ref/issue-2419-justify-hanging-indent.png differ diff --git a/tests/ref/issue-2530-enum-item-panic.png b/tests/ref/issue-2530-enum-item-panic.png new file mode 100644 index 00000000..4f6130ba Binary files /dev/null and b/tests/ref/issue-2530-enum-item-panic.png differ diff --git a/tests/ref/issue-2530-figure-caption-panic.png b/tests/ref/issue-2530-figure-caption-panic.png new file mode 100644 index 00000000..025449ef Binary files /dev/null and b/tests/ref/issue-2530-figure-caption-panic.png differ diff --git a/tests/ref/issue-2530-list-item-panic.png b/tests/ref/issue-2530-list-item-panic.png new file mode 100644 index 00000000..14d2f570 Binary files /dev/null and b/tests/ref/issue-2530-list-item-panic.png differ diff --git a/tests/ref/issue-2530-term-item-panic.png b/tests/ref/issue-2530-term-item-panic.png new file mode 100644 index 00000000..85b3e92f Binary files /dev/null and b/tests/ref/issue-2530-term-item-panic.png differ diff --git a/tests/ref/issue-2531-cite-show-set.png b/tests/ref/issue-2531-cite-show-set.png new file mode 100644 index 00000000..25723f4d Binary files /dev/null and b/tests/ref/issue-2531-cite-show-set.png differ diff --git a/tests/ref/issue-2538-cjk-latin-spacing-before-linebreak.png b/tests/ref/issue-2538-cjk-latin-spacing-before-linebreak.png new file mode 100644 index 00000000..59571642 Binary files /dev/null and b/tests/ref/issue-2538-cjk-latin-spacing-before-linebreak.png differ diff --git a/tests/ref/issue-2595-float-overlap.png b/tests/ref/issue-2595-float-overlap.png new file mode 100644 index 00000000..4b460579 Binary files /dev/null and b/tests/ref/issue-2595-float-overlap.png differ diff --git a/tests/ref/issue-2650-cjk-latin-spacing-meta.png b/tests/ref/issue-2650-cjk-latin-spacing-meta.png new file mode 100644 index 00000000..d346b73f Binary files /dev/null and b/tests/ref/issue-2650-cjk-latin-spacing-meta.png differ diff --git a/tests/ref/issue-2715-float-order.png b/tests/ref/issue-2715-float-order.png new file mode 100644 index 00000000..01599d25 Binary files /dev/null and b/tests/ref/issue-2715-float-order.png differ diff --git a/tests/ref/issue-2902-gradient-oklab-panic.png b/tests/ref/issue-2902-gradient-oklab-panic.png new file mode 100644 index 00000000..f8e18f7c Binary files /dev/null and b/tests/ref/issue-2902-gradient-oklab-panic.png differ diff --git a/tests/ref/issue-2902-gradient-oklch-panic.png b/tests/ref/issue-2902-gradient-oklch-panic.png new file mode 100644 index 00000000..1af7200e Binary files /dev/null and b/tests/ref/issue-2902-gradient-oklch-panic.png differ diff --git a/tests/ref/issue-3082-chinese-punctuation.png b/tests/ref/issue-3082-chinese-punctuation.png new file mode 100644 index 00000000..642013d0 Binary files /dev/null and b/tests/ref/issue-3082-chinese-punctuation.png differ diff --git a/tests/ref/issue-3191-raw-indent-shrink.png b/tests/ref/issue-3191-raw-indent-shrink.png new file mode 100644 index 00000000..e7ac73b7 Binary files /dev/null and b/tests/ref/issue-3191-raw-indent-shrink.png differ diff --git a/tests/ref/issue-3191-raw-normal-paragraphs-still-shrink.png b/tests/ref/issue-3191-raw-normal-paragraphs-still-shrink.png new file mode 100644 index 00000000..1eb49995 Binary files /dev/null and b/tests/ref/issue-3191-raw-normal-paragraphs-still-shrink.png differ diff --git a/tests/ref/issue-3232-dict-empty.png b/tests/ref/issue-3232-dict-empty.png new file mode 100644 index 00000000..f8d3f324 Binary files /dev/null and b/tests/ref/issue-3232-dict-empty.png differ diff --git a/tests/ref/issue-3264-rect-negative-dimensions.png b/tests/ref/issue-3264-rect-negative-dimensions.png new file mode 100644 index 00000000..44a04681 Binary files /dev/null and b/tests/ref/issue-3264-rect-negative-dimensions.png differ diff --git a/tests/ref/issue-3363-json-large-number.png b/tests/ref/issue-3363-json-large-number.png new file mode 100644 index 00000000..3e13dea1 Binary files /dev/null and b/tests/ref/issue-3363-json-large-number.png differ diff --git a/tests/ref/issue-3586-figure-caption-separator.png b/tests/ref/issue-3586-figure-caption-separator.png new file mode 100644 index 00000000..1d038fe3 Binary files /dev/null and b/tests/ref/issue-3586-figure-caption-separator.png differ diff --git a/tests/ref/issue-3624-spacing-behaviour.png b/tests/ref/issue-3624-spacing-behaviour.png new file mode 100644 index 00000000..c7db6753 Binary files /dev/null and b/tests/ref/issue-3624-spacing-behaviour.png differ diff --git a/tests/ref/issue-3641-float-loop.png b/tests/ref/issue-3641-float-loop.png new file mode 100644 index 00000000..4490d30a Binary files /dev/null and b/tests/ref/issue-3641-float-loop.png differ diff --git a/tests/ref/issue-3650-italic-equation.png b/tests/ref/issue-3650-italic-equation.png new file mode 100644 index 00000000..484457e8 Binary files /dev/null and b/tests/ref/issue-3650-italic-equation.png differ diff --git a/tests/ref/issue-3658-math-size.png b/tests/ref/issue-3658-math-size.png new file mode 100644 index 00000000..db8fccf9 Binary files /dev/null and b/tests/ref/issue-3658-math-size.png differ diff --git a/tests/ref/issue-3662-pdf-smartquotes.png b/tests/ref/issue-3662-pdf-smartquotes.png new file mode 100644 index 00000000..ff73cbc8 Binary files /dev/null and b/tests/ref/issue-3662-pdf-smartquotes.png differ diff --git a/tests/ref/issue-3700-deformed-stroke.png b/tests/ref/issue-3700-deformed-stroke.png new file mode 100644 index 00000000..9578a675 Binary files /dev/null and b/tests/ref/issue-3700-deformed-stroke.png differ diff --git a/tests/ref/issue-3841-tabs-in-raw-type-code.png b/tests/ref/issue-3841-tabs-in-raw-type-code.png new file mode 100644 index 00000000..b7a7b1ba Binary files /dev/null and b/tests/ref/issue-3841-tabs-in-raw-type-code.png differ diff --git a/tests/ref/issue-622-hide-meta-cite.png b/tests/ref/issue-622-hide-meta-cite.png new file mode 100644 index 00000000..8918f668 Binary files /dev/null and b/tests/ref/issue-622-hide-meta-cite.png differ diff --git a/tests/ref/issue-622-hide-meta-outline.png b/tests/ref/issue-622-hide-meta-outline.png new file mode 100644 index 00000000..72a82e4d Binary files /dev/null and b/tests/ref/issue-622-hide-meta-outline.png differ diff --git a/tests/ref/issue-785-cite-locate.png b/tests/ref/issue-785-cite-locate.png new file mode 100644 index 00000000..7c2a650a Binary files /dev/null and b/tests/ref/issue-785-cite-locate.png differ diff --git a/tests/ref/issue-80-emoji-linebreak.png b/tests/ref/issue-80-emoji-linebreak.png new file mode 100644 index 00000000..d35a62b3 Binary files /dev/null and b/tests/ref/issue-80-emoji-linebreak.png differ diff --git a/tests/ref/issue-852-mat-type.png b/tests/ref/issue-852-mat-type.png new file mode 100644 index 00000000..81af3bb5 Binary files /dev/null and b/tests/ref/issue-852-mat-type.png differ diff --git a/tests/ref/issue-870-image-rotation.png b/tests/ref/issue-870-image-rotation.png new file mode 100644 index 00000000..c321a1a9 Binary files /dev/null and b/tests/ref/issue-870-image-rotation.png differ diff --git a/tests/ref/issue-886-args-sink.png b/tests/ref/issue-886-args-sink.png new file mode 100644 index 00000000..2ef08adf Binary files /dev/null and b/tests/ref/issue-886-args-sink.png differ diff --git a/tests/ref/issue-columns-heading.png b/tests/ref/issue-columns-heading.png new file mode 100644 index 00000000..700972bc Binary files /dev/null and b/tests/ref/issue-columns-heading.png differ diff --git a/tests/ref/issue-flow-frame-placement.png b/tests/ref/issue-flow-frame-placement.png new file mode 100644 index 00000000..27469c27 Binary files /dev/null and b/tests/ref/issue-flow-frame-placement.png differ diff --git a/tests/ref/issue-flow-layout-index-out-of-bounds.png b/tests/ref/issue-flow-layout-index-out-of-bounds.png new file mode 100644 index 00000000..8746cbfc Binary files /dev/null and b/tests/ref/issue-flow-layout-index-out-of-bounds.png differ diff --git a/tests/ref/issue-flow-overlarge-frames.png b/tests/ref/issue-flow-overlarge-frames.png new file mode 100644 index 00000000..016af525 Binary files /dev/null and b/tests/ref/issue-flow-overlarge-frames.png differ diff --git a/tests/ref/issue-flow-trailing-leading.png b/tests/ref/issue-flow-trailing-leading.png new file mode 100644 index 00000000..4245d42f Binary files /dev/null and b/tests/ref/issue-flow-trailing-leading.png differ diff --git a/tests/ref/issue-flow-weak-spacing.png b/tests/ref/issue-flow-weak-spacing.png new file mode 100644 index 00000000..e37a5ae3 Binary files /dev/null and b/tests/ref/issue-flow-weak-spacing.png differ diff --git a/tests/ref/issue-gradient-cmyk-encode.png b/tests/ref/issue-gradient-cmyk-encode.png new file mode 100644 index 00000000..065d1a3b Binary files /dev/null and b/tests/ref/issue-gradient-cmyk-encode.png differ diff --git a/tests/ref/issue-grid-base-auto-row-list.png b/tests/ref/issue-grid-base-auto-row-list.png new file mode 100644 index 00000000..8da3adf5 Binary files /dev/null and b/tests/ref/issue-grid-base-auto-row-list.png differ diff --git a/tests/ref/issue-grid-base-auto-row.png b/tests/ref/issue-grid-base-auto-row.png new file mode 100644 index 00000000..0e05577d Binary files /dev/null and b/tests/ref/issue-grid-base-auto-row.png differ diff --git a/tests/ref/issue-grid-double-skip.png b/tests/ref/issue-grid-double-skip.png new file mode 100644 index 00000000..2901f29a Binary files /dev/null and b/tests/ref/issue-grid-double-skip.png differ diff --git a/tests/ref/issue-grid-gutter-skip.png b/tests/ref/issue-grid-gutter-skip.png new file mode 100644 index 00000000..3404fd10 Binary files /dev/null and b/tests/ref/issue-grid-gutter-skip.png differ diff --git a/tests/ref/issue-grid-skip-list.png b/tests/ref/issue-grid-skip-list.png new file mode 100644 index 00000000..bd674337 Binary files /dev/null and b/tests/ref/issue-grid-skip-list.png differ diff --git a/tests/ref/issue-grid-skip.png b/tests/ref/issue-grid-skip.png new file mode 100644 index 00000000..1b46fd1a Binary files /dev/null and b/tests/ref/issue-grid-skip.png differ diff --git a/tests/ref/issue-math-realize-hide.png b/tests/ref/issue-math-realize-hide.png new file mode 100644 index 00000000..729e9f00 Binary files /dev/null and b/tests/ref/issue-math-realize-hide.png differ diff --git a/tests/ref/issue-math-realize-scripting.png b/tests/ref/issue-math-realize-scripting.png new file mode 100644 index 00000000..a29b0364 Binary files /dev/null and b/tests/ref/issue-math-realize-scripting.png differ diff --git a/tests/ref/issue-math-realize-show.png b/tests/ref/issue-math-realize-show.png new file mode 100644 index 00000000..d6b727c1 Binary files /dev/null and b/tests/ref/issue-math-realize-show.png differ diff --git a/tests/ref/issue-multiple-footnote-in-one-line.png b/tests/ref/issue-multiple-footnote-in-one-line.png new file mode 100644 index 00000000..1d8c017d Binary files /dev/null and b/tests/ref/issue-multiple-footnote-in-one-line.png differ diff --git a/tests/ref/issue-non-atomic-closure.png b/tests/ref/issue-non-atomic-closure.png new file mode 100644 index 00000000..f60b4654 Binary files /dev/null and b/tests/ref/issue-non-atomic-closure.png differ diff --git a/tests/ref/issue-place-base.png b/tests/ref/issue-place-base.png new file mode 100644 index 00000000..45517fe9 Binary files /dev/null and b/tests/ref/issue-place-base.png differ diff --git a/tests/ref/issue-rtl-safe-to-break-panic.png b/tests/ref/issue-rtl-safe-to-break-panic.png new file mode 100644 index 00000000..5cd9920c Binary files /dev/null and b/tests/ref/issue-rtl-safe-to-break-panic.png differ diff --git a/tests/ref/justify-avoid-runts.png b/tests/ref/justify-avoid-runts.png new file mode 100644 index 00000000..70513939 Binary files /dev/null and b/tests/ref/justify-avoid-runts.png differ diff --git a/tests/ref/justify-chinese.png b/tests/ref/justify-chinese.png new file mode 100644 index 00000000..0284e8b9 Binary files /dev/null and b/tests/ref/justify-chinese.png differ diff --git a/tests/ref/justify-code-blocks.png b/tests/ref/justify-code-blocks.png new file mode 100644 index 00000000..088e8b63 Binary files /dev/null and b/tests/ref/justify-code-blocks.png differ diff --git a/tests/ref/justify-japanese.png b/tests/ref/justify-japanese.png new file mode 100644 index 00000000..addeba54 Binary files /dev/null and b/tests/ref/justify-japanese.png differ diff --git a/tests/ref/justify-justified-linebreak.png b/tests/ref/justify-justified-linebreak.png new file mode 100644 index 00000000..8792e9e2 Binary files /dev/null and b/tests/ref/justify-justified-linebreak.png differ diff --git a/tests/ref/justify-knuth-story.png b/tests/ref/justify-knuth-story.png new file mode 100644 index 00000000..9fbcc3c3 Binary files /dev/null and b/tests/ref/justify-knuth-story.png differ diff --git a/tests/ref/justify-manual-linebreak.png b/tests/ref/justify-manual-linebreak.png new file mode 100644 index 00000000..144a62c7 Binary files /dev/null and b/tests/ref/justify-manual-linebreak.png differ diff --git a/tests/ref/justify-no-leading-spaces.png b/tests/ref/justify-no-leading-spaces.png new file mode 100644 index 00000000..9d2557b5 Binary files /dev/null and b/tests/ref/justify-no-leading-spaces.png differ diff --git a/tests/ref/justify-punctuation-adjustment.png b/tests/ref/justify-punctuation-adjustment.png new file mode 100644 index 00000000..28d4ef04 Binary files /dev/null and b/tests/ref/justify-punctuation-adjustment.png differ diff --git a/tests/ref/justify-shrink-last-line.png b/tests/ref/justify-shrink-last-line.png new file mode 100644 index 00000000..f839e92e Binary files /dev/null and b/tests/ref/justify-shrink-last-line.png differ diff --git a/tests/ref/justify-variants.png b/tests/ref/justify-variants.png new file mode 100644 index 00000000..81fcc700 Binary files /dev/null and b/tests/ref/justify-variants.png differ diff --git a/tests/ref/justify-whitespace-adjustment.png b/tests/ref/justify-whitespace-adjustment.png new file mode 100644 index 00000000..4ea6829c Binary files /dev/null and b/tests/ref/justify-whitespace-adjustment.png differ diff --git a/tests/ref/justify-without-justifiables.png b/tests/ref/justify-without-justifiables.png new file mode 100644 index 00000000..77e5bf1b Binary files /dev/null and b/tests/ref/justify-without-justifiables.png differ diff --git a/tests/ref/justify.png b/tests/ref/justify.png new file mode 100644 index 00000000..4e4fdbf5 Binary files /dev/null and b/tests/ref/justify.png differ diff --git a/tests/ref/label-after-expression.png b/tests/ref/label-after-expression.png new file mode 100644 index 00000000..5ceaf342 Binary files /dev/null and b/tests/ref/label-after-expression.png differ diff --git a/tests/ref/label-after-parbreak.png b/tests/ref/label-after-parbreak.png new file mode 100644 index 00000000..9339c65c Binary files /dev/null and b/tests/ref/label-after-parbreak.png differ diff --git a/tests/ref/label-dynamic-show-set.png b/tests/ref/label-dynamic-show-set.png new file mode 100644 index 00000000..25681b92 Binary files /dev/null and b/tests/ref/label-dynamic-show-set.png differ diff --git a/tests/ref/label-in-block.png b/tests/ref/label-in-block.png new file mode 100644 index 00000000..e97bd725 Binary files /dev/null and b/tests/ref/label-in-block.png differ diff --git a/tests/ref/label-on-text.png b/tests/ref/label-on-text.png new file mode 100644 index 00000000..67fb1aa8 Binary files /dev/null and b/tests/ref/label-on-text.png differ diff --git a/tests/ref/label-show-where-selector.png b/tests/ref/label-show-where-selector.png new file mode 100644 index 00000000..61e90a9a Binary files /dev/null and b/tests/ref/label-show-where-selector.png differ diff --git a/tests/ref/label-unclosed-is-text.png b/tests/ref/label-unclosed-is-text.png new file mode 100644 index 00000000..051db0cf Binary files /dev/null and b/tests/ref/label-unclosed-is-text.png differ diff --git a/tests/ref/layout-in-fixed-size-block.png b/tests/ref/layout-in-fixed-size-block.png new file mode 100644 index 00000000..6cc321b3 Binary files /dev/null and b/tests/ref/layout-in-fixed-size-block.png differ diff --git a/tests/ref/layout-in-page-call.png b/tests/ref/layout-in-page-call.png new file mode 100644 index 00000000..9bc75ae7 Binary files /dev/null and b/tests/ref/layout-in-page-call.png differ diff --git a/tests/ref/layout/align.png b/tests/ref/layout/align.png deleted file mode 100644 index a0113597..00000000 Binary files a/tests/ref/layout/align.png and /dev/null differ diff --git a/tests/ref/layout/block-sizing.png b/tests/ref/layout/block-sizing.png deleted file mode 100644 index 7d57a0d8..00000000 Binary files a/tests/ref/layout/block-sizing.png and /dev/null differ diff --git a/tests/ref/layout/block-spacing.png b/tests/ref/layout/block-spacing.png deleted file mode 100644 index d73abac0..00000000 Binary files a/tests/ref/layout/block-spacing.png and /dev/null differ diff --git a/tests/ref/layout/cjk-latin-spacing.png b/tests/ref/layout/cjk-latin-spacing.png deleted file mode 100644 index 629145e4..00000000 Binary files a/tests/ref/layout/cjk-latin-spacing.png and /dev/null differ diff --git a/tests/ref/layout/cjk-punctuation-adjustment.png b/tests/ref/layout/cjk-punctuation-adjustment.png deleted file mode 100644 index 1da08f23..00000000 Binary files a/tests/ref/layout/cjk-punctuation-adjustment.png and /dev/null differ diff --git a/tests/ref/layout/clip.png b/tests/ref/layout/clip.png deleted file mode 100644 index f37bf9ad..00000000 Binary files a/tests/ref/layout/clip.png and /dev/null differ diff --git a/tests/ref/layout/code-indent-shrink.png b/tests/ref/layout/code-indent-shrink.png deleted file mode 100644 index 26f6ec40..00000000 Binary files a/tests/ref/layout/code-indent-shrink.png and /dev/null differ diff --git a/tests/ref/layout/columns.png b/tests/ref/layout/columns.png deleted file mode 100644 index 38912f1b..00000000 Binary files a/tests/ref/layout/columns.png and /dev/null differ diff --git a/tests/ref/layout/container-fill.png b/tests/ref/layout/container-fill.png deleted file mode 100644 index 74fdc73d..00000000 Binary files a/tests/ref/layout/container-fill.png and /dev/null differ diff --git a/tests/ref/layout/container.png b/tests/ref/layout/container.png deleted file mode 100644 index 0cd56b2d..00000000 Binary files a/tests/ref/layout/container.png and /dev/null differ diff --git a/tests/ref/layout/enum-align.png b/tests/ref/layout/enum-align.png deleted file mode 100644 index 18e392f2..00000000 Binary files a/tests/ref/layout/enum-align.png and /dev/null differ diff --git a/tests/ref/layout/enum-numbering.png b/tests/ref/layout/enum-numbering.png deleted file mode 100644 index e1b2103b..00000000 Binary files a/tests/ref/layout/enum-numbering.png and /dev/null differ diff --git a/tests/ref/layout/enum.png b/tests/ref/layout/enum.png deleted file mode 100644 index 62f1e4ab..00000000 Binary files a/tests/ref/layout/enum.png and /dev/null differ diff --git a/tests/ref/layout/flow-orphan.png b/tests/ref/layout/flow-orphan.png deleted file mode 100644 index 434636c4..00000000 Binary files a/tests/ref/layout/flow-orphan.png and /dev/null differ diff --git a/tests/ref/layout/grid-1.png b/tests/ref/layout/grid-1.png deleted file mode 100644 index 9e33772c..00000000 Binary files a/tests/ref/layout/grid-1.png and /dev/null differ diff --git a/tests/ref/layout/grid-2.png b/tests/ref/layout/grid-2.png deleted file mode 100644 index ac1f7014..00000000 Binary files a/tests/ref/layout/grid-2.png and /dev/null differ diff --git a/tests/ref/layout/grid-3.png b/tests/ref/layout/grid-3.png deleted file mode 100644 index 0f54f2cc..00000000 Binary files a/tests/ref/layout/grid-3.png and /dev/null differ diff --git a/tests/ref/layout/grid-4.png b/tests/ref/layout/grid-4.png deleted file mode 100644 index 35a05ab5..00000000 Binary files a/tests/ref/layout/grid-4.png and /dev/null differ diff --git a/tests/ref/layout/grid-5.png b/tests/ref/layout/grid-5.png deleted file mode 100644 index 233ebb00..00000000 Binary files a/tests/ref/layout/grid-5.png and /dev/null differ diff --git a/tests/ref/layout/grid-auto-shrink.png b/tests/ref/layout/grid-auto-shrink.png deleted file mode 100644 index 34995215..00000000 Binary files a/tests/ref/layout/grid-auto-shrink.png and /dev/null differ diff --git a/tests/ref/layout/grid-cell.png b/tests/ref/layout/grid-cell.png deleted file mode 100644 index 07508b40..00000000 Binary files a/tests/ref/layout/grid-cell.png and /dev/null differ diff --git a/tests/ref/layout/grid-colspan.png b/tests/ref/layout/grid-colspan.png deleted file mode 100644 index e16ca347..00000000 Binary files a/tests/ref/layout/grid-colspan.png and /dev/null differ diff --git a/tests/ref/layout/grid-footers-1.png b/tests/ref/layout/grid-footers-1.png deleted file mode 100644 index 331cf7ad..00000000 Binary files a/tests/ref/layout/grid-footers-1.png and /dev/null differ diff --git a/tests/ref/layout/grid-footers-2.png b/tests/ref/layout/grid-footers-2.png deleted file mode 100644 index 60e9689c..00000000 Binary files a/tests/ref/layout/grid-footers-2.png and /dev/null differ diff --git a/tests/ref/layout/grid-footers-3.png b/tests/ref/layout/grid-footers-3.png deleted file mode 100644 index cc4948b8..00000000 Binary files a/tests/ref/layout/grid-footers-3.png and /dev/null differ diff --git a/tests/ref/layout/grid-footers-4.png b/tests/ref/layout/grid-footers-4.png deleted file mode 100644 index 29a6430b..00000000 Binary files a/tests/ref/layout/grid-footers-4.png and /dev/null differ diff --git a/tests/ref/layout/grid-footers-5.png b/tests/ref/layout/grid-footers-5.png deleted file mode 100644 index 6cae5592..00000000 Binary files a/tests/ref/layout/grid-footers-5.png and /dev/null differ diff --git a/tests/ref/layout/grid-headers-1.png b/tests/ref/layout/grid-headers-1.png deleted file mode 100644 index 7ae2d8d3..00000000 Binary files a/tests/ref/layout/grid-headers-1.png and /dev/null differ diff --git a/tests/ref/layout/grid-headers-2.png b/tests/ref/layout/grid-headers-2.png deleted file mode 100644 index 3dbc07c8..00000000 Binary files a/tests/ref/layout/grid-headers-2.png and /dev/null differ diff --git a/tests/ref/layout/grid-headers-3.png b/tests/ref/layout/grid-headers-3.png deleted file mode 100644 index 9ee77d50..00000000 Binary files a/tests/ref/layout/grid-headers-3.png and /dev/null differ diff --git a/tests/ref/layout/grid-headers-4.png b/tests/ref/layout/grid-headers-4.png deleted file mode 100644 index 1f3e4b10..00000000 Binary files a/tests/ref/layout/grid-headers-4.png and /dev/null differ diff --git a/tests/ref/layout/grid-positioning.png b/tests/ref/layout/grid-positioning.png deleted file mode 100644 index cac93f40..00000000 Binary files a/tests/ref/layout/grid-positioning.png and /dev/null differ diff --git a/tests/ref/layout/grid-rowspan-basic.png b/tests/ref/layout/grid-rowspan-basic.png deleted file mode 100644 index b464d8b4..00000000 Binary files a/tests/ref/layout/grid-rowspan-basic.png and /dev/null differ diff --git a/tests/ref/layout/grid-rowspan-split-1.png b/tests/ref/layout/grid-rowspan-split-1.png deleted file mode 100644 index 12cd5fc6..00000000 Binary files a/tests/ref/layout/grid-rowspan-split-1.png and /dev/null differ diff --git a/tests/ref/layout/grid-rowspan-split-2.png b/tests/ref/layout/grid-rowspan-split-2.png deleted file mode 100644 index e55c5e23..00000000 Binary files a/tests/ref/layout/grid-rowspan-split-2.png and /dev/null differ diff --git a/tests/ref/layout/grid-rowspan-split-3.png b/tests/ref/layout/grid-rowspan-split-3.png deleted file mode 100644 index c3ff4bd1..00000000 Binary files a/tests/ref/layout/grid-rowspan-split-3.png and /dev/null differ diff --git a/tests/ref/layout/grid-rtl.png b/tests/ref/layout/grid-rtl.png deleted file mode 100644 index d628ee8a..00000000 Binary files a/tests/ref/layout/grid-rtl.png and /dev/null differ diff --git a/tests/ref/layout/grid-stroke.png b/tests/ref/layout/grid-stroke.png deleted file mode 100644 index fbba379e..00000000 Binary files a/tests/ref/layout/grid-stroke.png and /dev/null differ diff --git a/tests/ref/layout/grid-styling.png b/tests/ref/layout/grid-styling.png deleted file mode 100644 index dc50dd90..00000000 Binary files a/tests/ref/layout/grid-styling.png and /dev/null differ diff --git a/tests/ref/layout/hide.png b/tests/ref/layout/hide.png deleted file mode 100644 index d8980049..00000000 Binary files a/tests/ref/layout/hide.png and /dev/null differ diff --git a/tests/ref/layout/list-attach.png b/tests/ref/layout/list-attach.png deleted file mode 100644 index 4a6a4573..00000000 Binary files a/tests/ref/layout/list-attach.png and /dev/null differ diff --git a/tests/ref/layout/list-marker.png b/tests/ref/layout/list-marker.png deleted file mode 100644 index 19d6ed5f..00000000 Binary files a/tests/ref/layout/list-marker.png and /dev/null differ diff --git a/tests/ref/layout/list.png b/tests/ref/layout/list.png deleted file mode 100644 index 269243eb..00000000 Binary files a/tests/ref/layout/list.png and /dev/null differ diff --git a/tests/ref/layout/out-of-flow-in-block.png b/tests/ref/layout/out-of-flow-in-block.png deleted file mode 100644 index 97637145..00000000 Binary files a/tests/ref/layout/out-of-flow-in-block.png and /dev/null differ diff --git a/tests/ref/layout/pad.png b/tests/ref/layout/pad.png deleted file mode 100644 index d228f07f..00000000 Binary files a/tests/ref/layout/pad.png and /dev/null differ diff --git a/tests/ref/layout/page-binding.png b/tests/ref/layout/page-binding.png deleted file mode 100644 index 5b6d0657..00000000 Binary files a/tests/ref/layout/page-binding.png and /dev/null differ diff --git a/tests/ref/layout/page-margin.png b/tests/ref/layout/page-margin.png deleted file mode 100644 index f690724b..00000000 Binary files a/tests/ref/layout/page-margin.png and /dev/null differ diff --git a/tests/ref/layout/page-marginals.png b/tests/ref/layout/page-marginals.png deleted file mode 100644 index bbe6358e..00000000 Binary files a/tests/ref/layout/page-marginals.png and /dev/null differ diff --git a/tests/ref/layout/page-number-align.png b/tests/ref/layout/page-number-align.png deleted file mode 100644 index b05ca454..00000000 Binary files a/tests/ref/layout/page-number-align.png and /dev/null differ diff --git a/tests/ref/layout/page-style.png b/tests/ref/layout/page-style.png deleted file mode 100644 index ac6b602c..00000000 Binary files a/tests/ref/layout/page-style.png and /dev/null differ diff --git a/tests/ref/layout/page.png b/tests/ref/layout/page.png deleted file mode 100644 index bcf32526..00000000 Binary files a/tests/ref/layout/page.png and /dev/null differ diff --git a/tests/ref/layout/pagebreak-parity.png b/tests/ref/layout/pagebreak-parity.png deleted file mode 100644 index 0dbabe7a..00000000 Binary files a/tests/ref/layout/pagebreak-parity.png and /dev/null differ diff --git a/tests/ref/layout/pagebreak-weak.png b/tests/ref/layout/pagebreak-weak.png deleted file mode 100644 index 412c4e8d..00000000 Binary files a/tests/ref/layout/pagebreak-weak.png and /dev/null differ diff --git a/tests/ref/layout/pagebreak.png b/tests/ref/layout/pagebreak.png deleted file mode 100644 index ab055643..00000000 Binary files a/tests/ref/layout/pagebreak.png and /dev/null differ diff --git a/tests/ref/layout/par-bidi.png b/tests/ref/layout/par-bidi.png deleted file mode 100644 index af66a719..00000000 Binary files a/tests/ref/layout/par-bidi.png and /dev/null differ diff --git a/tests/ref/layout/par-indent.png b/tests/ref/layout/par-indent.png deleted file mode 100644 index cceaa3b9..00000000 Binary files a/tests/ref/layout/par-indent.png and /dev/null differ diff --git a/tests/ref/layout/par-justify-cjk.png b/tests/ref/layout/par-justify-cjk.png deleted file mode 100644 index 25adfcb2..00000000 Binary files a/tests/ref/layout/par-justify-cjk.png and /dev/null differ diff --git a/tests/ref/layout/par-justify.png b/tests/ref/layout/par-justify.png deleted file mode 100644 index 0cd9cbcd..00000000 Binary files a/tests/ref/layout/par-justify.png and /dev/null differ diff --git a/tests/ref/layout/par-knuth.png b/tests/ref/layout/par-knuth.png deleted file mode 100644 index f3da1753..00000000 Binary files a/tests/ref/layout/par-knuth.png and /dev/null differ diff --git a/tests/ref/layout/par-simple.png b/tests/ref/layout/par-simple.png deleted file mode 100644 index a645bfd8..00000000 Binary files a/tests/ref/layout/par-simple.png and /dev/null differ diff --git a/tests/ref/layout/par.png b/tests/ref/layout/par.png deleted file mode 100644 index f25f56d2..00000000 Binary files a/tests/ref/layout/par.png and /dev/null differ diff --git a/tests/ref/layout/place-background.png b/tests/ref/layout/place-background.png deleted file mode 100644 index d9c1c42f..00000000 Binary files a/tests/ref/layout/place-background.png and /dev/null differ diff --git a/tests/ref/layout/place-float-auto.png b/tests/ref/layout/place-float-auto.png deleted file mode 100644 index f2e4ee92..00000000 Binary files a/tests/ref/layout/place-float-auto.png and /dev/null differ diff --git a/tests/ref/layout/place-float-columns.png b/tests/ref/layout/place-float-columns.png deleted file mode 100644 index 186b79d1..00000000 Binary files a/tests/ref/layout/place-float-columns.png and /dev/null differ diff --git a/tests/ref/layout/place-float-figure.png b/tests/ref/layout/place-float-figure.png deleted file mode 100644 index bf9d21b4..00000000 Binary files a/tests/ref/layout/place-float-figure.png and /dev/null differ diff --git a/tests/ref/layout/place-nested.png b/tests/ref/layout/place-nested.png deleted file mode 100644 index 864830d8..00000000 Binary files a/tests/ref/layout/place-nested.png and /dev/null differ diff --git a/tests/ref/layout/place.png b/tests/ref/layout/place.png deleted file mode 100644 index 2ef85a4d..00000000 Binary files a/tests/ref/layout/place.png and /dev/null differ diff --git a/tests/ref/layout/repeat.png b/tests/ref/layout/repeat.png deleted file mode 100644 index 8e21f102..00000000 Binary files a/tests/ref/layout/repeat.png and /dev/null differ diff --git a/tests/ref/layout/spacing.png b/tests/ref/layout/spacing.png deleted file mode 100644 index 9bab536a..00000000 Binary files a/tests/ref/layout/spacing.png and /dev/null differ diff --git a/tests/ref/layout/stack-1.png b/tests/ref/layout/stack-1.png deleted file mode 100644 index 1a3133b8..00000000 Binary files a/tests/ref/layout/stack-1.png and /dev/null differ diff --git a/tests/ref/layout/stack-2.png b/tests/ref/layout/stack-2.png deleted file mode 100644 index 6cb0aad2..00000000 Binary files a/tests/ref/layout/stack-2.png and /dev/null differ diff --git a/tests/ref/layout/table-cell.png b/tests/ref/layout/table-cell.png deleted file mode 100644 index 647a2e10..00000000 Binary files a/tests/ref/layout/table-cell.png and /dev/null differ diff --git a/tests/ref/layout/table.png b/tests/ref/layout/table.png deleted file mode 100644 index ddd0e043..00000000 Binary files a/tests/ref/layout/table.png and /dev/null differ diff --git a/tests/ref/layout/terms.png b/tests/ref/layout/terms.png deleted file mode 100644 index e0cd013a..00000000 Binary files a/tests/ref/layout/terms.png and /dev/null differ diff --git a/tests/ref/layout/transform-layout.png b/tests/ref/layout/transform-layout.png deleted file mode 100644 index 576824f0..00000000 Binary files a/tests/ref/layout/transform-layout.png and /dev/null differ diff --git a/tests/ref/layout/transform.png b/tests/ref/layout/transform.png deleted file mode 100644 index 83b7d13a..00000000 Binary files a/tests/ref/layout/transform.png and /dev/null differ diff --git a/tests/ref/let-basic.png b/tests/ref/let-basic.png new file mode 100644 index 00000000..ded47a5a Binary files /dev/null and b/tests/ref/let-basic.png differ diff --git a/tests/ref/let-termination.png b/tests/ref/let-termination.png new file mode 100644 index 00000000..552bb4ce Binary files /dev/null and b/tests/ref/let-termination.png differ diff --git a/tests/ref/line-basic.png b/tests/ref/line-basic.png new file mode 100644 index 00000000..007672e1 Binary files /dev/null and b/tests/ref/line-basic.png differ diff --git a/tests/ref/line-positioning.png b/tests/ref/line-positioning.png new file mode 100644 index 00000000..65678caa Binary files /dev/null and b/tests/ref/line-positioning.png differ diff --git a/tests/ref/line-stroke-dash.png b/tests/ref/line-stroke-dash.png new file mode 100644 index 00000000..f245e32f Binary files /dev/null and b/tests/ref/line-stroke-dash.png differ diff --git a/tests/ref/line-stroke-set.png b/tests/ref/line-stroke-set.png new file mode 100644 index 00000000..f82f899e Binary files /dev/null and b/tests/ref/line-stroke-set.png differ diff --git a/tests/ref/line-stroke.png b/tests/ref/line-stroke.png new file mode 100644 index 00000000..d0213002 Binary files /dev/null and b/tests/ref/line-stroke.png differ diff --git a/tests/ref/linebreak-cite-punctuation.png b/tests/ref/linebreak-cite-punctuation.png new file mode 100644 index 00000000..64d930c6 Binary files /dev/null and b/tests/ref/linebreak-cite-punctuation.png differ diff --git a/tests/ref/linebreak-hyphen-nbsp.png b/tests/ref/linebreak-hyphen-nbsp.png new file mode 100644 index 00000000..ee88ae58 Binary files /dev/null and b/tests/ref/linebreak-hyphen-nbsp.png differ diff --git a/tests/ref/linebreak-link-end.png b/tests/ref/linebreak-link-end.png new file mode 100644 index 00000000..f11e91d6 Binary files /dev/null and b/tests/ref/linebreak-link-end.png differ diff --git a/tests/ref/linebreak-link-justify.png b/tests/ref/linebreak-link-justify.png new file mode 100644 index 00000000..8007cf3e Binary files /dev/null and b/tests/ref/linebreak-link-justify.png differ diff --git a/tests/ref/linebreak-link.png b/tests/ref/linebreak-link.png new file mode 100644 index 00000000..d5ba8c9e Binary files /dev/null and b/tests/ref/linebreak-link.png differ diff --git a/tests/ref/linebreak-manual-consecutive.png b/tests/ref/linebreak-manual-consecutive.png new file mode 100644 index 00000000..0dbef35b Binary files /dev/null and b/tests/ref/linebreak-manual-consecutive.png differ diff --git a/tests/ref/linebreak-manual-directly-after-automatic.png b/tests/ref/linebreak-manual-directly-after-automatic.png new file mode 100644 index 00000000..006e3ef2 Binary files /dev/null and b/tests/ref/linebreak-manual-directly-after-automatic.png differ diff --git a/tests/ref/linebreak-manual-justified.png b/tests/ref/linebreak-manual-justified.png new file mode 100644 index 00000000..f74ea3fd Binary files /dev/null and b/tests/ref/linebreak-manual-justified.png differ diff --git a/tests/ref/linebreak-manual-trailing-multiple.png b/tests/ref/linebreak-manual-trailing-multiple.png new file mode 100644 index 00000000..edf3a949 Binary files /dev/null and b/tests/ref/linebreak-manual-trailing-multiple.png differ diff --git a/tests/ref/linebreak-manual.png b/tests/ref/linebreak-manual.png new file mode 100644 index 00000000..37aca398 Binary files /dev/null and b/tests/ref/linebreak-manual.png differ diff --git a/tests/ref/linebreak-math-punctuation.png b/tests/ref/linebreak-math-punctuation.png new file mode 100644 index 00000000..93b77d2a Binary files /dev/null and b/tests/ref/linebreak-math-punctuation.png differ diff --git a/tests/ref/linebreak-narrow-nbsp.png b/tests/ref/linebreak-narrow-nbsp.png new file mode 100644 index 00000000..81cf82f8 Binary files /dev/null and b/tests/ref/linebreak-narrow-nbsp.png differ diff --git a/tests/ref/linebreak-overflow-double.png b/tests/ref/linebreak-overflow-double.png new file mode 100644 index 00000000..04a5bbaa Binary files /dev/null and b/tests/ref/linebreak-overflow-double.png differ diff --git a/tests/ref/linebreak-overflow.png b/tests/ref/linebreak-overflow.png new file mode 100644 index 00000000..1dfcbc27 Binary files /dev/null and b/tests/ref/linebreak-overflow.png differ diff --git a/tests/ref/linebreak-shape-run.png b/tests/ref/linebreak-shape-run.png new file mode 100644 index 00000000..ebfb87f0 Binary files /dev/null and b/tests/ref/linebreak-shape-run.png differ diff --git a/tests/ref/linebreak-thai.png b/tests/ref/linebreak-thai.png new file mode 100644 index 00000000..8053a212 Binary files /dev/null and b/tests/ref/linebreak-thai.png differ diff --git a/tests/ref/link-basic.png b/tests/ref/link-basic.png new file mode 100644 index 00000000..d16c7ef1 Binary files /dev/null and b/tests/ref/link-basic.png differ diff --git a/tests/ref/link-bracket-balanced.png b/tests/ref/link-bracket-balanced.png new file mode 100644 index 00000000..048a7c52 Binary files /dev/null and b/tests/ref/link-bracket-balanced.png differ diff --git a/tests/ref/link-bracket-unbalanced-closing.png b/tests/ref/link-bracket-unbalanced-closing.png new file mode 100644 index 00000000..e1c1341c Binary files /dev/null and b/tests/ref/link-bracket-unbalanced-closing.png differ diff --git a/tests/ref/link-on-block.png b/tests/ref/link-on-block.png new file mode 100644 index 00000000..9076983d Binary files /dev/null and b/tests/ref/link-on-block.png differ diff --git a/tests/ref/link-show.png b/tests/ref/link-show.png new file mode 100644 index 00000000..59542bad Binary files /dev/null and b/tests/ref/link-show.png differ diff --git a/tests/ref/link-to-label.png b/tests/ref/link-to-label.png new file mode 100644 index 00000000..f6075526 Binary files /dev/null and b/tests/ref/link-to-label.png differ diff --git a/tests/ref/link-to-page.png b/tests/ref/link-to-page.png new file mode 100644 index 00000000..bbd2f103 Binary files /dev/null and b/tests/ref/link-to-page.png differ diff --git a/tests/ref/link-trailing-period.png b/tests/ref/link-trailing-period.png new file mode 100644 index 00000000..4dd11f34 Binary files /dev/null and b/tests/ref/link-trailing-period.png differ diff --git a/tests/ref/link-transformed.png b/tests/ref/link-transformed.png new file mode 100644 index 00000000..6b94b5cb Binary files /dev/null and b/tests/ref/link-transformed.png differ diff --git a/tests/ref/list-attached-above-spacing.png b/tests/ref/list-attached-above-spacing.png new file mode 100644 index 00000000..0f499769 Binary files /dev/null and b/tests/ref/list-attached-above-spacing.png differ diff --git a/tests/ref/list-attached.png b/tests/ref/list-attached.png new file mode 100644 index 00000000..c1735fd0 Binary files /dev/null and b/tests/ref/list-attached.png differ diff --git a/tests/ref/list-basic.png b/tests/ref/list-basic.png new file mode 100644 index 00000000..edf69cac Binary files /dev/null and b/tests/ref/list-basic.png differ diff --git a/tests/ref/list-content-block.png b/tests/ref/list-content-block.png new file mode 100644 index 00000000..18b003e5 Binary files /dev/null and b/tests/ref/list-content-block.png differ diff --git a/tests/ref/list-indent-specifics.png b/tests/ref/list-indent-specifics.png new file mode 100644 index 00000000..212e45ed Binary files /dev/null and b/tests/ref/list-indent-specifics.png differ diff --git a/tests/ref/list-marker-align-unaffected.png b/tests/ref/list-marker-align-unaffected.png new file mode 100644 index 00000000..90f9ad45 Binary files /dev/null and b/tests/ref/list-marker-align-unaffected.png differ diff --git a/tests/ref/list-marker-bare-hyphen.png b/tests/ref/list-marker-bare-hyphen.png new file mode 100644 index 00000000..37830fd6 Binary files /dev/null and b/tests/ref/list-marker-bare-hyphen.png differ diff --git a/tests/ref/list-marker-closure.png b/tests/ref/list-marker-closure.png new file mode 100644 index 00000000..4dba3b9d Binary files /dev/null and b/tests/ref/list-marker-closure.png differ diff --git a/tests/ref/list-marker-cycle.png b/tests/ref/list-marker-cycle.png new file mode 100644 index 00000000..ef219f07 Binary files /dev/null and b/tests/ref/list-marker-cycle.png differ diff --git a/tests/ref/list-marker-dash.png b/tests/ref/list-marker-dash.png new file mode 100644 index 00000000..10abc8a6 Binary files /dev/null and b/tests/ref/list-marker-dash.png differ diff --git a/tests/ref/list-mix.png b/tests/ref/list-mix.png new file mode 100644 index 00000000..0f2b03cf Binary files /dev/null and b/tests/ref/list-mix.png differ diff --git a/tests/ref/list-mixed-tabs-and-spaces.png b/tests/ref/list-mixed-tabs-and-spaces.png new file mode 100644 index 00000000..fcddff42 Binary files /dev/null and b/tests/ref/list-mixed-tabs-and-spaces.png differ diff --git a/tests/ref/list-nested.png b/tests/ref/list-nested.png new file mode 100644 index 00000000..22f73ecb Binary files /dev/null and b/tests/ref/list-nested.png differ diff --git a/tests/ref/list-non-attached-followed-by-attached.png b/tests/ref/list-non-attached-followed-by-attached.png new file mode 100644 index 00000000..22db4e38 Binary files /dev/null and b/tests/ref/list-non-attached-followed-by-attached.png differ diff --git a/tests/ref/list-rtl.png b/tests/ref/list-rtl.png new file mode 100644 index 00000000..db1e7546 Binary files /dev/null and b/tests/ref/list-rtl.png differ diff --git a/tests/ref/list-syntax-edge-cases.png b/tests/ref/list-syntax-edge-cases.png new file mode 100644 index 00000000..460462e3 Binary files /dev/null and b/tests/ref/list-syntax-edge-cases.png differ diff --git a/tests/ref/list-tabs.png b/tests/ref/list-tabs.png new file mode 100644 index 00000000..1fce74c3 Binary files /dev/null and b/tests/ref/list-tabs.png differ diff --git a/tests/ref/list-tight-non-attached-tight.png b/tests/ref/list-tight-non-attached-tight.png new file mode 100644 index 00000000..96d51813 Binary files /dev/null and b/tests/ref/list-tight-non-attached-tight.png differ diff --git a/tests/ref/list-top-level-indent.png b/tests/ref/list-top-level-indent.png new file mode 100644 index 00000000..beb17ede Binary files /dev/null and b/tests/ref/list-top-level-indent.png differ diff --git a/tests/ref/list-wide-cannot-attach.png b/tests/ref/list-wide-cannot-attach.png new file mode 100644 index 00000000..600041a7 Binary files /dev/null and b/tests/ref/list-wide-cannot-attach.png differ diff --git a/tests/ref/list-wide-really-cannot-attach.png b/tests/ref/list-wide-really-cannot-attach.png new file mode 100644 index 00000000..89680c09 Binary files /dev/null and b/tests/ref/list-wide-really-cannot-attach.png differ diff --git a/tests/ref/locate-element-selector.png b/tests/ref/locate-element-selector.png new file mode 100644 index 00000000..fc36ddff Binary files /dev/null and b/tests/ref/locate-element-selector.png differ diff --git a/tests/ref/locate-position.png b/tests/ref/locate-position.png new file mode 100644 index 00000000..fc36ddff Binary files /dev/null and b/tests/ref/locate-position.png differ diff --git a/tests/ref/loop-break-join-in-first-arg.png b/tests/ref/loop-break-join-in-first-arg.png new file mode 100644 index 00000000..fbad2125 Binary files /dev/null and b/tests/ref/loop-break-join-in-first-arg.png differ diff --git a/tests/ref/loop-break-join-in-nested-blocks.png b/tests/ref/loop-break-join-in-nested-blocks.png new file mode 100644 index 00000000..6e2af47a Binary files /dev/null and b/tests/ref/loop-break-join-in-nested-blocks.png differ diff --git a/tests/ref/loop-break-join-in-set-rule-args.png b/tests/ref/loop-break-join-in-set-rule-args.png new file mode 100644 index 00000000..37e13773 Binary files /dev/null and b/tests/ref/loop-break-join-in-set-rule-args.png differ diff --git a/tests/ref/loop-break-join-set-and-show.png b/tests/ref/loop-break-join-set-and-show.png new file mode 100644 index 00000000..8c81c147 Binary files /dev/null and b/tests/ref/loop-break-join-set-and-show.png differ diff --git a/tests/ref/lorem-pars.png b/tests/ref/lorem-pars.png new file mode 100644 index 00000000..5ff0a345 Binary files /dev/null and b/tests/ref/lorem-pars.png differ diff --git a/tests/ref/lorem.png b/tests/ref/lorem.png new file mode 100644 index 00000000..197acb1c Binary files /dev/null and b/tests/ref/lorem.png differ diff --git a/tests/ref/math-accent-align.png b/tests/ref/math-accent-align.png new file mode 100644 index 00000000..84e8dc8c Binary files /dev/null and b/tests/ref/math-accent-align.png differ diff --git a/tests/ref/math-accent-bounds.png b/tests/ref/math-accent-bounds.png new file mode 100644 index 00000000..d9876182 Binary files /dev/null and b/tests/ref/math-accent-bounds.png differ diff --git a/tests/ref/math-accent-func.png b/tests/ref/math-accent-func.png new file mode 100644 index 00000000..00821f70 Binary files /dev/null and b/tests/ref/math-accent-func.png differ diff --git a/tests/ref/math-accent-high-base.png b/tests/ref/math-accent-high-base.png new file mode 100644 index 00000000..f4d7580f Binary files /dev/null and b/tests/ref/math-accent-high-base.png differ diff --git a/tests/ref/math-accent-sized.png b/tests/ref/math-accent-sized.png new file mode 100644 index 00000000..76783b25 Binary files /dev/null and b/tests/ref/math-accent-sized.png differ diff --git a/tests/ref/math-accent-superscript.png b/tests/ref/math-accent-superscript.png new file mode 100644 index 00000000..8ddf113d Binary files /dev/null and b/tests/ref/math-accent-superscript.png differ diff --git a/tests/ref/math-accent-sym-call.png b/tests/ref/math-accent-sym-call.png new file mode 100644 index 00000000..0837a86c Binary files /dev/null and b/tests/ref/math-accent-sym-call.png differ diff --git a/tests/ref/math-accent-wide-base.png b/tests/ref/math-accent-wide-base.png new file mode 100644 index 00000000..af716bf4 Binary files /dev/null and b/tests/ref/math-accent-wide-base.png differ diff --git a/tests/ref/math-align-aligned-in-source.png b/tests/ref/math-align-aligned-in-source.png new file mode 100644 index 00000000..958a42c5 Binary files /dev/null and b/tests/ref/math-align-aligned-in-source.png differ diff --git a/tests/ref/math-align-basic.png b/tests/ref/math-align-basic.png new file mode 100644 index 00000000..cf4a8d6a Binary files /dev/null and b/tests/ref/math-align-basic.png differ diff --git a/tests/ref/math-align-cases.png b/tests/ref/math-align-cases.png new file mode 100644 index 00000000..4ea9a264 Binary files /dev/null and b/tests/ref/math-align-cases.png differ diff --git a/tests/ref/math-align-implicit.png b/tests/ref/math-align-implicit.png new file mode 100644 index 00000000..05a0d98d Binary files /dev/null and b/tests/ref/math-align-implicit.png differ diff --git a/tests/ref/math-align-lines-mixed.png b/tests/ref/math-align-lines-mixed.png new file mode 100644 index 00000000..d50af28c Binary files /dev/null and b/tests/ref/math-align-lines-mixed.png differ diff --git a/tests/ref/math-align-post-fix.png b/tests/ref/math-align-post-fix.png new file mode 100644 index 00000000..33bc3da7 Binary files /dev/null and b/tests/ref/math-align-post-fix.png differ diff --git a/tests/ref/math-align-toggle.png b/tests/ref/math-align-toggle.png new file mode 100644 index 00000000..24448ab5 Binary files /dev/null and b/tests/ref/math-align-toggle.png differ diff --git a/tests/ref/math-align-weird.png b/tests/ref/math-align-weird.png new file mode 100644 index 00000000..672742ec Binary files /dev/null and b/tests/ref/math-align-weird.png differ diff --git a/tests/ref/math-align-wider-first-column.png b/tests/ref/math-align-wider-first-column.png new file mode 100644 index 00000000..46c9c3ff Binary files /dev/null and b/tests/ref/math-align-wider-first-column.png differ diff --git a/tests/ref/math-attach-default-placement.png b/tests/ref/math-attach-default-placement.png new file mode 100644 index 00000000..685fb550 Binary files /dev/null and b/tests/ref/math-attach-default-placement.png differ diff --git a/tests/ref/math-attach-descender-collision.png b/tests/ref/math-attach-descender-collision.png new file mode 100644 index 00000000..71654916 Binary files /dev/null and b/tests/ref/math-attach-descender-collision.png differ diff --git a/tests/ref/math-attach-followed-by-func-call.png b/tests/ref/math-attach-followed-by-func-call.png new file mode 100644 index 00000000..71d78c16 Binary files /dev/null and b/tests/ref/math-attach-followed-by-func-call.png differ diff --git a/tests/ref/math-attach-force-scripts-and-limits.png b/tests/ref/math-attach-force-scripts-and-limits.png new file mode 100644 index 00000000..21a1050f Binary files /dev/null and b/tests/ref/math-attach-force-scripts-and-limits.png differ diff --git a/tests/ref/math-attach-high.png b/tests/ref/math-attach-high.png new file mode 100644 index 00000000..4bb6cb29 Binary files /dev/null and b/tests/ref/math-attach-high.png differ diff --git a/tests/ref/math-attach-horizontal-align.png b/tests/ref/math-attach-horizontal-align.png new file mode 100644 index 00000000..507cb0ff Binary files /dev/null and b/tests/ref/math-attach-horizontal-align.png differ diff --git a/tests/ref/math-attach-integral.png b/tests/ref/math-attach-integral.png new file mode 100644 index 00000000..baebf44c Binary files /dev/null and b/tests/ref/math-attach-integral.png differ diff --git a/tests/ref/math-attach-large-operator.png b/tests/ref/math-attach-large-operator.png new file mode 100644 index 00000000..774b603c Binary files /dev/null and b/tests/ref/math-attach-large-operator.png differ diff --git a/tests/ref/math-attach-limit.png b/tests/ref/math-attach-limit.png new file mode 100644 index 00000000..5f9f24d7 Binary files /dev/null and b/tests/ref/math-attach-limit.png differ diff --git a/tests/ref/math-attach-mixed.png b/tests/ref/math-attach-mixed.png new file mode 100644 index 00000000..4be327e3 Binary files /dev/null and b/tests/ref/math-attach-mixed.png differ diff --git a/tests/ref/math-attach-nested.png b/tests/ref/math-attach-nested.png new file mode 100644 index 00000000..8b4309cf Binary files /dev/null and b/tests/ref/math-attach-nested.png differ diff --git a/tests/ref/math-attach-postscripts.png b/tests/ref/math-attach-postscripts.png new file mode 100644 index 00000000..bd94e4bd Binary files /dev/null and b/tests/ref/math-attach-postscripts.png differ diff --git a/tests/ref/math-attach-prescripts.png b/tests/ref/math-attach-prescripts.png new file mode 100644 index 00000000..cd105e9d Binary files /dev/null and b/tests/ref/math-attach-prescripts.png differ diff --git a/tests/ref/math-attach-show-limit.png b/tests/ref/math-attach-show-limit.png new file mode 100644 index 00000000..4ce2b3fb Binary files /dev/null and b/tests/ref/math-attach-show-limit.png differ diff --git a/tests/ref/math-attach-subscript-multiline.png b/tests/ref/math-attach-subscript-multiline.png new file mode 100644 index 00000000..7f9aec2e Binary files /dev/null and b/tests/ref/math-attach-subscript-multiline.png differ diff --git a/tests/ref/math-attach-to-group.png b/tests/ref/math-attach-to-group.png new file mode 100644 index 00000000..a3d1923e Binary files /dev/null and b/tests/ref/math-attach-to-group.png differ diff --git a/tests/ref/math-binom-multiple.png b/tests/ref/math-binom-multiple.png new file mode 100644 index 00000000..7eb60be0 Binary files /dev/null and b/tests/ref/math-binom-multiple.png differ diff --git a/tests/ref/math-binom.png b/tests/ref/math-binom.png new file mode 100644 index 00000000..85ab08f9 Binary files /dev/null and b/tests/ref/math-binom.png differ diff --git a/tests/ref/math-box-with-baseline.png b/tests/ref/math-box-with-baseline.png new file mode 100644 index 00000000..e38e6442 Binary files /dev/null and b/tests/ref/math-box-with-baseline.png differ diff --git a/tests/ref/math-box-without-baseline.png b/tests/ref/math-box-without-baseline.png new file mode 100644 index 00000000..27549587 Binary files /dev/null and b/tests/ref/math-box-without-baseline.png differ diff --git a/tests/ref/math-call-non-func.png b/tests/ref/math-call-non-func.png new file mode 100644 index 00000000..da46efc9 Binary files /dev/null and b/tests/ref/math-call-non-func.png differ diff --git a/tests/ref/math-cancel-angle-absolute.png b/tests/ref/math-cancel-angle-absolute.png new file mode 100644 index 00000000..125e59fb Binary files /dev/null and b/tests/ref/math-cancel-angle-absolute.png differ diff --git a/tests/ref/math-cancel-angle-func.png b/tests/ref/math-cancel-angle-func.png new file mode 100644 index 00000000..54f6e759 Binary files /dev/null and b/tests/ref/math-cancel-angle-func.png differ diff --git a/tests/ref/math-cancel-cross.png b/tests/ref/math-cancel-cross.png new file mode 100644 index 00000000..49fba664 Binary files /dev/null and b/tests/ref/math-cancel-cross.png differ diff --git a/tests/ref/math-cancel-customized.png b/tests/ref/math-cancel-customized.png new file mode 100644 index 00000000..9fa5045d Binary files /dev/null and b/tests/ref/math-cancel-customized.png differ diff --git a/tests/ref/math-cancel-display.png b/tests/ref/math-cancel-display.png new file mode 100644 index 00000000..30d30a59 Binary files /dev/null and b/tests/ref/math-cancel-display.png differ diff --git a/tests/ref/math-cancel-inline.png b/tests/ref/math-cancel-inline.png new file mode 100644 index 00000000..4d92bc5e Binary files /dev/null and b/tests/ref/math-cancel-inline.png differ diff --git a/tests/ref/math-cancel-inverted.png b/tests/ref/math-cancel-inverted.png new file mode 100644 index 00000000..129d53a0 Binary files /dev/null and b/tests/ref/math-cancel-inverted.png differ diff --git a/tests/ref/math-cases-gap.png b/tests/ref/math-cases-gap.png new file mode 100644 index 00000000..e3579130 Binary files /dev/null and b/tests/ref/math-cases-gap.png differ diff --git a/tests/ref/math-cases.png b/tests/ref/math-cases.png new file mode 100644 index 00000000..2e8c260a Binary files /dev/null and b/tests/ref/math-cases.png differ diff --git a/tests/ref/math-class-chars.png b/tests/ref/math-class-chars.png new file mode 100644 index 00000000..a4f7d29b Binary files /dev/null and b/tests/ref/math-class-chars.png differ diff --git a/tests/ref/math-class-content.png b/tests/ref/math-class-content.png new file mode 100644 index 00000000..47603fb4 Binary files /dev/null and b/tests/ref/math-class-content.png differ diff --git a/tests/ref/math-class-exceptions.png b/tests/ref/math-class-exceptions.png new file mode 100644 index 00000000..8b3ecc81 Binary files /dev/null and b/tests/ref/math-class-exceptions.png differ diff --git a/tests/ref/math-class-limits.png b/tests/ref/math-class-limits.png new file mode 100644 index 00000000..140acf95 Binary files /dev/null and b/tests/ref/math-class-limits.png differ diff --git a/tests/ref/math-class-nested.png b/tests/ref/math-class-nested.png new file mode 100644 index 00000000..5847868e Binary files /dev/null and b/tests/ref/math-class-nested.png differ diff --git a/tests/ref/math-common-symbols.png b/tests/ref/math-common-symbols.png new file mode 100644 index 00000000..22da84b5 Binary files /dev/null and b/tests/ref/math-common-symbols.png differ diff --git a/tests/ref/math-dif.png b/tests/ref/math-dif.png new file mode 100644 index 00000000..dfe88b3c Binary files /dev/null and b/tests/ref/math-dif.png differ diff --git a/tests/ref/math-equation-align-numbered.png b/tests/ref/math-equation-align-numbered.png new file mode 100644 index 00000000..e43054c8 Binary files /dev/null and b/tests/ref/math-equation-align-numbered.png differ diff --git a/tests/ref/math-equation-align-unnumbered.png b/tests/ref/math-equation-align-unnumbered.png new file mode 100644 index 00000000..413da120 Binary files /dev/null and b/tests/ref/math-equation-align-unnumbered.png differ diff --git a/tests/ref/math-equation-auto-wrapping.png b/tests/ref/math-equation-auto-wrapping.png new file mode 100644 index 00000000..9c600172 Binary files /dev/null and b/tests/ref/math-equation-auto-wrapping.png differ diff --git a/tests/ref/math-equation-font.png b/tests/ref/math-equation-font.png new file mode 100644 index 00000000..b105d9e3 Binary files /dev/null and b/tests/ref/math-equation-font.png differ diff --git a/tests/ref/math-equation-number-align-end.png b/tests/ref/math-equation-number-align-end.png new file mode 100644 index 00000000..f60a15ec Binary files /dev/null and b/tests/ref/math-equation-number-align-end.png differ diff --git a/tests/ref/math-equation-number-align-left.png b/tests/ref/math-equation-number-align-left.png new file mode 100644 index 00000000..a8ed40a5 Binary files /dev/null and b/tests/ref/math-equation-number-align-left.png differ diff --git a/tests/ref/math-equation-number-align-multiline-bottom.png b/tests/ref/math-equation-number-align-multiline-bottom.png new file mode 100644 index 00000000..cb0e5daa Binary files /dev/null and b/tests/ref/math-equation-number-align-multiline-bottom.png differ diff --git a/tests/ref/math-equation-number-align-multiline-expand.png b/tests/ref/math-equation-number-align-multiline-expand.png new file mode 100644 index 00000000..3c3cdc05 Binary files /dev/null and b/tests/ref/math-equation-number-align-multiline-expand.png differ diff --git a/tests/ref/math-equation-number-align-multiline-top-start.png b/tests/ref/math-equation-number-align-multiline-top-start.png new file mode 100644 index 00000000..43346de9 Binary files /dev/null and b/tests/ref/math-equation-number-align-multiline-top-start.png differ diff --git a/tests/ref/math-equation-number-align-multiline.png b/tests/ref/math-equation-number-align-multiline.png new file mode 100644 index 00000000..a46bc1e9 Binary files /dev/null and b/tests/ref/math-equation-number-align-multiline.png differ diff --git a/tests/ref/math-equation-number-align-right.png b/tests/ref/math-equation-number-align-right.png new file mode 100644 index 00000000..e3d588c4 Binary files /dev/null and b/tests/ref/math-equation-number-align-right.png differ diff --git a/tests/ref/math-equation-number-align-start.png b/tests/ref/math-equation-number-align-start.png new file mode 100644 index 00000000..67ed3c4c Binary files /dev/null and b/tests/ref/math-equation-number-align-start.png differ diff --git a/tests/ref/math-equation-number-align.png b/tests/ref/math-equation-number-align.png new file mode 100644 index 00000000..f60a15ec Binary files /dev/null and b/tests/ref/math-equation-number-align.png differ diff --git a/tests/ref/math-equation-numbering.png b/tests/ref/math-equation-numbering.png new file mode 100644 index 00000000..b1e6b10e Binary files /dev/null and b/tests/ref/math-equation-numbering.png differ diff --git a/tests/ref/math-equation-show-rule.png b/tests/ref/math-equation-show-rule.png new file mode 100644 index 00000000..26da7cd1 Binary files /dev/null and b/tests/ref/math-equation-show-rule.png differ diff --git a/tests/ref/math-font-fallback.png b/tests/ref/math-font-fallback.png new file mode 100644 index 00000000..50fa85c7 Binary files /dev/null and b/tests/ref/math-font-fallback.png differ diff --git a/tests/ref/math-font-features.png b/tests/ref/math-font-features.png new file mode 100644 index 00000000..0fd5e6e1 Binary files /dev/null and b/tests/ref/math-font-features.png differ diff --git a/tests/ref/math-font-switch.png b/tests/ref/math-font-switch.png new file mode 100644 index 00000000..4c572ea5 Binary files /dev/null and b/tests/ref/math-font-switch.png differ diff --git a/tests/ref/math-frac-associativity.png b/tests/ref/math-frac-associativity.png new file mode 100644 index 00000000..a5daca59 Binary files /dev/null and b/tests/ref/math-frac-associativity.png differ diff --git a/tests/ref/math-frac-baseline.png b/tests/ref/math-frac-baseline.png new file mode 100644 index 00000000..d65e2c33 Binary files /dev/null and b/tests/ref/math-frac-baseline.png differ diff --git a/tests/ref/math-frac-large.png b/tests/ref/math-frac-large.png new file mode 100644 index 00000000..ff9520f3 Binary files /dev/null and b/tests/ref/math-frac-large.png differ diff --git a/tests/ref/math-frac-paren-removal.png b/tests/ref/math-frac-paren-removal.png new file mode 100644 index 00000000..4f58f1d3 Binary files /dev/null and b/tests/ref/math-frac-paren-removal.png differ diff --git a/tests/ref/math-frac-precedence.png b/tests/ref/math-frac-precedence.png new file mode 100644 index 00000000..236b9989 Binary files /dev/null and b/tests/ref/math-frac-precedence.png differ diff --git a/tests/ref/math-linebreaking-after-binop-and-rel.png b/tests/ref/math-linebreaking-after-binop-and-rel.png new file mode 100644 index 00000000..1cdd73c4 Binary files /dev/null and b/tests/ref/math-linebreaking-after-binop-and-rel.png differ diff --git a/tests/ref/math-linebreaking-after-relation-without-space.png b/tests/ref/math-linebreaking-after-relation-without-space.png new file mode 100644 index 00000000..7c569ad1 Binary files /dev/null and b/tests/ref/math-linebreaking-after-relation-without-space.png differ diff --git a/tests/ref/math-linebreaking-between-consecutive-relations.png b/tests/ref/math-linebreaking-between-consecutive-relations.png new file mode 100644 index 00000000..ba222c57 Binary files /dev/null and b/tests/ref/math-linebreaking-between-consecutive-relations.png differ diff --git a/tests/ref/math-linebreaking-empty.png b/tests/ref/math-linebreaking-empty.png new file mode 100644 index 00000000..8fd4dbb9 Binary files /dev/null and b/tests/ref/math-linebreaking-empty.png differ diff --git a/tests/ref/math-linebreaking-in-box.png b/tests/ref/math-linebreaking-in-box.png new file mode 100644 index 00000000..e026f1a2 Binary files /dev/null and b/tests/ref/math-linebreaking-in-box.png differ diff --git a/tests/ref/math-linebreaking-lr.png b/tests/ref/math-linebreaking-lr.png new file mode 100644 index 00000000..69f08e7e Binary files /dev/null and b/tests/ref/math-linebreaking-lr.png differ diff --git a/tests/ref/math-linebreaking-multiline.png b/tests/ref/math-linebreaking-multiline.png new file mode 100644 index 00000000..cd5f2fce Binary files /dev/null and b/tests/ref/math-linebreaking-multiline.png differ diff --git a/tests/ref/math-linebreaking-trailing-linebreak.png b/tests/ref/math-linebreaking-trailing-linebreak.png new file mode 100644 index 00000000..4a50832b Binary files /dev/null and b/tests/ref/math-linebreaking-trailing-linebreak.png differ diff --git a/tests/ref/math-lr-call.png b/tests/ref/math-lr-call.png new file mode 100644 index 00000000..baf668d4 Binary files /dev/null and b/tests/ref/math-lr-call.png differ diff --git a/tests/ref/math-lr-color.png b/tests/ref/math-lr-color.png new file mode 100644 index 00000000..66876819 Binary files /dev/null and b/tests/ref/math-lr-color.png differ diff --git a/tests/ref/math-lr-fences.png b/tests/ref/math-lr-fences.png new file mode 100644 index 00000000..32314cb4 Binary files /dev/null and b/tests/ref/math-lr-fences.png differ diff --git a/tests/ref/math-lr-half.png b/tests/ref/math-lr-half.png new file mode 100644 index 00000000..311188b4 Binary files /dev/null and b/tests/ref/math-lr-half.png differ diff --git a/tests/ref/math-lr-matching.png b/tests/ref/math-lr-matching.png new file mode 100644 index 00000000..e5fd4c7b Binary files /dev/null and b/tests/ref/math-lr-matching.png differ diff --git a/tests/ref/math-lr-mid.png b/tests/ref/math-lr-mid.png new file mode 100644 index 00000000..e4f1e671 Binary files /dev/null and b/tests/ref/math-lr-mid.png differ diff --git a/tests/ref/math-lr-shorthands.png b/tests/ref/math-lr-shorthands.png new file mode 100644 index 00000000..d8961672 Binary files /dev/null and b/tests/ref/math-lr-shorthands.png differ diff --git a/tests/ref/math-lr-size.png b/tests/ref/math-lr-size.png new file mode 100644 index 00000000..09d24421 Binary files /dev/null and b/tests/ref/math-lr-size.png differ diff --git a/tests/ref/math-lr-symbol-unmatched.png b/tests/ref/math-lr-symbol-unmatched.png new file mode 100644 index 00000000..38d0a988 Binary files /dev/null and b/tests/ref/math-lr-symbol-unmatched.png differ diff --git a/tests/ref/math-lr-unbalanced.png b/tests/ref/math-lr-unbalanced.png new file mode 100644 index 00000000..eff579ba Binary files /dev/null and b/tests/ref/math-lr-unbalanced.png differ diff --git a/tests/ref/math-lr-unmatched.png b/tests/ref/math-lr-unmatched.png new file mode 100644 index 00000000..9a0f3275 Binary files /dev/null and b/tests/ref/math-lr-unmatched.png differ diff --git a/tests/ref/math-lr-weak-spacing.png b/tests/ref/math-lr-weak-spacing.png new file mode 100644 index 00000000..871aaa2e Binary files /dev/null and b/tests/ref/math-lr-weak-spacing.png differ diff --git a/tests/ref/math-mat-align-complex.png b/tests/ref/math-mat-align-complex.png new file mode 100644 index 00000000..682fed22 Binary files /dev/null and b/tests/ref/math-mat-align-complex.png differ diff --git a/tests/ref/math-mat-align-explicit--alternating.png b/tests/ref/math-mat-align-explicit--alternating.png new file mode 100644 index 00000000..cb29eb06 Binary files /dev/null and b/tests/ref/math-mat-align-explicit--alternating.png differ diff --git a/tests/ref/math-mat-align-explicit-left.png b/tests/ref/math-mat-align-explicit-left.png new file mode 100644 index 00000000..97fe0a1f Binary files /dev/null and b/tests/ref/math-mat-align-explicit-left.png differ diff --git a/tests/ref/math-mat-align-explicit-right.png b/tests/ref/math-mat-align-explicit-right.png new file mode 100644 index 00000000..80966e52 Binary files /dev/null and b/tests/ref/math-mat-align-explicit-right.png differ diff --git a/tests/ref/math-mat-align-implicit.png b/tests/ref/math-mat-align-implicit.png new file mode 100644 index 00000000..0c14f1a7 Binary files /dev/null and b/tests/ref/math-mat-align-implicit.png differ diff --git a/tests/ref/math-mat-align-signed-numbers.png b/tests/ref/math-mat-align-signed-numbers.png new file mode 100644 index 00000000..02a3c582 Binary files /dev/null and b/tests/ref/math-mat-align-signed-numbers.png differ diff --git a/tests/ref/math-mat-augment-set.png b/tests/ref/math-mat-augment-set.png new file mode 100644 index 00000000..f3827c41 Binary files /dev/null and b/tests/ref/math-mat-augment-set.png differ diff --git a/tests/ref/math-mat-augment.png b/tests/ref/math-mat-augment.png new file mode 100644 index 00000000..3a272ce9 Binary files /dev/null and b/tests/ref/math-mat-augment.png differ diff --git a/tests/ref/math-mat-baseline.png b/tests/ref/math-mat-baseline.png new file mode 100644 index 00000000..51e90a1f Binary files /dev/null and b/tests/ref/math-mat-baseline.png differ diff --git a/tests/ref/math-mat-delim-direct.png b/tests/ref/math-mat-delim-direct.png new file mode 100644 index 00000000..b40fd36c Binary files /dev/null and b/tests/ref/math-mat-delim-direct.png differ diff --git a/tests/ref/math-mat-delim-set.png b/tests/ref/math-mat-delim-set.png new file mode 100644 index 00000000..fc92fd4b Binary files /dev/null and b/tests/ref/math-mat-delim-set.png differ diff --git a/tests/ref/math-mat-gap.png b/tests/ref/math-mat-gap.png new file mode 100644 index 00000000..5eb8460d Binary files /dev/null and b/tests/ref/math-mat-gap.png differ diff --git a/tests/ref/math-mat-gaps.png b/tests/ref/math-mat-gaps.png new file mode 100644 index 00000000..38cf5247 Binary files /dev/null and b/tests/ref/math-mat-gaps.png differ diff --git a/tests/ref/math-mat-semicolon.png b/tests/ref/math-mat-semicolon.png new file mode 100644 index 00000000..abb5d1df Binary files /dev/null and b/tests/ref/math-mat-semicolon.png differ diff --git a/tests/ref/math-mat-sparse.png b/tests/ref/math-mat-sparse.png new file mode 100644 index 00000000..4d077931 Binary files /dev/null and b/tests/ref/math-mat-sparse.png differ diff --git a/tests/ref/math-multiline-multiple-trailing-linebreaks.png b/tests/ref/math-multiline-multiple-trailing-linebreaks.png new file mode 100644 index 00000000..2c6484c7 Binary files /dev/null and b/tests/ref/math-multiline-multiple-trailing-linebreaks.png differ diff --git a/tests/ref/math-multiline-no-trailing-linebreak.png b/tests/ref/math-multiline-no-trailing-linebreak.png new file mode 100644 index 00000000..8ad6204d Binary files /dev/null and b/tests/ref/math-multiline-no-trailing-linebreak.png differ diff --git a/tests/ref/math-multiline-trailing-linebreak.png b/tests/ref/math-multiline-trailing-linebreak.png new file mode 100644 index 00000000..364d8624 Binary files /dev/null and b/tests/ref/math-multiline-trailing-linebreak.png differ diff --git a/tests/ref/math-nested-normal-layout.png b/tests/ref/math-nested-normal-layout.png new file mode 100644 index 00000000..4ec7d46e Binary files /dev/null and b/tests/ref/math-nested-normal-layout.png differ diff --git a/tests/ref/math-non-math-content.png b/tests/ref/math-non-math-content.png new file mode 100644 index 00000000..66896d18 Binary files /dev/null and b/tests/ref/math-non-math-content.png differ diff --git a/tests/ref/math-op-call.png b/tests/ref/math-op-call.png new file mode 100644 index 00000000..2fcdf2cb Binary files /dev/null and b/tests/ref/math-op-call.png differ diff --git a/tests/ref/math-op-custom.png b/tests/ref/math-op-custom.png new file mode 100644 index 00000000..fbba241d Binary files /dev/null and b/tests/ref/math-op-custom.png differ diff --git a/tests/ref/math-op-predefined.png b/tests/ref/math-op-predefined.png new file mode 100644 index 00000000..bfede9e7 Binary files /dev/null and b/tests/ref/math-op-predefined.png differ diff --git a/tests/ref/math-op-scripts-vs-limits.png b/tests/ref/math-op-scripts-vs-limits.png new file mode 100644 index 00000000..41897416 Binary files /dev/null and b/tests/ref/math-op-scripts-vs-limits.png differ diff --git a/tests/ref/math-op-styled.png b/tests/ref/math-op-styled.png new file mode 100644 index 00000000..c6890d74 Binary files /dev/null and b/tests/ref/math-op-styled.png differ diff --git a/tests/ref/math-optical-size-frac-script-script.png b/tests/ref/math-optical-size-frac-script-script.png new file mode 100644 index 00000000..893b3434 Binary files /dev/null and b/tests/ref/math-optical-size-frac-script-script.png differ diff --git a/tests/ref/math-optical-size-nested-scripts.png b/tests/ref/math-optical-size-nested-scripts.png new file mode 100644 index 00000000..8ca35c6e Binary files /dev/null and b/tests/ref/math-optical-size-nested-scripts.png differ diff --git a/tests/ref/math-optical-size-prime-large-operator.png b/tests/ref/math-optical-size-prime-large-operator.png new file mode 100644 index 00000000..b38a934e Binary files /dev/null and b/tests/ref/math-optical-size-prime-large-operator.png differ diff --git a/tests/ref/math-optical-size-primes.png b/tests/ref/math-optical-size-primes.png new file mode 100644 index 00000000..8fc199aa Binary files /dev/null and b/tests/ref/math-optical-size-primes.png differ diff --git a/tests/ref/math-primes-after-code-expr.png b/tests/ref/math-primes-after-code-expr.png new file mode 100644 index 00000000..5ec3bc8c Binary files /dev/null and b/tests/ref/math-primes-after-code-expr.png differ diff --git a/tests/ref/math-primes-attach.png b/tests/ref/math-primes-attach.png new file mode 100644 index 00000000..95b77882 Binary files /dev/null and b/tests/ref/math-primes-attach.png differ diff --git a/tests/ref/math-primes-complex.png b/tests/ref/math-primes-complex.png new file mode 100644 index 00000000..5f5558eb Binary files /dev/null and b/tests/ref/math-primes-complex.png differ diff --git a/tests/ref/math-primes-limits.png b/tests/ref/math-primes-limits.png new file mode 100644 index 00000000..f2c5cec2 Binary files /dev/null and b/tests/ref/math-primes-limits.png differ diff --git a/tests/ref/math-primes-scripts.png b/tests/ref/math-primes-scripts.png new file mode 100644 index 00000000..2a912180 Binary files /dev/null and b/tests/ref/math-primes-scripts.png differ diff --git a/tests/ref/math-primes-spaces.png b/tests/ref/math-primes-spaces.png new file mode 100644 index 00000000..890cc348 Binary files /dev/null and b/tests/ref/math-primes-spaces.png differ diff --git a/tests/ref/math-primes.png b/tests/ref/math-primes.png new file mode 100644 index 00000000..f3323197 Binary files /dev/null and b/tests/ref/math-primes.png differ diff --git a/tests/ref/math-root-basic.png b/tests/ref/math-root-basic.png new file mode 100644 index 00000000..b8b891eb Binary files /dev/null and b/tests/ref/math-root-basic.png differ diff --git a/tests/ref/math-root-large-body.png b/tests/ref/math-root-large-body.png new file mode 100644 index 00000000..3dd4d848 Binary files /dev/null and b/tests/ref/math-root-large-body.png differ diff --git a/tests/ref/math-root-large-index.png b/tests/ref/math-root-large-index.png new file mode 100644 index 00000000..8037222c Binary files /dev/null and b/tests/ref/math-root-large-index.png differ diff --git a/tests/ref/math-root-precomposed.png b/tests/ref/math-root-precomposed.png new file mode 100644 index 00000000..e09f1878 Binary files /dev/null and b/tests/ref/math-root-precomposed.png differ diff --git a/tests/ref/math-root-radical-attachment.png b/tests/ref/math-root-radical-attachment.png new file mode 100644 index 00000000..4cb447ec Binary files /dev/null and b/tests/ref/math-root-radical-attachment.png differ diff --git a/tests/ref/math-root-syntax.png b/tests/ref/math-root-syntax.png new file mode 100644 index 00000000..49255493 Binary files /dev/null and b/tests/ref/math-root-syntax.png differ diff --git a/tests/ref/math-shorthandes.png b/tests/ref/math-shorthandes.png new file mode 100644 index 00000000..ff26ce96 Binary files /dev/null and b/tests/ref/math-shorthandes.png differ diff --git a/tests/ref/math-size.png b/tests/ref/math-size.png new file mode 100644 index 00000000..b44e4c74 Binary files /dev/null and b/tests/ref/math-size.png differ diff --git a/tests/ref/math-spacing-basic.png b/tests/ref/math-spacing-basic.png new file mode 100644 index 00000000..5567b087 Binary files /dev/null and b/tests/ref/math-spacing-basic.png differ diff --git a/tests/ref/math-spacing-decorated.png b/tests/ref/math-spacing-decorated.png new file mode 100644 index 00000000..e34066ea Binary files /dev/null and b/tests/ref/math-spacing-decorated.png differ diff --git a/tests/ref/math-spacing-kept-spaces.png b/tests/ref/math-spacing-kept-spaces.png new file mode 100644 index 00000000..bb433d4f Binary files /dev/null and b/tests/ref/math-spacing-kept-spaces.png differ diff --git a/tests/ref/math-spacing-predefined.png b/tests/ref/math-spacing-predefined.png new file mode 100644 index 00000000..244e7642 Binary files /dev/null and b/tests/ref/math-spacing-predefined.png differ diff --git a/tests/ref/math-spacing-set-comprehension.png b/tests/ref/math-spacing-set-comprehension.png new file mode 100644 index 00000000..63ef46ca Binary files /dev/null and b/tests/ref/math-spacing-set-comprehension.png differ diff --git a/tests/ref/math-spacing-weak.png b/tests/ref/math-spacing-weak.png new file mode 100644 index 00000000..71af3222 Binary files /dev/null and b/tests/ref/math-spacing-weak.png differ diff --git a/tests/ref/math-style-exceptions.png b/tests/ref/math-style-exceptions.png new file mode 100644 index 00000000..bdeabb67 Binary files /dev/null and b/tests/ref/math-style-exceptions.png differ diff --git a/tests/ref/math-style-greek-exceptions.png b/tests/ref/math-style-greek-exceptions.png new file mode 100644 index 00000000..93ae6309 Binary files /dev/null and b/tests/ref/math-style-greek-exceptions.png differ diff --git a/tests/ref/math-style-hebrew-exceptions.png b/tests/ref/math-style-hebrew-exceptions.png new file mode 100644 index 00000000..723466e8 Binary files /dev/null and b/tests/ref/math-style-hebrew-exceptions.png differ diff --git a/tests/ref/math-style-italic-default.png b/tests/ref/math-style-italic-default.png new file mode 100644 index 00000000..0a25f6fa Binary files /dev/null and b/tests/ref/math-style-italic-default.png differ diff --git a/tests/ref/math-style.png b/tests/ref/math-style.png new file mode 100644 index 00000000..f514bd18 Binary files /dev/null and b/tests/ref/math-style.png differ diff --git a/tests/ref/math-symbol-show-rule.png b/tests/ref/math-symbol-show-rule.png new file mode 100644 index 00000000..68faf937 Binary files /dev/null and b/tests/ref/math-symbol-show-rule.png differ diff --git a/tests/ref/math-table.png b/tests/ref/math-table.png new file mode 100644 index 00000000..5eb93218 Binary files /dev/null and b/tests/ref/math-table.png differ diff --git a/tests/ref/math-text-color.png b/tests/ref/math-text-color.png new file mode 100644 index 00000000..33ff00f3 Binary files /dev/null and b/tests/ref/math-text-color.png differ diff --git a/tests/ref/math-underover-brace.png b/tests/ref/math-underover-brace.png new file mode 100644 index 00000000..d4a3f4a1 Binary files /dev/null and b/tests/ref/math-underover-brace.png differ diff --git a/tests/ref/math-underover-brackets.png b/tests/ref/math-underover-brackets.png new file mode 100644 index 00000000..03419bc3 Binary files /dev/null and b/tests/ref/math-underover-brackets.png differ diff --git a/tests/ref/math-underover-line-bracket.png b/tests/ref/math-underover-line-bracket.png new file mode 100644 index 00000000..08d8df20 Binary files /dev/null and b/tests/ref/math-underover-line-bracket.png differ diff --git a/tests/ref/math-unicode.png b/tests/ref/math-unicode.png new file mode 100644 index 00000000..e74429eb Binary files /dev/null and b/tests/ref/math-unicode.png differ diff --git a/tests/ref/math-vec-align-explicit-alternating.png b/tests/ref/math-vec-align-explicit-alternating.png new file mode 100644 index 00000000..cb29eb06 Binary files /dev/null and b/tests/ref/math-vec-align-explicit-alternating.png differ diff --git a/tests/ref/math-vec-delim-set.png b/tests/ref/math-vec-delim-set.png new file mode 100644 index 00000000..8024d594 Binary files /dev/null and b/tests/ref/math-vec-delim-set.png differ diff --git a/tests/ref/math-vec-gap.png b/tests/ref/math-vec-gap.png new file mode 100644 index 00000000..06f8cf7d Binary files /dev/null and b/tests/ref/math-vec-gap.png differ diff --git a/tests/ref/math-vec-wide.png b/tests/ref/math-vec-wide.png new file mode 100644 index 00000000..30853a00 Binary files /dev/null and b/tests/ref/math-vec-wide.png differ diff --git a/tests/ref/math/accent.png b/tests/ref/math/accent.png deleted file mode 100644 index 52a7037e..00000000 Binary files a/tests/ref/math/accent.png and /dev/null differ diff --git a/tests/ref/math/alignment.png b/tests/ref/math/alignment.png deleted file mode 100644 index 4bf739a4..00000000 Binary files a/tests/ref/math/alignment.png and /dev/null differ diff --git a/tests/ref/math/attach-p1.png b/tests/ref/math/attach-p1.png deleted file mode 100644 index 45c465ce..00000000 Binary files a/tests/ref/math/attach-p1.png and /dev/null differ diff --git a/tests/ref/math/attach-p2.png b/tests/ref/math/attach-p2.png deleted file mode 100644 index 3820f33e..00000000 Binary files a/tests/ref/math/attach-p2.png and /dev/null differ diff --git a/tests/ref/math/attach-p3.png b/tests/ref/math/attach-p3.png deleted file mode 100644 index 69e0a7dd..00000000 Binary files a/tests/ref/math/attach-p3.png and /dev/null differ diff --git a/tests/ref/math/call.png b/tests/ref/math/call.png deleted file mode 100644 index 907a1a2b..00000000 Binary files a/tests/ref/math/call.png and /dev/null differ diff --git a/tests/ref/math/cancel.png b/tests/ref/math/cancel.png deleted file mode 100644 index 4f0de136..00000000 Binary files a/tests/ref/math/cancel.png and /dev/null differ diff --git a/tests/ref/math/cases.png b/tests/ref/math/cases.png deleted file mode 100644 index e222ae17..00000000 Binary files a/tests/ref/math/cases.png and /dev/null differ diff --git a/tests/ref/math/class.png b/tests/ref/math/class.png deleted file mode 100644 index a4d6e86c..00000000 Binary files a/tests/ref/math/class.png and /dev/null differ diff --git a/tests/ref/math/content.png b/tests/ref/math/content.png deleted file mode 100644 index c27a17ea..00000000 Binary files a/tests/ref/math/content.png and /dev/null differ diff --git a/tests/ref/math/delimited.png b/tests/ref/math/delimited.png deleted file mode 100644 index 6126f58a..00000000 Binary files a/tests/ref/math/delimited.png and /dev/null differ diff --git a/tests/ref/math/equation-block-align.png b/tests/ref/math/equation-block-align.png deleted file mode 100644 index 8736312a..00000000 Binary files a/tests/ref/math/equation-block-align.png and /dev/null differ diff --git a/tests/ref/math/equation-number.png b/tests/ref/math/equation-number.png deleted file mode 100644 index 8ba91590..00000000 Binary files a/tests/ref/math/equation-number.png and /dev/null differ diff --git a/tests/ref/math/equation-show.png b/tests/ref/math/equation-show.png deleted file mode 100644 index 79a70dc0..00000000 Binary files a/tests/ref/math/equation-show.png and /dev/null differ diff --git a/tests/ref/math/font-features.png b/tests/ref/math/font-features.png deleted file mode 100644 index 0ab2c06d..00000000 Binary files a/tests/ref/math/font-features.png and /dev/null differ diff --git a/tests/ref/math/frac.png b/tests/ref/math/frac.png deleted file mode 100644 index 3e08f7e5..00000000 Binary files a/tests/ref/math/frac.png and /dev/null differ diff --git a/tests/ref/math/linebreak.png b/tests/ref/math/linebreak.png deleted file mode 100644 index f3212a4a..00000000 Binary files a/tests/ref/math/linebreak.png and /dev/null differ diff --git a/tests/ref/math/matrix-alignment.png b/tests/ref/math/matrix-alignment.png deleted file mode 100644 index cdf17463..00000000 Binary files a/tests/ref/math/matrix-alignment.png and /dev/null differ diff --git a/tests/ref/math/matrix-gaps.png b/tests/ref/math/matrix-gaps.png deleted file mode 100644 index 16788969..00000000 Binary files a/tests/ref/math/matrix-gaps.png and /dev/null differ diff --git a/tests/ref/math/matrix.png b/tests/ref/math/matrix.png deleted file mode 100644 index b8ea19e2..00000000 Binary files a/tests/ref/math/matrix.png and /dev/null differ diff --git a/tests/ref/math/multiline.png b/tests/ref/math/multiline.png deleted file mode 100644 index 185724af..00000000 Binary files a/tests/ref/math/multiline.png and /dev/null differ diff --git a/tests/ref/math/numbering.png b/tests/ref/math/numbering.png deleted file mode 100644 index 813f5f8c..00000000 Binary files a/tests/ref/math/numbering.png and /dev/null differ diff --git a/tests/ref/math/op.png b/tests/ref/math/op.png deleted file mode 100644 index ab3f35f6..00000000 Binary files a/tests/ref/math/op.png and /dev/null differ diff --git a/tests/ref/math/opticalsize.png b/tests/ref/math/opticalsize.png deleted file mode 100644 index 303f7bee..00000000 Binary files a/tests/ref/math/opticalsize.png and /dev/null differ diff --git a/tests/ref/math/prime.png b/tests/ref/math/prime.png deleted file mode 100644 index 81a47643..00000000 Binary files a/tests/ref/math/prime.png and /dev/null differ diff --git a/tests/ref/math/root.png b/tests/ref/math/root.png deleted file mode 100644 index 51fdf2e8..00000000 Binary files a/tests/ref/math/root.png and /dev/null differ diff --git a/tests/ref/math/spacing.png b/tests/ref/math/spacing.png deleted file mode 100644 index d8198bbf..00000000 Binary files a/tests/ref/math/spacing.png and /dev/null differ diff --git a/tests/ref/math/style.png b/tests/ref/math/style.png deleted file mode 100644 index a52136dc..00000000 Binary files a/tests/ref/math/style.png and /dev/null differ diff --git a/tests/ref/math/syntax.png b/tests/ref/math/syntax.png deleted file mode 100644 index 3855fa9b..00000000 Binary files a/tests/ref/math/syntax.png and /dev/null differ diff --git a/tests/ref/math/unbalanced.png b/tests/ref/math/unbalanced.png deleted file mode 100644 index 84f51837..00000000 Binary files a/tests/ref/math/unbalanced.png and /dev/null differ diff --git a/tests/ref/math/underover.png b/tests/ref/math/underover.png deleted file mode 100644 index e974302f..00000000 Binary files a/tests/ref/math/underover.png and /dev/null differ diff --git a/tests/ref/math/vec.png b/tests/ref/math/vec.png deleted file mode 100644 index f2371e5b..00000000 Binary files a/tests/ref/math/vec.png and /dev/null differ diff --git a/tests/ref/meta/bibliography-full.png b/tests/ref/meta/bibliography-full.png deleted file mode 100644 index d8778c09..00000000 Binary files a/tests/ref/meta/bibliography-full.png and /dev/null differ diff --git a/tests/ref/meta/bibliography-ordering.png b/tests/ref/meta/bibliography-ordering.png deleted file mode 100644 index 116c561d..00000000 Binary files a/tests/ref/meta/bibliography-ordering.png and /dev/null differ diff --git a/tests/ref/meta/bibliography.png b/tests/ref/meta/bibliography.png deleted file mode 100644 index 8fbd09bc..00000000 Binary files a/tests/ref/meta/bibliography.png and /dev/null differ diff --git a/tests/ref/meta/cite-footnote.png b/tests/ref/meta/cite-footnote.png deleted file mode 100644 index 3a7a0094..00000000 Binary files a/tests/ref/meta/cite-footnote.png and /dev/null differ diff --git a/tests/ref/meta/cite-form.png b/tests/ref/meta/cite-form.png deleted file mode 100644 index 8adeac92..00000000 Binary files a/tests/ref/meta/cite-form.png and /dev/null differ diff --git a/tests/ref/meta/cite-group.png b/tests/ref/meta/cite-group.png deleted file mode 100644 index 8d02a903..00000000 Binary files a/tests/ref/meta/cite-group.png and /dev/null differ diff --git a/tests/ref/meta/counter-page.png b/tests/ref/meta/counter-page.png deleted file mode 100644 index 869718bc..00000000 Binary files a/tests/ref/meta/counter-page.png and /dev/null differ diff --git a/tests/ref/meta/counter.png b/tests/ref/meta/counter.png deleted file mode 100644 index 6c29ac17..00000000 Binary files a/tests/ref/meta/counter.png and /dev/null differ diff --git a/tests/ref/meta/document.png b/tests/ref/meta/document.png deleted file mode 100644 index 6db26511..00000000 Binary files a/tests/ref/meta/document.png and /dev/null differ diff --git a/tests/ref/meta/figure-caption.png b/tests/ref/meta/figure-caption.png deleted file mode 100644 index 8a1d4a59..00000000 Binary files a/tests/ref/meta/figure-caption.png and /dev/null differ diff --git a/tests/ref/meta/figure-localization.png b/tests/ref/meta/figure-localization.png deleted file mode 100644 index 5fcbd2b7..00000000 Binary files a/tests/ref/meta/figure-localization.png and /dev/null differ diff --git a/tests/ref/meta/figure.png b/tests/ref/meta/figure.png deleted file mode 100644 index bcdd0d2f..00000000 Binary files a/tests/ref/meta/figure.png and /dev/null differ diff --git a/tests/ref/meta/footnote-break.png b/tests/ref/meta/footnote-break.png deleted file mode 100644 index 625305c8..00000000 Binary files a/tests/ref/meta/footnote-break.png and /dev/null differ diff --git a/tests/ref/meta/footnote-columns.png b/tests/ref/meta/footnote-columns.png deleted file mode 100644 index 528ec664..00000000 Binary files a/tests/ref/meta/footnote-columns.png and /dev/null differ diff --git a/tests/ref/meta/footnote-container.png b/tests/ref/meta/footnote-container.png deleted file mode 100644 index 9327e7ee..00000000 Binary files a/tests/ref/meta/footnote-container.png and /dev/null differ diff --git a/tests/ref/meta/footnote-invariant.png b/tests/ref/meta/footnote-invariant.png deleted file mode 100644 index 66b41182..00000000 Binary files a/tests/ref/meta/footnote-invariant.png and /dev/null differ diff --git a/tests/ref/meta/footnote-refs.png b/tests/ref/meta/footnote-refs.png deleted file mode 100644 index 3fab7bd5..00000000 Binary files a/tests/ref/meta/footnote-refs.png and /dev/null differ diff --git a/tests/ref/meta/footnote-table.png b/tests/ref/meta/footnote-table.png deleted file mode 100644 index 023f8008..00000000 Binary files a/tests/ref/meta/footnote-table.png and /dev/null differ diff --git a/tests/ref/meta/footnote.png b/tests/ref/meta/footnote.png deleted file mode 100644 index 4c67bbd7..00000000 Binary files a/tests/ref/meta/footnote.png and /dev/null differ diff --git a/tests/ref/meta/heading.png b/tests/ref/meta/heading.png deleted file mode 100644 index 8467ea53..00000000 Binary files a/tests/ref/meta/heading.png and /dev/null differ diff --git a/tests/ref/meta/link.png b/tests/ref/meta/link.png deleted file mode 100644 index 3c3ecd2c..00000000 Binary files a/tests/ref/meta/link.png and /dev/null differ diff --git a/tests/ref/meta/numbering.png b/tests/ref/meta/numbering.png deleted file mode 100644 index fa5b520f..00000000 Binary files a/tests/ref/meta/numbering.png and /dev/null differ diff --git a/tests/ref/meta/outline-entry.png b/tests/ref/meta/outline-entry.png deleted file mode 100644 index f8f5412f..00000000 Binary files a/tests/ref/meta/outline-entry.png and /dev/null differ diff --git a/tests/ref/meta/outline-first-par-indent.png b/tests/ref/meta/outline-first-par-indent.png deleted file mode 100644 index f6e4ffe8..00000000 Binary files a/tests/ref/meta/outline-first-par-indent.png and /dev/null differ diff --git a/tests/ref/meta/outline-indent.png b/tests/ref/meta/outline-indent.png deleted file mode 100644 index 816d86a5..00000000 Binary files a/tests/ref/meta/outline-indent.png and /dev/null differ diff --git a/tests/ref/meta/outline.png b/tests/ref/meta/outline.png deleted file mode 100644 index 047bcc80..00000000 Binary files a/tests/ref/meta/outline.png and /dev/null differ diff --git a/tests/ref/meta/page-label.png b/tests/ref/meta/page-label.png deleted file mode 100644 index 301d626a..00000000 Binary files a/tests/ref/meta/page-label.png and /dev/null differ diff --git a/tests/ref/meta/query-before-after.png b/tests/ref/meta/query-before-after.png deleted file mode 100644 index 80f8fe1f..00000000 Binary files a/tests/ref/meta/query-before-after.png and /dev/null differ diff --git a/tests/ref/meta/query-figure.png b/tests/ref/meta/query-figure.png deleted file mode 100644 index 2537ebf0..00000000 Binary files a/tests/ref/meta/query-figure.png and /dev/null differ diff --git a/tests/ref/meta/query-header.png b/tests/ref/meta/query-header.png deleted file mode 100644 index c2dc4689..00000000 Binary files a/tests/ref/meta/query-header.png and /dev/null differ diff --git a/tests/ref/meta/ref.png b/tests/ref/meta/ref.png deleted file mode 100644 index 51563f54..00000000 Binary files a/tests/ref/meta/ref.png and /dev/null differ diff --git a/tests/ref/meta/state.png b/tests/ref/meta/state.png deleted file mode 100644 index 25faa0d9..00000000 Binary files a/tests/ref/meta/state.png and /dev/null differ diff --git a/tests/ref/newline-continuation-code.png b/tests/ref/newline-continuation-code.png new file mode 100644 index 00000000..46a6afd5 Binary files /dev/null and b/tests/ref/newline-continuation-code.png differ diff --git a/tests/ref/newline-continuation-markup.png b/tests/ref/newline-continuation-markup.png new file mode 100644 index 00000000..268e5f84 Binary files /dev/null and b/tests/ref/newline-continuation-markup.png differ diff --git a/tests/ref/numbering-chinese.png b/tests/ref/numbering-chinese.png new file mode 100644 index 00000000..06b31334 Binary files /dev/null and b/tests/ref/numbering-chinese.png differ diff --git a/tests/ref/numbering-hebrew.png b/tests/ref/numbering-hebrew.png new file mode 100644 index 00000000..d7614225 Binary files /dev/null and b/tests/ref/numbering-hebrew.png differ diff --git a/tests/ref/numbering-japanese-aiueo.png b/tests/ref/numbering-japanese-aiueo.png new file mode 100644 index 00000000..b06d5c69 Binary files /dev/null and b/tests/ref/numbering-japanese-aiueo.png differ diff --git a/tests/ref/numbering-japanese-iroha.png b/tests/ref/numbering-japanese-iroha.png new file mode 100644 index 00000000..2018802f Binary files /dev/null and b/tests/ref/numbering-japanese-iroha.png differ diff --git a/tests/ref/numbering-korean.png b/tests/ref/numbering-korean.png new file mode 100644 index 00000000..281f2ec2 Binary files /dev/null and b/tests/ref/numbering-korean.png differ diff --git a/tests/ref/numbering-latin.png b/tests/ref/numbering-latin.png new file mode 100644 index 00000000..e154735a Binary files /dev/null and b/tests/ref/numbering-latin.png differ diff --git a/tests/ref/numbering-symbol-and-roman.png b/tests/ref/numbering-symbol-and-roman.png new file mode 100644 index 00000000..979f3b90 Binary files /dev/null and b/tests/ref/numbering-symbol-and-roman.png differ diff --git a/tests/ref/numbers.png b/tests/ref/numbers.png new file mode 100644 index 00000000..e6e7215b Binary files /dev/null and b/tests/ref/numbers.png differ diff --git a/tests/ref/ops-add-content.png b/tests/ref/ops-add-content.png new file mode 100644 index 00000000..bdb8cb5e Binary files /dev/null and b/tests/ref/ops-add-content.png differ diff --git a/tests/ref/ops-multiply-inf-with-length.png b/tests/ref/ops-multiply-inf-with-length.png new file mode 100644 index 00000000..749be056 Binary files /dev/null and b/tests/ref/ops-multiply-inf-with-length.png differ diff --git a/tests/ref/outline-entry-complex.png b/tests/ref/outline-entry-complex.png new file mode 100644 index 00000000..c885cacc Binary files /dev/null and b/tests/ref/outline-entry-complex.png differ diff --git a/tests/ref/outline-entry.png b/tests/ref/outline-entry.png new file mode 100644 index 00000000..94e7a5a7 Binary files /dev/null and b/tests/ref/outline-entry.png differ diff --git a/tests/ref/outline-first-line-indent.png b/tests/ref/outline-first-line-indent.png new file mode 100644 index 00000000..dd995f31 Binary files /dev/null and b/tests/ref/outline-first-line-indent.png differ diff --git a/tests/ref/outline-indent-no-numbering.png b/tests/ref/outline-indent-no-numbering.png new file mode 100644 index 00000000..62bd80a3 Binary files /dev/null and b/tests/ref/outline-indent-no-numbering.png differ diff --git a/tests/ref/outline-indent-numbering.png b/tests/ref/outline-indent-numbering.png new file mode 100644 index 00000000..6c936827 Binary files /dev/null and b/tests/ref/outline-indent-numbering.png differ diff --git a/tests/ref/outline.png b/tests/ref/outline.png new file mode 100644 index 00000000..e5c24a98 Binary files /dev/null and b/tests/ref/outline.png differ diff --git a/tests/ref/overhang-lone.png b/tests/ref/overhang-lone.png new file mode 100644 index 00000000..b48618fb Binary files /dev/null and b/tests/ref/overhang-lone.png differ diff --git a/tests/ref/overhang.png b/tests/ref/overhang.png new file mode 100644 index 00000000..b97ef30c Binary files /dev/null and b/tests/ref/overhang.png differ diff --git a/tests/ref/overline-background.png b/tests/ref/overline-background.png new file mode 100644 index 00000000..8efd147e Binary files /dev/null and b/tests/ref/overline-background.png differ diff --git a/tests/ref/pad-basic.png b/tests/ref/pad-basic.png new file mode 100644 index 00000000..f8c40088 Binary files /dev/null and b/tests/ref/pad-basic.png differ diff --git a/tests/ref/pad-expanding-contents.png b/tests/ref/pad-expanding-contents.png new file mode 100644 index 00000000..1bef4a81 Binary files /dev/null and b/tests/ref/pad-expanding-contents.png differ diff --git a/tests/ref/pad-followed-by-content.png b/tests/ref/pad-followed-by-content.png new file mode 100644 index 00000000..f0f06a6c Binary files /dev/null and b/tests/ref/pad-followed-by-content.png differ diff --git a/tests/ref/page-call-followed-by-pagebreak.png b/tests/ref/page-call-followed-by-pagebreak.png new file mode 100644 index 00000000..87cd9735 Binary files /dev/null and b/tests/ref/page-call-followed-by-pagebreak.png differ diff --git a/tests/ref/page-call-styled-empty.png b/tests/ref/page-call-styled-empty.png new file mode 100644 index 00000000..6a24b1bc Binary files /dev/null and b/tests/ref/page-call-styled-empty.png differ diff --git a/tests/ref/page-fill.png b/tests/ref/page-fill.png new file mode 100644 index 00000000..0c7ab277 Binary files /dev/null and b/tests/ref/page-fill.png differ diff --git a/tests/ref/page-large.png b/tests/ref/page-large.png new file mode 100644 index 00000000..a57dceec Binary files /dev/null and b/tests/ref/page-large.png differ diff --git a/tests/ref/page-margin-binding-from-text-lang.png b/tests/ref/page-margin-binding-from-text-lang.png new file mode 100644 index 00000000..8d12ff2f Binary files /dev/null and b/tests/ref/page-margin-binding-from-text-lang.png differ diff --git a/tests/ref/page-margin-individual.png b/tests/ref/page-margin-individual.png new file mode 100644 index 00000000..0bc0f51b Binary files /dev/null and b/tests/ref/page-margin-individual.png differ diff --git a/tests/ref/page-margin-inside-outside-override.png b/tests/ref/page-margin-inside-outside-override.png new file mode 100644 index 00000000..5aa8bf12 Binary files /dev/null and b/tests/ref/page-margin-inside-outside-override.png differ diff --git a/tests/ref/page-margin-inside-with-binding.png b/tests/ref/page-margin-inside-with-binding.png new file mode 100644 index 00000000..5b9ec04f Binary files /dev/null and b/tests/ref/page-margin-inside-with-binding.png differ diff --git a/tests/ref/page-margin-inside.png b/tests/ref/page-margin-inside.png new file mode 100644 index 00000000..d70b8604 Binary files /dev/null and b/tests/ref/page-margin-inside.png differ diff --git a/tests/ref/page-margin-uniform.png b/tests/ref/page-margin-uniform.png new file mode 100644 index 00000000..8a06fb74 Binary files /dev/null and b/tests/ref/page-margin-uniform.png differ diff --git a/tests/ref/page-marginals.png b/tests/ref/page-marginals.png new file mode 100644 index 00000000..cab886b3 Binary files /dev/null and b/tests/ref/page-marginals.png differ diff --git a/tests/ref/page-number-align-bottom-left.png b/tests/ref/page-number-align-bottom-left.png new file mode 100644 index 00000000..396f6e98 Binary files /dev/null and b/tests/ref/page-number-align-bottom-left.png differ diff --git a/tests/ref/page-number-align-top-right.png b/tests/ref/page-number-align-top-right.png new file mode 100644 index 00000000..3c7e5579 Binary files /dev/null and b/tests/ref/page-number-align-top-right.png differ diff --git a/tests/ref/page-numbering-pdf-label.png b/tests/ref/page-numbering-pdf-label.png new file mode 100644 index 00000000..a1cae720 Binary files /dev/null and b/tests/ref/page-numbering-pdf-label.png differ diff --git a/tests/ref/page-set-empty.png b/tests/ref/page-set-empty.png new file mode 100644 index 00000000..6a24b1bc Binary files /dev/null and b/tests/ref/page-set-empty.png differ diff --git a/tests/ref/page-set-forces-break.png b/tests/ref/page-set-forces-break.png new file mode 100644 index 00000000..4654ef6c Binary files /dev/null and b/tests/ref/page-set-forces-break.png differ diff --git a/tests/ref/page-set-only-pagebreak.png b/tests/ref/page-set-only-pagebreak.png new file mode 100644 index 00000000..9bf379d6 Binary files /dev/null and b/tests/ref/page-set-only-pagebreak.png differ diff --git a/tests/ref/page-set-override-and-mix.png b/tests/ref/page-set-override-and-mix.png new file mode 100644 index 00000000..d9df6acd Binary files /dev/null and b/tests/ref/page-set-override-and-mix.png differ diff --git a/tests/ref/page-set-override-thrice.png b/tests/ref/page-set-override-thrice.png new file mode 100644 index 00000000..99173ced Binary files /dev/null and b/tests/ref/page-set-override-thrice.png differ diff --git a/tests/ref/pagebreak-around-set-page.png b/tests/ref/pagebreak-around-set-page.png new file mode 100644 index 00000000..2c1ce508 Binary files /dev/null and b/tests/ref/pagebreak-around-set-page.png differ diff --git a/tests/ref/pagebreak-followed-by-page-call.png b/tests/ref/pagebreak-followed-by-page-call.png new file mode 100644 index 00000000..ee435cdc Binary files /dev/null and b/tests/ref/pagebreak-followed-by-page-call.png differ diff --git a/tests/ref/pagebreak-meta.png b/tests/ref/pagebreak-meta.png new file mode 100644 index 00000000..7953dc51 Binary files /dev/null and b/tests/ref/pagebreak-meta.png differ diff --git a/tests/ref/pagebreak-set-page-mixed.png b/tests/ref/pagebreak-set-page-mixed.png new file mode 100644 index 00000000..3502ee42 Binary files /dev/null and b/tests/ref/pagebreak-set-page-mixed.png differ diff --git a/tests/ref/pagebreak-to-auto-sized.png b/tests/ref/pagebreak-to-auto-sized.png new file mode 100644 index 00000000..f3e2df45 Binary files /dev/null and b/tests/ref/pagebreak-to-auto-sized.png differ diff --git a/tests/ref/pagebreak-to-multiple-pages.png b/tests/ref/pagebreak-to-multiple-pages.png new file mode 100644 index 00000000..a7af0a9a Binary files /dev/null and b/tests/ref/pagebreak-to-multiple-pages.png differ diff --git a/tests/ref/pagebreak-to.png b/tests/ref/pagebreak-to.png new file mode 100644 index 00000000..62a4ee20 Binary files /dev/null and b/tests/ref/pagebreak-to.png differ diff --git a/tests/ref/pagebreak-weak-after-set-page.png b/tests/ref/pagebreak-weak-after-set-page.png new file mode 100644 index 00000000..c8014df1 Binary files /dev/null and b/tests/ref/pagebreak-weak-after-set-page.png differ diff --git a/tests/ref/pagebreak-weak-meta.png b/tests/ref/pagebreak-weak-meta.png new file mode 100644 index 00000000..aa69e606 Binary files /dev/null and b/tests/ref/pagebreak-weak-meta.png differ diff --git a/tests/ref/pagebreak-weak-place.png b/tests/ref/pagebreak-weak-place.png new file mode 100644 index 00000000..f85bdf02 Binary files /dev/null and b/tests/ref/pagebreak-weak-place.png differ diff --git a/tests/ref/pagebreak.png b/tests/ref/pagebreak.png new file mode 100644 index 00000000..d07473d9 Binary files /dev/null and b/tests/ref/pagebreak.png differ diff --git a/tests/ref/par-basic.png b/tests/ref/par-basic.png new file mode 100644 index 00000000..ffd9de9a Binary files /dev/null and b/tests/ref/par-basic.png differ diff --git a/tests/ref/par-first-line-indent.png b/tests/ref/par-first-line-indent.png new file mode 100644 index 00000000..e6d7ed76 Binary files /dev/null and b/tests/ref/par-first-line-indent.png differ diff --git a/tests/ref/par-hanging-indent-manual-linebreak.png b/tests/ref/par-hanging-indent-manual-linebreak.png new file mode 100644 index 00000000..e9c666cd Binary files /dev/null and b/tests/ref/par-hanging-indent-manual-linebreak.png differ diff --git a/tests/ref/par-hanging-indent-rtl.png b/tests/ref/par-hanging-indent-rtl.png new file mode 100644 index 00000000..849e0a01 Binary files /dev/null and b/tests/ref/par-hanging-indent-rtl.png differ diff --git a/tests/ref/par-hanging-indent.png b/tests/ref/par-hanging-indent.png new file mode 100644 index 00000000..49455a78 Binary files /dev/null and b/tests/ref/par-hanging-indent.png differ diff --git a/tests/ref/par-leading-and-block-spacing.png b/tests/ref/par-leading-and-block-spacing.png new file mode 100644 index 00000000..faaa3116 Binary files /dev/null and b/tests/ref/par-leading-and-block-spacing.png differ diff --git a/tests/ref/par-spacing-and-first-line-indent.png b/tests/ref/par-spacing-and-first-line-indent.png new file mode 100644 index 00000000..c322f630 Binary files /dev/null and b/tests/ref/par-spacing-and-first-line-indent.png differ diff --git a/tests/ref/parser-backtracking-destructuring-whitespace.png b/tests/ref/parser-backtracking-destructuring-whitespace.png new file mode 100644 index 00000000..d5d72888 Binary files /dev/null and b/tests/ref/parser-backtracking-destructuring-whitespace.png differ diff --git a/tests/ref/path.png b/tests/ref/path.png new file mode 100644 index 00000000..9643a476 Binary files /dev/null and b/tests/ref/path.png differ diff --git a/tests/ref/pattern-line.png b/tests/ref/pattern-line.png new file mode 100644 index 00000000..b891b6d7 Binary files /dev/null and b/tests/ref/pattern-line.png differ diff --git a/tests/ref/pattern-lines.png b/tests/ref/pattern-lines.png new file mode 100644 index 00000000..008d357e Binary files /dev/null and b/tests/ref/pattern-lines.png differ diff --git a/tests/ref/pattern-relative-parent.png b/tests/ref/pattern-relative-parent.png new file mode 100644 index 00000000..786057ef Binary files /dev/null and b/tests/ref/pattern-relative-parent.png differ diff --git a/tests/ref/pattern-relative-self.png b/tests/ref/pattern-relative-self.png new file mode 100644 index 00000000..28408081 Binary files /dev/null and b/tests/ref/pattern-relative-self.png differ diff --git a/tests/ref/pattern-small.png b/tests/ref/pattern-small.png new file mode 100644 index 00000000..0406252d Binary files /dev/null and b/tests/ref/pattern-small.png differ diff --git a/tests/ref/pattern-spacing-negative.png b/tests/ref/pattern-spacing-negative.png new file mode 100644 index 00000000..659c2283 Binary files /dev/null and b/tests/ref/pattern-spacing-negative.png differ diff --git a/tests/ref/pattern-spacing-positive.png b/tests/ref/pattern-spacing-positive.png new file mode 100644 index 00000000..3e475eee Binary files /dev/null and b/tests/ref/pattern-spacing-positive.png differ diff --git a/tests/ref/pattern-spacing-zero.png b/tests/ref/pattern-spacing-zero.png new file mode 100644 index 00000000..5118471a Binary files /dev/null and b/tests/ref/pattern-spacing-zero.png differ diff --git a/tests/ref/pattern-stroke.png b/tests/ref/pattern-stroke.png new file mode 100644 index 00000000..8b03783b Binary files /dev/null and b/tests/ref/pattern-stroke.png differ diff --git a/tests/ref/pattern-text.png b/tests/ref/pattern-text.png new file mode 100644 index 00000000..de9bfc2e Binary files /dev/null and b/tests/ref/pattern-text.png differ diff --git a/tests/ref/place-background.png b/tests/ref/place-background.png new file mode 100644 index 00000000..7d732717 Binary files /dev/null and b/tests/ref/place-background.png differ diff --git a/tests/ref/place-basic.png b/tests/ref/place-basic.png new file mode 100644 index 00000000..07642c34 Binary files /dev/null and b/tests/ref/place-basic.png differ diff --git a/tests/ref/place-block-spacing.png b/tests/ref/place-block-spacing.png new file mode 100644 index 00000000..fb01d1b6 Binary files /dev/null and b/tests/ref/place-block-spacing.png differ diff --git a/tests/ref/place-bottom-in-box.png b/tests/ref/place-bottom-in-box.png new file mode 100644 index 00000000..fdd8c010 Binary files /dev/null and b/tests/ref/place-bottom-in-box.png differ diff --git a/tests/ref/place-bottom-right-in-box.png b/tests/ref/place-bottom-right-in-box.png new file mode 100644 index 00000000..49c40886 Binary files /dev/null and b/tests/ref/place-bottom-right-in-box.png differ diff --git a/tests/ref/place-float-columns.png b/tests/ref/place-float-columns.png new file mode 100644 index 00000000..97065b68 Binary files /dev/null and b/tests/ref/place-float-columns.png differ diff --git a/tests/ref/place-float-figure.png b/tests/ref/place-float-figure.png new file mode 100644 index 00000000..5411178a Binary files /dev/null and b/tests/ref/place-float-figure.png differ diff --git a/tests/ref/place-float.png b/tests/ref/place-float.png new file mode 100644 index 00000000..ddd49c47 Binary files /dev/null and b/tests/ref/place-float.png differ diff --git a/tests/ref/place-horizon-in-boxes.png b/tests/ref/place-horizon-in-boxes.png new file mode 100644 index 00000000..b6d333bf Binary files /dev/null and b/tests/ref/place-horizon-in-boxes.png differ diff --git a/tests/ref/place-top-left-in-box.png b/tests/ref/place-top-left-in-box.png new file mode 100644 index 00000000..914ffa58 Binary files /dev/null and b/tests/ref/place-top-left-in-box.png differ diff --git a/tests/ref/polygon-line-join.png b/tests/ref/polygon-line-join.png new file mode 100644 index 00000000..0f65fa70 Binary files /dev/null and b/tests/ref/polygon-line-join.png differ diff --git a/tests/ref/polygon.png b/tests/ref/polygon.png new file mode 100644 index 00000000..1dc11083 Binary files /dev/null and b/tests/ref/polygon.png differ diff --git a/tests/ref/query-and-or.png b/tests/ref/query-and-or.png new file mode 100644 index 00000000..39cfd076 Binary files /dev/null and b/tests/ref/query-and-or.png differ diff --git a/tests/ref/query-before-after.png b/tests/ref/query-before-after.png new file mode 100644 index 00000000..33fde985 Binary files /dev/null and b/tests/ref/query-before-after.png differ diff --git a/tests/ref/query-complex.png b/tests/ref/query-complex.png new file mode 100644 index 00000000..f71dcce5 Binary files /dev/null and b/tests/ref/query-complex.png differ diff --git a/tests/ref/query-list-of-figures.png b/tests/ref/query-list-of-figures.png new file mode 100644 index 00000000..c94ccd00 Binary files /dev/null and b/tests/ref/query-list-of-figures.png differ diff --git a/tests/ref/query-running-header.png b/tests/ref/query-running-header.png new file mode 100644 index 00000000..210c7810 Binary files /dev/null and b/tests/ref/query-running-header.png differ diff --git a/tests/ref/quote-block-spacing.png b/tests/ref/quote-block-spacing.png new file mode 100644 index 00000000..3efae5ab Binary files /dev/null and b/tests/ref/quote-block-spacing.png differ diff --git a/tests/ref/quote-cite-format-author-date.png b/tests/ref/quote-cite-format-author-date.png new file mode 100644 index 00000000..43816f8c Binary files /dev/null and b/tests/ref/quote-cite-format-author-date.png differ diff --git a/tests/ref/quote-cite-format-label-or-numeric.png b/tests/ref/quote-cite-format-label-or-numeric.png new file mode 100644 index 00000000..f0f5f90f Binary files /dev/null and b/tests/ref/quote-cite-format-label-or-numeric.png differ diff --git a/tests/ref/quote-cite-format-note.png b/tests/ref/quote-cite-format-note.png new file mode 100644 index 00000000..1092ffdb Binary files /dev/null and b/tests/ref/quote-cite-format-note.png differ diff --git a/tests/ref/quote-dir-align.png b/tests/ref/quote-dir-align.png new file mode 100644 index 00000000..0341f87c Binary files /dev/null and b/tests/ref/quote-dir-align.png differ diff --git a/tests/ref/quote-dir-author-pos.png b/tests/ref/quote-dir-author-pos.png new file mode 100644 index 00000000..842796a2 Binary files /dev/null and b/tests/ref/quote-dir-author-pos.png differ diff --git a/tests/ref/quote-inline.png b/tests/ref/quote-inline.png new file mode 100644 index 00000000..4dbc9720 Binary files /dev/null and b/tests/ref/quote-inline.png differ diff --git a/tests/ref/quote-nesting-custom.png b/tests/ref/quote-nesting-custom.png new file mode 100644 index 00000000..e26b6258 Binary files /dev/null and b/tests/ref/quote-nesting-custom.png differ diff --git a/tests/ref/quote-nesting.png b/tests/ref/quote-nesting.png new file mode 100644 index 00000000..dcd1e378 Binary files /dev/null and b/tests/ref/quote-nesting.png differ diff --git a/tests/ref/raw-align-default.png b/tests/ref/raw-align-default.png new file mode 100644 index 00000000..84c51229 Binary files /dev/null and b/tests/ref/raw-align-default.png differ diff --git a/tests/ref/raw-align-specified.png b/tests/ref/raw-align-specified.png new file mode 100644 index 00000000..18b48dec Binary files /dev/null and b/tests/ref/raw-align-specified.png differ diff --git a/tests/ref/raw-block-no-parbreaks.png b/tests/ref/raw-block-no-parbreaks.png new file mode 100644 index 00000000..401cc5a9 Binary files /dev/null and b/tests/ref/raw-block-no-parbreaks.png differ diff --git a/tests/ref/raw-consecutive-single-backticks.png b/tests/ref/raw-consecutive-single-backticks.png new file mode 100644 index 00000000..159d0eda Binary files /dev/null and b/tests/ref/raw-consecutive-single-backticks.png differ diff --git a/tests/ref/raw-dedent-empty-line.png b/tests/ref/raw-dedent-empty-line.png new file mode 100644 index 00000000..c3c88e7a Binary files /dev/null and b/tests/ref/raw-dedent-empty-line.png differ diff --git a/tests/ref/raw-dedent-first-line.png b/tests/ref/raw-dedent-first-line.png new file mode 100644 index 00000000..c6eee5ce Binary files /dev/null and b/tests/ref/raw-dedent-first-line.png differ diff --git a/tests/ref/raw-dedent-last-line.png b/tests/ref/raw-dedent-last-line.png new file mode 100644 index 00000000..2b1fe747 Binary files /dev/null and b/tests/ref/raw-dedent-last-line.png differ diff --git a/tests/ref/raw-empty.png b/tests/ref/raw-empty.png new file mode 100644 index 00000000..a47eb855 Binary files /dev/null and b/tests/ref/raw-empty.png differ diff --git a/tests/ref/raw-highlight-typ.png b/tests/ref/raw-highlight-typ.png new file mode 100644 index 00000000..f80bbf89 Binary files /dev/null and b/tests/ref/raw-highlight-typ.png differ diff --git a/tests/ref/raw-highlight.png b/tests/ref/raw-highlight.png new file mode 100644 index 00000000..2f99b450 Binary files /dev/null and b/tests/ref/raw-highlight.png differ diff --git a/tests/ref/raw-inline-multiline.png b/tests/ref/raw-inline-multiline.png new file mode 100644 index 00000000..7db3126d Binary files /dev/null and b/tests/ref/raw-inline-multiline.png differ diff --git a/tests/ref/raw-line-alternating-fill.png b/tests/ref/raw-line-alternating-fill.png new file mode 100644 index 00000000..b8053129 Binary files /dev/null and b/tests/ref/raw-line-alternating-fill.png differ diff --git a/tests/ref/raw-line-text-fill.png b/tests/ref/raw-line-text-fill.png new file mode 100644 index 00000000..5b3c4d19 Binary files /dev/null and b/tests/ref/raw-line-text-fill.png differ diff --git a/tests/ref/raw-line.png b/tests/ref/raw-line.png new file mode 100644 index 00000000..c8ada95d Binary files /dev/null and b/tests/ref/raw-line.png differ diff --git a/tests/ref/raw-more-backticks.png b/tests/ref/raw-more-backticks.png new file mode 100644 index 00000000..ab836011 Binary files /dev/null and b/tests/ref/raw-more-backticks.png differ diff --git a/tests/ref/raw-show-set.png b/tests/ref/raw-show-set.png new file mode 100644 index 00000000..8a82c2e9 Binary files /dev/null and b/tests/ref/raw-show-set.png differ diff --git a/tests/ref/raw-single-backtick-lang.png b/tests/ref/raw-single-backtick-lang.png new file mode 100644 index 00000000..b420627e Binary files /dev/null and b/tests/ref/raw-single-backtick-lang.png differ diff --git a/tests/ref/raw-syntaxes.png b/tests/ref/raw-syntaxes.png new file mode 100644 index 00000000..4e14cd06 Binary files /dev/null and b/tests/ref/raw-syntaxes.png differ diff --git a/tests/ref/raw-tab-size.png b/tests/ref/raw-tab-size.png new file mode 100644 index 00000000..132a10b3 Binary files /dev/null and b/tests/ref/raw-tab-size.png differ diff --git a/tests/ref/raw-theme.png b/tests/ref/raw-theme.png new file mode 100644 index 00000000..78561ac6 Binary files /dev/null and b/tests/ref/raw-theme.png differ diff --git a/tests/ref/raw-trimming.png b/tests/ref/raw-trimming.png new file mode 100644 index 00000000..58d90b7f Binary files /dev/null and b/tests/ref/raw-trimming.png differ diff --git a/tests/ref/raw-typst-lang.png b/tests/ref/raw-typst-lang.png new file mode 100644 index 00000000..3dcafafb Binary files /dev/null and b/tests/ref/raw-typst-lang.png differ diff --git a/tests/ref/rect-customization.png b/tests/ref/rect-customization.png new file mode 100644 index 00000000..93808920 Binary files /dev/null and b/tests/ref/rect-customization.png differ diff --git a/tests/ref/rect-fill-stroke.png b/tests/ref/rect-fill-stroke.png new file mode 100644 index 00000000..28a47c12 Binary files /dev/null and b/tests/ref/rect-fill-stroke.png differ diff --git a/tests/ref/rect-stroke.png b/tests/ref/rect-stroke.png new file mode 100644 index 00000000..7d59c049 Binary files /dev/null and b/tests/ref/rect-stroke.png differ diff --git a/tests/ref/rect.png b/tests/ref/rect.png new file mode 100644 index 00000000..04e435ed Binary files /dev/null and b/tests/ref/rect.png differ diff --git a/tests/ref/ref-basic.png b/tests/ref/ref-basic.png new file mode 100644 index 00000000..94d94789 Binary files /dev/null and b/tests/ref/ref-basic.png differ diff --git a/tests/ref/ref-supplements.png b/tests/ref/ref-supplements.png new file mode 100644 index 00000000..46d1524a Binary files /dev/null and b/tests/ref/ref-supplements.png differ diff --git a/tests/ref/repeat-align-and-dir.png b/tests/ref/repeat-align-and-dir.png new file mode 100644 index 00000000..16797d04 Binary files /dev/null and b/tests/ref/repeat-align-and-dir.png differ diff --git a/tests/ref/repeat-basic.png b/tests/ref/repeat-basic.png new file mode 100644 index 00000000..61e7f50f Binary files /dev/null and b/tests/ref/repeat-basic.png differ diff --git a/tests/ref/repeat-dots-rtl.png b/tests/ref/repeat-dots-rtl.png new file mode 100644 index 00000000..a0f1a919 Binary files /dev/null and b/tests/ref/repeat-dots-rtl.png differ diff --git a/tests/ref/repeat-empty.png b/tests/ref/repeat-empty.png new file mode 100644 index 00000000..c23d7fa4 Binary files /dev/null and b/tests/ref/repeat-empty.png differ diff --git a/tests/ref/repeat-unboxed.png b/tests/ref/repeat-unboxed.png new file mode 100644 index 00000000..91678cea Binary files /dev/null and b/tests/ref/repeat-unboxed.png differ diff --git a/tests/ref/repr-color.png b/tests/ref/repr-color.png new file mode 100644 index 00000000..3425f7d4 Binary files /dev/null and b/tests/ref/repr-color.png differ diff --git a/tests/ref/repr-literals.png b/tests/ref/repr-literals.png new file mode 100644 index 00000000..1e8e85a4 Binary files /dev/null and b/tests/ref/repr-literals.png differ diff --git a/tests/ref/repr-misc.png b/tests/ref/repr-misc.png new file mode 100644 index 00000000..f4ac7c5f Binary files /dev/null and b/tests/ref/repr-misc.png differ diff --git a/tests/ref/repr-numerical.png b/tests/ref/repr-numerical.png new file mode 100644 index 00000000..f1a6fe8e Binary files /dev/null and b/tests/ref/repr-numerical.png differ diff --git a/tests/ref/return-in-nested-content-block.png b/tests/ref/return-in-nested-content-block.png new file mode 100644 index 00000000..d688741c Binary files /dev/null and b/tests/ref/return-in-nested-content-block.png differ diff --git a/tests/ref/set-if.png b/tests/ref/set-if.png new file mode 100644 index 00000000..08dc5e82 Binary files /dev/null and b/tests/ref/set-if.png differ diff --git a/tests/ref/set-instantiation-site-markup.png b/tests/ref/set-instantiation-site-markup.png new file mode 100644 index 00000000..180444b9 Binary files /dev/null and b/tests/ref/set-instantiation-site-markup.png differ diff --git a/tests/ref/set-instantiation-site.png b/tests/ref/set-instantiation-site.png new file mode 100644 index 00000000..593d3e2d Binary files /dev/null and b/tests/ref/set-instantiation-site.png differ diff --git a/tests/ref/set-scoped-in-code-block.png b/tests/ref/set-scoped-in-code-block.png new file mode 100644 index 00000000..8941f6c4 Binary files /dev/null and b/tests/ref/set-scoped-in-code-block.png differ diff --git a/tests/ref/set-text-override.png b/tests/ref/set-text-override.png new file mode 100644 index 00000000..83623876 Binary files /dev/null and b/tests/ref/set-text-override.png differ diff --git a/tests/ref/set-vs-construct-1.png b/tests/ref/set-vs-construct-1.png new file mode 100644 index 00000000..597e9674 Binary files /dev/null and b/tests/ref/set-vs-construct-1.png differ diff --git a/tests/ref/set-vs-construct-2.png b/tests/ref/set-vs-construct-2.png new file mode 100644 index 00000000..2fedd0b4 Binary files /dev/null and b/tests/ref/set-vs-construct-2.png differ diff --git a/tests/ref/set-vs-construct-3.png b/tests/ref/set-vs-construct-3.png new file mode 100644 index 00000000..dff0c8af Binary files /dev/null and b/tests/ref/set-vs-construct-3.png differ diff --git a/tests/ref/set-vs-construct-4.png b/tests/ref/set-vs-construct-4.png new file mode 100644 index 00000000..1f6834ef Binary files /dev/null and b/tests/ref/set-vs-construct-4.png differ diff --git a/tests/ref/shaping-emoji-bad-zwj.png b/tests/ref/shaping-emoji-bad-zwj.png new file mode 100644 index 00000000..544d64ee Binary files /dev/null and b/tests/ref/shaping-emoji-bad-zwj.png differ diff --git a/tests/ref/shaping-emoji-basic.png b/tests/ref/shaping-emoji-basic.png new file mode 100644 index 00000000..090ea611 Binary files /dev/null and b/tests/ref/shaping-emoji-basic.png differ diff --git a/tests/ref/shaping-font-fallback.png b/tests/ref/shaping-font-fallback.png new file mode 100644 index 00000000..813e3915 Binary files /dev/null and b/tests/ref/shaping-font-fallback.png differ diff --git a/tests/ref/shaping-forced-script-font-feature-enabled.png b/tests/ref/shaping-forced-script-font-feature-enabled.png new file mode 100644 index 00000000..0a10087a Binary files /dev/null and b/tests/ref/shaping-forced-script-font-feature-enabled.png differ diff --git a/tests/ref/shaping-forced-script-font-feature-inhibited.png b/tests/ref/shaping-forced-script-font-feature-inhibited.png new file mode 100644 index 00000000..77d8010e Binary files /dev/null and b/tests/ref/shaping-forced-script-font-feature-inhibited.png differ diff --git a/tests/ref/shaping-script-separation.png b/tests/ref/shaping-script-separation.png new file mode 100644 index 00000000..68170dd9 Binary files /dev/null and b/tests/ref/shaping-script-separation.png differ diff --git a/tests/ref/shorthand-dashes.png b/tests/ref/shorthand-dashes.png new file mode 100644 index 00000000..f8b4191f Binary files /dev/null and b/tests/ref/shorthand-dashes.png differ diff --git a/tests/ref/shorthand-ellipsis.png b/tests/ref/shorthand-ellipsis.png new file mode 100644 index 00000000..df9a9241 Binary files /dev/null and b/tests/ref/shorthand-ellipsis.png differ diff --git a/tests/ref/shorthand-nbsp-and-shy-hyphen.png b/tests/ref/shorthand-nbsp-and-shy-hyphen.png new file mode 100644 index 00000000..e8c81aaa Binary files /dev/null and b/tests/ref/shorthand-nbsp-and-shy-hyphen.png differ diff --git a/tests/ref/shorthand-nbsp-width.png b/tests/ref/shorthand-nbsp-width.png new file mode 100644 index 00000000..a92988cf Binary files /dev/null and b/tests/ref/shorthand-nbsp-width.png differ diff --git a/tests/ref/shorthands-math.png b/tests/ref/shorthands-math.png new file mode 100644 index 00000000..0514fa62 Binary files /dev/null and b/tests/ref/shorthands-math.png differ diff --git a/tests/ref/show-bare-basic.png b/tests/ref/show-bare-basic.png new file mode 100644 index 00000000..e389b506 Binary files /dev/null and b/tests/ref/show-bare-basic.png differ diff --git a/tests/ref/show-bare-content-block.png b/tests/ref/show-bare-content-block.png new file mode 100644 index 00000000..2631092b Binary files /dev/null and b/tests/ref/show-bare-content-block.png differ diff --git a/tests/ref/show-bare-replace-with-content.png b/tests/ref/show-bare-replace-with-content.png new file mode 100644 index 00000000..51e36a49 Binary files /dev/null and b/tests/ref/show-bare-replace-with-content.png differ diff --git a/tests/ref/show-bare-vs-set-text.png b/tests/ref/show-bare-vs-set-text.png new file mode 100644 index 00000000..b1e15d98 Binary files /dev/null and b/tests/ref/show-bare-vs-set-text.png differ diff --git a/tests/ref/show-function-order-with-set.png b/tests/ref/show-function-order-with-set.png new file mode 100644 index 00000000..a59f7274 Binary files /dev/null and b/tests/ref/show-function-order-with-set.png differ diff --git a/tests/ref/show-function-set-on-it.png b/tests/ref/show-function-set-on-it.png new file mode 100644 index 00000000..6c545e95 Binary files /dev/null and b/tests/ref/show-function-set-on-it.png differ diff --git a/tests/ref/show-in-show.png b/tests/ref/show-in-show.png new file mode 100644 index 00000000..65280ad7 Binary files /dev/null and b/tests/ref/show-in-show.png differ diff --git a/tests/ref/show-multiple-rules.png b/tests/ref/show-multiple-rules.png new file mode 100644 index 00000000..c92b6269 Binary files /dev/null and b/tests/ref/show-multiple-rules.png differ diff --git a/tests/ref/show-nested-scopes.png b/tests/ref/show-nested-scopes.png new file mode 100644 index 00000000..ac0a8125 Binary files /dev/null and b/tests/ref/show-nested-scopes.png differ diff --git a/tests/ref/show-recursive-identity.png b/tests/ref/show-recursive-identity.png new file mode 100644 index 00000000..6c545e95 Binary files /dev/null and b/tests/ref/show-recursive-identity.png differ diff --git a/tests/ref/show-recursive-multiple.png b/tests/ref/show-recursive-multiple.png new file mode 100644 index 00000000..b56b089c Binary files /dev/null and b/tests/ref/show-recursive-multiple.png differ diff --git a/tests/ref/show-rule-in-function.png b/tests/ref/show-rule-in-function.png new file mode 100644 index 00000000..97aa2845 Binary files /dev/null and b/tests/ref/show-rule-in-function.png differ diff --git a/tests/ref/show-selector-basic.png b/tests/ref/show-selector-basic.png new file mode 100644 index 00000000..870166d9 Binary files /dev/null and b/tests/ref/show-selector-basic.png differ diff --git a/tests/ref/show-selector-discard.png b/tests/ref/show-selector-discard.png new file mode 100644 index 00000000..13c9f0d6 Binary files /dev/null and b/tests/ref/show-selector-discard.png differ diff --git a/tests/ref/show-selector-element-or-label.png b/tests/ref/show-selector-element-or-label.png new file mode 100644 index 00000000..32cd992d Binary files /dev/null and b/tests/ref/show-selector-element-or-label.png differ diff --git a/tests/ref/show-selector-or-elements-with-set.png b/tests/ref/show-selector-or-elements-with-set.png new file mode 100644 index 00000000..f561cad8 Binary files /dev/null and b/tests/ref/show-selector-or-elements-with-set.png differ diff --git a/tests/ref/show-selector-realistic.png b/tests/ref/show-selector-realistic.png new file mode 100644 index 00000000..ae4f4a9a Binary files /dev/null and b/tests/ref/show-selector-realistic.png differ diff --git a/tests/ref/show-selector-replace-and-show-set.png b/tests/ref/show-selector-replace-and-show-set.png new file mode 100644 index 00000000..47a7ae33 Binary files /dev/null and b/tests/ref/show-selector-replace-and-show-set.png differ diff --git a/tests/ref/show-selector-replace.png b/tests/ref/show-selector-replace.png new file mode 100644 index 00000000..c00a88e8 Binary files /dev/null and b/tests/ref/show-selector-replace.png differ diff --git a/tests/ref/show-selector-where.png b/tests/ref/show-selector-where.png new file mode 100644 index 00000000..4cb02efd Binary files /dev/null and b/tests/ref/show-selector-where.png differ diff --git a/tests/ref/show-set-on-layoutable-element.png b/tests/ref/show-set-on-layoutable-element.png new file mode 100644 index 00000000..701bea50 Binary files /dev/null and b/tests/ref/show-set-on-layoutable-element.png differ diff --git a/tests/ref/show-set-on-same-element.png b/tests/ref/show-set-on-same-element.png new file mode 100644 index 00000000..9459fca0 Binary files /dev/null and b/tests/ref/show-set-on-same-element.png differ diff --git a/tests/ref/show-set-override.png b/tests/ref/show-set-override.png new file mode 100644 index 00000000..e7831b90 Binary files /dev/null and b/tests/ref/show-set-override.png differ diff --git a/tests/ref/show-set-same-element-and-order.png b/tests/ref/show-set-same-element-and-order.png new file mode 100644 index 00000000..d55d5e14 Binary files /dev/null and b/tests/ref/show-set-same-element-and-order.png differ diff --git a/tests/ref/show-set-same-element-matched-field.png b/tests/ref/show-set-same-element-matched-field.png new file mode 100644 index 00000000..aa44baee Binary files /dev/null and b/tests/ref/show-set-same-element-matched-field.png differ diff --git a/tests/ref/show-set-same-element-matching-interaction.png b/tests/ref/show-set-same-element-matching-interaction.png new file mode 100644 index 00000000..bc061038 Binary files /dev/null and b/tests/ref/show-set-same-element-matching-interaction.png differ diff --git a/tests/ref/show-set-same-element-synthesized-matched-field.png b/tests/ref/show-set-same-element-synthesized-matched-field.png new file mode 100644 index 00000000..c3918e8f Binary files /dev/null and b/tests/ref/show-set-same-element-synthesized-matched-field.png differ diff --git a/tests/ref/show-set-text-order-adjacent-1.png b/tests/ref/show-set-text-order-adjacent-1.png new file mode 100644 index 00000000..1bc95e3b Binary files /dev/null and b/tests/ref/show-set-text-order-adjacent-1.png differ diff --git a/tests/ref/show-set-text-order-adjacent-2.png b/tests/ref/show-set-text-order-adjacent-2.png new file mode 100644 index 00000000..caada91a Binary files /dev/null and b/tests/ref/show-set-text-order-adjacent-2.png differ diff --git a/tests/ref/show-set-text-order-contained-1.png b/tests/ref/show-set-text-order-contained-1.png new file mode 100644 index 00000000..8deaaacd Binary files /dev/null and b/tests/ref/show-set-text-order-contained-1.png differ diff --git a/tests/ref/show-set-text-order-contained-2.png b/tests/ref/show-set-text-order-contained-2.png new file mode 100644 index 00000000..00ea3fb8 Binary files /dev/null and b/tests/ref/show-set-text-order-contained-2.png differ diff --git a/tests/ref/show-set-text-order-contained-3.png b/tests/ref/show-set-text-order-contained-3.png new file mode 100644 index 00000000..1bc95e3b Binary files /dev/null and b/tests/ref/show-set-text-order-contained-3.png differ diff --git a/tests/ref/show-set-text-order-contained-4.png b/tests/ref/show-set-text-order-contained-4.png new file mode 100644 index 00000000..0946f922 Binary files /dev/null and b/tests/ref/show-set-text-order-contained-4.png differ diff --git a/tests/ref/show-set-text-order-overlapping-1.png b/tests/ref/show-set-text-order-overlapping-1.png new file mode 100644 index 00000000..71222567 Binary files /dev/null and b/tests/ref/show-set-text-order-overlapping-1.png differ diff --git a/tests/ref/show-set-text-order-overlapping-2.png b/tests/ref/show-set-text-order-overlapping-2.png new file mode 100644 index 00000000..f1b658f2 Binary files /dev/null and b/tests/ref/show-set-text-order-overlapping-2.png differ diff --git a/tests/ref/show-set-vs-construct.png b/tests/ref/show-set-vs-construct.png new file mode 100644 index 00000000..a0ec96bf Binary files /dev/null and b/tests/ref/show-set-vs-construct.png differ diff --git a/tests/ref/show-set-where-override.png b/tests/ref/show-set-where-override.png new file mode 100644 index 00000000..7f1ec60d Binary files /dev/null and b/tests/ref/show-set-where-override.png differ diff --git a/tests/ref/show-text-basic.png b/tests/ref/show-text-basic.png new file mode 100644 index 00000000..29bb5840 Binary files /dev/null and b/tests/ref/show-text-basic.png differ diff --git a/tests/ref/show-text-cyclic-raw.png b/tests/ref/show-text-cyclic-raw.png new file mode 100644 index 00000000..b7521c44 Binary files /dev/null and b/tests/ref/show-text-cyclic-raw.png differ diff --git a/tests/ref/show-text-cyclic.png b/tests/ref/show-text-cyclic.png new file mode 100644 index 00000000..4c4c4886 Binary files /dev/null and b/tests/ref/show-text-cyclic.png differ diff --git a/tests/ref/show-text-exactly-once.png b/tests/ref/show-text-exactly-once.png new file mode 100644 index 00000000..f681f721 Binary files /dev/null and b/tests/ref/show-text-exactly-once.png differ diff --git a/tests/ref/show-text-get-text-on-it.png b/tests/ref/show-text-get-text-on-it.png new file mode 100644 index 00000000..5c75b9de Binary files /dev/null and b/tests/ref/show-text-get-text-on-it.png differ diff --git a/tests/ref/show-text-in-other-show.png b/tests/ref/show-text-in-other-show.png new file mode 100644 index 00000000..f29de999 Binary files /dev/null and b/tests/ref/show-text-in-other-show.png differ diff --git a/tests/ref/show-text-indirectly-cyclic.png b/tests/ref/show-text-indirectly-cyclic.png new file mode 100644 index 00000000..de166dca Binary files /dev/null and b/tests/ref/show-text-indirectly-cyclic.png differ diff --git a/tests/ref/show-text-path-resolving.png b/tests/ref/show-text-path-resolving.png new file mode 100644 index 00000000..1a04f9e6 Binary files /dev/null and b/tests/ref/show-text-path-resolving.png differ diff --git a/tests/ref/show-text-regex-case-insensitive.png b/tests/ref/show-text-regex-case-insensitive.png new file mode 100644 index 00000000..70d70d34 Binary files /dev/null and b/tests/ref/show-text-regex-case-insensitive.png differ diff --git a/tests/ref/show-text-regex-character-class.png b/tests/ref/show-text-regex-character-class.png new file mode 100644 index 00000000..946c5d22 Binary files /dev/null and b/tests/ref/show-text-regex-character-class.png differ diff --git a/tests/ref/show-text-regex-word-boundary.png b/tests/ref/show-text-regex-word-boundary.png new file mode 100644 index 00000000..c171ac02 Binary files /dev/null and b/tests/ref/show-text-regex-word-boundary.png differ diff --git a/tests/ref/show-text-regex.png b/tests/ref/show-text-regex.png new file mode 100644 index 00000000..85db10a3 Binary files /dev/null and b/tests/ref/show-text-regex.png differ diff --git a/tests/ref/show-where-folding-stroke.png b/tests/ref/show-where-folding-stroke.png new file mode 100644 index 00000000..186ce681 Binary files /dev/null and b/tests/ref/show-where-folding-stroke.png differ diff --git a/tests/ref/show-where-folding-text-size.png b/tests/ref/show-where-folding-text-size.png new file mode 100644 index 00000000..9fbe3ff9 Binary files /dev/null and b/tests/ref/show-where-folding-text-size.png differ diff --git a/tests/ref/show-where-optional-field-raw.png b/tests/ref/show-where-optional-field-raw.png new file mode 100644 index 00000000..dd381610 Binary files /dev/null and b/tests/ref/show-where-optional-field-raw.png differ diff --git a/tests/ref/show-where-optional-field-text.png b/tests/ref/show-where-optional-field-text.png new file mode 100644 index 00000000..b1367d09 Binary files /dev/null and b/tests/ref/show-where-optional-field-text.png differ diff --git a/tests/ref/show-where-resolving-hyphenate.png b/tests/ref/show-where-resolving-hyphenate.png new file mode 100644 index 00000000..052a2eda Binary files /dev/null and b/tests/ref/show-where-resolving-hyphenate.png differ diff --git a/tests/ref/show-where-resolving-length.png b/tests/ref/show-where-resolving-length.png new file mode 100644 index 00000000..4c77f2ac Binary files /dev/null and b/tests/ref/show-where-resolving-length.png differ diff --git a/tests/ref/smallcaps.png b/tests/ref/smallcaps.png new file mode 100644 index 00000000..b5ee12b7 Binary files /dev/null and b/tests/ref/smallcaps.png differ diff --git a/tests/ref/smartquote-apostrophe.png b/tests/ref/smartquote-apostrophe.png new file mode 100644 index 00000000..d2cc1ebf Binary files /dev/null and b/tests/ref/smartquote-apostrophe.png differ diff --git a/tests/ref/smartquote-custom-complex.png b/tests/ref/smartquote-custom-complex.png new file mode 100644 index 00000000..7204a997 Binary files /dev/null and b/tests/ref/smartquote-custom-complex.png differ diff --git a/tests/ref/smartquote-custom.png b/tests/ref/smartquote-custom.png new file mode 100644 index 00000000..6a6bd9d1 Binary files /dev/null and b/tests/ref/smartquote-custom.png differ diff --git a/tests/ref/smartquote-disable.png b/tests/ref/smartquote-disable.png new file mode 100644 index 00000000..0218b7ac Binary files /dev/null and b/tests/ref/smartquote-disable.png differ diff --git a/tests/ref/smartquote-disabled-temporarily.png b/tests/ref/smartquote-disabled-temporarily.png new file mode 100644 index 00000000..84bc5e32 Binary files /dev/null and b/tests/ref/smartquote-disabled-temporarily.png differ diff --git a/tests/ref/smartquote-empty.png b/tests/ref/smartquote-empty.png new file mode 100644 index 00000000..f9f19989 Binary files /dev/null and b/tests/ref/smartquote-empty.png differ diff --git a/tests/ref/smartquote-escape.png b/tests/ref/smartquote-escape.png new file mode 100644 index 00000000..45d8f602 Binary files /dev/null and b/tests/ref/smartquote-escape.png differ diff --git a/tests/ref/smartquote-nesting.png b/tests/ref/smartquote-nesting.png new file mode 100644 index 00000000..1f38c097 Binary files /dev/null and b/tests/ref/smartquote-nesting.png differ diff --git a/tests/ref/smartquote.png b/tests/ref/smartquote.png new file mode 100644 index 00000000..070e0487 Binary files /dev/null and b/tests/ref/smartquote.png differ diff --git a/tests/ref/space-collapsing-comments.png b/tests/ref/space-collapsing-comments.png new file mode 100644 index 00000000..b35d9fec Binary files /dev/null and b/tests/ref/space-collapsing-comments.png differ diff --git a/tests/ref/space-collapsing-linebreaks.png b/tests/ref/space-collapsing-linebreaks.png new file mode 100644 index 00000000..b1f4a3af Binary files /dev/null and b/tests/ref/space-collapsing-linebreaks.png differ diff --git a/tests/ref/space-collapsing-stringy-linebreak.png b/tests/ref/space-collapsing-stringy-linebreak.png new file mode 100644 index 00000000..ceec6da7 Binary files /dev/null and b/tests/ref/space-collapsing-stringy-linebreak.png differ diff --git a/tests/ref/space-collapsing-with-h.png b/tests/ref/space-collapsing-with-h.png new file mode 100644 index 00000000..c2e253e7 Binary files /dev/null and b/tests/ref/space-collapsing-with-h.png differ diff --git a/tests/ref/space-collapsing.png b/tests/ref/space-collapsing.png new file mode 100644 index 00000000..32bd6039 Binary files /dev/null and b/tests/ref/space-collapsing.png differ diff --git a/tests/ref/space-ideographic-kept.png b/tests/ref/space-ideographic-kept.png new file mode 100644 index 00000000..cd292e2d Binary files /dev/null and b/tests/ref/space-ideographic-kept.png differ diff --git a/tests/ref/space-thin-kept.png b/tests/ref/space-thin-kept.png new file mode 100644 index 00000000..6ed3504b Binary files /dev/null and b/tests/ref/space-thin-kept.png differ diff --git a/tests/ref/space-trailing-linebreak.png b/tests/ref/space-trailing-linebreak.png new file mode 100644 index 00000000..42b28264 Binary files /dev/null and b/tests/ref/space-trailing-linebreak.png differ diff --git a/tests/ref/spacing-h-and-v.png b/tests/ref/spacing-h-and-v.png new file mode 100644 index 00000000..2c9a2960 Binary files /dev/null and b/tests/ref/spacing-h-and-v.png differ diff --git a/tests/ref/spacing-rtl.png b/tests/ref/spacing-rtl.png new file mode 100644 index 00000000..a9cbbca6 Binary files /dev/null and b/tests/ref/spacing-rtl.png differ diff --git a/tests/ref/square-auto-sized.png b/tests/ref/square-auto-sized.png new file mode 100644 index 00000000..a2c4a36e Binary files /dev/null and b/tests/ref/square-auto-sized.png differ diff --git a/tests/ref/square-base.png b/tests/ref/square-base.png new file mode 100644 index 00000000..3ef753f2 Binary files /dev/null and b/tests/ref/square-base.png differ diff --git a/tests/ref/square-circle-alignment.png b/tests/ref/square-circle-alignment.png new file mode 100644 index 00000000..3fff9e66 Binary files /dev/null and b/tests/ref/square-circle-alignment.png differ diff --git a/tests/ref/square-circle-overspecified.png b/tests/ref/square-circle-overspecified.png new file mode 100644 index 00000000..6dde5e51 Binary files /dev/null and b/tests/ref/square-circle-overspecified.png differ diff --git a/tests/ref/square-contents-overflow.png b/tests/ref/square-contents-overflow.png new file mode 100644 index 00000000..ae65b0a8 Binary files /dev/null and b/tests/ref/square-contents-overflow.png differ diff --git a/tests/ref/square-height-limited-stack.png b/tests/ref/square-height-limited-stack.png new file mode 100644 index 00000000..f52c608d Binary files /dev/null and b/tests/ref/square-height-limited-stack.png differ diff --git a/tests/ref/square-height-limited.png b/tests/ref/square-height-limited.png new file mode 100644 index 00000000..c01dc426 Binary files /dev/null and b/tests/ref/square-height-limited.png differ diff --git a/tests/ref/square-overflow.png b/tests/ref/square-overflow.png new file mode 100644 index 00000000..6169f305 Binary files /dev/null and b/tests/ref/square-overflow.png differ diff --git a/tests/ref/square-rect-rounded.png b/tests/ref/square-rect-rounded.png new file mode 100644 index 00000000..678ba819 Binary files /dev/null and b/tests/ref/square-rect-rounded.png differ diff --git a/tests/ref/square-relative-size.png b/tests/ref/square-relative-size.png new file mode 100644 index 00000000..96e744e6 Binary files /dev/null and b/tests/ref/square-relative-size.png differ diff --git a/tests/ref/square-relatively-sized-child.png b/tests/ref/square-relatively-sized-child.png new file mode 100644 index 00000000..3ffe3105 Binary files /dev/null and b/tests/ref/square-relatively-sized-child.png differ diff --git a/tests/ref/square.png b/tests/ref/square.png new file mode 100644 index 00000000..e6f8f5c8 Binary files /dev/null and b/tests/ref/square.png differ diff --git a/tests/ref/stack-basic.png b/tests/ref/stack-basic.png new file mode 100644 index 00000000..b5f38a83 Binary files /dev/null and b/tests/ref/stack-basic.png differ diff --git a/tests/ref/stack-fr.png b/tests/ref/stack-fr.png new file mode 100644 index 00000000..e34dd9b1 Binary files /dev/null and b/tests/ref/stack-fr.png differ diff --git a/tests/ref/stack-overflow.png b/tests/ref/stack-overflow.png new file mode 100644 index 00000000..43b3625a Binary files /dev/null and b/tests/ref/stack-overflow.png differ diff --git a/tests/ref/stack-rtl-align-and-fr.png b/tests/ref/stack-rtl-align-and-fr.png new file mode 100644 index 00000000..653ade6f Binary files /dev/null and b/tests/ref/stack-rtl-align-and-fr.png differ diff --git a/tests/ref/stack-spacing.png b/tests/ref/stack-spacing.png new file mode 100644 index 00000000..9667f657 Binary files /dev/null and b/tests/ref/stack-spacing.png differ diff --git a/tests/ref/state-basic.png b/tests/ref/state-basic.png new file mode 100644 index 00000000..0c67a751 Binary files /dev/null and b/tests/ref/state-basic.png differ diff --git a/tests/ref/state-multiple-calls-same-key.png b/tests/ref/state-multiple-calls-same-key.png new file mode 100644 index 00000000..077b6792 Binary files /dev/null and b/tests/ref/state-multiple-calls-same-key.png differ diff --git a/tests/ref/state-nested.png b/tests/ref/state-nested.png new file mode 100644 index 00000000..cc701600 Binary files /dev/null and b/tests/ref/state-nested.png differ diff --git a/tests/ref/state-no-convergence.png b/tests/ref/state-no-convergence.png new file mode 100644 index 00000000..dd44b9e1 Binary files /dev/null and b/tests/ref/state-no-convergence.png differ diff --git a/tests/ref/strike-background.png b/tests/ref/strike-background.png new file mode 100644 index 00000000..01861d25 Binary files /dev/null and b/tests/ref/strike-background.png differ diff --git a/tests/ref/strike-with.png b/tests/ref/strike-with.png new file mode 100644 index 00000000..59a84150 Binary files /dev/null and b/tests/ref/strike-with.png differ diff --git a/tests/ref/stroke-composition.png b/tests/ref/stroke-composition.png new file mode 100644 index 00000000..a6c7ce70 Binary files /dev/null and b/tests/ref/stroke-composition.png differ diff --git a/tests/ref/stroke-folding.png b/tests/ref/stroke-folding.png new file mode 100644 index 00000000..b4f1b1a9 Binary files /dev/null and b/tests/ref/stroke-folding.png differ diff --git a/tests/ref/stroke-text.png b/tests/ref/stroke-text.png new file mode 100644 index 00000000..ac09053a Binary files /dev/null and b/tests/ref/stroke-text.png differ diff --git a/tests/ref/stroke-zero-thickness.png b/tests/ref/stroke-zero-thickness.png new file mode 100644 index 00000000..6d305eaf Binary files /dev/null and b/tests/ref/stroke-zero-thickness.png differ diff --git a/tests/ref/strong-delta.png b/tests/ref/strong-delta.png new file mode 100644 index 00000000..d32459f6 Binary files /dev/null and b/tests/ref/strong-delta.png differ diff --git a/tests/ref/strong-double-star-empty-hint.png b/tests/ref/strong-double-star-empty-hint.png new file mode 100644 index 00000000..29cbb90f Binary files /dev/null and b/tests/ref/strong-double-star-empty-hint.png differ diff --git a/tests/ref/sub-super-non-typographic.png b/tests/ref/sub-super-non-typographic.png new file mode 100644 index 00000000..e5a8b673 Binary files /dev/null and b/tests/ref/sub-super-non-typographic.png differ diff --git a/tests/ref/sub-super.png b/tests/ref/sub-super.png new file mode 100644 index 00000000..9359cf01 Binary files /dev/null and b/tests/ref/sub-super.png differ diff --git a/tests/ref/super-underline.png b/tests/ref/super-underline.png new file mode 100644 index 00000000..99c1c309 Binary files /dev/null and b/tests/ref/super-underline.png differ diff --git a/tests/ref/symbol-constructor.png b/tests/ref/symbol-constructor.png new file mode 100644 index 00000000..e6db9491 Binary files /dev/null and b/tests/ref/symbol-constructor.png differ diff --git a/tests/ref/symbol.png b/tests/ref/symbol.png new file mode 100644 index 00000000..37339d59 Binary files /dev/null and b/tests/ref/symbol.png differ diff --git a/tests/ref/table-align-array.png b/tests/ref/table-align-array.png new file mode 100644 index 00000000..9242ae12 Binary files /dev/null and b/tests/ref/table-align-array.png differ diff --git a/tests/ref/table-cell-align-override.png b/tests/ref/table-cell-align-override.png new file mode 100644 index 00000000..dfab2bb0 Binary files /dev/null and b/tests/ref/table-cell-align-override.png differ diff --git a/tests/ref/table-cell-folding.png b/tests/ref/table-cell-folding.png new file mode 100644 index 00000000..94897a92 Binary files /dev/null and b/tests/ref/table-cell-folding.png differ diff --git a/tests/ref/table-cell-override.png b/tests/ref/table-cell-override.png new file mode 100644 index 00000000..d6f37d63 Binary files /dev/null and b/tests/ref/table-cell-override.png differ diff --git a/tests/ref/table-cell-set.png b/tests/ref/table-cell-set.png new file mode 100644 index 00000000..ef720ab3 Binary files /dev/null and b/tests/ref/table-cell-set.png differ diff --git a/tests/ref/table-cell-show-and-override.png b/tests/ref/table-cell-show-and-override.png new file mode 100644 index 00000000..df745802 Binary files /dev/null and b/tests/ref/table-cell-show-and-override.png differ diff --git a/tests/ref/table-cell-show-based-on-position.png b/tests/ref/table-cell-show-based-on-position.png new file mode 100644 index 00000000..db46e260 Binary files /dev/null and b/tests/ref/table-cell-show-based-on-position.png differ diff --git a/tests/ref/table-cell-show-emph.png b/tests/ref/table-cell-show-emph.png new file mode 100644 index 00000000..1afc833b Binary files /dev/null and b/tests/ref/table-cell-show-emph.png differ diff --git a/tests/ref/table-cell-show.png b/tests/ref/table-cell-show.png new file mode 100644 index 00000000..9ac6d269 Binary files /dev/null and b/tests/ref/table-cell-show.png differ diff --git a/tests/ref/table-cell-various-overrides.png b/tests/ref/table-cell-various-overrides.png new file mode 100644 index 00000000..c8540dfe Binary files /dev/null and b/tests/ref/table-cell-various-overrides.png differ diff --git a/tests/ref/table-fill-basic.png b/tests/ref/table-fill-basic.png new file mode 100644 index 00000000..bc12f8ae Binary files /dev/null and b/tests/ref/table-fill-basic.png differ diff --git a/tests/ref/table-gutters.png b/tests/ref/table-gutters.png new file mode 100644 index 00000000..697ddd48 Binary files /dev/null and b/tests/ref/table-gutters.png differ diff --git a/tests/ref/table-inset-fold.png b/tests/ref/table-inset-fold.png new file mode 100644 index 00000000..f2985c9e Binary files /dev/null and b/tests/ref/table-inset-fold.png differ diff --git a/tests/ref/table-inset.png b/tests/ref/table-inset.png new file mode 100644 index 00000000..a8a9adda Binary files /dev/null and b/tests/ref/table-inset.png differ diff --git a/tests/ref/table-newlines.png b/tests/ref/table-newlines.png new file mode 100644 index 00000000..a4da25f3 Binary files /dev/null and b/tests/ref/table-newlines.png differ diff --git a/tests/ref/table-stroke-vline-position-left-and-right.png b/tests/ref/table-stroke-vline-position-left-and-right.png new file mode 100644 index 00000000..53b48a10 Binary files /dev/null and b/tests/ref/table-stroke-vline-position-left-and-right.png differ diff --git a/tests/ref/terms-built-in-loop.png b/tests/ref/terms-built-in-loop.png new file mode 100644 index 00000000..dc103af9 Binary files /dev/null and b/tests/ref/terms-built-in-loop.png differ diff --git a/tests/ref/terms-constructor.png b/tests/ref/terms-constructor.png new file mode 100644 index 00000000..fe161505 Binary files /dev/null and b/tests/ref/terms-constructor.png differ diff --git a/tests/ref/terms-grid.png b/tests/ref/terms-grid.png new file mode 100644 index 00000000..6142becf Binary files /dev/null and b/tests/ref/terms-grid.png differ diff --git a/tests/ref/terms-multiline.png b/tests/ref/terms-multiline.png new file mode 100644 index 00000000..b5baea4a Binary files /dev/null and b/tests/ref/terms-multiline.png differ diff --git a/tests/ref/terms-rtl.png b/tests/ref/terms-rtl.png new file mode 100644 index 00000000..538571dd Binary files /dev/null and b/tests/ref/terms-rtl.png differ diff --git a/tests/ref/terms-style-change-interrupted.png b/tests/ref/terms-style-change-interrupted.png new file mode 100644 index 00000000..846e45e1 Binary files /dev/null and b/tests/ref/terms-style-change-interrupted.png differ diff --git a/tests/ref/terms-syntax-edge-cases.png b/tests/ref/terms-syntax-edge-cases.png new file mode 100644 index 00000000..e2a557c1 Binary files /dev/null and b/tests/ref/terms-syntax-edge-cases.png differ diff --git a/tests/ref/text-alternates-and-stylistic-sets.png b/tests/ref/text-alternates-and-stylistic-sets.png new file mode 100644 index 00000000..877542fc Binary files /dev/null and b/tests/ref/text-alternates-and-stylistic-sets.png differ diff --git a/tests/ref/text-call-body.png b/tests/ref/text-call-body.png new file mode 100644 index 00000000..24cdeb9f Binary files /dev/null and b/tests/ref/text-call-body.png differ diff --git a/tests/ref/text-chinese-basic.png b/tests/ref/text-chinese-basic.png new file mode 100644 index 00000000..ea4a0b82 Binary files /dev/null and b/tests/ref/text-chinese-basic.png differ diff --git a/tests/ref/text-cjk-latin-spacing.png b/tests/ref/text-cjk-latin-spacing.png new file mode 100644 index 00000000..1906bf76 Binary files /dev/null and b/tests/ref/text-cjk-latin-spacing.png differ diff --git a/tests/ref/text-copy-paste-ligatures.png b/tests/ref/text-copy-paste-ligatures.png new file mode 100644 index 00000000..f0f36a86 Binary files /dev/null and b/tests/ref/text-copy-paste-ligatures.png differ diff --git a/tests/ref/text-edge.png b/tests/ref/text-edge.png new file mode 100644 index 00000000..0953eded Binary files /dev/null and b/tests/ref/text-edge.png differ diff --git a/tests/ref/text-features.png b/tests/ref/text-features.png new file mode 100644 index 00000000..7b0b391f Binary files /dev/null and b/tests/ref/text-features.png differ diff --git a/tests/ref/text-font-change-after-space.png b/tests/ref/text-font-change-after-space.png new file mode 100644 index 00000000..83d2ceb6 Binary files /dev/null and b/tests/ref/text-font-change-after-space.png differ diff --git a/tests/ref/text-font-just-a-space.png b/tests/ref/text-font-just-a-space.png new file mode 100644 index 00000000..3c91db3c Binary files /dev/null and b/tests/ref/text-font-just-a-space.png differ diff --git a/tests/ref/text-font-properties.png b/tests/ref/text-font-properties.png new file mode 100644 index 00000000..3c65fa33 Binary files /dev/null and b/tests/ref/text-font-properties.png differ diff --git a/tests/ref/text-kerning.png b/tests/ref/text-kerning.png new file mode 100644 index 00000000..1bd3a001 Binary files /dev/null and b/tests/ref/text-kerning.png differ diff --git a/tests/ref/text-lang-hyphenate.png b/tests/ref/text-lang-hyphenate.png new file mode 100644 index 00000000..6315d6e2 Binary files /dev/null and b/tests/ref/text-lang-hyphenate.png differ diff --git a/tests/ref/text-lang-region.png b/tests/ref/text-lang-region.png new file mode 100644 index 00000000..a2736578 Binary files /dev/null and b/tests/ref/text-lang-region.png differ diff --git a/tests/ref/text-lang-script-shaping.png b/tests/ref/text-lang-script-shaping.png new file mode 100644 index 00000000..6beaece4 Binary files /dev/null and b/tests/ref/text-lang-script-shaping.png differ diff --git a/tests/ref/text-lang-shaping.png b/tests/ref/text-lang-shaping.png new file mode 100644 index 00000000..b892fcd5 Binary files /dev/null and b/tests/ref/text-lang-shaping.png differ diff --git a/tests/ref/text-lang-unknown-region.png b/tests/ref/text-lang-unknown-region.png new file mode 100644 index 00000000..de63013e Binary files /dev/null and b/tests/ref/text-lang-unknown-region.png differ diff --git a/tests/ref/text-lang.png b/tests/ref/text-lang.png new file mode 100644 index 00000000..de63013e Binary files /dev/null and b/tests/ref/text-lang.png differ diff --git a/tests/ref/text-ligatures.png b/tests/ref/text-ligatures.png new file mode 100644 index 00000000..6f0e286c Binary files /dev/null and b/tests/ref/text-ligatures.png differ diff --git a/tests/ref/text-number-type.png b/tests/ref/text-number-type.png new file mode 100644 index 00000000..beb6ba6c Binary files /dev/null and b/tests/ref/text-number-type.png differ diff --git a/tests/ref/text-number-width.png b/tests/ref/text-number-width.png new file mode 100644 index 00000000..62d8c61b Binary files /dev/null and b/tests/ref/text-number-width.png differ diff --git a/tests/ref/text-size-em-nesting.png b/tests/ref/text-size-em-nesting.png new file mode 100644 index 00000000..34ae35fe Binary files /dev/null and b/tests/ref/text-size-em-nesting.png differ diff --git a/tests/ref/text-size-em.png b/tests/ref/text-size-em.png new file mode 100644 index 00000000..944bdd29 Binary files /dev/null and b/tests/ref/text-size-em.png differ diff --git a/tests/ref/text-slashed-zero-and-fractions.png b/tests/ref/text-slashed-zero-and-fractions.png new file mode 100644 index 00000000..a25ca023 Binary files /dev/null and b/tests/ref/text-slashed-zero-and-fractions.png differ diff --git a/tests/ref/text-spacing-relative.png b/tests/ref/text-spacing-relative.png new file mode 100644 index 00000000..ccd2f140 Binary files /dev/null and b/tests/ref/text-spacing-relative.png differ diff --git a/tests/ref/text-spacing.png b/tests/ref/text-spacing.png new file mode 100644 index 00000000..240c69c0 Binary files /dev/null and b/tests/ref/text-spacing.png differ diff --git a/tests/ref/text-tracking-arabic.png b/tests/ref/text-tracking-arabic.png new file mode 100644 index 00000000..a4e450ff Binary files /dev/null and b/tests/ref/text-tracking-arabic.png differ diff --git a/tests/ref/text-tracking-changed-temporarily.png b/tests/ref/text-tracking-changed-temporarily.png new file mode 100644 index 00000000..f27849b4 Binary files /dev/null and b/tests/ref/text-tracking-changed-temporarily.png differ diff --git a/tests/ref/text-tracking-mark-placement.png b/tests/ref/text-tracking-mark-placement.png new file mode 100644 index 00000000..7fc8bb19 Binary files /dev/null and b/tests/ref/text-tracking-mark-placement.png differ diff --git a/tests/ref/text-tracking-negative.png b/tests/ref/text-tracking-negative.png new file mode 100644 index 00000000..96589887 Binary files /dev/null and b/tests/ref/text-tracking-negative.png differ diff --git a/tests/ref/text/baseline.png b/tests/ref/text/baseline.png deleted file mode 100644 index dcd6eb12..00000000 Binary files a/tests/ref/text/baseline.png and /dev/null differ diff --git a/tests/ref/text/chinese.png b/tests/ref/text/chinese.png deleted file mode 100644 index 0c3ddd00..00000000 Binary files a/tests/ref/text/chinese.png and /dev/null differ diff --git a/tests/ref/text/copy-paste.png b/tests/ref/text/copy-paste.png deleted file mode 100644 index ae4a5ad9..00000000 Binary files a/tests/ref/text/copy-paste.png and /dev/null differ diff --git a/tests/ref/text/deco.png b/tests/ref/text/deco.png deleted file mode 100644 index 3a11e72f..00000000 Binary files a/tests/ref/text/deco.png and /dev/null differ diff --git a/tests/ref/text/edge.png b/tests/ref/text/edge.png deleted file mode 100644 index 1daf4c2f..00000000 Binary files a/tests/ref/text/edge.png and /dev/null differ diff --git a/tests/ref/text/em.png b/tests/ref/text/em.png deleted file mode 100644 index 04cccd53..00000000 Binary files a/tests/ref/text/em.png and /dev/null differ diff --git a/tests/ref/text/emoji.png b/tests/ref/text/emoji.png deleted file mode 100644 index 1dbbba79..00000000 Binary files a/tests/ref/text/emoji.png and /dev/null differ diff --git a/tests/ref/text/emphasis.png b/tests/ref/text/emphasis.png deleted file mode 100644 index c19f6ebb..00000000 Binary files a/tests/ref/text/emphasis.png and /dev/null differ diff --git a/tests/ref/text/escape.png b/tests/ref/text/escape.png deleted file mode 100644 index c94bc52f..00000000 Binary files a/tests/ref/text/escape.png and /dev/null differ diff --git a/tests/ref/text/fallback.png b/tests/ref/text/fallback.png deleted file mode 100644 index 7f1e3e38..00000000 Binary files a/tests/ref/text/fallback.png and /dev/null differ diff --git a/tests/ref/text/features.png b/tests/ref/text/features.png deleted file mode 100644 index 566694c6..00000000 Binary files a/tests/ref/text/features.png and /dev/null differ diff --git a/tests/ref/text/font.png b/tests/ref/text/font.png deleted file mode 100644 index 39c8a951..00000000 Binary files a/tests/ref/text/font.png and /dev/null differ diff --git a/tests/ref/text/hyphenate.png b/tests/ref/text/hyphenate.png deleted file mode 100644 index 7b386a51..00000000 Binary files a/tests/ref/text/hyphenate.png and /dev/null differ diff --git a/tests/ref/text/lang-with-region.png b/tests/ref/text/lang-with-region.png deleted file mode 100644 index c7753104..00000000 Binary files a/tests/ref/text/lang-with-region.png and /dev/null differ diff --git a/tests/ref/text/lang.png b/tests/ref/text/lang.png deleted file mode 100644 index a5ae8979..00000000 Binary files a/tests/ref/text/lang.png and /dev/null differ diff --git a/tests/ref/text/linebreak-link.png b/tests/ref/text/linebreak-link.png deleted file mode 100644 index ffe39caa..00000000 Binary files a/tests/ref/text/linebreak-link.png and /dev/null differ diff --git a/tests/ref/text/linebreak-obj.png b/tests/ref/text/linebreak-obj.png deleted file mode 100644 index 127ee687..00000000 Binary files a/tests/ref/text/linebreak-obj.png and /dev/null differ diff --git a/tests/ref/text/linebreak.png b/tests/ref/text/linebreak.png deleted file mode 100644 index 3dd2fc15..00000000 Binary files a/tests/ref/text/linebreak.png and /dev/null differ diff --git a/tests/ref/text/lorem.png b/tests/ref/text/lorem.png deleted file mode 100644 index 9d55df22..00000000 Binary files a/tests/ref/text/lorem.png and /dev/null differ diff --git a/tests/ref/text/microtype.png b/tests/ref/text/microtype.png deleted file mode 100644 index 87622b0f..00000000 Binary files a/tests/ref/text/microtype.png and /dev/null differ diff --git a/tests/ref/text/numbers.png b/tests/ref/text/numbers.png deleted file mode 100644 index 9fc76aae..00000000 Binary files a/tests/ref/text/numbers.png and /dev/null differ diff --git a/tests/ref/text/quote-nesting.png b/tests/ref/text/quote-nesting.png deleted file mode 100644 index fb16002d..00000000 Binary files a/tests/ref/text/quote-nesting.png and /dev/null differ diff --git a/tests/ref/text/quote.png b/tests/ref/text/quote.png deleted file mode 100644 index 653f2d17..00000000 Binary files a/tests/ref/text/quote.png and /dev/null differ diff --git a/tests/ref/text/quotes.png b/tests/ref/text/quotes.png deleted file mode 100644 index 535c2829..00000000 Binary files a/tests/ref/text/quotes.png and /dev/null differ diff --git a/tests/ref/text/raw-align.png b/tests/ref/text/raw-align.png deleted file mode 100644 index 6d1044f7..00000000 Binary files a/tests/ref/text/raw-align.png and /dev/null differ diff --git a/tests/ref/text/raw-code.png b/tests/ref/text/raw-code.png deleted file mode 100644 index 682c7c48..00000000 Binary files a/tests/ref/text/raw-code.png and /dev/null differ diff --git a/tests/ref/text/raw-line.png b/tests/ref/text/raw-line.png deleted file mode 100644 index b76eb808..00000000 Binary files a/tests/ref/text/raw-line.png and /dev/null differ diff --git a/tests/ref/text/raw-syntaxes.png b/tests/ref/text/raw-syntaxes.png deleted file mode 100644 index ada751e0..00000000 Binary files a/tests/ref/text/raw-syntaxes.png and /dev/null differ diff --git a/tests/ref/text/raw-tabs.png b/tests/ref/text/raw-tabs.png deleted file mode 100644 index cac265e9..00000000 Binary files a/tests/ref/text/raw-tabs.png and /dev/null differ diff --git a/tests/ref/text/raw-theme.png b/tests/ref/text/raw-theme.png deleted file mode 100644 index 0ce17760..00000000 Binary files a/tests/ref/text/raw-theme.png and /dev/null differ diff --git a/tests/ref/text/raw.png b/tests/ref/text/raw.png deleted file mode 100644 index 27120d74..00000000 Binary files a/tests/ref/text/raw.png and /dev/null differ diff --git a/tests/ref/text/shaping.png b/tests/ref/text/shaping.png deleted file mode 100644 index 69cba132..00000000 Binary files a/tests/ref/text/shaping.png and /dev/null differ diff --git a/tests/ref/text/shift.png b/tests/ref/text/shift.png deleted file mode 100644 index 09d68bac..00000000 Binary files a/tests/ref/text/shift.png and /dev/null differ diff --git a/tests/ref/text/smartquotes.png b/tests/ref/text/smartquotes.png deleted file mode 100644 index a6a8cbb5..00000000 Binary files a/tests/ref/text/smartquotes.png and /dev/null differ diff --git a/tests/ref/text/space.png b/tests/ref/text/space.png deleted file mode 100644 index bae0e0a8..00000000 Binary files a/tests/ref/text/space.png and /dev/null differ diff --git a/tests/ref/text/stroke.png b/tests/ref/text/stroke.png deleted file mode 100644 index d6d85c28..00000000 Binary files a/tests/ref/text/stroke.png and /dev/null differ diff --git a/tests/ref/text/symbol.png b/tests/ref/text/symbol.png deleted file mode 100644 index 04d9d77f..00000000 Binary files a/tests/ref/text/symbol.png and /dev/null differ diff --git a/tests/ref/text/tracking-spacing.png b/tests/ref/text/tracking-spacing.png deleted file mode 100644 index 68d80213..00000000 Binary files a/tests/ref/text/tracking-spacing.png and /dev/null differ diff --git a/tests/ref/transform-rotate-and-scale.png b/tests/ref/transform-rotate-and-scale.png new file mode 100644 index 00000000..0dcf67ed Binary files /dev/null and b/tests/ref/transform-rotate-and-scale.png differ diff --git a/tests/ref/transform-rotate-origin.png b/tests/ref/transform-rotate-origin.png new file mode 100644 index 00000000..152b1e1f Binary files /dev/null and b/tests/ref/transform-rotate-origin.png differ diff --git a/tests/ref/transform-rotate-relative-sizing.png b/tests/ref/transform-rotate-relative-sizing.png new file mode 100644 index 00000000..9b81c386 Binary files /dev/null and b/tests/ref/transform-rotate-relative-sizing.png differ diff --git a/tests/ref/transform-rotate.png b/tests/ref/transform-rotate.png new file mode 100644 index 00000000..3990ed5b Binary files /dev/null and b/tests/ref/transform-rotate.png differ diff --git a/tests/ref/transform-scale-origin.png b/tests/ref/transform-scale-origin.png new file mode 100644 index 00000000..10e1cfe2 Binary files /dev/null and b/tests/ref/transform-scale-origin.png differ diff --git a/tests/ref/transform-scale-relative-sizing.png b/tests/ref/transform-scale-relative-sizing.png new file mode 100644 index 00000000..d10bd3ff Binary files /dev/null and b/tests/ref/transform-scale-relative-sizing.png differ diff --git a/tests/ref/transform-scale.png b/tests/ref/transform-scale.png new file mode 100644 index 00000000..c95b90f1 Binary files /dev/null and b/tests/ref/transform-scale.png differ diff --git a/tests/ref/transform-tex-logo.png b/tests/ref/transform-tex-logo.png new file mode 100644 index 00000000..5d16ffb4 Binary files /dev/null and b/tests/ref/transform-tex-logo.png differ diff --git a/tests/ref/underline-background.png b/tests/ref/underline-background.png new file mode 100644 index 00000000..33ba381a Binary files /dev/null and b/tests/ref/underline-background.png differ diff --git a/tests/ref/underline-overline-strike.png b/tests/ref/underline-overline-strike.png new file mode 100644 index 00000000..2567fca4 Binary files /dev/null and b/tests/ref/underline-overline-strike.png differ diff --git a/tests/ref/underline-stroke-folding.png b/tests/ref/underline-stroke-folding.png new file mode 100644 index 00000000..32119e5c Binary files /dev/null and b/tests/ref/underline-stroke-folding.png differ diff --git a/tests/ref/visualize/gradient-conic.png b/tests/ref/visualize/gradient-conic.png deleted file mode 100644 index ff4a0ca2..00000000 Binary files a/tests/ref/visualize/gradient-conic.png and /dev/null differ diff --git a/tests/ref/visualize/gradient-dir.png b/tests/ref/visualize/gradient-dir.png deleted file mode 100644 index bda3eb17..00000000 Binary files a/tests/ref/visualize/gradient-dir.png and /dev/null differ diff --git a/tests/ref/visualize/gradient-hue-rotation.png b/tests/ref/visualize/gradient-hue-rotation.png deleted file mode 100644 index 2d786f71..00000000 Binary files a/tests/ref/visualize/gradient-hue-rotation.png and /dev/null differ diff --git a/tests/ref/visualize/gradient-math.png b/tests/ref/visualize/gradient-math.png deleted file mode 100644 index 470e6138..00000000 Binary files a/tests/ref/visualize/gradient-math.png and /dev/null differ diff --git a/tests/ref/visualize/gradient-presets.png b/tests/ref/visualize/gradient-presets.png deleted file mode 100644 index e6f7f73a..00000000 Binary files a/tests/ref/visualize/gradient-presets.png and /dev/null differ diff --git a/tests/ref/visualize/gradient-radial.png b/tests/ref/visualize/gradient-radial.png deleted file mode 100644 index 2e8e9af3..00000000 Binary files a/tests/ref/visualize/gradient-radial.png and /dev/null differ diff --git a/tests/ref/visualize/gradient-relative-conic.png b/tests/ref/visualize/gradient-relative-conic.png deleted file mode 100644 index 232c5f0a..00000000 Binary files a/tests/ref/visualize/gradient-relative-conic.png and /dev/null differ diff --git a/tests/ref/visualize/gradient-relative-linear.png b/tests/ref/visualize/gradient-relative-linear.png deleted file mode 100644 index 56e46119..00000000 Binary files a/tests/ref/visualize/gradient-relative-linear.png and /dev/null differ diff --git a/tests/ref/visualize/gradient-relative-radial.png b/tests/ref/visualize/gradient-relative-radial.png deleted file mode 100644 index 210ea7b0..00000000 Binary files a/tests/ref/visualize/gradient-relative-radial.png and /dev/null differ diff --git a/tests/ref/visualize/gradient-repeat.png b/tests/ref/visualize/gradient-repeat.png deleted file mode 100644 index 6be7dc66..00000000 Binary files a/tests/ref/visualize/gradient-repeat.png and /dev/null differ diff --git a/tests/ref/visualize/gradient-sharp.png b/tests/ref/visualize/gradient-sharp.png deleted file mode 100644 index b7698cfa..00000000 Binary files a/tests/ref/visualize/gradient-sharp.png and /dev/null differ diff --git a/tests/ref/visualize/gradient-stroke.png b/tests/ref/visualize/gradient-stroke.png deleted file mode 100644 index 69317f73..00000000 Binary files a/tests/ref/visualize/gradient-stroke.png and /dev/null differ diff --git a/tests/ref/visualize/gradient-text-decorations.png b/tests/ref/visualize/gradient-text-decorations.png deleted file mode 100644 index 887cd500..00000000 Binary files a/tests/ref/visualize/gradient-text-decorations.png and /dev/null differ diff --git a/tests/ref/visualize/gradient-text-other.png b/tests/ref/visualize/gradient-text-other.png deleted file mode 100644 index 78555b18..00000000 Binary files a/tests/ref/visualize/gradient-text-other.png and /dev/null differ diff --git a/tests/ref/visualize/gradient-text.png b/tests/ref/visualize/gradient-text.png deleted file mode 100644 index 478a0586..00000000 Binary files a/tests/ref/visualize/gradient-text.png and /dev/null differ diff --git a/tests/ref/visualize/gradient-transform.png b/tests/ref/visualize/gradient-transform.png deleted file mode 100644 index a55ad91e..00000000 Binary files a/tests/ref/visualize/gradient-transform.png and /dev/null differ diff --git a/tests/ref/visualize/image-scale.png b/tests/ref/visualize/image-scale.png deleted file mode 100644 index 95e9157e..00000000 Binary files a/tests/ref/visualize/image-scale.png and /dev/null differ diff --git a/tests/ref/visualize/image.png b/tests/ref/visualize/image.png deleted file mode 100644 index ec53fa98..00000000 Binary files a/tests/ref/visualize/image.png and /dev/null differ diff --git a/tests/ref/visualize/line.png b/tests/ref/visualize/line.png deleted file mode 100644 index d19dea0e..00000000 Binary files a/tests/ref/visualize/line.png and /dev/null differ diff --git a/tests/ref/visualize/path.png b/tests/ref/visualize/path.png deleted file mode 100644 index c7f710c9..00000000 Binary files a/tests/ref/visualize/path.png and /dev/null differ diff --git a/tests/ref/visualize/pattern-relative.png b/tests/ref/visualize/pattern-relative.png deleted file mode 100644 index 7958bf7f..00000000 Binary files a/tests/ref/visualize/pattern-relative.png and /dev/null differ diff --git a/tests/ref/visualize/pattern-simple.png b/tests/ref/visualize/pattern-simple.png deleted file mode 100644 index ac473a75..00000000 Binary files a/tests/ref/visualize/pattern-simple.png and /dev/null differ diff --git a/tests/ref/visualize/pattern-small.png b/tests/ref/visualize/pattern-small.png deleted file mode 100644 index 6af592dd..00000000 Binary files a/tests/ref/visualize/pattern-small.png and /dev/null differ diff --git a/tests/ref/visualize/pattern-spacing.png b/tests/ref/visualize/pattern-spacing.png deleted file mode 100644 index 4c95a3b0..00000000 Binary files a/tests/ref/visualize/pattern-spacing.png and /dev/null differ diff --git a/tests/ref/visualize/pattern-stroke.png b/tests/ref/visualize/pattern-stroke.png deleted file mode 100644 index d71f1c92..00000000 Binary files a/tests/ref/visualize/pattern-stroke.png and /dev/null differ diff --git a/tests/ref/visualize/pattern-text.png b/tests/ref/visualize/pattern-text.png deleted file mode 100644 index 2ecf2fda..00000000 Binary files a/tests/ref/visualize/pattern-text.png and /dev/null differ diff --git a/tests/ref/visualize/polygon.png b/tests/ref/visualize/polygon.png deleted file mode 100644 index 234aeb14..00000000 Binary files a/tests/ref/visualize/polygon.png and /dev/null differ diff --git a/tests/ref/visualize/shape-aspect.png b/tests/ref/visualize/shape-aspect.png deleted file mode 100644 index 918a5e73..00000000 Binary files a/tests/ref/visualize/shape-aspect.png and /dev/null differ diff --git a/tests/ref/visualize/shape-circle.png b/tests/ref/visualize/shape-circle.png deleted file mode 100644 index a2ee279d..00000000 Binary files a/tests/ref/visualize/shape-circle.png and /dev/null differ diff --git a/tests/ref/visualize/shape-ellipse.png b/tests/ref/visualize/shape-ellipse.png deleted file mode 100644 index 6de5e9f6..00000000 Binary files a/tests/ref/visualize/shape-ellipse.png and /dev/null differ diff --git a/tests/ref/visualize/shape-fill-stroke.png b/tests/ref/visualize/shape-fill-stroke.png deleted file mode 100644 index d4a4817a..00000000 Binary files a/tests/ref/visualize/shape-fill-stroke.png and /dev/null differ diff --git a/tests/ref/visualize/shape-rect.png b/tests/ref/visualize/shape-rect.png deleted file mode 100644 index a279341e..00000000 Binary files a/tests/ref/visualize/shape-rect.png and /dev/null differ diff --git a/tests/ref/visualize/shape-rounded.png b/tests/ref/visualize/shape-rounded.png deleted file mode 100644 index ec926d0a..00000000 Binary files a/tests/ref/visualize/shape-rounded.png and /dev/null differ diff --git a/tests/ref/visualize/shape-square.png b/tests/ref/visualize/shape-square.png deleted file mode 100644 index 46e243e1..00000000 Binary files a/tests/ref/visualize/shape-square.png and /dev/null differ diff --git a/tests/ref/visualize/stroke.png b/tests/ref/visualize/stroke.png deleted file mode 100644 index bdfcae9f..00000000 Binary files a/tests/ref/visualize/stroke.png and /dev/null differ diff --git a/tests/ref/visualize/svg-text.png b/tests/ref/visualize/svg-text.png deleted file mode 100644 index b2bbe320..00000000 Binary files a/tests/ref/visualize/svg-text.png and /dev/null differ diff --git a/tests/ref/while-loop-basic.png b/tests/ref/while-loop-basic.png new file mode 100644 index 00000000..3a0e6d24 Binary files /dev/null and b/tests/ref/while-loop-basic.png differ diff --git a/tests/src/args.rs b/tests/src/args.rs new file mode 100644 index 00000000..fcd4ead1 --- /dev/null +++ b/tests/src/args.rs @@ -0,0 +1,46 @@ +use clap::{Parser, Subcommand}; + +/// Typst's test runner. +#[derive(Debug, Clone, Parser)] +#[clap(name = "typst-test", author)] +pub struct CliArguments { + /// The command to run. + #[command(subcommand)] + pub command: Option, + /// All the tests that contain the filter string will be run. + pub filter: Vec, + /// Runs only the tests with the exact specified `filter` names. + #[arg(short, long)] + pub exact: bool, + /// Whether to update the reference images of non-passing tests. + #[arg(short, long)] + pub update: bool, + /// The scaling factor to render the output image with. + /// + /// Does not affect the comparison or the reference image. + #[arg(short, long, default_value_t = 1.0)] + pub scale: f32, + /// Exports PDF outputs into the artifact store. + #[arg(long)] + pub pdf: bool, + /// Exports SVG outputs into the artifact store. + #[arg(long)] + pub svg: bool, + /// Whether to display the syntax tree. + #[arg(long)] + pub syntax: bool, + /// Prevents the terminal from being cleared of test names. + #[arg(short, long)] + pub verbose: bool, + /// How many threads to spawn when running the tests. + #[arg(short = 'j', long)] + pub num_threads: Option, +} + +/// What to do. +#[derive(Debug, Clone, Subcommand)] +#[command()] +pub enum Command { + /// Clears the on-disk test artifact store. + Clean, +} diff --git a/tests/src/collect.rs b/tests/src/collect.rs new file mode 100644 index 00000000..44a325f2 --- /dev/null +++ b/tests/src/collect.rs @@ -0,0 +1,420 @@ +use std::collections::{HashMap, HashSet}; +use std::fmt::{self, Display, Formatter}; +use std::ops::Range; +use std::path::{Path, PathBuf}; +use std::str::FromStr; + +use ecow::{eco_format, EcoString}; +use typst::syntax::package::PackageVersion; +use typst::syntax::{is_id_continue, is_ident, is_newline, FileId, Source, VirtualPath}; +use unscanny::Scanner; + +/// Collects all tests from all files. +/// +/// Returns: +/// - the tests and the number of skipped tests in the success case. +/// - parsing errors in the failure case. +pub fn collect() -> Result<(Vec, usize), Vec> { + Collector::new().collect() +} + +/// A single test. +pub struct Test { + pub pos: FilePos, + pub name: EcoString, + pub source: Source, + pub notes: Vec, + pub large: bool, +} + +impl Display for Test { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + write!(f, "{} ({})", self.name, self.pos) + } +} + +/// A position in a file. +#[derive(Clone)] +pub struct FilePos { + pub path: PathBuf, + pub line: usize, +} + +impl FilePos { + fn new(path: impl Into, line: usize) -> Self { + Self { path: path.into(), line } + } +} + +impl Display for FilePos { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + write!(f, "{}:{}", self.path.display(), self.line) + } +} + +/// The size of a file. +pub struct FileSize(pub usize); + +impl Display for FileSize { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + write!(f, "{:.2} KiB", (self.0 as f64) / 1024.0) + } +} + +/// An annotation like `// Error: 2-6 message` in a test. +pub struct Note { + pub pos: FilePos, + pub kind: NoteKind, + pub range: Option>, + pub message: String, +} + +/// A kind of annotation in a test. +#[derive(Debug, Copy, Clone, Eq, PartialEq)] +pub enum NoteKind { + Error, + Warning, + Hint, +} + +impl FromStr for NoteKind { + type Err = (); + + fn from_str(s: &str) -> Result { + Ok(match s { + "Error" => Self::Error, + "Warning" => Self::Warning, + "Hint" => Self::Hint, + _ => return Err(()), + }) + } +} + +impl Display for NoteKind { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + f.pad(match self { + Self::Error => "Error", + Self::Warning => "Warning", + Self::Hint => "Hint", + }) + } +} + +/// Collects all tests from all files. +struct Collector { + tests: Vec, + errors: Vec, + seen: HashMap, + large: HashSet, + skipped: usize, +} + +impl Collector { + /// Creates a new test collector. + fn new() -> Self { + Self { + tests: vec![], + errors: vec![], + seen: HashMap::new(), + large: HashSet::new(), + skipped: 0, + } + } + + /// Collects tests from all files. + fn collect(mut self) -> Result<(Vec, usize), Vec> { + self.walk_files(); + self.walk_references(); + + if self.errors.is_empty() { + Ok((self.tests, self.skipped)) + } else { + Err(self.errors) + } + } + + /// Walks through all test files and collects the tests. + fn walk_files(&mut self) { + for entry in walkdir::WalkDir::new(crate::SUITE_PATH).sort_by_file_name() { + let entry = entry.unwrap(); + let path = entry.path(); + if !path.extension().is_some_and(|ext| ext == "typ") { + continue; + } + + let text = std::fs::read_to_string(path).unwrap(); + if text.starts_with("// SKIP") { + continue; + } + + Parser::new(self, path, &text).parse(); + } + } + + /// Walks through all reference images and ensure that a test exists for + /// each one. + fn walk_references(&mut self) { + for entry in walkdir::WalkDir::new(crate::REF_PATH).sort_by_file_name() { + let entry = entry.unwrap(); + let path = entry.path(); + if !path.extension().is_some_and(|ext| ext == "png") { + continue; + } + + let stem = path.file_stem().unwrap().to_string_lossy(); + let name = &*stem; + + let Some(pos) = self.seen.get(name) else { + self.errors.push(TestParseError { + pos: FilePos::new(path, 0), + message: "dangling reference image".into(), + }); + continue; + }; + + let len = path.metadata().unwrap().len() as usize; + if !self.large.contains(name) && len > crate::REF_LIMIT { + self.errors.push(TestParseError { + pos: pos.clone(), + message: format!( + "reference image size exceeds {}, but the test is not marked as `// LARGE`", + FileSize(crate::REF_LIMIT), + ), + }); + } + } + } +} + +/// Parses a single test file. +struct Parser<'a> { + collector: &'a mut Collector, + path: &'a Path, + s: Scanner<'a>, + test_start_line: usize, + line: usize, +} + +impl<'a> Parser<'a> { + /// Creates a new parser for a file. + fn new(collector: &'a mut Collector, path: &'a Path, source: &'a str) -> Self { + Self { + collector, + path, + s: Scanner::new(source), + test_start_line: 1, + line: 1, + } + } + + /// Parses an individual file. + fn parse(&mut self) { + self.skip_preamble(); + + while !self.s.done() { + let mut name = EcoString::new(); + let mut notes = vec![]; + if self.s.eat_if("---") { + self.s.eat_while(' '); + name = self.s.eat_until(char::is_whitespace).into(); + self.s.eat_while(' '); + + if name.is_empty() { + self.error("expected test name"); + } else if !is_ident(&name) { + self.error(format!("test name `{name}` is not a valid identifier")); + } else if !self.s.eat_if("---") { + self.error("expected closing ---"); + } + } else { + self.error("expected opening ---"); + } + + if self.collector.seen.contains_key(&name) { + self.error(format!("duplicate test {name}")); + } + + if self.s.eat_newline() { + self.line += 1; + } + + let start = self.s.cursor(); + self.test_start_line = self.line; + + let pos = FilePos::new(self.path, self.test_start_line); + self.collector.seen.insert(name.clone(), pos.clone()); + + while !self.s.done() && !self.s.at("---") { + self.s.eat_until(is_newline); + if self.s.eat_newline() { + self.line += 1; + } + } + + let text = self.s.from(start); + let large = text.starts_with("// LARGE"); + if large { + self.collector.large.insert(name.clone()); + } + + if !filtered(&name) { + self.collector.skipped += 1; + continue; + } + + let vpath = VirtualPath::new(self.path); + let source = Source::new(FileId::new(None, vpath), text.into()); + + self.s.jump(start); + self.line = self.test_start_line; + + while !self.s.done() && !self.s.at("---") { + self.s.eat_while(' '); + if self.s.eat_if("// ") { + notes.extend(self.parse_note(&source)); + } + + self.s.eat_until(is_newline); + if self.s.eat_newline() { + self.line += 1; + } + } + + self.collector.tests.push(Test { pos, name, source, notes, large }); + } + } + + /// Skips the preamble of a test. + fn skip_preamble(&mut self) { + let mut errored = false; + while !self.s.done() && !self.s.at("---") { + let line = self.s.eat_until(is_newline).trim(); + if !errored && !line.is_empty() && !line.starts_with("//") { + self.error("test preamble may only contain comments and blank lines"); + errored = true; + } + if self.s.eat_newline() { + self.line += 1; + } + } + } + + /// Parses an annotation in a test. + fn parse_note(&mut self, source: &Source) -> Option { + let head = self.s.eat_while(is_id_continue); + if !self.s.eat_if(':') { + return None; + } + + let kind: NoteKind = head.parse().ok()?; + self.s.eat_if(' '); + + let mut range = None; + if self.s.at('-') || self.s.at(char::is_numeric) { + range = self.parse_range(source); + if range.is_none() { + self.error("range is malformed"); + return None; + } + } + + let message = self + .s + .eat_until(is_newline) + .trim() + .replace("VERSION", &eco_format!("{}", PackageVersion::compiler())); + + Some(Note { + pos: FilePos::new(self.path, self.line), + kind, + range, + message, + }) + } + + /// Parse a range, optionally abbreviated as just a position if the range + /// is empty. + fn parse_range(&mut self, source: &Source) -> Option> { + let start = self.parse_position(source)?; + let end = if self.s.eat_if('-') { self.parse_position(source)? } else { start }; + Some(start..end) + } + + /// Parses a relative `(line:)?column` position. + fn parse_position(&mut self, source: &Source) -> Option { + let first = self.parse_number()?; + let (line_delta, column) = + if self.s.eat_if(':') { (first, self.parse_number()?) } else { (1, first) }; + + let text = source.text(); + let line_idx_in_test = self.line - self.test_start_line; + let comments = text + .lines() + .skip(line_idx_in_test + 1) + .take_while(|line| line.trim().starts_with("//")) + .count(); + + let line_idx = (line_idx_in_test + comments).checked_add_signed(line_delta)?; + let column_idx = if column < 0 { + // Negative column index is from the back. + let range = source.line_to_range(line_idx)?; + text[range].chars().count().saturating_add_signed(column) + } else { + usize::try_from(column).ok()?.checked_sub(1)? + }; + + source.line_column_to_byte(line_idx, column_idx) + } + + /// Parse a number. + fn parse_number(&mut self) -> Option { + let start = self.s.cursor(); + self.s.eat_if('-'); + self.s.eat_while(char::is_numeric); + self.s.from(start).parse().ok() + } + + /// Stores a test parsing error. + fn error(&mut self, message: impl Into) { + self.collector.errors.push(TestParseError { + pos: FilePos::new(self.path, self.line), + message: message.into(), + }); + } +} + +/// Whether a test is within the filtered set. +fn filtered(name: &str) -> bool { + let exact = crate::ARGS.exact; + let filter = &crate::ARGS.filter; + filter.is_empty() + || filter + .iter() + .any(|v| if exact { name == v } else { name.contains(v) }) +} + +/// An error in a test file. +pub struct TestParseError { + pos: FilePos, + message: String, +} + +impl Display for TestParseError { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + write!(f, "{} ({})", self.message, self.pos) + } +} + +trait ScannerExt { + fn eat_newline(&mut self) -> bool; +} + +impl ScannerExt for Scanner<'_> { + fn eat_newline(&mut self) -> bool { + let ate = self.eat_if(is_newline); + if ate && self.before().ends_with('\r') { + self.eat_if('\n'); + } + ate + } +} diff --git a/tests/src/logger.rs b/tests/src/logger.rs new file mode 100644 index 00000000..c48650a7 --- /dev/null +++ b/tests/src/logger.rs @@ -0,0 +1,141 @@ +use std::io::{self, IsTerminal, StderrLock, Write}; +use std::time::{Duration, Instant}; + +use crate::collect::Test; +use crate::run::TestResult; + +/// Receives status updates by individual test runs. +pub struct Logger<'a> { + filtered: usize, + passed: usize, + failed: usize, + skipped: usize, + mismatched_image: bool, + active: Vec<&'a Test>, + last_change: Instant, + temp_lines: usize, + terminal: bool, +} + +impl<'a> Logger<'a> { + /// Create a new logger. + pub fn new(filtered: usize, skipped: usize) -> Self { + Self { + filtered, + passed: 0, + failed: 0, + skipped, + mismatched_image: false, + active: vec![], + temp_lines: 0, + last_change: Instant::now(), + terminal: std::io::stderr().is_terminal(), + } + } + + /// Register the start of a test. + pub fn start(&mut self, test: &'a Test) { + self.active.push(test); + self.last_change = Instant::now(); + self.refresh(); + } + + /// Register a finished test. + pub fn end(&mut self, test: &'a Test, result: std::thread::Result) { + self.active.retain(|t| t.name != test.name); + + let result = match result { + Ok(result) => result, + Err(_) => { + self.failed += 1; + self.temp_lines = 0; + self.print(move |out| { + writeln!(out, "❌ {test} panicked")?; + Ok(()) + }) + .unwrap(); + return; + } + }; + + if result.is_ok() { + self.passed += 1; + } else { + self.failed += 1; + } + + self.mismatched_image |= result.mismatched_image; + self.last_change = Instant::now(); + + self.print(move |out| { + if !result.errors.is_empty() { + writeln!(out, "❌ {test}")?; + for line in result.errors.lines() { + writeln!(out, " {line}")?; + } + } else if crate::ARGS.verbose || !result.infos.is_empty() { + writeln!(out, "✅ {test}")?; + } + for line in result.infos.lines() { + writeln!(out, " {line}")?; + } + Ok(()) + }) + .unwrap(); + } + + /// Prints a summary and returns whether the test suite passed. + pub fn finish(&self) -> bool { + let Self { filtered, passed, failed, skipped, .. } = *self; + + eprintln!("{passed} passed, {failed} failed, {skipped} skipped"); + assert_eq!(filtered, passed + failed, "not all tests were executed succesfully"); + + if self.mismatched_image { + eprintln!(" pass the --update flag to update the reference images"); + } + + self.failed == 0 + } + + /// Refresh the status. + pub fn refresh(&mut self) { + self.print(|_| Ok(())).unwrap(); + } + + /// Refresh the status print. + fn print( + &mut self, + inner: impl FnOnce(&mut StderrLock<'_>) -> io::Result<()>, + ) -> io::Result<()> { + let mut out = std::io::stderr().lock(); + + // Clear the status lines. + for _ in 0..self.temp_lines { + write!(out, "\x1B[1F\x1B[0J")?; + self.temp_lines = 0; + } + + // Print the result of a finished test. + inner(&mut out)?; + + // Print the status line. + let done = self.failed + self.passed; + if done < self.filtered { + if self.last_change.elapsed() > Duration::from_secs(2) { + for test in &self.active { + writeln!(out, "⏰ {test} is taking a long time ...")?; + if self.terminal { + self.temp_lines += 1; + } + } + } + if self.terminal { + writeln!(out, "💨 {done} / {}", self.filtered)?; + self.temp_lines += 1; + } + } + + Ok(()) + } +} diff --git a/tests/src/metadata.rs b/tests/src/metadata.rs deleted file mode 100644 index 53cbbdff..00000000 --- a/tests/src/metadata.rs +++ /dev/null @@ -1,334 +0,0 @@ -use std::collections::HashSet; -use std::fmt::{self, Display, Formatter}; -use std::ops::Range; -use std::str::FromStr; - -use ecow::EcoString; -use typst::syntax::package::PackageVersion; -use typst::syntax::Source; -use unscanny::Scanner; - -/// Each test and subset may contain metadata. -#[derive(Debug)] -pub struct TestMetadata { - /// Configures how the test is run. - pub config: TestConfig, - /// Declares properties that must hold for a test. - /// - /// For instance, `// Warning: 1-3 no text within underscores` - /// will fail the test if the warning isn't generated by your test. - pub annotations: HashSet, -} - -/// Configuration of a test or subtest. -#[derive(Debug, Default)] -pub struct TestConfig { - /// Reference images will be generated and compared. - /// - /// Defaults to `true`, can be disabled with `Ref: false`. - pub compare_ref: Option, - /// Hint annotations will be compared to compiler hints. - /// - /// Defaults to `true`, can be disabled with `Hints: false`. - pub validate_hints: Option, - /// Autocompletion annotations will be validated against autocompletions. - /// Mutually exclusive with error and hint annotations. - /// - /// Defaults to `false`, can be enabled with `Autocomplete: true`. - pub validate_autocomplete: Option, -} - -/// Parsing error when the metadata is invalid. -pub(crate) enum InvalidMetadata { - /// An invalid annotation and it's error message. - InvalidAnnotation(Annotation, String), - /// Setting metadata can only be done with `true` or `false` as a value. - InvalidSet(String), -} - -impl InvalidMetadata { - pub(crate) fn write( - invalid_data: Vec, - output: &mut String, - print_annotation: &mut impl FnMut(&Annotation, &mut String), - ) { - use std::fmt::Write; - for data in invalid_data.into_iter() { - let (annotation, error) = match data { - InvalidMetadata::InvalidAnnotation(a, e) => (Some(a), e), - InvalidMetadata::InvalidSet(e) => (None, e), - }; - write!(output, "{error}",).unwrap(); - if let Some(annotation) = annotation { - print_annotation(&annotation, output) - } else { - writeln!(output).unwrap(); - } - } - } -} - -/// Annotation of the form `// KIND: RANGE TEXT`. -#[derive(Debug, Clone, Eq, PartialEq, Hash)] -pub struct Annotation { - /// Which kind of annotation this is. - pub kind: AnnotationKind, - /// May be written as: - /// - `{line}:{col}-{line}:{col}`, e.g. `0:4-0:6`. - /// - `{col}-{col}`, e.g. `4-6`: - /// The line is assumed to be the line after the annotation. - /// - `-1`: Produces a range of length zero at the end of the next line. - /// Mostly useful for autocompletion tests which require an index. - pub range: Option>, - /// The raw text after the annotation. - pub text: EcoString, -} - -/// The different kinds of in-test annotations. -#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] -pub enum AnnotationKind { - Error, - Warning, - Hint, - AutocompleteContains, - AutocompleteExcludes, -} - -impl AnnotationKind { - /// Returns the user-facing string for this annotation. - pub fn as_str(self) -> &'static str { - match self { - AnnotationKind::Error => "Error", - AnnotationKind::Warning => "Warning", - AnnotationKind::Hint => "Hint", - AnnotationKind::AutocompleteContains => "Autocomplete contains", - AnnotationKind::AutocompleteExcludes => "Autocomplete excludes", - } - } -} - -impl FromStr for AnnotationKind { - type Err = &'static str; - - fn from_str(s: &str) -> Result { - Ok(match s { - "Error" => AnnotationKind::Error, - "Warning" => AnnotationKind::Warning, - "Hint" => AnnotationKind::Hint, - "Autocomplete contains" => AnnotationKind::AutocompleteContains, - "Autocomplete excludes" => AnnotationKind::AutocompleteExcludes, - _ => return Err("invalid annotatino"), - }) - } -} - -impl Display for AnnotationKind { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - f.pad(self.as_str()) - } -} - -/// Parse metadata for a test. -pub fn parse_part_metadata( - source: &Source, - is_header: bool, -) -> Result> { - let mut config = TestConfig::default(); - let mut annotations = HashSet::default(); - let mut invalid_data = vec![]; - - let lines = source_to_lines(source); - - for (i, line) in lines.iter().enumerate() { - if let Some((key, value)) = parse_metadata_line(line) { - let key = key.trim(); - match key { - "Ref" => validate_set_annotation( - value, - &mut config.compare_ref, - &mut invalid_data, - ), - "Hints" => validate_set_annotation( - value, - &mut config.validate_hints, - &mut invalid_data, - ), - "Autocomplete" => validate_set_annotation( - value, - &mut config.validate_autocomplete, - &mut invalid_data, - ), - annotation_key => { - let Ok(kind) = AnnotationKind::from_str(annotation_key) else { - continue; - }; - let mut s = Scanner::new(value); - let range = parse_range(&mut s, i, source); - let rest = if range.is_some() { s.after() } else { s.string() }; - let message = rest - .trim() - .replace("VERSION", &PackageVersion::compiler().to_string()) - .into(); - - let annotation = - Annotation { kind, range: range.clone(), text: message }; - - if is_header { - invalid_data.push(InvalidMetadata::InvalidAnnotation( - annotation, - format!( - "Error: header may not contain annotations of type {kind}" - ), - )); - continue; - } - - if matches!( - kind, - AnnotationKind::AutocompleteContains - | AnnotationKind::AutocompleteExcludes - ) { - if let Some(range) = range { - if range.start != range.end { - invalid_data.push(InvalidMetadata::InvalidAnnotation( - annotation, - "Error: found range in Autocomplete annotation where range.start != range.end, range.end would be ignored." - .to_string() - )); - continue; - } - } else { - invalid_data.push(InvalidMetadata::InvalidAnnotation( - annotation, - "Error: autocomplete annotation but no range specified" - .to_string(), - )); - continue; - } - } - annotations.insert(annotation); - } - } - } - } - if invalid_data.is_empty() { - Ok(TestMetadata { config, annotations }) - } else { - Err(invalid_data) - } -} - -/// Extract key and value for a metadata line of the form: `// KEY: VALUE`. -fn parse_metadata_line(line: &str) -> Option<(&str, &str)> { - let mut s = Scanner::new(line); - if !s.eat_if("// ") { - return None; - } - - let key = s.eat_until(':').trim(); - if !s.eat_if(':') { - return None; - } - - let value = s.eat_until('\n').trim(); - Some((key, value)) -} - -/// Parse a quoted string. -fn parse_string<'a>(s: &mut Scanner<'a>) -> Option<&'a str> { - if !s.eat_if('"') { - return None; - } - let sub = s.eat_until('"'); - if !s.eat_if('"') { - return None; - } - - Some(sub) -} - -/// Parse a number. -fn parse_num(s: &mut Scanner) -> Option { - let mut first = true; - let n = &s.eat_while(|c: char| { - let valid = first && c == '-' || c.is_numeric(); - first = false; - valid - }); - n.parse().ok() -} - -/// Parse a comma-separated list of strings. -pub fn parse_string_list(text: &str) -> HashSet<&str> { - let mut s = Scanner::new(text); - let mut result = HashSet::new(); - while let Some(sub) = parse_string(&mut s) { - result.insert(sub); - s.eat_whitespace(); - if !s.eat_if(',') { - break; - } - s.eat_whitespace(); - } - result -} - -/// Parse a position. -fn parse_pos(s: &mut Scanner, i: usize, source: &Source) -> Option { - let first = parse_num(s)? - 1; - let (delta, column) = - if s.eat_if(':') { (first, parse_num(s)? - 1) } else { (0, first) }; - let line = (i + comments_until_code(source, i)).checked_add_signed(delta)?; - source.line_column_to_byte(line, usize::try_from(column).ok()?) -} - -/// Parse a range. -fn parse_range(s: &mut Scanner, i: usize, source: &Source) -> Option> { - let lines = source_to_lines(source); - s.eat_whitespace(); - if s.eat_if("-1") { - let mut add = 1; - while let Some(line) = lines.get(i + add) { - if !line.starts_with("//") { - break; - } - add += 1; - } - let next_line = lines.get(i + add)?; - let col = next_line.chars().count(); - - let index = source.line_column_to_byte(i + add, col)?; - s.eat_whitespace(); - return Some(index..index); - } - let start = parse_pos(s, i, source)?; - let end = if s.eat_if('-') { parse_pos(s, i, source)? } else { start }; - s.eat_whitespace(); - Some(start..end) -} - -/// Returns the number of lines of comment from line i to next line of code. -fn comments_until_code(source: &Source, i: usize) -> usize { - source_to_lines(source)[i..] - .iter() - .take_while(|line| line.starts_with("//")) - .count() -} - -fn source_to_lines(source: &Source) -> Vec<&str> { - source.text().lines().map(str::trim).collect() -} - -fn validate_set_annotation( - value: &str, - flag: &mut Option, - invalid_data: &mut Vec, -) { - let value = value.trim(); - if value != "false" && value != "true" { - invalid_data.push( - InvalidMetadata::InvalidSet(format!("Error: trying to set Ref, Hints, or Autocomplete with value {value:?} != true, != false."))) - } else { - *flag = Some(value == "true") - } -} diff --git a/tests/src/run.rs b/tests/src/run.rs new file mode 100644 index 00000000..f797147f --- /dev/null +++ b/tests/src/run.rs @@ -0,0 +1,442 @@ +use std::fmt::Write; +use std::ops::Range; +use std::path::Path; + +use ecow::eco_vec; +use tiny_skia as sk; +use typst::diag::SourceDiagnostic; +use typst::eval::Tracer; +use typst::foundations::Smart; +use typst::introspection::Meta; +use typst::layout::{Abs, Frame, FrameItem, Page, Transform}; +use typst::model::Document; +use typst::visualize::Color; +use typst::WorldExt; + +use crate::collect::{FileSize, NoteKind, Test}; +use crate::world::TestWorld; + +/// Runs a single test. +/// +/// Returns whether the test passed. +pub fn run(test: &Test) -> TestResult { + Runner::new(test).run() +} + +/// The result of running a single test. +pub struct TestResult { + /// The error log for this test. If empty, the test passed. + pub errors: String, + /// The info log for this test. + pub infos: String, + /// Whether the image was mismatched. + pub mismatched_image: bool, +} + +impl TestResult { + /// Whether the test passed. + pub fn is_ok(&self) -> bool { + self.errors.is_empty() + } +} + +/// Write a line to a log sink, defaulting to the test's error log. +macro_rules! log { + (into: $sink:expr, $($tts:tt)*) => { + writeln!($sink, $($tts)*).unwrap(); + }; + ($runner:expr, $($tts:tt)*) => { + writeln!(&mut $runner.result.errors, $($tts)*).unwrap(); + }; +} + +/// Runs a single test. +pub struct Runner<'a> { + test: &'a Test, + world: TestWorld, + seen: Vec, + result: TestResult, + not_annotated: String, +} + +impl<'a> Runner<'a> { + /// Create a new test runner. + fn new(test: &'a Test) -> Self { + Self { + test, + world: TestWorld::new(test.source.clone()), + seen: vec![false; test.notes.len()], + result: TestResult { + errors: String::new(), + infos: String::new(), + mismatched_image: false, + }, + not_annotated: String::new(), + } + } + + /// Run the test. + fn run(mut self) -> TestResult { + if crate::ARGS.syntax { + log!(into: self.result.infos, "tree: {:#?}", self.test.source.root()); + } + + let mut tracer = Tracer::new(); + let (doc, errors) = match typst::compile(&self.world, &mut tracer) { + Ok(doc) => (Some(doc), eco_vec![]), + Err(errors) => (None, errors), + }; + + let warnings = tracer.warnings(); + if doc.is_none() && errors.is_empty() { + log!(self, "no document, but also no errors"); + } + + self.check_document(doc.as_ref()); + + for error in &errors { + self.check_diagnostic(NoteKind::Error, error); + } + + for warning in &warnings { + self.check_diagnostic(NoteKind::Warning, warning); + } + + self.handle_not_emitted(); + self.handle_not_annotated(); + + self.result + } + + /// Handle errors that weren't annotated. + fn handle_not_annotated(&mut self) { + if !self.not_annotated.is_empty() { + log!(self, "not annotated"); + self.result.errors.push_str(&self.not_annotated); + } + } + + /// Handle notes that weren't handled before. + fn handle_not_emitted(&mut self) { + let mut first = true; + for (note, &seen) in self.test.notes.iter().zip(&self.seen) { + if seen { + continue; + } + let note_range = self.format_range(¬e.range); + if first { + log!(self, "not emitted"); + first = false; + } + log!(self, " {}: {note_range} {} ({})", note.kind, note.message, note.pos,); + } + } + + /// Check that the document output is correct. + fn check_document(&mut self, document: Option<&Document>) { + let live_path = format!("{}/render/{}.png", crate::STORE_PATH, self.test.name); + let ref_path = format!("{}/{}.png", crate::REF_PATH, self.test.name); + let has_ref = Path::new(&ref_path).exists(); + + let Some(document) = document else { + if has_ref { + log!(self, "missing document"); + log!(self, " ref | {ref_path}"); + } + return; + }; + + let skippable = match document.pages.as_slice() { + [page] => skippable(page), + _ => false, + }; + + // Tests without visible output and no reference image don't need to be + // compared. + if skippable && !has_ref { + std::fs::remove_file(&live_path).ok(); + return; + } + + // Render the live version. + let pixmap = render(document, 1.0); + + // Save live version, possibly rerendering if different scale is + // requested. + let mut pixmap_live = &pixmap; + let slot; + let scale = crate::ARGS.scale; + if scale != 1.0 { + slot = render(document, scale); + pixmap_live = &slot; + } + let data = pixmap_live.encode_png().unwrap(); + std::fs::write(&live_path, data).unwrap(); + + // Write PDF if requested. + if crate::ARGS.pdf { + let pdf_path = format!("{}/pdf/{}.pdf", crate::STORE_PATH, self.test.name); + let pdf = typst_pdf::pdf(document, Smart::Auto, None); + std::fs::write(pdf_path, pdf).unwrap(); + } + + // Write SVG if requested. + if crate::ARGS.svg { + let svg_path = format!("{}/svg/{}.svg", crate::STORE_PATH, self.test.name); + let svg = typst_svg::svg_merged(document, Abs::pt(5.0)); + std::fs::write(svg_path, svg).unwrap(); + } + + // Compare against reference image if available. + let equal = has_ref && { + let ref_data = std::fs::read(&ref_path).unwrap(); + let ref_pixmap = sk::Pixmap::decode_png(&ref_data).unwrap(); + approx_equal(&pixmap, &ref_pixmap) + }; + + // Test that is ok doesn't need to be updated. + if equal { + return; + } + + if crate::ARGS.update { + if skippable { + std::fs::remove_file(&ref_path).unwrap(); + log!( + into: self.result.infos, + "removed reference image ({ref_path})" + ); + } else { + let opts = oxipng::Options::max_compression(); + let data = pixmap.encode_png().unwrap(); + let ref_data = oxipng::optimize_from_memory(&data, &opts).unwrap(); + if !self.test.large && ref_data.len() > crate::REF_LIMIT { + log!(self, "reference image would exceed maximum size"); + log!(self, " maximum | {}", FileSize(crate::REF_LIMIT)); + log!(self, " size | {}", FileSize(ref_data.len())); + log!(self, "please try to minimize the size of the test (smaller pages, less text, etc.)"); + log!(self, "if you think the test cannot be reasonably minimized, mark it as `// LARGE`"); + return; + } + std::fs::write(&ref_path, &ref_data).unwrap(); + log!( + into: self.result.infos, + "Updated reference image ({ref_path}, {})", + FileSize(ref_data.len()), + ); + } + } else { + self.result.mismatched_image = true; + if has_ref { + log!(self, "mismatched rendering"); + log!(self, " live | {live_path}"); + log!(self, " ref | {ref_path}"); + } else { + log!(self, "missing reference image"); + log!(self, " live | {live_path}"); + } + } + } + + /// Compare a subset of notes with a given kind against diagnostics of + /// that same kind. + fn check_diagnostic(&mut self, kind: NoteKind, diag: &SourceDiagnostic) { + // Ignore diagnostics from other sources than the test file itself. + if diag.span.id().is_some_and(|id| id != self.test.source.id()) { + return; + } + + let message = diag.message.replace("\\", "/"); + let range = self.world.range(diag.span); + self.validate_note(kind, range.clone(), &message); + + // Check hints. + for hint in &diag.hints { + self.validate_note(NoteKind::Hint, range.clone(), hint); + } + } + + /// Try to find a matching note for the given `kind`, `range`, and + /// `message`. + /// + /// - If found, marks it as seen and returns it. + /// - If none was found, emits a "Not annotated" error and returns nothing. + fn validate_note( + &mut self, + kind: NoteKind, + range: Option>, + message: &str, + ) { + // Try to find perfect match. + if let Some((i, _)) = self.test.notes.iter().enumerate().find(|&(i, note)| { + !self.seen[i] + && note.kind == kind + && note.range == range + && note.message == message + }) { + self.seen[i] = true; + return; + } + + // Try to find closely matching annotation. If the note has the same + // range or message, it's most likely the one we're interested in. + let Some((i, note)) = self.test.notes.iter().enumerate().find(|&(i, note)| { + !self.seen[i] + && note.kind == kind + && (note.range == range || note.message == message) + }) else { + // Not even a close match, diagnostic is not annotated. + let diag_range = self.format_range(&range); + log!(into: self.not_annotated, " {kind}: {diag_range} {}", message); + return; + }; + + // Mark this annotation as visited and return it. + self.seen[i] = true; + + // Range is wrong. + if range != note.range { + let note_range = self.format_range(¬e.range); + let note_text = self.text_for_range(¬e.range); + let diag_range = self.format_range(&range); + let diag_text = self.text_for_range(&range); + log!(self, "mismatched range ({}):", note.pos); + log!(self, " message | {}", note.message); + log!(self, " annotated | {note_range:<9} | {note_text}"); + log!(self, " emitted | {diag_range:<9} | {diag_text}"); + } + + // Message is wrong. + if message != note.message { + log!(self, "mismatched message ({}):", note.pos); + log!(self, " annotated | {}", note.message); + log!(self, " emitted | {message}"); + } + } + + /// Display the text for a range. + fn text_for_range(&self, range: &Option>) -> String { + let Some(range) = range else { return "No text".into() }; + if range.is_empty() { + "(empty)".into() + } else { + format!("`{}`", self.test.source.text()[range.clone()].replace('\n', "\\n")) + } + } + + /// Display a byte range as a line:column range. + fn format_range(&self, range: &Option>) -> String { + let Some(range) = range else { return "No range".into() }; + if range.start == range.end { + self.format_pos(range.start) + } else { + format!("{}-{}", self.format_pos(range.start,), self.format_pos(range.end,)) + } + } + + /// Display a position as a line:column pair. + fn format_pos(&self, pos: usize) -> String { + if let (Some(line_idx), Some(column_idx)) = + (self.test.source.byte_to_line(pos), self.test.source.byte_to_column(pos)) + { + let line = self.test.pos.line + line_idx; + let column = column_idx + 1; + if line == 1 { + format!("{column}") + } else { + format!("{line}:{column}") + } + } else { + "oob".into() + } + } +} + +/// Draw all frames into one image with padding in between. +fn render(document: &Document, pixel_per_pt: f32) -> sk::Pixmap { + for page in &document.pages { + let limit = Abs::cm(100.0); + if page.frame.width() > limit || page.frame.height() > limit { + panic!("overlarge frame: {:?}", page.frame.size()); + } + } + + let gap = Abs::pt(1.0); + let mut pixmap = typst_render::render_merged( + document, + pixel_per_pt, + Color::WHITE, + gap, + Color::BLACK, + ); + + let gap = (pixel_per_pt * gap.to_pt() as f32).round(); + + let mut y = 0.0; + for page in &document.pages { + let ts = + sk::Transform::from_scale(pixel_per_pt, pixel_per_pt).post_translate(0.0, y); + render_links(&mut pixmap, ts, &page.frame); + y += (pixel_per_pt * page.frame.height().to_pt() as f32).round().max(1.0) + gap; + } + + pixmap +} + +/// Draw extra boxes for links so we can see whether they are there. +fn render_links(canvas: &mut sk::Pixmap, ts: sk::Transform, frame: &Frame) { + for (pos, item) in frame.items() { + let ts = ts.pre_translate(pos.x.to_pt() as f32, pos.y.to_pt() as f32); + match *item { + FrameItem::Group(ref group) => { + let ts = ts.pre_concat(to_sk_transform(&group.transform)); + render_links(canvas, ts, &group.frame); + } + FrameItem::Meta(Meta::Link(_), size) => { + let w = size.x.to_pt() as f32; + let h = size.y.to_pt() as f32; + let rect = sk::Rect::from_xywh(0.0, 0.0, w, h).unwrap(); + let mut paint = sk::Paint::default(); + paint.set_color_rgba8(40, 54, 99, 40); + canvas.fill_rect(rect, &paint, ts, None); + } + _ => {} + } + } +} + +/// Whether rendering of a frame can be skipped. +fn skippable(page: &Page) -> bool { + page.frame.width().approx_eq(Abs::pt(120.0)) + && page.frame.height().approx_eq(Abs::pt(20.0)) + && skippable_frame(&page.frame) +} + +/// Whether rendering of a frame can be skipped. +fn skippable_frame(frame: &Frame) -> bool { + frame.items().all(|(_, item)| match item { + FrameItem::Group(group) => skippable_frame(&group.frame), + FrameItem::Meta(..) => true, + _ => false, + }) +} + +/// Whether to pixel images are approximately equal. +fn approx_equal(a: &sk::Pixmap, b: &sk::Pixmap) -> bool { + a.width() == b.width() + && a.height() == b.height() + && a.data().iter().zip(b.data()).all(|(&a, &b)| a.abs_diff(b) <= 1) +} + +/// Convert a Typst transform to a tiny-skia transform. +fn to_sk_transform(transform: &Transform) -> sk::Transform { + let Transform { sx, ky, kx, sy, tx, ty } = *transform; + sk::Transform::from_row( + sx.get() as _, + ky.get() as _, + kx.get() as _, + sy.get() as _, + tx.to_pt() as f32, + ty.to_pt() as f32, + ) +} diff --git a/tests/src/tests.rs b/tests/src/tests.rs index e4f60bb6..6d58e969 100644 --- a/tests/src/tests.rs +++ b/tests/src/tests.rs @@ -1,1127 +1,112 @@ -/*! This is Typst's test runner. +//! Typst's test runner. -Tests are Typst files composed of a header part followed by subtests. +mod args; +mod collect; +mod logger; +mod run; +mod world; -The header may contain: -- a small description `// tests that features X works well` -- metadata (see [metadata::TestConfiguration]) - -The subtests may use extra testing functions defined in [library], most -importantly, `test(x, y)` which will fail the test `if x != y`. -*/ - -#![allow(clippy::comparison_chain)] -mod metadata; - -use self::metadata::*; - -use std::borrow::Cow; -use std::collections::{HashMap, HashSet}; -use std::ffi::OsStr; -use std::fmt::Write as _; -use std::io::{self, IsTerminal, Write as _}; -use std::ops::Range; -use std::path::{Path, PathBuf, MAIN_SEPARATOR_STR}; -use std::sync::{OnceLock, RwLock}; -use std::{env, fs}; +use std::path::Path; +use std::time::Duration; use clap::Parser; -use comemo::{Prehashed, Track}; -use oxipng::{InFile, Options, OutFile}; +use once_cell::sync::Lazy; +use parking_lot::Mutex; use rayon::iter::{ParallelBridge, ParallelIterator}; -use tiny_skia as sk; -use typst::diag::{bail, FileError, FileResult, Severity, SourceDiagnostic, StrResult}; -use typst::eval::Tracer; -use typst::foundations::{func, Bytes, Datetime, NoneValue, Repr, Smart, Value}; -use typst::introspection::Meta; -use typst::layout::{Abs, Frame, FrameItem, Margin, Page, PageElem, Transform}; -use typst::model::Document; -use typst::syntax::{FileId, Source, SyntaxNode, VirtualPath}; -use typst::text::{Font, FontBook, TextElem, TextSize}; -use typst::visualize::Color; -use typst::{Library, World, WorldExt}; -use walkdir::WalkDir; -// These directories are all relative to the tests/ directory. -const TYP_DIR: &str = "typ"; -const REF_DIR: &str = "ref"; -const PNG_DIR: &str = "png"; -const PDF_DIR: &str = "pdf"; -const SVG_DIR: &str = "svg"; +use crate::args::{CliArguments, Command}; +use crate::logger::Logger; -/// Arguments that modify test behaviour. -/// -/// Specify them like this when developing: -/// `cargo test --workspace --test tests -- --help` -#[derive(Debug, Clone, Parser)] -#[clap(name = "typst-test", author)] -struct Args { - /// All the tests that contains a filter string will be run (unless - /// `--exact` is specified, which is even stricter). - filter: Vec, - /// Runs only the specified subtest. - #[arg(short, long)] - #[arg(allow_hyphen_values = true)] - subtest: Option, - /// Runs only the test with the exact name specified in your command. - /// - /// Example: - /// `cargo test --workspace --test tests -- compiler/bytes.typ --exact` - #[arg(long)] - exact: bool, - /// Updates the reference images in `tests/ref`. - #[arg(long, default_value_t = env::var_os("UPDATE_EXPECT").is_some())] - update: bool, - /// Exports the tests as PDF into `tests/pdf`. - #[arg(long)] - pdf: bool, - /// Configuration of what to print. - #[command(flatten)] - print: PrintConfig, - /// Running `cargo test --workspace -- --nocapture` for the unit tests would - /// fail the test runner without argument. - // TODO: would it really still happen? - #[arg(long)] - nocapture: bool, - /// Prevents the terminal from being cleared of test names and includes - /// non-essential test messages. - #[arg(short, long)] - verbose: bool, -} +/// The parsed command line arguments. +static ARGS: Lazy = Lazy::new(CliArguments::parse); -/// Which things to print out for debugging. -#[derive(Default, Debug, Copy, Clone, Eq, PartialEq, Parser)] -struct PrintConfig { - /// Print the syntax tree. - #[arg(long)] - syntax: bool, - /// Print the content model. - #[arg(long)] - model: bool, - /// Print the layouted frames. - #[arg(long)] - frames: bool, -} +/// The directory where the test suite is located. +const SUITE_PATH: &str = "tests/suite"; -impl Args { - fn matches(&self, canonicalized_path: &Path) -> bool { - let path = canonicalized_path.to_string_lossy(); - if !self.exact { - return self.filter.is_empty() - || self.filter.iter().any(|v| path.contains(v)); - } +/// The directory where the full test results are stored. +const STORE_PATH: &str = "tests/store"; - self.filter.iter().any(|v| match path.strip_suffix(v) { - None => false, - Some(residual) => { - residual.is_empty() || residual.ends_with(MAIN_SEPARATOR_STR) - } - }) - } -} - -/// Tests all test files and prints a summary. -fn main() { - let args = Args::parse(); - - // Create loader and context. - let world = TestWorld::new(args.print); - - println!("Running tests..."); - let results = WalkDir::new(TYP_DIR) - .sort_by_file_name() - .into_iter() - .par_bridge() - .filter_map(|entry| { - let entry = entry.unwrap(); - if entry.depth() == 0 { - return None; - } +/// The directory where the reference images are stored. +const REF_PATH: &str = "tests/ref"; - if entry.path().starts_with("typ/benches") { - return None; - } - - let src_path = entry.into_path(); // Relative to TYP_DIR. - if src_path.extension() != Some(OsStr::new("typ")) { - return None; - } - - if args.matches(&src_path.canonicalize().unwrap()) { - Some(src_path) - } else { - None - } - }) - .map_with(world, |world, src_path| { - let path = src_path.strip_prefix(TYP_DIR).unwrap(); - let png_path = Path::new(PNG_DIR).join(path).with_extension("png"); - let ref_path = Path::new(REF_DIR).join(path).with_extension("png"); - let svg_path = Path::new(SVG_DIR).join(path).with_extension("svg"); - let pdf_path = - args.pdf.then(|| Path::new(PDF_DIR).join(path).with_extension("pdf")); - - test( - world, - &src_path, - &png_path, - &ref_path, - pdf_path.as_deref(), - &svg_path, - &args, - ) as usize - }) - .collect::>(); - - let len = results.len(); - let ok = results.iter().sum::(); - if len > 0 { - println!("{ok} / {len} test{} passed.", if len > 1 { "s" } else { "" }); - } else { - println!("No test ran."); - } - - if ok != len { - println!( - "Set the UPDATE_EXPECT environment variable or pass the \ - --update flag to update the reference image(s)." - ); - } - - if ok < len { - std::process::exit(1); - } -} +/// The maximum size of reference images that aren't marked as `// LARGE`. +const REF_LIMIT: usize = 20 * 1024; -fn library() -> Library { - #[func] - fn test(lhs: Value, rhs: Value) -> StrResult { - if lhs != rhs { - bail!("Assertion failed: {} != {}", lhs.repr(), rhs.repr()); - } - Ok(NoneValue) - } - - #[func] - fn test_repr(lhs: Value, rhs: Value) -> StrResult { - if lhs.repr() != rhs.repr() { - bail!("Assertion failed: {} != {}", lhs.repr(), rhs.repr()); - } - Ok(NoneValue) - } - - #[func] - fn print(#[variadic] values: Vec) -> NoneValue { - let mut stdout = io::stdout().lock(); - write!(stdout, "> ").unwrap(); - for (i, value) in values.into_iter().enumerate() { - if i > 0 { - write!(stdout, ", ").unwrap(); - } - write!(stdout, "{value:?}").unwrap(); - } - writeln!(stdout).unwrap(); - NoneValue - } - - // Set page width to 120pt with 10pt margins, so that the inner page is - // exactly 100pt wide. Page height is unbounded and font size is 10pt so - // that it multiplies to nice round numbers. - let mut lib = Library::default(); - lib.styles - .set(PageElem::set_width(Smart::Custom(Abs::pt(120.0).into()))); - lib.styles.set(PageElem::set_height(Smart::Auto)); - lib.styles.set(PageElem::set_margin(Margin::splat(Some(Smart::Custom( - Abs::pt(10.0).into(), - ))))); - lib.styles.set(TextElem::set_size(TextSize(Abs::pt(10.0).into()))); - - // Hook up helpers into the global scope. - lib.global.scope_mut().define_func::(); - lib.global.scope_mut().define_func::(); - lib.global.scope_mut().define_func::(); - lib.global - .scope_mut() - .define("conifer", Color::from_u8(0x9f, 0xEB, 0x52, 0xFF)); - lib.global - .scope_mut() - .define("forest", Color::from_u8(0x43, 0xA1, 0x27, 0xFF)); - - lib -} - -/// A world that provides access to the tests environment. -struct TestWorld { - print: PrintConfig, - main: FileId, - library: Prehashed, - book: Prehashed, - fonts: Vec, - slots: RwLock>, -} - -#[derive(Clone)] -struct FileSlot { - source: OnceLock>, - buffer: OnceLock>, -} - -impl TestWorld { - fn new(print: PrintConfig) -> Self { - let fonts: Vec<_> = typst_assets::fonts() - .chain(typst_dev_assets::fonts()) - .flat_map(|data| Font::iter(Bytes::from_static(data))) - .collect(); - - Self { - print, - main: FileId::new(None, VirtualPath::new("main.typ")), - library: Prehashed::new(library()), - book: Prehashed::new(FontBook::from_fonts(&fonts)), - fonts, - slots: RwLock::new(HashMap::new()), - } - } -} - -impl World for TestWorld { - fn library(&self) -> &Prehashed { - &self.library - } - - fn book(&self) -> &Prehashed { - &self.book - } - - fn main(&self) -> Source { - self.source(self.main).unwrap() - } - - fn source(&self, id: FileId) -> FileResult { - self.slot(id, |slot| { - slot.source - .get_or_init(|| { - let buf = read(&system_path(id)?)?; - let text = String::from_utf8(buf.into_owned())?; - Ok(Source::new(id, text)) - }) - .clone() - }) - } - - fn file(&self, id: FileId) -> FileResult { - self.slot(id, |slot| { - slot.buffer - .get_or_init(|| { - read(&system_path(id)?).map(|cow| match cow { - Cow::Owned(buf) => buf.into(), - Cow::Borrowed(buf) => Bytes::from_static(buf), - }) - }) - .clone() - }) - } - - fn font(&self, id: usize) -> Option { - Some(self.fonts[id].clone()) - } - - fn today(&self, _: Option) -> Option { - Some(Datetime::from_ymd(1970, 1, 1).unwrap()) - } -} - -impl TestWorld { - fn set(&mut self, path: &Path, text: String) -> Source { - self.main = FileId::new(None, VirtualPath::new(path)); - let source = Source::new(self.main, text); - self.slot(self.main, |slot| { - slot.source = OnceLock::from(Ok(source.clone())); - source - }) - } - - fn slot(&self, id: FileId, f: F) -> T - where - F: FnOnce(&mut FileSlot) -> T, - { - f(self.slots.write().unwrap().entry(id).or_insert_with(|| FileSlot { - source: OnceLock::new(), - buffer: OnceLock::new(), - })) - } -} +fn main() { + setup(); -impl Clone for TestWorld { - fn clone(&self) -> Self { - Self { - print: self.print, - main: self.main, - library: self.library.clone(), - book: self.book.clone(), - fonts: self.fonts.clone(), - slots: RwLock::new(self.slots.read().unwrap().clone()), - } + match &ARGS.command { + None => test(), + Some(Command::Clean) => std::fs::remove_dir_all(STORE_PATH).unwrap(), } } -/// The file system path for a file ID. -fn system_path(id: FileId) -> FileResult { - let root: PathBuf = match id.package() { - Some(spec) => format!("packages/{}-{}", spec.name, spec.version).into(), - None => PathBuf::new(), - }; - - id.vpath().resolve(&root).ok_or(FileError::AccessDenied) -} - -/// Read a file. -fn read(path: &Path) -> FileResult> { - // Basically symlinks `assets/files` to `tests/files` so that the assets - // are within the test project root. - let resolved = path.to_path_buf(); - if let Ok(suffix) = path.strip_prefix("assets/") { - return typst_dev_assets::get(&suffix.to_string_lossy()) - .map(Cow::Borrowed) - .ok_or_else(|| FileError::NotFound(path.into())); - } - - let f = |e| FileError::from_io(e, path); - if fs::metadata(&resolved).map_err(f)?.is_dir() { - Err(FileError::IsDirectory) - } else { - fs::read(&resolved).map(Cow::Owned).map_err(f) - } -} +fn setup() { + // Make all paths relative to the workspace. That's nicer for IDEs when + // clicking on paths printed to the terminal. + std::env::set_current_dir("..").unwrap(); -/// Tests a test file and prints the result. -/// -/// Also tests that the header of each test is written correctly. -/// See [parse_part_metadata] for more details. -fn test( - world: &mut TestWorld, - src_path: &Path, - png_path: &Path, - ref_path: &Path, - pdf_path: Option<&Path>, - svg_path: &Path, - args: &Args, -) -> bool { - struct PanicGuard<'a>(&'a Path); - impl Drop for PanicGuard<'_> { - fn drop(&mut self) { - if std::thread::panicking() { - println!("Panicked in {}", self.0.display()); - } - } + // Create the storage. + for ext in ["render", "pdf", "svg"] { + std::fs::create_dir_all(Path::new(STORE_PATH).join(ext)).unwrap(); } - let name = src_path.strip_prefix(TYP_DIR).unwrap_or(src_path); - let text = fs::read_to_string(src_path).unwrap(); - let _guard = PanicGuard(name); - - let mut output = String::new(); - let mut ok = true; - let mut updated = false; - let mut pages = vec![]; - let mut line = 0; - let mut header_configuration = None; - let mut compare_ever = false; - let mut rng = LinearShift::new(); - - let parts: Vec<_> = text - .split("\n---") - .map(|s| s.strip_suffix('\r').unwrap_or(s)) - .collect(); - - for (i, &part) in parts.iter().enumerate() { - if let Some(x) = args.subtest { - let x = usize::try_from( - x.rem_euclid(isize::try_from(parts.len()).unwrap_or_default()), - ) + // Set up the thread pool. + if let Some(num_threads) = ARGS.num_threads { + rayon::ThreadPoolBuilder::new() + .num_threads(num_threads) + .build_global() .unwrap(); - if x != i { - writeln!(output, " Skipped subtest {i}.").unwrap(); - continue; - } - } - let is_header = i == 0 - && parts.len() > 1 - && part - .lines() - .all(|s| s.starts_with("//") || s.chars().all(|c| c.is_whitespace())); - - if is_header { - let source = Source::detached(part.to_string()); - let metadata = parse_part_metadata(&source, true); - match metadata { - Ok(metadata) => { - header_configuration = Some(metadata.config); - } - Err(invalid_data) => { - ok = false; - writeln!( - output, - " Test {}: invalid metadata in header, failing the test:", - name.display() - ) - .unwrap(); - InvalidMetadata::write( - invalid_data, - &mut output, - &mut |annotation, output| { - print_annotation(output, &source, line, annotation) - }, - ); - } - } - } else { - let (part_ok, compare_here, part_frames) = test_part( - &mut output, - world, - src_path, - part.into(), - line, - i, - header_configuration.as_ref().unwrap_or(&Default::default()), - &mut rng, - args.verbose, - ); - - ok &= part_ok; - compare_ever |= compare_here; - pages.extend(part_frames); - } - - line += part.lines().count() + 1; - } - - let document = Document { pages, ..Default::default() }; - if compare_ever { - if let Some(pdf_path) = pdf_path { - let pdf_data = typst_pdf::pdf( - &document, - Smart::Custom(&format!("typst-test: {}", name.display())), - world.today(Some(0)), - ); - fs::create_dir_all(pdf_path.parent().unwrap()).unwrap(); - fs::write(pdf_path, pdf_data).unwrap(); - } - - if world.print.frames { - for frame in &document.pages { - writeln!(output, "{frame:#?}\n").unwrap(); - } - } - - let canvas = render(&document); - fs::create_dir_all(png_path.parent().unwrap()).unwrap(); - canvas.save_png(png_path).unwrap(); - - let svg = typst_svg::svg_merged(&document, Abs::pt(5.0)); - - fs::create_dir_all(svg_path.parent().unwrap()).unwrap(); - std::fs::write(svg_path, svg.as_bytes()).unwrap(); - - if let Ok(ref_pixmap) = sk::Pixmap::load_png(ref_path) { - if canvas.width() != ref_pixmap.width() - || canvas.height() != ref_pixmap.height() - || canvas - .data() - .iter() - .zip(ref_pixmap.data()) - .any(|(&a, &b)| a.abs_diff(b) > 2) - { - if args.update { - update_image(png_path, ref_path); - updated = true; - } else { - writeln!(output, " Does not match reference image.").unwrap(); - ok = false; - } - } - } else if !document.pages.is_empty() { - if args.update { - update_image(png_path, ref_path); - updated = true; - } else { - writeln!(output, " Failed to open reference image.").unwrap(); - ok = false; - } - } } - - { - let mut stdout = io::stdout().lock(); - stdout.write_all(name.to_string_lossy().as_bytes()).unwrap(); - if ok { - writeln!(stdout, " ✔").unwrap(); - // Don't clear the line when in verbose mode or when the reference image - // was updated, to show in the output which test had its image updated. - if !updated && !args.verbose && stdout.is_terminal() { - // ANSI escape codes: cursor moves up and clears the line. - write!(stdout, "\x1b[1A\x1b[2K").unwrap(); - } - } else { - writeln!(stdout, " ❌").unwrap(); - } - if updated { - writeln!(stdout, " Updated reference image.").unwrap(); - } - if !output.is_empty() { - stdout.write_all(output.as_bytes()).unwrap(); - } - } - - ok } -fn update_image(png_path: &Path, ref_path: &Path) { - oxipng::optimize( - &InFile::Path(png_path.to_owned()), - &OutFile::from_path(ref_path.to_owned()), - &Options::max_compression(), - ) - .unwrap(); -} - -#[allow(clippy::too_many_arguments)] -fn test_part( - output: &mut String, - world: &mut TestWorld, - src_path: &Path, - text: String, - line: usize, - i: usize, - header_configuration: &TestConfig, - rng: &mut LinearShift, - verbose: bool, -) -> (bool, bool, Vec) { - let source = world.set(src_path, text); - if world.print.syntax { - writeln!(output, "Syntax Tree:\n{:#?}\n", source.root()).unwrap(); - } - - if world.print.model { - print_model(world, &source, output); - } - - let mut tracer = Tracer::new(); - let (mut frames, diagnostics) = match typst::compile(world, &mut tracer) { - Ok(document) => (document.pages, tracer.warnings()), +fn test() { + let (tests, skipped) = match crate::collect::collect() { + Ok(output) => output, Err(errors) => { - let mut warnings = tracer.warnings(); - warnings.extend(errors); - (vec![], warnings) - } - }; - - let metadata = parse_part_metadata(&source, false); - match metadata { - Ok(metadata) => { - let mut ok = true; - let compare_ref = metadata - .config - .compare_ref - .unwrap_or(header_configuration.compare_ref.unwrap_or(true)); - let validate_hints = metadata - .config - .validate_hints - .unwrap_or(header_configuration.validate_hints.unwrap_or(true)); - let validate_autocomplete = metadata - .config - .validate_autocomplete - .unwrap_or(header_configuration.validate_autocomplete.unwrap_or(false)); - - if verbose { - writeln!(output, "Subtest {i} runs with compare_ref={compare_ref}; validate_hints={validate_hints}; validate_autocomplete={validate_autocomplete};").unwrap(); - } - ok &= test_spans(output, source.root()); - ok &= test_reparse(output, source.text(), i, rng); - - // Don't retain frames if we don't want to compare with reference images. - if !compare_ref { - frames.clear(); - } - - // we never check autocomplete and error at the same time - - let diagnostic_annotations = metadata - .annotations - .iter() - .filter(|a| { - !matches!( - a.kind, - AnnotationKind::AutocompleteContains - | AnnotationKind::AutocompleteExcludes - ) - }) - .cloned() - .collect::>(); - - if validate_autocomplete { - // warns and ignores diagnostics - if !diagnostic_annotations.is_empty() { - writeln!( - output, - " Subtest {i} contains diagnostics but is in autocomplete mode." - ) - .unwrap(); - for annotation in diagnostic_annotations { - write!(output, " Ignored | ").unwrap(); - print_annotation(output, &source, line, &annotation); - } - } - - test_autocomplete( - output, - world, - &source, - line, - i, - &mut ok, - metadata.annotations.iter(), - ); - } else { - test_diagnostics( - output, - world, - &source, - line, - i, - &mut ok, - validate_hints, - diagnostics.iter(), - &diagnostic_annotations, - ); - } - - (ok, compare_ref, frames) - } - Err(invalid_data) => { - writeln!(output, " Subtest {i} has invalid metadata, failing the test:") - .unwrap(); - InvalidMetadata::write( - invalid_data, - output, - &mut |annotation: &Annotation, output: &mut String| { - print_annotation(output, &source, line, annotation) - }, - ); - - (false, false, frames) - } - } -} - -#[allow(clippy::too_many_arguments)] -fn test_autocomplete<'a>( - output: &mut String, - world: &mut TestWorld, - source: &Source, - line: usize, - i: usize, - ok: &mut bool, - annotations: impl Iterator, -) { - for annotation in annotations.filter(|a| { - matches!( - a.kind, - AnnotationKind::AutocompleteContains | AnnotationKind::AutocompleteExcludes - ) - }) { - // Ok cause we checked in parsing that range was Some for this annotation - let cursor = annotation.range.as_ref().unwrap().start; - - // todo, use document if is_some to test labels autocomplete - let completions = typst_ide::autocomplete(world, None, source, cursor, true) - .map(|(_, c)| c) - .unwrap_or_default() - .into_iter() - .map(|c| c.label.to_string()) - .collect::>(); - let completions = - completions.iter().map(|s| s.as_str()).collect::>(); - - let must_contain_or_exclude = parse_string_list(&annotation.text); - let missing = - must_contain_or_exclude.difference(&completions).collect::>(); - - if !missing.is_empty() - && matches!(annotation.kind, AnnotationKind::AutocompleteContains) - { - writeln!(output, " Subtest {i} does not match expected completions.") - .unwrap(); - write!(output, " for annotation | ").unwrap(); - print_annotation(output, source, line, annotation); - - write!(output, " Not contained // ").unwrap(); - for item in missing { - write!(output, "{item:?}, ").unwrap() + eprintln!("failed to collect tests"); + for error in errors { + eprintln!("❌ {error}"); } - writeln!(output).unwrap(); - *ok = false; + std::process::exit(1); } - - let undesired = - must_contain_or_exclude.intersection(&completions).collect::>(); - - if !undesired.is_empty() - && matches!(annotation.kind, AnnotationKind::AutocompleteExcludes) - { - writeln!(output, " Subtest {i} does not match expected completions.") - .unwrap(); - write!(output, " for annotation | ").unwrap(); - print_annotation(output, source, line, annotation); - - write!(output, " Not excluded // ").unwrap(); - for item in undesired { - write!(output, "{item:?}, ").unwrap() - } - writeln!(output).unwrap(); - *ok = false; - } - } -} - -#[allow(clippy::too_many_arguments)] -fn test_diagnostics<'a>( - output: &mut String, - world: &mut TestWorld, - source: &Source, - line: usize, - i: usize, - ok: &mut bool, - validate_hints: bool, - diagnostics: impl Iterator, - diagnostic_annotations: &HashSet, -) { - // Map diagnostics to range and message format, discard traces and errors from - // other files, collect hints. - // - // This has one caveat: due to the format of the expected hints, we can not - // verify if a hint belongs to a diagnostic or not. That should be irrelevant - // however, as the line of the hint is still verified. - let mut actual_diagnostics = HashSet::new(); - for diagnostic in diagnostics { - // Ignore diagnostics from other files. - if diagnostic.span.id().is_some_and(|id| id != source.id()) { - continue; - } - - let annotation = Annotation { - kind: match diagnostic.severity { - Severity::Error => AnnotationKind::Error, - Severity::Warning => AnnotationKind::Warning, - }, - range: world.range(diagnostic.span), - text: diagnostic.message.replace("\\", "/"), - }; - - if validate_hints { - for hint in &diagnostic.hints { - actual_diagnostics.insert(Annotation { - kind: AnnotationKind::Hint, - text: hint.clone(), - range: annotation.range.clone(), - }); - } - } - - actual_diagnostics.insert(annotation); - } - - // Basically symmetric_difference, but we need to know where an item is coming from. - let mut unexpected_outputs = actual_diagnostics - .difference(diagnostic_annotations) - .collect::>(); - let mut missing_outputs = diagnostic_annotations - .difference(&actual_diagnostics) - .collect::>(); - - unexpected_outputs.sort_by_key(|&v| v.range.as_ref().map(|r| r.start)); - missing_outputs.sort_by_key(|&v| v.range.as_ref().map(|r| r.start)); - - // This prints all unexpected emits first, then all missing emits. - // Is this reasonable or subject to change? - if !(unexpected_outputs.is_empty() && missing_outputs.is_empty()) { - writeln!(output, " Subtest {i} does not match expected errors.").unwrap(); - *ok = false; - - for unexpected in unexpected_outputs { - write!(output, " Not annotated // ").unwrap(); - print_annotation(output, source, line, unexpected) - } - - for missing in missing_outputs { - write!(output, " Not emitted // ").unwrap(); - print_annotation(output, source, line, missing) - } - } -} - -fn print_model(world: &mut TestWorld, source: &Source, output: &mut String) { - let world = (world as &dyn World).track(); - let route = typst::engine::Route::default(); - let mut tracer = typst::eval::Tracer::new(); - - let module = - typst::eval::eval(world, route.track(), tracer.track_mut(), source).unwrap(); - writeln!(output, "Model:\n{:#?}\n", module.content()).unwrap(); -} - -fn print_annotation( - output: &mut String, - source: &Source, - line: usize, - annotation: &Annotation, -) { - let Annotation { range, text, kind } = annotation; - write!(output, "{kind}: ").unwrap(); - if let Some(range) = range { - let start_line = 1 + line + source.byte_to_line(range.start).unwrap(); - let start_col = 1 + source.byte_to_column(range.start).unwrap(); - let end_line = 1 + line + source.byte_to_line(range.end).unwrap(); - let end_col = 1 + source.byte_to_column(range.end).unwrap(); - write!(output, "{start_line}:{start_col}-{end_line}:{end_col} ").unwrap(); - } - writeln!(output, "{text}").unwrap(); -} - -/// Pseudorandomly edit the source file and test whether a reparse produces the -/// same result as a clean parse. -/// -/// The method will first inject 10 strings once every 400 source characters -/// and then select 5 leaf node boundaries to inject an additional, randomly -/// chosen string from the injection list. -fn test_reparse( - output: &mut String, - text: &str, - i: usize, - rng: &mut LinearShift, -) -> bool { - let supplements = [ - "[", - "]", - "{", - "}", - "(", - ")", - "#rect()", - "a word", - ", a: 1", - "10.0", - ":", - "if i == 0 {true}", - "for", - "* hello *", - "//", - "/*", - "\\u{12e4}", - "```typst", - " ", - "trees", - "\\", - "$ a $", - "2.", - "-", - "5", - ]; - - let mut ok = true; - let mut apply = |replace: Range, with| { - let mut incr_source = Source::detached(text); - if incr_source.root().len() != text.len() { - println!( - " Subtest {i} tree length {} does not match string length {} ❌", - incr_source.root().len(), - text.len(), - ); - return false; - } - - incr_source.edit(replace.clone(), with); - - let edited_src = incr_source.text(); - let ref_source = Source::detached(edited_src); - let ref_root = ref_source.root(); - let incr_root = incr_source.root(); - - // Ensures that the span numbering invariants hold. - let spans_ok = test_spans(output, ref_root) && test_spans(output, incr_root); - - // Ensure that the reference and incremental trees are the same. - let tree_ok = ref_root.spanless_eq(incr_root); - - if !tree_ok { - writeln!( - output, - " Subtest {i} reparse differs from clean parse when inserting '{with}' at {}-{} ❌\n", - replace.start, replace.end, - ).unwrap(); - writeln!(output, " Expected reference tree:\n{ref_root:#?}\n").unwrap(); - writeln!(output, " Found incremental tree:\n{incr_root:#?}").unwrap(); - writeln!( - output, - " Full source ({}):\n\"{edited_src:?}\"", - edited_src.len() - ) - .unwrap(); - } - - spans_ok && tree_ok - }; - - let mut pick = |range: Range| { - let ratio = rng.next(); - (range.start as f64 + ratio * (range.end - range.start) as f64).floor() as usize }; - let insertions = (text.len() as f64 / 400.0).ceil() as usize; - for _ in 0..insertions { - let supplement = supplements[pick(0..supplements.len())]; - let start = pick(0..text.len()); - let end = pick(start..text.len()); - - if !text.is_char_boundary(start) || !text.is_char_boundary(end) { - continue; - } - - ok &= apply(start..end, supplement); - } - - let source = Source::detached(text); - let leafs = leafs(source.root()); - let start = source.find(leafs[pick(0..leafs.len())].span()).unwrap().offset(); - let supplement = supplements[pick(0..supplements.len())]; - ok &= apply(start..start, supplement); - - ok -} - -/// Returns all leaf descendants of a node (may include itself). -fn leafs(node: &SyntaxNode) -> Vec { - if node.children().len() == 0 { - vec![node.clone()] - } else { - node.children().flat_map(leafs).collect() - } -} - -/// Ensure that all spans are properly ordered (and therefore unique). -#[track_caller] -fn test_spans(output: &mut String, root: &SyntaxNode) -> bool { - test_spans_impl(output, root, 0..u64::MAX) -} - -#[track_caller] -fn test_spans_impl(output: &mut String, node: &SyntaxNode, within: Range) -> bool { - if !within.contains(&node.span().number()) { - writeln!(output, " Node: {node:#?}").unwrap(); - writeln!( - output, - " Wrong span order: {} not in {within:?} ❌", - node.span().number() - ) - .unwrap(); - } - - let start = node.span().number() + 1; - let mut children = node.children().peekable(); - while let Some(child) = children.next() { - let end = children.peek().map_or(within.end, |next| next.span().number()); - if !test_spans_impl(output, child, start..end) { - return false; - } - } - - true -} - -/// Draw all frames into one image with padding in between. -fn render(document: &Document) -> sk::Pixmap { - let pixel_per_pt = 2.0; - let padding = Abs::pt(5.0); - - for page in &document.pages { - let limit = Abs::cm(100.0); - if page.frame.width() > limit || page.frame.height() > limit { - panic!("overlarge frame: {:?}", page.frame.size()); - } - } - - let mut pixmap = typst_render::render_merged( - document, - pixel_per_pt, - Color::WHITE, - padding, - Color::BLACK, - ); - - let padding = (pixel_per_pt * padding.to_pt() as f32).round(); - let [x, mut y] = [padding; 2]; - for page in &document.pages { - let ts = - sk::Transform::from_scale(pixel_per_pt, pixel_per_pt).post_translate(x, y); - render_links(&mut pixmap, ts, &page.frame); - y += (pixel_per_pt * page.frame.height().to_pt() as f32).round().max(1.0) - + padding; - } - - pixmap -} - -/// Draw extra boxes for links so we can see whether they are there. -fn render_links(canvas: &mut sk::Pixmap, ts: sk::Transform, frame: &Frame) { - for (pos, item) in frame.items() { - let ts = ts.pre_translate(pos.x.to_pt() as f32, pos.y.to_pt() as f32); - match *item { - FrameItem::Group(ref group) => { - let ts = ts.pre_concat(to_sk_transform(&group.transform)); - render_links(canvas, ts, &group.frame); - } - FrameItem::Meta(Meta::Link(_), size) => { - let w = size.x.to_pt() as f32; - let h = size.y.to_pt() as f32; - let rect = sk::Rect::from_xywh(0.0, 0.0, w, h).unwrap(); - let mut paint = sk::Paint::default(); - paint.set_color_rgba8(40, 54, 99, 40); - canvas.fill_rect(rect, &paint, ts, None); - } - _ => {} - } - } -} - -fn to_sk_transform(transform: &Transform) -> sk::Transform { - let Transform { sx, ky, kx, sy, tx, ty } = *transform; - sk::Transform::from_row( - sx.get() as _, - ky.get() as _, - kx.get() as _, - sy.get() as _, - tx.to_pt() as f32, - ty.to_pt() as f32, - ) -} - -/// A Linear-feedback shift register using XOR as its shifting function. -/// Can be used as PRNG. -struct LinearShift(u64); - -impl LinearShift { - /// Initialize the shift register with a pre-set seed. - pub fn new() -> Self { - Self(0xACE5) - } - - /// Return a pseudo-random number between `0.0` and `1.0`. - pub fn next(&mut self) -> f64 { - self.0 ^= self.0 >> 3; - self.0 ^= self.0 << 14; - self.0 ^= self.0 >> 28; - self.0 ^= self.0 << 36; - self.0 ^= self.0 >> 52; - self.0 as f64 / u64::MAX as f64 + let filtered = tests.len(); + if filtered == 0 { + eprintln!("no test selected"); + return; + } + + // Run the tests. + let logger = Mutex::new(Logger::new(filtered, skipped)); + std::thread::scope(|scope| { + let logger = &logger; + let (sender, receiver) = std::sync::mpsc::channel(); + + // Regularly refresh the logger in case we make no progress. + scope.spawn(move || { + while receiver.recv_timeout(Duration::from_millis(500)).is_err() { + logger.lock().refresh(); + } + }); + + // Run the tests. + // + // We use `par_bridge` instead of `par_iter` because the former + // results in a stack overflow during PDF export. Probably related + // to `typst::util::Deferred` yielding. + tests.iter().par_bridge().for_each(|test| { + logger.lock().start(test); + let result = std::panic::catch_unwind(|| run::run(test)); + logger.lock().end(test, result); + }); + + sender.send(()).unwrap(); + }); + + let passed = logger.into_inner().finish(); + if !passed { + std::process::exit(1); } } diff --git a/tests/src/world.rs b/tests/src/world.rs new file mode 100644 index 00000000..86ee8da6 --- /dev/null +++ b/tests/src/world.rs @@ -0,0 +1,229 @@ +use std::borrow::Cow; +use std::collections::HashMap; +use std::fs; +use std::io::Write; +use std::path::{Path, PathBuf}; +use std::sync::OnceLock; + +use comemo::Prehashed; +use once_cell::sync::Lazy; +use parking_lot::Mutex; +use typst::diag::{bail, FileError, FileResult, StrResult}; +use typst::foundations::{func, Bytes, Datetime, NoneValue, Repr, Smart, Value}; +use typst::layout::{Abs, Margin, PageElem}; +use typst::syntax::{FileId, Source}; +use typst::text::{Font, FontBook, TextElem, TextSize}; +use typst::visualize::Color; +use typst::{Library, World}; + +/// A world that provides access to the tests environment. +#[derive(Clone)] +pub struct TestWorld { + main: Source, + base: &'static TestBase, +} + +impl TestWorld { + /// Create a new world for a single test. + /// + /// This is cheap because the shared base for all test runs is lazily + /// initialized just once. + pub fn new(source: Source) -> Self { + static BASE: Lazy = Lazy::new(TestBase::default); + Self { main: source, base: &*BASE } + } +} + +impl World for TestWorld { + fn library(&self) -> &Prehashed { + &self.base.library + } + + fn book(&self) -> &Prehashed { + &self.base.book + } + + fn main(&self) -> Source { + self.main.clone() + } + + fn source(&self, id: FileId) -> FileResult { + if id == self.main.id() { + Ok(self.main.clone()) + } else { + self.slot(id, FileSlot::source) + } + } + + fn file(&self, id: FileId) -> FileResult { + self.slot(id, FileSlot::file) + } + + fn font(&self, index: usize) -> Option { + Some(self.base.fonts[index].clone()) + } + + fn today(&self, _: Option) -> Option { + Some(Datetime::from_ymd(1970, 1, 1).unwrap()) + } +} + +impl TestWorld { + /// Access the canonical slot for the given file id. + fn slot(&self, id: FileId, f: F) -> T + where + F: FnOnce(&mut FileSlot) -> T, + { + let mut map = self.base.slots.lock(); + f(map.entry(id).or_insert_with(|| FileSlot::new(id))) + } +} + +/// Shared foundation of all test worlds. +struct TestBase { + library: Prehashed, + book: Prehashed, + fonts: Vec, + slots: Mutex>, +} + +impl Default for TestBase { + fn default() -> Self { + let fonts: Vec<_> = typst_assets::fonts() + .chain(typst_dev_assets::fonts()) + .flat_map(|data| Font::iter(Bytes::from_static(data))) + .collect(); + + Self { + library: Prehashed::new(library()), + book: Prehashed::new(FontBook::from_fonts(&fonts)), + fonts, + slots: Mutex::new(HashMap::new()), + } + } +} + +/// Holds the processed data for a file ID. +#[derive(Clone)] +struct FileSlot { + id: FileId, + source: OnceLock>, + file: OnceLock>, +} + +impl FileSlot { + /// Create a new file slot. + fn new(id: FileId) -> Self { + Self { id, file: OnceLock::new(), source: OnceLock::new() } + } + + /// Retrieve the source for this file. + fn source(&mut self) -> FileResult { + self.source + .get_or_init(|| { + let buf = read(&system_path(self.id)?)?; + let text = String::from_utf8(buf.into_owned())?; + Ok(Source::new(self.id, text)) + }) + .clone() + } + + /// Retrieve the file's bytes. + fn file(&mut self) -> FileResult { + self.file + .get_or_init(|| { + read(&system_path(self.id)?).map(|cow| match cow { + Cow::Owned(buf) => buf.into(), + Cow::Borrowed(buf) => Bytes::from_static(buf), + }) + }) + .clone() + } +} + +/// The file system path for a file ID. +fn system_path(id: FileId) -> FileResult { + let root: PathBuf = match id.package() { + Some(spec) => format!("tests/packages/{}-{}", spec.name, spec.version).into(), + None => PathBuf::new(), + }; + + id.vpath().resolve(&root).ok_or(FileError::AccessDenied) +} + +/// Read a file. +fn read(path: &Path) -> FileResult> { + // Resolve asset. + if let Ok(suffix) = path.strip_prefix("assets/") { + return typst_dev_assets::get(&suffix.to_string_lossy()) + .map(Cow::Borrowed) + .ok_or_else(|| FileError::NotFound(path.into())); + } + + let f = |e| FileError::from_io(e, path); + if fs::metadata(path).map_err(f)?.is_dir() { + Err(FileError::IsDirectory) + } else { + fs::read(path).map(Cow::Owned).map_err(f) + } +} + +/// The extended standard library for testing. +fn library() -> Library { + // Set page width to 120pt with 10pt margins, so that the inner page is + // exactly 100pt wide. Page height is unbounded and font size is 10pt so + // that it multiplies to nice round numbers. + let mut lib = Library::default(); + + #[func] + fn test(lhs: Value, rhs: Value) -> StrResult { + if lhs != rhs { + bail!("Assertion failed: {} != {}", lhs.repr(), rhs.repr()); + } + Ok(NoneValue) + } + + #[func] + fn test_repr(lhs: Value, rhs: Value) -> StrResult { + if lhs.repr() != rhs.repr() { + bail!("Assertion failed: {} != {}", lhs.repr(), rhs.repr()); + } + Ok(NoneValue) + } + + #[func] + fn print(#[variadic] values: Vec) -> NoneValue { + let mut out = std::io::stdout().lock(); + write!(out, "> ").unwrap(); + for (i, value) in values.into_iter().enumerate() { + if i > 0 { + write!(out, ", ").unwrap(); + } + write!(out, "{value:?}").unwrap(); + } + writeln!(out).unwrap(); + NoneValue + } + + // Hook up helpers into the global scope. + lib.global.scope_mut().define_func::(); + lib.global.scope_mut().define_func::(); + lib.global.scope_mut().define_func::(); + lib.global + .scope_mut() + .define("conifer", Color::from_u8(0x9f, 0xEB, 0x52, 0xFF)); + lib.global + .scope_mut() + .define("forest", Color::from_u8(0x43, 0xA1, 0x27, 0xFF)); + + // Hook up default styles. + lib.styles + .set(PageElem::set_width(Smart::Custom(Abs::pt(120.0).into()))); + lib.styles.set(PageElem::set_height(Smart::Auto)); + lib.styles.set(PageElem::set_margin(Margin::splat(Some(Smart::Custom( + Abs::pt(10.0).into(), + ))))); + lib.styles.set(TextElem::set_size(TextSize(Abs::pt(10.0).into()))); + + lib +} diff --git a/tests/suite/foundations/array.typ b/tests/suite/foundations/array.typ new file mode 100644 index 00000000..d4a2f151 --- /dev/null +++ b/tests/suite/foundations/array.typ @@ -0,0 +1,472 @@ +// Test arrays. + +--- array-basic-syntax --- +#set page(width: 150pt) + +// Empty. +#() + +// Not an array, just a parenthesized expression. +#(1) + +// One item and trailing comma. +#(-1,) + +// No trailing comma. +#(true, false) + +// Multiple lines and items and trailing comma. +#("1" + , rgb("002") + ,) + +--- array-bad-token --- +// Error: 4-6 unexpected end of block comment +#(1*/2) + +--- array-bad-number-suffix --- +// Error: 6-8 invalid number suffix: u +#(1, 1u 2) + +--- array-leading-comma --- +// Error: 3-4 unexpected comma +#(,1) + +--- array-incomplete-pair --- +// Missing expression makes named pair incomplete, making this an empty array. +// Error: 5 expected expression +#(a:) + +--- array-named-pair --- +// Named pair after this is already identified as an array. +// Error: 6-10 expected expression, found named pair +#(1, b: 2) + +--- array-keyed-pair --- +// Keyed pair after this is already identified as an array. +// Error: 6-14 expected expression, found keyed pair +#(1, "key": 2) + +--- array-bad-conversion-from-string --- +// Error: 8-15 expected array, bytes, or version, found string +#array("hello") + +--- spread-into-array --- +// Test spreading into array and dictionary. +#{ + let l = (1, 2, 3) + let r = (5, 6, 7) + test((..l, 4, ..r), range(1, 8)) + test((..none), ()) +} + +--- spread-dict-into-array --- +// Error: 9-17 cannot spread dictionary into array +#(1, 2, ..(a: 1)) + +--- array-len --- +// Test the `len` method. +#test(().len(), 0) +#test(("A", "B", "C").len(), 3) + +--- array-at-lvalue --- +// Test lvalue and rvalue access. +#{ + let array = (1, 2) + array.at(1) += 5 + array.at(0) + test(array, (1, 8)) +} + +--- array-first-and-at-lvalue --- +// Test different lvalue method. +#{ + let array = (1, 2, 3) + array.first() = 7 + array.at(1) *= 8 + test(array, (7, 16, 3)) +} + +--- array-at-out-of-bounds --- +// Test rvalue out of bounds. +// Error: 2-17 array index out of bounds (index: 5, len: 3) and no default value was specified +#(1, 2, 3).at(5) + +--- array-at-out-of-bounds-negative --- +// Error: 2-18 array index out of bounds (index: -4, len: 3) and no default value was specified +#(1, 2, 3).at(-4) + +--- array-at-out-of-bounds-lvalue --- +// Test lvalue out of bounds. +#{ + let array = (1, 2, 3) + // Error: 3-14 array index out of bounds (index: 3, len: 3) + array.at(3) = 5 +} + +--- array-at-with-default --- +// Test default value. +#test((1, 2, 3).at(2, default: 5), 3) +#test((1, 2, 3).at(3, default: 5), 5) + +--- array-remove-with-default --- +// Test remove with default value. + +#{ + let array = (1, 2, 3) + test(array.remove(2, default: 5), 3) +} + +#{ + let array = (1, 2, 3) + test(array.remove(3, default: 5), 5) +} + +--- array-range --- +// Test the `range` function. +#test(range(4), (0, 1, 2, 3)) +#test(range(1, 4), (1, 2, 3)) +#test(range(-4, 2), (-4, -3, -2, -1, 0, 1)) +#test(range(10, 5), ()) +#test(range(10, step: 3), (0, 3, 6, 9)) +#test(range(1, 4, step: 1), (1, 2, 3)) +#test(range(1, 8, step: 2), (1, 3, 5, 7)) +#test(range(5, 2, step: -1), (5, 4, 3)) +#test(range(10, 0, step: -3), (10, 7, 4, 1)) + +--- array-range-end-missing --- +// Error: 2-9 missing argument: end +#range() + +--- array-range-float-invalid --- +// Error: 11-14 expected integer, found float +#range(1, 2.0) + +--- array-range-bad-step-type --- +// Error: 17-22 expected integer, found string +#range(4, step: "one") + +--- array-range-step-zero --- +// Error: 18-19 number must not be zero +#range(10, step: 0) + +--- array-bad-method-lvalue --- +// Test bad lvalue. +// Error: 2:3-2:14 cannot mutate a temporary value +#let array = (1, 2, 3) +#(array.len() = 4) + +--- array-unknown-method-lvalue --- +// Test bad lvalue. +// Error: 2:9-2:13 type array has no method `yolo` +#let array = (1, 2, 3) +#(array.yolo() = 4) + +--- array-negative-indices --- +// Test negative indices. +#{ + let array = (1, 2, 3, 4) + test(array.at(0), 1) + test(array.at(-1), 4) + test(array.at(-2), 3) + test(array.at(-3), 2) + test(array.at(-4), 1) +} + +--- array-first-and-last --- +// The the `first` and `last` methods. +#test((1,).first(), 1) +#test((2,).last(), 2) +#test((1, 2, 3).first(), 1) +#test((1, 2, 3).last(), 3) + +--- array-first-empty --- +// Error: 2-12 array is empty +#().first() + +--- array-last-empty --- +// Error: 2-11 array is empty +#().last() + +--- array-push-and-pop --- +// Test the `push` and `pop` methods. +#{ + let tasks = (a: (1, 2, 3), b: (4, 5, 6)) + test(tasks.at("a").pop(), 3) + tasks.b.push(7) + test(tasks.a, (1, 2)) + test(tasks.at("b"), (4, 5, 6, 7)) +} + +--- array-insert-and-remove --- +// Test the `insert` and `remove` methods. +#{ + let array = (0, 1, 2, 4, 5) + array.insert(3, 3) + test(array, range(6)) + array.remove(1) + test(array, (0, 2, 3, 4, 5)) +} + +--- array-insert-missing-index --- +// Error: 2:2-2:18 missing argument: index +#let numbers = () +#numbers.insert() + +--- array-slice --- +// Test the `slice` method. +#test((1, 2, 3, 4).slice(2), (3, 4)) +#test(range(10).slice(2, 6), (2, 3, 4, 5)) +#test(range(10).slice(4, count: 3), (4, 5, 6)) +#test(range(10).slice(-5, count: 2), (5, 6)) +#test((1, 2, 3).slice(2, -2), ()) +#test((1, 2, 3).slice(-2, 2), (2,)) +#test((1, 2, 3).slice(-3, 2), (1, 2)) +#test("ABCD".split("").slice(1, -1).join("-"), "A-B-C-D") + +--- array-slice-out-of-bounds --- +// Error: 2-30 array index out of bounds (index: 12, len: 10) +#range(10).slice(9, count: 3) + +--- array-slice-out-of-bounds-negative --- +// Error: 2-24 array index out of bounds (index: -4, len: 3) +#(1, 2, 3).slice(0, -4) + +--- array-position --- +// Test the `position` method. +#test(("Hi", "❤️", "Love").position(s => s == "❤️"), 1) +#test(("Bye", "💘", "Apart").position(s => s == "❤️"), none) +#test(("A", "B", "CDEF", "G").position(v => v.len() > 2), 2) + +--- array-filter --- +// Test the `filter` method. +#test(().filter(calc.even), ()) +#test((1, 2, 3, 4).filter(calc.even), (2, 4)) +#test((7, 3, 2, 5, 1).filter(x => x < 5), (3, 2, 1)) + +--- array-map --- +// Test the `map` method. +#test(().map(x => x * 2), ()) +#test((2, 3).map(x => x * 2), (4, 6)) + +--- array-fold --- +// Test the `fold` method. +#test(().fold("hi", grid), "hi") +#test((1, 2, 3, 4).fold(0, (s, x) => s + x), 10) + +--- array-fold-closure-without-params --- +// Error: 20-22 unexpected argument +#(1, 2, 3).fold(0, () => none) + +--- array-sum --- +// Test the `sum` method. +#test(().sum(default: 0), 0) +#test(().sum(default: []), []) +#test((1, 2, 3).sum(), 6) + +--- array-sum-empty --- +// Error: 2-10 cannot calculate sum of empty array with no default +#().sum() + +--- array-product --- +// Test the `product` method. +#test(().product(default: 0), 0) +#test(().product(default: []), []) +#test(([ab], 3).product(), [ab]*3) +#test((1, 2, 3).product(), 6) + +--- array-product-empty --- +// Error: 2-14 cannot calculate product of empty array with no default +#().product() + +--- array-rev --- +// Test the `rev` method. +#test(range(3).rev(), (2, 1, 0)) + +--- array-join --- +// Test the `join` method. +#test(().join(), none) +#test((1,).join(), 1) +#test(("a", "b", "c").join(), "abc") +#test("(" + ("a", "b", "c").join(", ") + ")", "(a, b, c)") + +--- array-join-bad-values --- +// Error: 2-22 cannot join boolean with boolean +#(true, false).join() + +--- array-join-bad-separator --- +// Error: 2-20 cannot join string with integer +#("a", "b").join(1) + +--- array-join-content --- +// Test joining content. +#([One], [Two], [Three]).join([, ], last: [ and ]). + +--- array-intersperse --- +// Test the `intersperse` method +#test(().intersperse("a"), ()) +#test((1,).intersperse("a"), (1,)) +#test((1, 2).intersperse("a"), (1, "a", 2)) +#test((1, 2, "b").intersperse("a"), (1, "a", 2, "a", "b")) + +--- array-chunks --- +// Test the `chunks` method. +#test(().chunks(10), ()) +#test((1, 2, 3).chunks(10), ((1, 2, 3),)) +#test((1, 2, 3, 4, 5, 6).chunks(3), ((1, 2, 3), (4, 5, 6))) +#test((1, 2, 3, 4, 5, 6, 7, 8).chunks(3), ((1, 2, 3), (4, 5, 6), (7, 8))) + +#test(().chunks(10, exact: true), ()) +#test((1, 2, 3).chunks(10, exact: true), ()) +#test((1, 2, 3, 4, 5, 6).chunks(3, exact: true), ((1, 2, 3), (4, 5, 6))) +#test((1, 2, 3, 4, 5, 6, 7, 8).chunks(3, exact: true), ((1, 2, 3), (4, 5, 6))) + +--- array-chunks-size-zero --- +// Error: 19-20 number must be positive +#(1, 2, 3).chunks(0) + +--- array-chunks-size-negative --- +// Error: 19-21 number must be positive +#(1, 2, 3).chunks(-5) + +--- array-sorted --- +// Test the `sorted` method. +#test(().sorted(), ()) +#test(().sorted(key: x => x), ()) +#test(((true, false) * 10).sorted(), (false,) * 10 + (true,) * 10) +#test(("it", "the", "hi", "text").sorted(), ("hi", "it", "text", "the")) +#test(("I", "the", "hi", "text").sorted(key: x => x), ("I", "hi", "text", "the")) +#test(("I", "the", "hi", "text").sorted(key: x => x.len()), ("I", "hi", "the", "text")) +#test((2, 1, 3, 10, 5, 8, 6, -7, 2).sorted(), (-7, 1, 2, 2, 3, 5, 6, 8, 10)) +#test((2, 1, 3, -10, -5, 8, 6, -7, 2).sorted(key: x => x), (-10, -7, -5, 1, 2, 2, 3, 6, 8)) +#test((2, 1, 3, -10, -5, 8, 6, -7, 2).sorted(key: x => x * x), (1, 2, 2, 3, -5, 6, -7, 8, -10)) + +--- array-sorted-key-function-positional-1 --- +// Error: 12-18 unexpected argument +#().sorted(x => x) + +--- array-zip --- +// Test the `zip` method. +#test(().zip(()), ()) +#test((1,).zip(()), ()) +#test((1,).zip((2,)), ((1, 2),)) +#test((1, 2).zip((3, 4)), ((1, 3), (2, 4))) +#test((1, 2, 3, 4).zip((5, 6)), ((1, 5), (2, 6))) +#test(((1, 2), 3).zip((4, 5)), (((1, 2), 4), (3, 5))) +#test((1, "hi").zip((true, false)), ((1, true), ("hi", false))) +#test((1, 2, 3).zip((3, 4, 5), (6, 7, 8)), ((1, 3, 6), (2, 4, 7), (3, 5, 8))) +#test(().zip((), ()), ()) +#test((1,).zip((2,), (3,)), ((1, 2, 3),)) +#test((1, 2, 3).zip(), ((1,), (2,), (3,))) +#test(array.zip(()), ()) + +--- array-enumerate --- +// Test the `enumerate` method. +#test(().enumerate(), ()) +#test(().enumerate(start: 5), ()) +#test(("a", "b", "c").enumerate(), ((0, "a"), (1, "b"), (2, "c"))) +#test(("a", "b", "c").enumerate(start: 1), ((1, "a"), (2, "b"), (3, "c"))) +#test(("a", "b", "c").enumerate(start: 42), ((42, "a"), (43, "b"), (44, "c"))) +#test(("a", "b", "c").enumerate(start: -7), ((-7, "a"), (-6, "b"), (-5, "c"))) + +--- array-dedup --- +// Test the `dedup` method. +#test(().dedup(), ()) +#test((1,).dedup(), (1,)) +#test((1, 1).dedup(), (1,)) +#test((1, 2, 1).dedup(), (1, 2)) +#test(("Jane", "John", "Eric").dedup(), ("Jane", "John", "Eric")) +#test(("Jane", "John", "Eric", "John").dedup(), ("Jane", "John", "Eric")) + +--- array-dedup-key --- +// Test the `dedup` method with the `key` argument. +#test((1, 2, 3, 4, 5, 6).dedup(key: x => calc.rem(x, 2)), (1, 2)) +#test((1, 2, 3, 4, 5, 6).dedup(key: x => calc.rem(x, 3)), (1, 2, 3)) +#test(("Hello", "World", "Hi", "There").dedup(key: x => x.len()), ("Hello", "Hi")) +#test(("Hello", "World", "Hi", "There").dedup(key: x => x.at(0)), ("Hello", "World", "There")) + +--- array-zip-positional-and-named-argument --- +// Error: 13-30 unexpected argument: val +#().zip((), val: "applicable") + +--- array-sorted-bad-key --- +// Error: 32-37 cannot divide by zero +#(1, 2, 0, 3).sorted(key: x => 5 / x) + +--- array-sorted-uncomparable --- +// Error: 2-26 cannot compare content and content +#([Hi], [There]).sorted() + +--- array-sorted-uncomparable-lengths --- +// Error: 2-26 cannot compare 3em with 2pt +#(1pt, 2pt, 3em).sorted() + +--- array-sorted-key-function-positional-2 --- +// Error: 42-52 unexpected argument +#((k: "a", v: 2), (k: "b", v: 1)).sorted(it => it.v) + +--- issue-3014-mix-array-dictionary --- +// Error: 8-17 expected expression, found named pair +#(box, fill: red) + +--- issue-3154-array-first-empty --- +#{ + let array = () + // Error: 3-16 array is empty + array.first() +} + +--- issue-3154-array-first-mutable-empty --- +#{ + let array = () + // Error: 3-16 array is empty + array.first() = 9 +} + +--- issue-3154-array-last-empty --- +#{ + let array = () + // Error: 3-15 array is empty + array.last() +} + +--- issue-3154-array-last-mutable-empty --- +#{ + let array = () + // Error: 3-15 array is empty + array.last() = 9 +} + +--- issue-3154-array-at-out-of-bounds --- +#{ + let array = (1,) + // Error: 3-14 array index out of bounds (index: 1, len: 1) and no default value was specified + array.at(1) +} + +--- issue-3154-array-at-out-of-bounds-default --- +#{ + let array = (1,) + test(array.at(1, default: 0), 0) +} + +--- issue-3154-array-at-out-of-bounds-mutable --- +#{ + let array = (1,) + // Error: 3-14 array index out of bounds (index: 1, len: 1) + array.at(1) = 9 +} + +--- issue-3154-array-at-out-of-bounds-mutable-default --- +#{ + let array = (1,) + // Error: 3-26 array index out of bounds (index: 1, len: 1) + array.at(1, default: 0) = 9 +} + +--- array-unopened --- +// Error: 2-3 unclosed delimiter +#{)} + +--- array-unclosed --- +// Error: 3-4 unclosed delimiter +#{(} diff --git a/tests/suite/foundations/assert.typ b/tests/suite/foundations/assert.typ new file mode 100644 index 00000000..5de0f387 --- /dev/null +++ b/tests/suite/foundations/assert.typ @@ -0,0 +1,40 @@ +--- assert-fail --- +// Test failing assertions. +// Error: 2-16 assertion failed +#assert(1 == 2) + +--- assert-fail-message --- +// Test failing assertions. +// Error: 2-51 assertion failed: two is smaller than one +#assert(2 < 1, message: "two is smaller than one") + +--- assert-bad-type --- +// Test failing assertions. +// Error: 9-15 expected boolean, found string +#assert("true") + +--- assert-eq-fail --- +// Test failing assertions. +// Error: 2-19 equality assertion failed: value 10 was not equal to 11 +#assert.eq(10, 11) + +--- assert-eq-fail-message --- +// Test failing assertions. +// Error: 2-55 equality assertion failed: 10 and 12 are not equal +#assert.eq(10, 12, message: "10 and 12 are not equal") + +--- assert-ne-fail --- +// Test failing assertions. +// Error: 2-19 inequality assertion failed: value 11 was equal to 11 +#assert.ne(11, 11) + +--- assert-ne-fail-message --- +// Test failing assertions. +// Error: 2-57 inequality assertion failed: must be different from 11 +#assert.ne(11, 11, message: "must be different from 11") + +--- assert-success --- +// Test successful assertions. +#assert(5 > 3) +#assert.eq(15, 15) +#assert.ne(10, 12) diff --git a/tests/suite/foundations/bytes.typ b/tests/suite/foundations/bytes.typ new file mode 100644 index 00000000..c7089278 --- /dev/null +++ b/tests/suite/foundations/bytes.typ @@ -0,0 +1,31 @@ +// Test the bytes type. + +--- bytes-basic --- +#let data = read("/assets/images/rhino.png", encoding: none) +#test(data.len(), 232243) +#test(data.slice(0, count: 5), bytes((137, 80, 78, 71, 13))) +#test(str(data.slice(1, 4)), "PNG") +#test(repr(data), "bytes(232243)") + +--- bytes-string-conversion --- +#test(str(bytes(range(0x41, 0x50))), "ABCDEFGHIJKLMNO") + +--- bytes-array-conversion --- +#test(array(bytes("Hello")), (0x48, 0x65, 0x6C, 0x6C, 0x6F)) + +--- bytes-addition --- +// Test addition and joining. +#test(bytes((1, 2)) + bytes(()), bytes((1, 2))) +#test(bytes((1, 2)) + bytes((3, 4)), bytes((1, 2, 3, 4))) +#test(bytes(()) + bytes((3, 4)), bytes((3, 4))) + +--- bytes-joining --- +#test(str({ + bytes("Hello") + bytes((0x20,)) + bytes("World") +}), "Hello World") + +--- bytes-bad-conversion-from-dict --- +// Error: 8-14 expected string, array, or bytes, found dictionary +#bytes((a: 1)) diff --git a/tests/suite/foundations/calc.typ b/tests/suite/foundations/calc.typ new file mode 100644 index 00000000..e702be9f --- /dev/null +++ b/tests/suite/foundations/calc.typ @@ -0,0 +1,261 @@ +--- calc-round --- +#test(calc.round(calc.e, digits: 2), 2.72) +#test(calc.round(calc.pi, digits: 2), 3.14) + +--- calc-abs --- +// Test the `abs` function. +#test(calc.abs(-3), 3) +#test(calc.abs(3), 3) +#test(calc.abs(-0.0), 0.0) +#test(calc.abs(0.0), -0.0) +#test(calc.abs(-3.14), 3.14) +#test(calc.abs(50%), 50%) +#test(calc.abs(-25%), 25%) + +--- cals-abs-bad-type --- +// Error: 11-22 expected integer, float, length, angle, ratio, or fraction, found string +#calc.abs("no number") + +--- calc-even-and-odd --- +// Test the `even` and `odd` functions. +#test(calc.even(2), true) +#test(calc.odd(2), false) +#test(calc.odd(-1), true) +#test(calc.even(-11), false) + +--- calc-rem --- +// Test the `rem` function. +#test(calc.rem(1, 1), 0) +#test(calc.rem(5, 3), 2) +#test(calc.rem(5, -3), 2) +#test(calc.rem(22.5, 10), 2.5) +#test(calc.rem(9, 4.5), 0) + +--- calc-rem-divisor-zero-1 --- +// Error: 14-15 divisor must not be zero +#calc.rem(5, 0) + +--- calc-rem-divisor-zero-2 --- +// Error: 16-19 divisor must not be zero +#calc.rem(3.0, 0.0) + +--- calc-div-euclid --- +// Test the `div-euclid` function. +#test(calc.div-euclid(7, 3), 2) +#test(calc.div-euclid(7, -3), -2) +#test(calc.div-euclid(-7, 3), -3) +#test(calc.div-euclid(-7, -3), 3) +#test(calc.div-euclid(2.5, 2), 1) + +--- calc-div-euclid-divisor-zero-1 --- +// Error: 21-22 divisor must not be zero +#calc.div-euclid(5, 0) + +--- calc-div-euclid-divisor-zero-2 --- +// Error: 23-26 divisor must not be zero +#calc.div-euclid(3.0, 0.0) + +--- calc-rem-euclid --- +// Test the `rem-euclid` function. +#test(calc.rem-euclid(7, 3), 1) +#test(calc.rem-euclid(7, -3), 1) +#test(calc.rem-euclid(-7, 3), 2) +#test(calc.rem-euclid(-7, -3), 2) +#test(calc.rem-euclid(2.5, 2), 0.5) + +--- calc-rem-euclid-divisor-zero-1 --- +// Error: 21-22 divisor must not be zero +#calc.rem-euclid(5, 0) + +--- calc-rem-euclid-divisor-zero-2 --- +// Error: 23-26 divisor must not be zero +#calc.rem-euclid(3.0, 0.0) + +--- calc-quo --- +// Test the `quo` function. +#test(calc.quo(1, 1), 1) +#test(calc.quo(5, 3), 1) +#test(calc.quo(5, -3), -1) +#test(calc.quo(22.5, 10), 2) +#test(calc.quo(9, 4.5), 2) + +--- calc-quo-divisor-zero-1 --- +// Error: 14-15 divisor must not be zero +#calc.quo(5, 0) + +--- calc-quo-divisor-zero-2 --- +// Error: 16-19 divisor must not be zero +#calc.quo(3.0, 0.0) + +--- calc-min-and-max --- +// Test the `min` and `max` functions. +#test(calc.min(2, -4), -4) +#test(calc.min(3.5, 1e2, -0.1, 3), -0.1) +#test(calc.max(-3, 11), 11) +#test(calc.min("hi"), "hi") + +--- calc-pow-log-exp-ln --- +// Test the `pow`, `log`, `exp`, and `ln` functions. +#test(calc.pow(10, 0), 1) +#test(calc.pow(2, 4), 16) +#test(calc.exp(2), calc.pow(calc.e, 2)) +#test(calc.ln(10), calc.log(10, base: calc.e)) + +--- calc-bit-logical --- +// Test the `bit-not`, `bit-and`, `bit-or` and `bit-xor` functions. +#test(64.bit-not(), -65) +#test(0.bit-not(), -1) +#test((-56).bit-not(), 55) +#test(128.bit-and(192), 128) +#test(192.bit-and(224), 192) +#test((-1).bit-and(325532), 325532) +#test(0.bit-and(-53), 0) +#test(0.bit-or(-1), -1) +#test(5.bit-or(3), 7) +#test((-50).bit-or(3), -49) +#test(64.bit-or(32), 96) +#test((-1).bit-xor(1), -2) +#test(64.bit-xor(96), 32) +#test((-1).bit-xor(-7), 6) +#test(0.bit-xor(492), 492) + +--- calc-bit-shift --- +// Test the `bit-lshift` and `bit-rshift` functions. +#test(32.bit-lshift(2), 128) +#test(694.bit-lshift(0), 694) +#test(128.bit-rshift(2), 32) +#test(128.bit-rshift(12345), 0) +#test((-7).bit-rshift(2), -2) +#test((-7).bit-rshift(12345), -1) +#test(128.bit-rshift(2, logical: true), 32) +#test((-7).bit-rshift(61, logical: true), 7) +#test(128.bit-rshift(12345, logical: true), 0) +#test((-7).bit-rshift(12345, logical: true), 0) + +--- calc-bit-shift-too-large --- +// Error: 2-18 the result is too large +#1.bit-lshift(64) + +--- calc-bit-lshift-negative --- +// Error: 15-17 number must be at least zero +#1.bit-lshift(-1) + +--- calc-bit-rshift-negative --- +// Error: 15-17 number must be at least zero +#1.bit-rshift(-1) + +--- calc-pow-zero-to-power-of-zero --- +// Error: 2-16 zero to the power of zero is undefined +#calc.pow(0, 0) + +--- calc-pow-exponent-too-large --- +// Error: 14-31 exponent is too large +#calc.pow(2, 10000000000000000) + +--- calc-pow-too-large --- +// Error: 2-25 the result is too large +#calc.pow(2, 2147483647) + +--- calc-pow-bad-exponent --- +// Error: 14-36 exponent may not be infinite, subnormal, or NaN +#calc.pow(2, calc.pow(2.0, 10000.0)) + +--- calc-pow-not-real --- +// Error: 2-19 the result is not a real number +#calc.pow(-1, 0.5) + +--- calc-sqrt-not-real --- +// Error: 12-14 cannot take square root of negative number +#calc.sqrt(-1) + +--- calc-root --- +#test(calc.root(12.0, 1), 12.0) +#test(calc.root(9.0, 2), 3.0) +#test(calc.root(27.0, 3), 3.0) +#test(calc.root(-27.0, 3), -3.0) +// 100^(-1/2) = (100^(1/2))^-1 = 1/sqrt(100) +#test(calc.root(100.0, -2), 0.1) + +--- calc-root-zeroth --- +// Error: 17-18 cannot take the 0th root of a number +#calc.root(1.0, 0) + +--- calc-root-negative-even --- +// Error: 24-25 negative numbers do not have a real nth root when n is even +#test(calc.root(-27.0, 4), -3.0) + +--- calc-log-negative --- +// Error: 11-13 value must be strictly positive +#calc.log(-1) + +--- calc-log-bad-base --- +// Error: 20-21 base may not be zero, NaN, infinite, or subnormal +#calc.log(1, base: 0) + +--- calc-log-not-real --- +// Error: 2-24 the result is not a real number +#calc.log(10, base: -1) + +--- calc-fact --- +// Test the `fact` function. +#test(calc.fact(0), 1) +#test(calc.fact(5), 120) + +--- calc-fact-too-large --- +// Error: 2-15 the result is too large +#calc.fact(21) + +--- calc-perm --- +// Test the `perm` function. +#test(calc.perm(0, 0), 1) +#test(calc.perm(5, 3), 60) +#test(calc.perm(5, 5), 120) +#test(calc.perm(5, 6), 0) + +--- calc-perm-too-large --- +// Error: 2-19 the result is too large +#calc.perm(21, 21) + +--- calc-binom --- +// Test the `binom` function. +#test(calc.binom(0, 0), 1) +#test(calc.binom(5, 3), 10) +#test(calc.binom(5, 5), 1) +#test(calc.binom(5, 6), 0) +#test(calc.binom(6, 2), 15) + +--- calc-gcd --- +// Test the `gcd` function. +#test(calc.gcd(112, 77), 7) +#test(calc.gcd(12, 96), 12) +#test(calc.gcd(13, 9), 1) +#test(calc.gcd(13, -9), 1) +#test(calc.gcd(272557, 272557), 272557) +#test(calc.gcd(0, 0), 0) +#test(calc.gcd(7, 0), 7) + +--- calc-lcm --- +// Test the `lcm` function. +#test(calc.lcm(112, 77), 1232) +#test(calc.lcm(12, 96), 96) +#test(calc.lcm(13, 9), 117) +#test(calc.lcm(13, -9), 117) +#test(calc.lcm(272557, 272557), 272557) +#test(calc.lcm(0, 0), 0) +#test(calc.lcm(8, 0), 0) + +--- calc-lcm-too-large --- +// Error: 2-41 the result is too large +#calc.lcm(15486487489457, 4874879896543) + +--- calc-min-nothing --- +// Error: 2-12 expected at least one value +#calc.min() + +--- calc-min-uncomparable --- +// Error: 14-18 cannot compare string and integer +#calc.min(1, "hi") + +--- calc-max-uncomparable --- +// Error: 16-19 cannot compare 1pt with 1em +#calc.max(1em, 1pt) diff --git a/tests/suite/foundations/content.typ b/tests/suite/foundations/content.typ new file mode 100644 index 00000000..afecc124 --- /dev/null +++ b/tests/suite/foundations/content.typ @@ -0,0 +1,120 @@ +--- content-at-default --- +// Test .at() default values for content. +#test(auto, [a].at("doesn't exist", default: auto)) + +--- content-field-syntax --- +// Test fields on elements. +#show list: it => { + test(it.children.len(), 3) +} + +- A +- B +- C + +--- content-field-missing --- +// Error: 25-28 content does not contain field "fun" +#show heading: it => it.fun += A + +--- content-fields --- +// Test content fields method. +#test([a].fields(), (text: "a")) +#test([a *b*].fields(), (children: ([a], [ ], strong[b]))) + +--- content-fields-mutable-invalid --- +#{ + let object = [hi] + // Error: 3-9 cannot mutate fields on content + object.property = "value" +} + +--- content-field-materialized-table --- +// Ensure that fields from set rules are materialized into the element before +// a show rule runs. +#set table(columns: (10pt, auto)) +#show table: it => it.columns +#table[A][B][C][D] + +--- content-field-materialized-heading --- +// Test it again with a different element. +#set heading(numbering: "(I)") +#show heading: set text(size: 11pt, weight: "regular") +#show heading: it => it.numbering += Heading + +--- content-field-materialized-query --- +// Test it with query. +#set raw(lang: "rust") +#context query().first().lang +`raw` + +--- content-fields-complex --- +// Integrated test for content fields. +#let compute(equation, ..vars) = { + let vars = vars.named() + let f(elem) = { + let func = elem.func() + if func == text { + let text = elem.text + if regex("^\d+$") in text { + int(text) + } else if text in vars { + int(vars.at(text)) + } else { + panic("unknown math variable: " + text) + } + } else if func == math.attach { + let value = f(elem.base) + if elem.has("t") { + value = calc.pow(value, f(elem.t)) + } + value + } else if elem.has("children") { + elem + .children + .filter(v => v != [ ]) + .split[+] + .map(xs => xs.fold(1, (prod, v) => prod * f(v))) + .fold(0, (sum, v) => sum + v) + } + } + let result = f(equation.body) + [With ] + vars + .pairs() + .map(p => $#p.first() = #p.last()$) + .join(", ", last: " and ") + [ we have:] + $ equation = result $ +} + +#compute($x y + y^2$, x: 2, y: 3) + +--- content-label-has-method --- +// Test whether the label is accessible through the `has` method. +#show heading: it => { + assert(it.has("label")) + it +} + += Hello, world! + +--- content-label-field-access --- +// Test whether the label is accessible through field syntax. +#show heading: it => { + assert(str(it.label) == "my-label") + it +} + += Hello, world! + +--- content-label-fields-method --- +// Test whether the label is accessible through the fields method. +#show heading: it => { + assert("label" in it.fields()) + assert(str(it.fields().label) == "my-label") + it +} + += Hello, world! diff --git a/tests/suite/foundations/context.typ b/tests/suite/foundations/context.typ new file mode 100644 index 00000000..fea9f544 --- /dev/null +++ b/tests/suite/foundations/context.typ @@ -0,0 +1,65 @@ +// Test context expressions. + +--- context-body-atomic-in-markup --- +// Test that context body is parsed as atomic expression. +#let c = [#context "hello".] +#test(c.children.first().func(), (context none).func()) +#test(c.children.last(), [.]) + +--- context-element-constructor-forbidden --- +// Test that manual construction is forbidden. +// Error: 2-25 cannot be constructed manually +#(context none).func()() + +--- context-in-show-rule --- +// Test that show rule establishes context. +#set heading(numbering: "1.") +#show heading: it => test( + counter(heading).get(), + (intro: (1,), back: (2,)).at(str(it.label)), +) + += Introduction += Background + +--- context-in-show-rule-query --- +// Test that show rule on non-locatable element allows `query`. +// Error: 18-47 Assertion failed: 2 != 3 +#show emph: _ => test(query(heading).len(), 3) +#show strong: _ => test(query(heading).len(), 2) += Introduction += Background +*Hi* _there_ + +--- context-assign-to-captured-variable --- +// Test error when captured variable is assigned to. +#let i = 0 +// Error: 11-12 variables from outside the context expression are read-only and cannot be modified +#context (i = 1) + +--- context-compatibility-locate --- +#let s = state("x", 0) +#let compute(expr) = [ + #s.update(x => + eval(expr.replace("x", str(x))) + ) + New value is #s.display(). +] + +#locate(loc => { + let elem = query(, loc).first() + test(s.at(elem.location()), 13) +}) + +#compute("10") \ +#compute("x + 3") \ +*Here.* \ +#compute("x * 2") \ +#compute("x - 5") + +--- context-compatibility-styling --- +#style(styles => measure([it], styles).width < 20pt) + +--- context-compatibility-counter-display --- +#counter(heading).update(10) +#counter(heading).display(n => test(n, 10)) diff --git a/tests/suite/foundations/datetime.typ b/tests/suite/foundations/datetime.typ new file mode 100644 index 00000000..b54c11f3 --- /dev/null +++ b/tests/suite/foundations/datetime.typ @@ -0,0 +1,93 @@ +--- datetime-constructor-empty --- +// Error: 2-12 at least one of date or time must be fully specified +#datetime() + +--- datetime-constructor-time-invalid --- +// Error: 2-42 time is invalid +#datetime(hour: 25, minute: 0, second: 0) + +--- datetime-constructor-date-invalid --- +// Error: 2-41 date is invalid +#datetime(year: 2000, month: 2, day: 30) + +--- datetime-display --- +// Test displaying of dates. +#test(datetime(year: 2023, month: 4, day: 29).display(), "2023-04-29") +#test(datetime(year: 2023, month: 4, day: 29).display("[year]"), "2023") +#test( + datetime(year: 2023, month: 4, day: 29) + .display("[year repr:last_two]"), + "23", +) +#test( + datetime(year: 2023, month: 4, day: 29) + .display("[year] [month repr:long] [day] [week_number] [weekday]"), + "2023 April 29 17 Saturday", +) + +// Test displaying of times +#test(datetime(hour: 14, minute: 26, second: 50).display(), "14:26:50") +#test(datetime(hour: 14, minute: 26, second: 50).display("[hour]"), "14") +#test( + datetime(hour: 14, minute: 26, second: 50) + .display("[hour repr:12 padding:none]"), + "2", +) +#test( + datetime(hour: 14, minute: 26, second: 50) + .display("[hour], [minute], [second]"), "14, 26, 50", +) + +// Test displaying of datetimes +#test( + datetime(year: 2023, month: 4, day: 29, hour: 14, minute: 26, second: 50).display(), + "2023-04-29 14:26:50", +) + +// Test getting the year/month/day etc. of a datetime +#let d = datetime(year: 2023, month: 4, day: 29, hour: 14, minute: 26, second: 50) +#test(d.year(), 2023) +#test(d.month(), 4) +#test(d.weekday(), 6) +#test(d.day(), 29) +#test(d.hour(), 14) +#test(d.minute(), 26) +#test(d.second(), 50) + +#let e = datetime(year: 2023, month: 4, day: 29) +#test(e.hour(), none) +#test(e.minute(), none) +#test(e.second(), none) + +// Test today +#test(datetime.today().display(), "1970-01-01") +#test(datetime.today(offset: auto).display(), "1970-01-01") +#test(datetime.today(offset: 2).display(), "1970-01-01") + +--- datetime-ordinal --- +// Test date methods. +#test(datetime(day: 1, month: 1, year: 2000).ordinal(), 1); +#test(datetime(day: 1, month: 3, year: 2000).ordinal(), 31 + 29 + 1); +#test(datetime(day: 31, month: 12, year: 2000).ordinal(), 366); +#test(datetime(day: 1, month: 3, year: 2001).ordinal(), 31 + 28 + 1); +#test(datetime(day: 31, month: 12, year: 2001).ordinal(), 365); + +--- datetime-display-missing-closing-bracket --- +// Error: 27-34 missing closing bracket for bracket at index 0 +#datetime.today().display("[year") + +--- datetime-display-invalid-component --- +// Error: 27-38 invalid component name 'nothing' at index 1 +#datetime.today().display("[nothing]") + +--- datetime-display-invalid-modifier --- +// Error: 27-50 invalid modifier 'wrong' at index 6 +#datetime.today().display("[year wrong:last_two]") + +--- datetime-display-expected-component --- +// Error: 27-33 expected component name at index 2 +#datetime.today().display(" []") + +--- datetime-display-insufficient-information --- +// Error: 2-36 failed to format datetime (insufficient information) +#datetime.today().display("[hour]") diff --git a/tests/suite/foundations/dict.typ b/tests/suite/foundations/dict.typ new file mode 100644 index 00000000..2c2d2a41 --- /dev/null +++ b/tests/suite/foundations/dict.typ @@ -0,0 +1,266 @@ +// Test dictionaries. + +--- dict-basic-syntax --- + +// Empty +#(:) + +// Two pairs and string key. +#let dict = (normal: 1, "spacy key": 2) +#dict + +#test(dict.normal, 1) +#test(dict.at("spacy key"), 2) + +--- dict-fields --- +// Test field on dictionary. +#let dict = (nothing: "ness", hello: "world") +#test(dict.nothing, "ness") +#{ + let world = dict + .hello + + test(world, "world") +} + +--- dict-missing-field --- +// Error: 6-13 dictionary does not contain key "invalid" +#(:).invalid + +--- dict-bad-key --- +// Error: 3-7 expected string, found boolean +// Error: 16-18 expected string, found integer +#(true: false, 42: 3) + +--- dict-duplicate-key --- +// Error: 24-29 duplicate key: first +#(first: 1, second: 2, first: 3) + +--- dict-duplicate-key-stringy --- +// Error: 17-20 duplicate key: a +#(a: 1, "b": 2, "a": 3) + +--- dict-bad-expression --- +// Simple expression after already being identified as a dictionary. +// Error: 9-10 expected named or keyed pair, found identifier +#(a: 1, b) + +--- dict-leading-colon --- +// Identified as dictionary due to initial colon. +// The boolean key is allowed for now since it will only cause an error at the evaluation stage. +// Error: 4-5 expected named or keyed pair, found integer +// Error: 17 expected expression +#(:1 b:"", true:) + +--- spread-into-dict --- +#{ + let x = (a: 1) + let y = (b: 2) + let z = (a: 3) + test((:..x, ..y, ..z), (a: 3, b: 2)) + test((..(a: 1), b: 2), (a: 1, b: 2)) +} + +--- spread-array-into-dict --- +// Error: 3-11 cannot spread array into dictionary +#(..(1, 2), a: 1) + +--- dict-at-lvalue --- +// Test lvalue and rvalue access. +#{ + let dict = (a: 1, "b b": 1) + dict.at("b b") += 1 + dict.state = (ok: true, err: false) + test(dict, (a: 1, "b b": 2, state: (ok: true, err: false))) + test(dict.state.ok, true) + dict.at("state").ok = false + test(dict.state.ok, false) + test(dict.state.err, false) +} + +--- dict-at-missing-key --- +// Test rvalue missing key. +#{ + let dict = (a: 1, b: 2) + // Error: 11-23 dictionary does not contain key "c" and no default value was specified + let x = dict.at("c") +} + +--- dict-at-default --- +// Test default value. +#test((a: 1, b: 2).at("b", default: 3), 2) +#test((a: 1, b: 2).at("c", default: 3), 3) + +--- dict-insert --- +// Test insert. +#{ + let dict = (a: 1, b: 2) + dict.insert("b", 3) + test(dict, (a: 1, b: 3)) + dict.insert("c", 5) + test(dict, (a: 1, b: 3, c: 5)) +} + +--- dict-remove-with-default --- +// Test remove with default value. +#{ + let dict = (a: 1, b: 2) + test(dict.remove("b", default: 3), 2) +} + +#{ + let dict = (a: 1, b: 2) + test(dict.remove("c", default: 3), 3) +} + +--- dict-missing-lvalue --- +// Missing lvalue is not automatically none-initialized. +#{ + let dict = (:) + // Error: 3-9 dictionary does not contain key "b" + // Hint: 3-9 use `insert` to add or update values + dict.b += 1 +} + +--- dict-basic-methods --- +// Test dictionary methods. +#let dict = (a: 3, c: 2, b: 1) +#test("c" in dict, true) +#test(dict.len(), 3) +#test(dict.values(), (3, 2, 1)) +#test(dict.pairs().map(p => p.first() + str(p.last())).join(), "a3c2b1") + +#dict.remove("c") +#test("c" in dict, false) +#test(dict, (a: 3, b: 1)) + +--- dict-from-module --- +// Test dictionary constructor +#dictionary(sys).at("version") +#dictionary(sys).at("no-crash", default: none) + +--- dict-remove-order --- +// Test that removal keeps order. +#let dict = (a: 1, b: 2, c: 3, d: 4) +#dict.remove("b") +#test(dict.keys(), ("a", "c", "d")) + +--- dict-temporary-lvalue --- +// Error: 3-15 cannot mutate a temporary value +#((key: "val").other = "some") + +--- dict-function-item-not-a-method --- +#{ + let dict = ( + call-me: () => 1, + ) + // Error: 8-15 type dictionary has no method `call-me` + // Hint: 8-15 to call the function stored in the dictionary, surround the field access with parentheses, e.g. `(dict.call-me)(..)` + dict.call-me() +} + +--- dict-item-missing-method --- +#{ + let dict = ( + nonfunc: 1 + ) + + // Error: 8-15 type dictionary has no method `nonfunc` + // Hint: 8-15 did you mean to access the field `nonfunc`? + dict.nonfunc() +} + +--- dict-dynamic-uplicate-key --- +#let a = "hello" +#let b = "world" +#let c = "value" +#let d = "conflict" + +#assert.eq(((a): b), ("hello": "world")) +#assert.eq(((a): 1, (a): 2), ("hello": 2)) +#assert.eq((hello: 1, (a): 2), ("hello": 2)) +#assert.eq((a + b: c, (a + b): d, (a): "value2", a: "value3"), ("helloworld": "conflict", "hello": "value2", "a": "value3")) + +--- issue-1338-dictionary-underscore --- +#let foo = "foo" +#let bar = "bar" +// Error: 8-9 expected expression, found underscore +// Error: 16-17 expected expression, found underscore +#(foo: _, bar: _) + +--- issue-1342-dictionary-bare-expressions --- +// Error: 5-8 expected named or keyed pair, found identifier +// Error: 10-13 expected named or keyed pair, found identifier +#(: foo, bar) + +--- issue-3154-dict-at-not-contained --- +#{ + let dict = (a: 1) + // Error: 3-15 dictionary does not contain key "b" and no default value was specified + dict.at("b") +} + +--- issue-3154-dict-at-missing-default --- +#{ + let dict = (a: 1) + test(dict.at("b", default: 0), 0) +} + +--- issue-3154-dict-at-missing-mutable --- +#{ + let dict = (a: 1) + // Error: 3-15 dictionary does not contain key "b" + // Hint: 3-15 use `insert` to add or update values + dict.at("b") = 9 +} + +--- issue-3154-dict-at-missing-mutable-default --- +#{ + let dict = (a: 1) + // Error: 3-27 dictionary does not contain key "b" + // Hint: 3-27 use `insert` to add or update values + dict.at("b", default: 0) = 9 +} + +--- issue-3154-dict-syntax-missing --- +#{ + let dict = (a: 1) + // Error: 8-9 dictionary does not contain key "b" + dict.b +} + +--- issue-3154-dict-syntax-missing-mutable --- +#{ + let dict = (a: 1) + dict.b = 9 + test(dict, (a: 1, b: 9)) +} + +--- issue-3154-dict-syntax-missing-add-assign --- +#{ + let dict = (a: 1) + // Error: 3-9 dictionary does not contain key "b" + // Hint: 3-9 use `insert` to add or update values + dict.b += 9 +} + +--- issue-3232-dict-unexpected-keys-sides --- +// Confusing "expected relative length or dictionary, found dictionary" +// Error: 16-58 unexpected keys "unexpected" and "unexpected-too" +#block(outset: (unexpected: 0.5em, unexpected-too: 0.2em), [Hi]) + +--- issue-3232-dict-unexpected-keys-corners --- +// Error: 14-56 unexpected keys "unexpected" and "unexpected-too" +#box(radius: (unexpected: 0.5em, unexpected-too: 0.5em), [Hi]) + +--- issue-3232-dict-unexpected-key-sides --- +// Error: 16-49 unexpected key "unexpected", valid keys are "left", "top", "right", "bottom", "x", "y", and "rest" +#block(outset: (unexpected: 0.2em, right: 0.5em), [Hi]) // The 1st key is unexpected + +--- issue-3232-dict-unexpected-key-corners --- +// Error: 14-50 unexpected key "unexpected", valid keys are "top-left", "top-right", "bottom-right", "bottom-left", "left", "top", "right", "bottom", and "rest" +#box(radius: (top-left: 0.5em, unexpected: 0.5em), [Hi]) // The 2nd key is unexpected + +--- issue-3232-dict-empty --- +#block(outset: (:), [Hi]) // Ok +#box(radius: (:), [Hi]) // Ok diff --git a/tests/suite/foundations/duration.typ b/tests/suite/foundations/duration.typ new file mode 100644 index 00000000..7e53f703 --- /dev/null +++ b/tests/suite/foundations/duration.typ @@ -0,0 +1,103 @@ +// Test durations. + +--- duration-negate --- +// Test negating durations. +#test(-duration(hours: 2), duration(hours: -2)) + +--- duration-add-and-subtract --- +// Test adding and subtracting durations. +#test(duration(weeks: 1, hours: 1), duration(weeks: 1) + duration(hours: 1)) +#test(duration(weeks: 1, hours: -1), duration(weeks: 1) - duration(hours: 1)) +#test(duration(days: 6, hours: 23), duration(weeks: 1) - duration(hours: 1)) + +--- duration-add-and-subtract-dates --- +// Test adding and subtracting durations and dates. +#let d = datetime(day: 1, month: 1, year: 2000) +#let d2 = datetime(day: 1, month: 2, year: 2000) +#test(d + duration(weeks: 2), datetime(day: 15, month: 1, year: 2000)) +#test(d + duration(days: 3), datetime(day: 4, month: 1, year: 2000)) +#test(d + duration(weeks: 1, days: 3), datetime(day: 11, month: 1, year: 2000)) +#test(d2 + duration(days: -1), datetime(day: 31, month: 1, year: 2000)) +#test(d2 + duration(days: -3), datetime(day: 29, month: 1, year: 2000)) +#test(d2 + duration(weeks: -1), datetime(day: 25, month: 1, year: 2000)) +#test(d + duration(days: -1), datetime(day: 31, month: 12, year: 1999)) +#test(d + duration(weeks: 1, days: -7), datetime(day: 1, month: 1, year: 2000)) +#test(d2 - duration(days: 1), datetime(day: 31, month: 1, year: 2000)) +#test(d2 - duration(days: 3), datetime(day: 29, month: 1, year: 2000)) +#test(d2 - duration(weeks: 1), datetime(day: 25, month: 1, year: 2000)) +#test(d - duration(days: 1), datetime(day: 31, month: 12, year: 1999)) +#test(datetime(day: 31, month: 1, year: 2000) + duration(days: 1), d2) +#test( + datetime(day: 31, month: 12, year: 2000) + duration(days: 1), + datetime(day: 1, month: 1, year: 2001), +) + +--- duration-add-and-subtract-times --- +// Test adding and subtracting durations and times. +#let a = datetime(hour: 12, minute: 0, second: 0) +#test(a + duration(hours: 1, minutes: -60), datetime(hour: 12, minute: 0, second: 0)) +#test(a + duration(hours: 2), datetime(hour: 14, minute: 0, second: 0)) +#test(a + duration(minutes: 10), datetime(hour: 12, minute: 10, second: 0)) +#test(a + duration(seconds: 30), datetime(hour: 12, minute: 0, second: 30)) +#test(a + duration(hours: -2), datetime(hour: 10, minute: 0, second: 0)) +#test(a - duration(hours: 2), datetime(hour: 10, minute: 0, second: 0)) +#test(a + duration(minutes: -10), datetime(hour: 11, minute: 50, second: 0)) +#test(a - duration(minutes: 10), datetime(hour: 11, minute: 50, second: 0)) +#test(a + duration(seconds: -30), datetime(hour: 11, minute: 59, second: 30)) +#test(a - duration(seconds: 30), datetime(hour: 11, minute: 59, second: 30)) +#test( + a + duration(hours: 1, minutes: 13, seconds: 13), + datetime(hour: 13, minute: 13, second: 13), +) + +--- duration-add-and-subtract-datetimes --- +// Test adding and subtracting durations and datetimes. +#test( + datetime(day: 1, month: 1, year: 2000, hour: 12, minute: 0, second: 0) + + duration(weeks: 1, days: 3, hours: -13, minutes: 10, seconds: -10 ), + datetime(day: 10, month: 1, year: 2000, hour: 23, minute: 9, second: 50), +) +#test( + datetime(day: 1, month: 1, year: 2000, hour: 12, minute: 0, second: 0) + + duration(weeks: 1, days: 3, minutes: 10) + - duration(hours: 13, seconds: 10), + datetime(day: 10, month: 1, year: 2000, hour: 23, minute: 9, second: 50), +) + +--- duration-from-date-subtraction --- +// Test subtracting dates. +#let a = datetime(hour: 12, minute: 0, second: 0) +#let b = datetime(day: 1, month: 1, year: 2000) +#test(datetime(hour: 14, minute: 0, second: 0) - a, duration(hours: 2)) +#test(datetime(hour: 14, minute: 0, second: 0) - a, duration(minutes: 120)) +#test(datetime(hour: 13, minute: 0, second: 0) - a, duration(seconds: 3600)) +#test(datetime(day: 1, month: 2, year: 2000) - b, duration(days: 31)) +#test(datetime(day: 15, month: 1, year: 2000) - b, duration(weeks: 2)) + +--- duration-multiply-with-number --- +// Test multiplying and dividing durations with numbers. +#test(duration(minutes: 10) * 6, duration(hours: 1)) +#test(duration(minutes: 10) * 2, duration(minutes: 20)) +#test(duration(minutes: 10) * 2.5, duration(minutes: 25)) +#test(duration(minutes: 10) / 2, duration(minutes: 5)) +#test(duration(minutes: 10) / 2.5, duration(minutes: 4)) + +--- duration-divide --- +// Test dividing durations with durations +#test(duration(minutes: 20) / duration(hours: 1), 1 / 3) +#test(duration(minutes: 20) / duration(minutes: 10), 2) +#test(duration(minutes: 20) / duration(minutes: 8), 2.5) + +--- duration-compare --- +// Test comparing durations +#test(duration(minutes: 20) > duration(minutes: 10), true) +#test(duration(minutes: 20) >= duration(minutes: 10), true) +#test(duration(minutes: 10) < duration(minutes: 20), true) +#test(duration(minutes: 10) <= duration(minutes: 20), true) +#test(duration(minutes: 10) == duration(minutes: 10), true) +#test(duration(minutes: 10) != duration(minutes: 20), true) +#test(duration(minutes: 10) <= duration(minutes: 10), true) +#test(duration(minutes: 10) >= duration(minutes: 10), true) +#test(duration(minutes: 20) < duration(minutes: 10), false) +#test(duration(minutes: 20) <= duration(minutes: 10), false) +#test(duration(minutes: 20) == duration(minutes: 10), false) diff --git a/tests/suite/foundations/eval.typ b/tests/suite/foundations/eval.typ new file mode 100644 index 00000000..f85146b2 --- /dev/null +++ b/tests/suite/foundations/eval.typ @@ -0,0 +1,54 @@ +--- eval --- +// Test the eval function. +#test(eval("1 + 2"), 3) +#test(eval("1 + x", scope: (x: 3)), 4) +#test(eval("let x = x + 1; x + 1", scope: (x: 1)), 3) + +--- eval-mode --- +// Test evaluation in other modes. +#eval("[_Hello" + " World!_]") \ +#eval("_Hello" + " World!_", mode: "markup") \ +#eval("RR_1^NN", mode: "math", scope: (RR: math.NN, NN: math.RR)) + +--- eval-syntax-error-1 --- +// Error: 7-12 expected pattern +#eval("let") + +--- eval-in-show-rule --- +#show raw: it => text(font: "PT Sans", eval("[" + it.text + "]")) + +Interacting +``` +#set text(blue) +Blue #move(dy: -0.15em)[🌊] +``` + +--- eval-runtime-error --- +// Error: 7-17 cannot continue outside of loop +#eval("continue") + +--- eval-syntax-error-2 --- +// Error: 7-12 expected semicolon or line break +#eval("1 2") + +--- eval-path-resolve --- +// Test absolute path. +#eval("image(\"/assets/images/tiger.jpg\", width: 50%)") + +--- eval-path-resolve-in-show-rule --- +#show raw: it => eval(it.text, mode: "markup") + +``` +#show emph: image("/assets/images/tiger.jpg", width: 50%) +_Tiger!_ +``` + +--- eval-path-resolve-relative --- +// Test relative path. +#test(eval(`"HELLO" in read("./eval.typ")`.text), true) + +--- issue-2055-math-eval --- +// Evaluating a math expr should renders the same as an equation +#eval(mode: "math", "f(a) = cases(a + b\, space space x >= 3,a + b\, space space x = 5)") + +$f(a) = cases(a + b\, space space x >= 3,a + b\, space space x = 5)$ diff --git a/tests/suite/foundations/float.typ b/tests/suite/foundations/float.typ new file mode 100644 index 00000000..770533b9 --- /dev/null +++ b/tests/suite/foundations/float.typ @@ -0,0 +1,66 @@ +--- float-constructor --- +#test(float(10), 10.0) +#test(float(50% * 30%), 0.15) +#test(float("31.4e-1"), 3.14) +#test(float("31.4e\u{2212}1"), 3.14) +#test(float("3.1415"), 3.1415) +#test(float("-7654.321"), -7654.321) +#test(float("\u{2212}7654.321"), -7654.321) +#test(type(float(10)), float) + +--- float-constructor-bad-type --- +// Error: 8-13 expected float, boolean, integer, ratio, or string, found type +#float(float) + +--- float-constructor-bad-value --- +// Error: 8-15 invalid float: 1.2.3 +#float("1.2.3") + +--- float-is-nan --- +// Test float `is-nan()`. +#test(float(calc.nan).is-nan(), true) +#test(float(10).is-nan(), false) + +--- float-is-infinite --- +// Test float `is-infinite()`. +#test(float(calc.inf).is-infinite(), true) +#test(float(-calc.inf).is-infinite(), true) +#test(float(10).is-infinite(), false) +#test(float(-10).is-infinite(), false) + +--- float-signum --- +// Test float `signum()` +#test(float(0.0).signum(), 1.0) +#test(float(1.0).signum(), 1.0) +#test(float(-1.0).signum(), -1.0) +#test(float(10.0).signum(), 1.0) +#test(float(-10.0).signum(), -1.0) +#test(float(calc.nan).signum().is-nan(), true) + +--- float-repr --- +// Test the `repr` function with floats. +#repr(12.0) \ +#repr(3.14) \ +#repr(1234567890.0) \ +#repr(0123456789.0) \ +#repr(0.0) \ +#repr(-0.0) \ +#repr(-1.0) \ +#repr(-9876543210.0) \ +#repr(-0987654321.0) \ +#repr(-3.14) \ +#repr(4.0 - 8.0) + +--- float-display --- +// Test floats. +#12.0 \ +#3.14 \ +#1234567890.0 \ +#0123456789.0 \ +#0.0 \ +#(-0.0) \ +#(-1.0) \ +#(-9876543210.0) \ +#(-0987654321.0) \ +#(-3.14) \ +#(4.0 - 8.0) diff --git a/tests/suite/foundations/int.typ b/tests/suite/foundations/int.typ new file mode 100644 index 00000000..0c85dcab --- /dev/null +++ b/tests/suite/foundations/int.typ @@ -0,0 +1,73 @@ +--- int-base-alternative --- +// Test numbers with alternative bases. +#test(0x10, 16) +#test(0b1101, 13) +#test(0xA + 0xa, 0x14) + +--- int-base-binary-invalid --- +// Error: 2-7 invalid binary number: 0b123 +#0b123 + +--- int-base-hex-invalid --- +// Error: 2-8 invalid hexadecimal number: 0x123z +#0x123z + +--- int-constructor --- +// Test conversion to numbers. +#test(int(false), 0) +#test(int(true), 1) +#test(int(10), 10) +#test(int("150"), 150) +#test(int("-834"), -834) +#test(int("\u{2212}79"), -79) +#test(int(10 / 3), 3) + +--- int-constructor-bad-type --- +// Error: 6-10 expected integer, boolean, float, or string, found length +#int(10pt) + +--- int-constructor-bad-value --- +// Error: 6-12 invalid integer: nope +#int("nope") + +--- int-signum --- +// Test int `signum()` +#test(int(0).signum(), 0) +#test(int(1.0).signum(), 1) +#test(int(-1.0).signum(), -1) +#test(int(10.0).signum(), 1) +#test(int(-10.0).signum(), -1) + +--- int-repr --- +// Test the `repr` function with integers. +#repr(12) \ +#repr(1234567890) \ +#repr(0123456789) \ +#repr(0) \ +#repr(-0) \ +#repr(-1) \ +#repr(-9876543210) \ +#repr(-0987654321) \ +#repr(4 - 8) + +--- int-display --- +// Test integers. +#12 \ +#1234567890 \ +#0123456789 \ +#0 \ +#(-0) \ +#(-1) \ +#(-9876543210) \ +#(-0987654321) \ +#(4 - 8) + +--- issue-int-constructor --- +// Test that integer -> integer conversion doesn't do a roundtrip through float. +#let x = 9223372036854775800 +#test(type(x), int) +#test(int(x), x) + +--- number-invalid-suffix --- +// Error: 2-4 invalid number suffix: u +#1u diff --git a/tests/suite/foundations/label.typ b/tests/suite/foundations/label.typ new file mode 100644 index 00000000..2cde102c --- /dev/null +++ b/tests/suite/foundations/label.typ @@ -0,0 +1,70 @@ +// Test labels. + +--- label-show-where-selector --- +// Test labelled headings. +#show heading: set text(10pt) +#show heading.where(label: ): underline + += Introduction +The beginning. + += Conclusion +The end. + +--- label-after-expression --- +// Test label after expression. +#show strong.where(label: ): set text(red) + +#let a = [*A*] +#let b = [*B*] +#a #b + +--- label-on-text --- +// Test labelled text. +#show "t": it => { + set text(blue) if it.has("label") and it.label == + it +} + +This is a thing #[that ] happened. + +--- label-dynamic-show-set --- +// Test abusing dynamic labels for styling. +#show : set text(red) +#show : set text(blue) + +*A* *B* *C* #label("bl" + "ue") *D* + +--- label-after-parbreak --- +// Test that label ignores parbreak. +#show : none + +_Hidden_ + + +_Hidden_ + + +_Visible_ + +--- label-in-block --- +// Test that label only works within one content block. +#show : strike +*This is* #[] *protected.* +*This is not.* + +--- label-unclosed-is-text --- +// Test that incomplete label is text. +1 < 2 is #if 1 < 2 [not] a label. + +--- label-text-styled-and-sequence --- +// Test label on text, styled, and sequence. +#test([Hello].label, ) +#test([#[A *B* C]].label, ) +#test([#text(red)[Hello]].label, ) + +--- label-string-conversion --- +// Test getting the name of a label. +#test(str(), "hey") +#test(str(label("hey")), "hey") +#test(str([Hmm].label), "hey") diff --git a/tests/suite/foundations/panic.typ b/tests/suite/foundations/panic.typ new file mode 100644 index 00000000..5d9d4046 --- /dev/null +++ b/tests/suite/foundations/panic.typ @@ -0,0 +1,14 @@ +--- panic --- +// Test panic. +// Error: 2-9 panicked +#panic() + +--- panic-with-int --- +// Test panic. +// Error: 2-12 panicked with: 123 +#panic(123) + +--- panic-with-str --- +// Test panic. +// Error: 2-24 panicked with: "this is wrong" +#panic("this is wrong") diff --git a/tests/suite/foundations/plugin.typ b/tests/suite/foundations/plugin.typ new file mode 100644 index 00000000..0842980e --- /dev/null +++ b/tests/suite/foundations/plugin.typ @@ -0,0 +1,47 @@ +// Test WebAssembly plugins. + +--- plugin-basic --- +#let p = plugin("/assets/plugins/hello.wasm") +#test(p.hello(), bytes("Hello from wasm!!!")) +#test(p.double_it(bytes("hey!")), bytes("hey!.hey!")) +#test( + p.shuffle(bytes("value1"), bytes("value2"), bytes("value3")), + bytes("value3-value1-value2"), +) + +--- plugin-wrong-number-of-arguments --- +#let p = plugin("/assets/plugins/hello.wasm") + +// Error: 2-20 plugin function takes 0 arguments, but 1 was given +#p.hello(bytes("")) + +--- plugin-wrong-argument-type --- +#let p = plugin("/assets/plugins/hello.wasm") + +// Error: 10-14 expected bytes, found boolean +// Error: 27-29 expected bytes, found integer +#p.hello(true, bytes(()), 10) + +--- plugin-error --- +#let p = plugin("/assets/plugins/hello.wasm") + +// Error: 2-17 plugin errored with: This is an `Err` +#p.returns_err() + +--- plugin-panic --- +#let p = plugin("/assets/plugins/hello.wasm") + +// Error: 2-16 plugin panicked: wasm `unreachable` instruction executed +#p.will_panic() + +--- plugin-out-of-bounds-read --- +#let p = plugin("/assets/plugins/plugin-oob.wasm") + +// Error: 2-14 plugin tried to read out of bounds: pointer 0x40000000 is out of bounds for read of length 1 +#p.read_oob() + +--- plugin-out-of-bounds-write --- +#let p = plugin("/assets/plugins/plugin-oob.wasm") + +// Error: 2-27 plugin tried to write out of bounds: pointer 0x40000000 is out of bounds for write of length 3 +#p.write_oob(bytes("xyz")) diff --git a/tests/suite/foundations/repr.typ b/tests/suite/foundations/repr.typ new file mode 100644 index 00000000..f9346faa --- /dev/null +++ b/tests/suite/foundations/repr.typ @@ -0,0 +1,51 @@ +--- repr --- +#test(repr(ltr), "ltr") +#test(repr((1, 2, false, )), "(1, 2, false)") + +--- repr-literals --- +// Literal values. +#auto \ +#none (empty) \ +#true \ +#false + +--- repr-numerical --- +// Numerical values. +#1 \ +#1.0e-4 \ +#3.15 \ +#1e-10 \ +#50.368% \ +#0.0000012345pt \ +#4.5cm \ +#12e1pt \ +#2.5rad \ +#45deg \ +#1.7em \ +#(1cm + 0em) \ +#(2em + 10pt) \ +#2.3fr + +--- repr-misc --- +// Colors and strokes. +#set text(0.8em) +#rgb("f7a205") \ +#(2pt + rgb("f7a205")) + +// Strings and escaping. +#raw(repr("hi"), lang: "typc") +#repr("a\n[]\"\u{1F680}string") + +// Content. +#raw(lang: "typc", repr[*Hey*]) + +// Functions. +#let f(x) = x +#f \ +#rect \ +#(() => none) + +// Types. +#int \ +#type("hi") \ +#type((a: 1)) diff --git a/tests/suite/foundations/str.typ b/tests/suite/foundations/str.typ new file mode 100644 index 00000000..025ec53d --- /dev/null +++ b/tests/suite/foundations/str.typ @@ -0,0 +1,315 @@ +// Test the string methods. + +--- str-constructor --- +// Test conversion to string. +#test(str(123), "123") +#test(str(123, base: 3), "11120") +#test(str(-123, base: 16), "−7b") +#test(str(9223372036854775807, base: 36), "1y2p0ij32e8e7") +#test(str(50.14), "50.14") +#test(str(10 / 3).len() > 10, true) + +--- str-from-float --- +// Test the `str` function with floats. +#test(str(12.0), "12") +#test(str(3.14), "3.14") +#test(str(1234567890.0), "1234567890") +#test(str(0123456789.0), "123456789") +#test(str(0.0), "0") +#test(str(-0.0), "0") +#test(str(-1.0), "−1") +#test(str(-9876543210.0), "−9876543210") +#test(str(-0987654321.0), "−987654321") +#test(str(-3.14), "−3.14") +#test(str(4.0 - 8.0), "−4") + +--- str-from-int --- +// Test the `str` function with integers. +#test(str(12), "12") +#test(str(1234567890), "1234567890") +#test(str(0123456789), "123456789") +#test(str(0), "0") +#test(str(-0), "0") +#test(str(-1), "−1") +#test(str(-9876543210), "−9876543210") +#test(str(-0987654321), "−987654321") +#test(str(4 - 8), "−4") + +--- str-constructor-bad-type --- +// Error: 6-8 expected integer, float, version, bytes, label, type, or string, found content +#str([]) + +--- str-constructor-bad-base --- +// Error: 17-19 base must be between 2 and 36 +#str(123, base: 99) + +--- str-constructor-unsupported-base --- +// Error: 18-19 base is only supported for integers +#str(1.23, base: 2) + +--- str-from-and-to-unicode --- +// Test the unicode function. +#test(str.from-unicode(97), "a") +#test(str.to-unicode("a"), 97) + +--- str-from-unicode-bad-type --- +// Error: 19-22 expected integer, found content +#str.from-unicode([a]) + +--- str-to-unicode-bad-type --- +// Error: 17-21 expected exactly one character +#str.to-unicode("ab") + +--- str-from-unicode-negative --- +// Error: 19-21 number must be at least zero +#str.from-unicode(-1) + +--- str-from-unicode-bad-value --- +// Error: 2-28 0x110000 is not a valid codepoint +#str.from-unicode(0x110000) // 0x10ffff is the highest valid code point + +--- string-len --- +// Test the `len` method. +#test("Hello World!".len(), 12) + +--- string-first-and-last --- +// Test the `first` and `last` methods. +#test("Hello".first(), "H") +#test("Hello".last(), "o") +#test("🏳️‍🌈A🏳️‍⚧️".first(), "🏳️‍🌈") +#test("🏳️‍🌈A🏳️‍⚧️".last(), "🏳️‍⚧️") + +--- string-first-empty --- +// Error: 2-12 string is empty +#"".first() + +--- string-last-empty --- +// Error: 2-11 string is empty +#"".last() + +--- string-at --- +// Test the `at` method. +#test("Hello".at(1), "e") +#test("Hello".at(4), "o") +#test("Hello".at(-1), "o") +#test("Hello".at(-2), "l") +#test("Hey: 🏳️‍🌈 there!".at(5), "🏳️‍🌈") + +--- string-at-default --- +// Test `at`'s 'default' parameter. +#test("z", "Hello".at(5, default: "z")) + +--- string-at-not-a-char-boundary --- +// Error: 2-14 string index 2 is not a character boundary +#"🏳️‍🌈".at(2) + +--- string-at-out-of-bounds --- +// Error: 2-15 no default value was specified and string index out of bounds (index: 5, len: 5) +#"Hello".at(5) + +--- string-at-at-default-other-type --- +#test("Hello".at(5, default: (a: 10)), (a: 10)) + +--- string-slice --- +// Test the `slice` method. +#test("abc".slice(1, 2), "b") +#test("abc🏡def".slice(2, 7), "c🏡") +#test("abc🏡def".slice(2, -2), "c🏡d") +#test("abc🏡def".slice(-3, -1), "de") + +--- string-slice-not-a-char-boundary --- +// Error: 2-21 string index -1 is not a character boundary +#"🏳️‍🌈".slice(0, -1) + +--- string-clusters --- +// Test the `clusters` and `codepoints` methods. +#test("abc".clusters(), ("a", "b", "c")) +#test("abc".clusters(), ("a", "b", "c")) +#test("🏳️‍🌈!".clusters(), ("🏳️‍🌈", "!")) + +--- string-codepoints --- +#test("🏳️‍🌈!".codepoints(), ("🏳", "\u{fe0f}", "\u{200d}", "🌈", "!")) + +--- string-contains --- +// Test the `contains` method. +#test("abc".contains("b"), true) +#test("b" in "abc", true) +#test("1234f".contains(regex("\d")), true) +#test(regex("\d") in "1234f", true) +#test("abc".contains("d"), false) +#test("1234g" in "1234f", false) +#test("abc".contains(regex("^[abc]$")), false) +#test("abc".contains(regex("^[abc]+$")), true) + +--- string-starts-with --- +// Test the `starts-with` and `ends-with` methods. +#test("Typst".starts-with("Ty"), true) +#test("Typst".starts-with(regex("[Tt]ys")), false) +#test("Typst".starts-with("st"), false) + +--- string-ends-with --- +#test("Typst".ends-with("st"), true) +#test("Typst".ends-with(regex("\d*")), true) +#test("Typst".ends-with(regex("\d+")), false) +#test("Typ12".ends-with(regex("\d+")), true) +#test("typst13".ends-with(regex("1[0-9]")), true) +#test("typst113".ends-with(regex("1[0-9]")), true) +#test("typst23".ends-with(regex("1[0-9]")), false) + +--- string-find-and-position --- +// Test the `find` and `position` methods. +#let date = regex("\d{2}:\d{2}") +#test("Hello World".find("World"), "World") +#test("Hello World".position("World"), 6) +#test("It's 12:13 now".find(date), "12:13") +#test("It's 12:13 now".position(date), 5) + +--- string-match --- +// Test the `match` method. +#test("Is there a".match("for this?"), none) +#test( + "The time of my life.".match(regex("[mit]+e")), + (start: 4, end: 8, text: "time", captures: ()), +) + +--- string-matches --- +// Test the `matches` method. +#test("Hello there".matches("\d"), ()) +#test("Day by Day.".matches("Day"), ( + (start: 0, end: 3, text: "Day", captures: ()), + (start: 7, end: 10, text: "Day", captures: ()), +)) + +// Compute the sum of all timestamps in the text. +#let timesum(text) = { + let time = 0 + for match in text.matches(regex("(\d+):(\d+)")) { + let caps = match.captures + time += 60 * int(caps.at(0)) + int(caps.at(1)) + } + str(int(time / 60)) + ":" + str(calc.rem(time, 60)) +} + +#test(timesum(""), "0:0") +#test(timesum("2:70"), "3:10") +#test(timesum("1:20, 2:10, 0:40"), "4:10") + +--- stgring-replace --- +// Test the `replace` method with `Str` replacements. +#test("ABC".replace("", "-"), "-A-B-C-") +#test("Ok".replace("Ok", "Nope", count: 0), "Ok") +#test("to add?".replace("", "How ", count: 1), "How to add?") +#test("AB C DEF GH J".replace(" ", ",", count: 2), "AB,C,DEF GH J") +#test("Walcemo" + .replace("o", "k") + .replace("e", "o") + .replace("k", "e") + .replace("a", "e"), + "Welcome" +) +#test("123".replace(regex("\d$"), "_"), "12_") +#test("123".replace(regex("\d{1,2}$"), "__"), "1__") + +--- string-replace-function --- +// Test the `replace` method with `Func` replacements. + +#test("abc".replace(regex("[a-z]"), m => { + str(m.start) + m.text + str(m.end) +}), "0a11b22c3") +#test("abcd, efgh".replace(regex("\w+"), m => { + upper(m.text) +}), "ABCD, EFGH") +#test("hello : world".replace(regex("^(.+)\s*(:)\s*(.+)$"), m => { + upper(m.captures.at(0)) + m.captures.at(1) + " " + upper(m.captures.at(2)) +}), "HELLO : WORLD") +#test("hello world, lorem ipsum".replace(regex("(\w+) (\w+)"), m => { + m.captures.at(1) + " " + m.captures.at(0) +}), "world hello, ipsum lorem") +#test("hello world, lorem ipsum".replace(regex("(\w+) (\w+)"), count: 1, m => { + m.captures.at(1) + " " + m.captures.at(0) +}), "world hello, lorem ipsum") +#test("123 456".replace(regex("[a-z]+"), "a"), "123 456") + +#test("abc".replace("", m => "-"), "-a-b-c-") +#test("abc".replace("", m => "-", count: 1), "-abc") +#test("123".replace("abc", m => ""), "123") +#test("123".replace("abc", m => "", count: 2), "123") +#test("a123b123c".replace("123", m => { + str(m.start) + "-" + str(m.end) +}), "a1-4b5-8c") +#test("halla warld".replace("a", m => { + if m.start == 1 { "e" } + else if m.start == 4 or m.start == 7 { "o" } +}), "hello world") +#test("aaa".replace("a", m => str(m.captures.len())), "000") + +--- string-replace-function-bad-type --- +// Error: 23-24 expected string, found integer +#"123".replace("123", m => 1) + +--- string-replace-bad-type --- +// Error: 23-32 expected string or function, found array +#"123".replace("123", (1, 2, 3)) + +--- string-trim-basic --- +// Test the `trim` method; the pattern is not provided. +#let str = "Typst, LaTeX, Word, InDesign" +#let array = ("Typst", "LaTeX", "Word", "InDesign") +#test(str.split(",").map(s => s.trim()), array) +#test("".trim(), "") +#test(" ".trim(), "") +#test("\t".trim(), "") +#test("\n".trim(), "") +#test("\t \n".trim(), "") +#test(" abc ".trim(at: start), "abc ") +#test("\tabc ".trim(at: start), "abc ") +#test("abc\n".trim(at: end), "abc") +#test(" abc ".trim(at: end, repeat: true), " abc") +#test(" abc".trim(at: start, repeat: false), "abc") + +--- string-trim-pattern-str --- +// Test the `trim` method; the pattern is a string. +#test("aabcaa".trim("a", repeat: false), "abca") +#test("aabca".trim("a", at: start), "bca") +#test("aabcaa".trim("a", at: end, repeat: false), "aabca") +#test(" abc\n".trim("\n"), " abc") +#test("whole".trim("whole", at: start), "") + +--- string-trim-pattern-regex --- +// Test the `trim` method; the pattern is a regex. +#test("".trim(regex(".")), "") +#test("123abc456".trim(regex("\d")), "abc") +#test("123abc456".trim(regex("\d"), repeat: false), "23abc45") +#test("123a4b5c678".trim(regex("\d"), repeat: true), "a4b5c") +#test("123a4b5c678".trim(regex("\d"), repeat: false), "23a4b5c67") +#test("123abc456".trim(regex("\d"), at: start), "abc456") +#test("123abc456".trim(regex("\d"), at: end), "123abc") +#test("123abc456".trim(regex("\d+"), at: end, repeat: false), "123abc") +#test("123abc456".trim(regex("\d{1,2}$"), repeat: false), "123abc4") +#test("hello world".trim(regex(".")), "") +#test("12306".trim(regex("\d"), at: start), "") +#test("12306abc".trim(regex("\d"), at: start), "abc") +#test("whole".trim(regex("whole"), at: start), "") +#test("12306".trim(regex("\d"), at: end), "") +#test("abc12306".trim(regex("\d"), at: end), "abc") +#test("whole".trim(regex("whole"), at: end), "") + +--- string-trim-at-bad-alignment --- +// Error: 17-21 expected either `start` or `end` +#"abc".trim(at: left) + +--- string-split --- +// Test the `split` method. +#test("abc".split(""), ("", "a", "b", "c", "")) +#test("abc".split("b"), ("a", "c")) +#test("a123c".split(regex("\d")), ("a", "", "", "c")) +#test("a123c".split(regex("\d+")), ("a", "c")) + +--- string-rev --- +// Test the `rev` method. +#test("abc".rev(), "cba") +#test("ax̂e".rev(), "ex̂a") + +--- string-unclosed --- +// Error: 2-2:1 unclosed string +#"hello\" diff --git a/tests/suite/foundations/type.typ b/tests/suite/foundations/type.typ new file mode 100644 index 00000000..f2a98845 --- /dev/null +++ b/tests/suite/foundations/type.typ @@ -0,0 +1,25 @@ +--- type --- +#test(type(1), int) +#test(type(ltr), direction) +#test(type(10 / 3), float) + +--- type-string-compatibility --- +#test(type(10), int) +#test(type(10), "integer") +#test("is " + type(10), "is integer") +#test(int in ("integer", "string"), true) +#test(int in "integers or strings", true) +#test(str in "integers or strings", true) + +--- issue-3110-type-constructor --- +// Let the error message report the type name. +// Error: 2-9 type content does not have a constructor +#content() + +--- issue-3110-associated-field --- +// Error: 6-12 type integer does not contain field `MAXVAL` +#int.MAXVAL + +--- issue-3110-associated-function --- +// Error: 6-18 type string does not contain field `from-unïcode` +#str.from-unïcode(97) diff --git a/tests/suite/foundations/version.typ b/tests/suite/foundations/version.typ new file mode 100644 index 00000000..bf2cadb1 --- /dev/null +++ b/tests/suite/foundations/version.typ @@ -0,0 +1,47 @@ +// Test versions. + +--- version-constructor --- +// Test version constructor. + +// Empty. +#version() + +// Plain. +#test(version(1, 2).major, 1) + +// Single Array argument. +#test(version((1, 2)).minor, 2) + +// Mixed arguments. +#test(version(1, (2, 3), 4, (5, 6), 7).at(5), 6) + +--- version-equality --- +// Test equality of different-length versions +#test(version(), version(0)) +#test(version(0), version(0, 0)) +#test(version(1, 2), version(1, 2, 0, 0, 0, 0)) + +--- version-at --- +// Test `version.at`. + +// Non-negative index in bounds +#test(version(1, 2).at(1), 2) + +// Non-negative index out of bounds +#test(version(1, 2).at(4), 0) + +// Negative index in bounds +#test(version(1, 2).at(-2), 1) + +// Error: 2-22 component index out of bounds (index: -3, len: 2) +#version(1, 2).at(-3) + +--- version-fields --- +// Test version fields. +#test(version(1, 2, 3).major, 1) +#test(version(1, 2, 3).minor, 2) +#test(version(1, 2, 3).patch, 3) + +--- version-type --- +// Test the type of `sys.version` +#test(type(sys.version), version) diff --git a/tests/suite/introspection/counter.typ b/tests/suite/introspection/counter.typ new file mode 100644 index 00000000..8a5315f9 --- /dev/null +++ b/tests/suite/introspection/counter.typ @@ -0,0 +1,78 @@ +// Test counters. + +--- counter-basic-1 --- +// Count with string key. +#let mine = counter("mine!") + +Final: #context mine.final().at(0) \ +#mine.step() +First: #context mine.display() \ +#mine.update(7) +#context mine.display("1 of 1", both: true) \ +#mine.step() +#mine.step() +Second: #context mine.display("I") +#mine.update(n => n * 2) +#mine.step() + +--- counter-basic-2 --- +// Test `counter`. +#let c = counter("heading") +#c.update(2) +#c.update(n => n + 2) +#context test(c.get(), (4,)) +#c.update(n => n - 3) +#context test(c.at(here()), (1,)) + +--- counter-label --- +// Count labels. +#let label = +#let count = context counter(label).display() +#let elem(it) = [#box(it) #label] + +#elem[hey, there!] #count \ +#elem[more here!] #count + +--- counter-heading --- +// Count headings. +#set heading(numbering: "1.a.") +#show heading: set text(10pt) +#counter(heading).step() + += Alpha +In #context counter(heading).display() +== Beta + +#set heading(numbering: none) += Gamma +#heading(numbering: "I.")[Delta] + +At Beta, it was #context { + let it = query(heading).find(it => it.body == [Beta]) + numbering(it.numbering, ..counter(heading).at(it.location())) +} + +--- counter-page --- +#set page(height: 50pt, margin: (bottom: 20pt, rest: 10pt)) +#lorem(12) +#set page(numbering: "(i)") +#lorem(6) +#pagebreak() +#set page(numbering: "1 / 1") +#counter(page).update(1) +#lorem(20) + +--- counter-figure --- +// Count figures. +#figure(numbering: "A", caption: [Four 'A's], kind: image, supplement: "Figure")[_AAAA!_] +#figure(numbering: none, caption: [Four 'B's], kind: image, supplement: "Figure")[_BBBB!_] +#figure(caption: [Four 'C's], kind: image, supplement: "Figure")[_CCCC!_] +#counter(figure.where(kind: image)).update(n => n + 3) +#figure(caption: [Four 'D's], kind: image, supplement: "Figure")[_DDDD!_] + +--- counter-at-no-context --- +// Test `counter.at` outside of context. +// Error: 2-28 can only be used when context is known +// Hint: 2-28 try wrapping this in a `context` expression +// Hint: 2-28 the `context` expression should wrap everything that depends on this function +#counter("key").at(