diff options
Diffstat (limited to 'test_wallhaven_dl.py')
| -rw-r--r-- | test_wallhaven_dl.py | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/test_wallhaven_dl.py b/test_wallhaven_dl.py new file mode 100644 index 0000000..a72ae6e --- /dev/null +++ b/test_wallhaven_dl.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +# Checks for wallhaven-dl's non-GUI logic. Run: python3 test_wallhaven_dl.py +# +# Copyright (C) 2026 Danilo M. <danix@danix.xyz> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import importlib.machinery +import importlib.util +import os +import sys +import tempfile +from pathlib import Path + +sys.dont_write_bytecode = True +loader = importlib.machinery.SourceFileLoader("whdl", str(Path(__file__).with_name("wallhaven-dl"))) +spec = importlib.util.spec_from_loader("whdl", loader) +whdl = importlib.util.module_from_spec(spec) +loader.exec_module(whdl) + +# target(): which monitor an image is meant for +wide, tall, big = (2560, 1080), (1080, 1920), (3840, 2160) +assert whdl.target(1920, 1080, [wide, tall]) == 0 # landscape image -> landscape monitor +assert whdl.target(1080, 1920, [wide, tall]) == 1 # portrait image -> portrait monitor +assert whdl.target(1920, 1080, [wide, big, tall]) == 1 # largest of the landscape ones +assert whdl.target(1080, 1920, [wide, big]) == 1 # no portrait monitor -> largest overall + +# api_delay(): rate limiter +assert whdl.api_delay([], 100.0) == 0 +assert whdl.api_delay([50.0 + i for i in range(39)], 100.0) == 0 # under the limit +assert whdl.api_delay([50.0 + i for i in range(40)], 100.0) == 10.0 # oldest of last 40 at t=50 +assert whdl.api_delay([0.0] * 5 + [50.0 + i for i in range(39)], 100.0) == 0 # old calls expired + +# scan_library(): wallhaven ids anywhere under the roots, hidden folders and .part skipped +with tempfile.TemporaryDirectory() as tmp: + for f in ["wallhaven-aaa111.jpg", "sub/deeper/wallhaven-bbb222.png", "sub/holiday.jpg", + "sub/wallhaven-eee555_2560x1080.png", + ".current/wallhaven-ccc333.jpg", "wallhaven-ddd444.part"]: + Path(tmp, f).parent.mkdir(parents=True, exist_ok=True) + Path(tmp, f).write_bytes(b"") + found = whdl.scan_library(Path(tmp), Path(tmp, "missing")) + assert found == {"aaa111": Path(tmp, "wallhaven-aaa111.jpg"), + "bbb222": Path(tmp, "sub/deeper/wallhaven-bbb222.png"), + "eee555": Path(tmp, "sub/wallhaven-eee555_2560x1080.png")}, found + +# nearest_color() / palette_histogram(): local color extraction mapped onto wallhaven's palette +assert whdl.COLORS[whdl.nearest_color(0, 0, 0)] == "000000" +assert whdl.COLORS[whdl.nearest_color(255, 255, 250)] == "ffffff" +assert whdl.COLORS[whdl.nearest_color(10, 100, 210)] == "0066cc" # a slightly off blue +assert whdl.COLORS[whdl.nearest_color(250, 0, 5)] == "cc0000" # pure-ish red +hist = whdl.palette_histogram([(10, 100, 210)] * 60 + [(0, 0, 0)] * 30 + [(255, 255, 0)] * 10) +assert [whdl.COLORS[i] for i, _ in hist.most_common()] == ["0066cc", "000000", "ffff00"], hist + +# search_pick(): prefers a chromatic color over greys when it covers enough of the image +grey, brown, blue, black = (whdl.COLORS.index(c) for c in ("999999", "996633", "0066cc", "000000")) +assert whdl.search_pick(whdl.Counter({grey: 47, brown: 35, blue: 18})) == brown +assert whdl.search_pick(whdl.Counter({grey: 60, black: 35, blue: 5})) == grey # blue under 10% + +# read_apikey(): parses a fake `pass` put first on PATH +with tempfile.TemporaryDirectory() as tmp: + fake = Path(tmp, "pass") + fake.write_text('#!/bin/sh\ncase "$2" in\n' + " multi) printf 'sitepassword\\nlogin: someone\\nAPIKey: abc123\\n' ;;\n" + " plain) printf 'xyz789\\n' ;;\n" + " *) exit 1 ;;\nesac\n") + fake.chmod(0o755) + os.environ["PATH"] = f"{tmp}:{os.environ['PATH']}" + assert whdl.read_apikey("multi") == "abc123" + assert whdl.read_apikey("plain") == "xyz789" + assert whdl.read_apikey("missing") == "" + +print("ok") |
