72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
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_opaque_master_can_be_resized_to_locked_runtime_dimensions(self):
|
|
source = Image.new("RGB", (2, 3), (240, 235, 220))
|
|
output = process_opaque_image(source, (4, 6))
|
|
self.assertEqual((4, 6), output.size)
|
|
self.assertEqual("RGBA", output.mode)
|
|
self.assertEqual((240, 235, 220, 255), output.getpixel((3, 5)))
|
|
|
|
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()
|