import sys import tempfile import unittest from pathlib import Path from PIL import Image SCRIPTS = Path(__file__).resolve().parents[1] / "scripts" sys.path.insert(0, str(SCRIPTS)) from build_g01_backgrounds import process_chroma_image, process_opaque_image, save_png class G01BackgroundBuilderTests(unittest.TestCase): def config(self): return { "dominanceStart": 30, "dominanceEnd": 220, "despillAllowance": 10, } def test_pure_green_becomes_clean_transparency(self): source = Image.new("RGB", (2, 1), (0, 255, 0)) output = process_chroma_image(source, self.config()) self.assertEqual((0, 0, 0, 0), output.getpixel((0, 0))) def test_warm_artwork_remains_opaque(self): source = Image.new("RGB", (1, 1), (210, 190, 150)) output = process_chroma_image(source, self.config()) self.assertEqual((210, 190, 150, 255), output.getpixel((0, 0))) def test_antialiased_green_edge_is_translucent_and_despilled(self): source = Image.new("RGB", (1, 1), (100, 200, 90)) output = process_chroma_image(source, self.config()) red, green, blue, alpha = output.getpixel((0, 0)) self.assertGreater(alpha, 0) self.assertLess(alpha, 255) self.assertLessEqual(green, max(red, blue) + 10) def test_opaque_master_is_normalized_to_rgba_without_transparency(self): source = Image.new("RGB", (1, 1), (240, 235, 220)) output = process_opaque_image(source) self.assertEqual("RGBA", output.mode) self.assertEqual((240, 235, 220, 255), output.getpixel((0, 0))) def test_saved_png_declares_srgb_color_profile(self): with tempfile.TemporaryDirectory() as directory: path = Path(directory) / "asset.png" save_png(Image.new("RGBA", (1, 1), (240, 235, 220, 255)), path) with Image.open(path) as opened: self.assertIn("srgb", opened.info) def test_saved_png_bytes_are_deterministic(self): with tempfile.TemporaryDirectory() as directory: first = Path(directory) / "first.png" second = Path(directory) / "second.png" image = Image.new("RGBA", (2, 2), (240, 235, 220, 255)) save_png(image, first) save_png(image, second) self.assertEqual(first.read_bytes(), second.read_bytes()) if __name__ == "__main__": unittest.main()