Add representative live render suite
This commit is contained in:
1 parent
d5857fc889
commit
510ba7260b
3 files changed
+220
No files matched your search
Executable
+63
@@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
SUITE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
REPO_ROOT="$(cd "$SUITE_DIR/../.." && pwd)"
|
||||
PAIRED_CORPUS="$REPO_ROOT/render-repros/paired-corpus.py"
|
||||
SITES="$SUITE_DIR/sites.txt"
|
||||
OBSCURA="${OBSCURA_BIN:-$REPO_ROOT/target/release/obscura}"
|
||||
PYTHON="${PYTHON_BIN:-python3}"
|
||||
|
||||
usage() {
|
||||
echo "usage: $0 OUT_DIR [SCROLL_Y]" >&2
|
||||
echo "SCROLL_Y is an integer CSS-pixel offset or 'bottom'." >&2
|
||||
}
|
||||
|
||||
if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
if (( $# < 1 || $# > 2 )); then
|
||||
usage
|
||||
exit 2
|
||||
fi
|
||||
|
||||
OUT="$1"
|
||||
if [[ -e "$OUT" ]]; then
|
||||
echo "output path already exists: $OUT" >&2
|
||||
exit 2
|
||||
fi
|
||||
if [[ ! -x "$OBSCURA" ]]; then
|
||||
echo "Obscura binary is not executable: $OBSCURA" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
args=(
|
||||
"$PAIRED_CORPUS"
|
||||
"$SITES"
|
||||
--obscura-bin "$OBSCURA"
|
||||
--out "$OUT"
|
||||
--width 1440
|
||||
--height 1000
|
||||
--settle-ms 3000
|
||||
--animation-time-ms 0
|
||||
--geometry-selector "header, nav, footer"
|
||||
--geometry-selector "main, article"
|
||||
--geometry-selector "section"
|
||||
--geometry-selector "form, fieldset, input, button, select, textarea"
|
||||
--geometry-selector "img, svg, video, canvas"
|
||||
--geometry-selector "pre"
|
||||
--geometry-selector "table"
|
||||
)
|
||||
|
||||
if [[ -n "${CHROMIUM_BIN:-}" ]]; then
|
||||
args+=(--chromium-bin "$CHROMIUM_BIN")
|
||||
fi
|
||||
if [[ -n "${BASELINE_BIN:-}" ]]; then
|
||||
args+=(--baseline-bin "$BASELINE_BIN")
|
||||
fi
|
||||
if (( $# == 2 )); then
|
||||
args+=(--scroll-y "$2")
|
||||
fi
|
||||
|
||||
exec env PYTHONDONTWRITEBYTECODE=1 "$PYTHON" "${args[@]}"
|
||||
@@ -0,0 +1,20 @@
|
||||
# Modern framework applications and documentation.
|
||||
https://react.dev/
|
||||
https://vuejs.org/
|
||||
https://angular.dev/
|
||||
https://emberjs.com/
|
||||
https://qwik.dev/
|
||||
https://www.solidjs.com/
|
||||
https://remix.run/
|
||||
|
||||
# CSS systems and CSS-heavy documentation.
|
||||
https://tailwindcss.com/
|
||||
https://bulma.io/
|
||||
https://developer.mozilla.org/en-US/docs/Web/CSS
|
||||
|
||||
# Commercial and marketing surfaces.
|
||||
https://brave.com/
|
||||
https://www.apple.com/
|
||||
|
||||
# Native and framework-styled form controls.
|
||||
https://getbootstrap.com/docs/5.3/forms/overview/
|
||||
@@ -0,0 +1,137 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import stat
|
||||
import subprocess
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
SUITE_DIR = Path(__file__).resolve().parent
|
||||
RUNNER = SUITE_DIR / "run.sh"
|
||||
SITES = SUITE_DIR / "sites.txt"
|
||||
|
||||
|
||||
class RepresentativeSuiteTests(unittest.TestCase):
|
||||
def run_wrapper(self, *arguments, extra_environment=None):
|
||||
with tempfile.TemporaryDirectory() as temporary_directory:
|
||||
temporary = Path(temporary_directory)
|
||||
obscura = temporary / "obscura"
|
||||
obscura.write_text("#!/usr/bin/env sh\nexit 0\n")
|
||||
obscura.chmod(obscura.stat().st_mode | stat.S_IXUSR)
|
||||
|
||||
invocation = temporary / "invocation.txt"
|
||||
python = temporary / "python"
|
||||
python.write_text(
|
||||
"#!/usr/bin/env sh\n"
|
||||
": \"${INVOCATION:?}\"\n"
|
||||
"printf '%s\\n' \"$@\" > \"$INVOCATION\"\n"
|
||||
)
|
||||
python.chmod(python.stat().st_mode | stat.S_IXUSR)
|
||||
|
||||
environment = os.environ.copy()
|
||||
environment.update(
|
||||
{
|
||||
"INVOCATION": str(invocation),
|
||||
"OBSCURA_BIN": str(obscura),
|
||||
"PYTHON_BIN": str(python),
|
||||
}
|
||||
)
|
||||
if extra_environment:
|
||||
environment.update(extra_environment)
|
||||
|
||||
output = temporary / "output"
|
||||
result = subprocess.run(
|
||||
["bash", str(RUNNER), str(output), *arguments],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
env=environment,
|
||||
check=False,
|
||||
)
|
||||
invoked_arguments = (
|
||||
invocation.read_text().splitlines()
|
||||
if invocation.exists()
|
||||
else []
|
||||
)
|
||||
return result, invoked_arguments, str(output), str(obscura)
|
||||
|
||||
def test_default_invocation_pins_capture_conditions_and_generic_probes(self):
|
||||
result, arguments, output, obscura = self.run_wrapper()
|
||||
self.assertEqual(result.returncode, 0, result.stderr)
|
||||
self.assertEqual(
|
||||
arguments[:2],
|
||||
[
|
||||
str(SUITE_DIR.parent / "paired-corpus.py"),
|
||||
str(SITES),
|
||||
],
|
||||
)
|
||||
self.assertEqual(
|
||||
arguments[2:12],
|
||||
[
|
||||
"--obscura-bin",
|
||||
obscura,
|
||||
"--out",
|
||||
output,
|
||||
"--width",
|
||||
"1440",
|
||||
"--height",
|
||||
"1000",
|
||||
"--settle-ms",
|
||||
"3000",
|
||||
],
|
||||
)
|
||||
self.assertIn("--animation-time-ms", arguments)
|
||||
self.assertEqual(arguments[arguments.index("--animation-time-ms") + 1], "0")
|
||||
self.assertEqual(arguments.count("--geometry-selector"), 7)
|
||||
self.assertNotIn("--scroll-y", arguments)
|
||||
|
||||
selectors = [
|
||||
arguments[index + 1]
|
||||
for index, argument in enumerate(arguments)
|
||||
if argument == "--geometry-selector"
|
||||
]
|
||||
self.assertEqual(
|
||||
selectors,
|
||||
[
|
||||
"header, nav, footer",
|
||||
"main, article",
|
||||
"section",
|
||||
"form, fieldset, input, button, select, textarea",
|
||||
"img, svg, video, canvas",
|
||||
"pre",
|
||||
"table",
|
||||
],
|
||||
)
|
||||
|
||||
def test_scroll_and_optional_comparison_binaries_are_forwarded(self):
|
||||
result, arguments, _, _ = self.run_wrapper(
|
||||
"bottom",
|
||||
extra_environment={
|
||||
"CHROMIUM_BIN": "/opt/chromium",
|
||||
"BASELINE_BIN": "/opt/obscura-baseline",
|
||||
},
|
||||
)
|
||||
self.assertEqual(result.returncode, 0, result.stderr)
|
||||
self.assertEqual(arguments[-6:], [
|
||||
"--chromium-bin",
|
||||
"/opt/chromium",
|
||||
"--baseline-bin",
|
||||
"/opt/obscura-baseline",
|
||||
"--scroll-y",
|
||||
"bottom",
|
||||
])
|
||||
|
||||
def test_site_corpus_is_https_and_has_no_duplicates(self):
|
||||
urls = [
|
||||
line.strip()
|
||||
for line in SITES.read_text().splitlines()
|
||||
if line.strip() and not line.lstrip().startswith("#")
|
||||
]
|
||||
self.assertEqual(len(urls), 13)
|
||||
self.assertEqual(len(urls), len(set(urls)))
|
||||
self.assertTrue(all(url.startswith("https://") for url in urls))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in new issue
Block a user