"""Tests for the reference-anchored texture path (no network).""" import unittest from unittest import mock from PIL import Image import generate_textures as gt class ReferenceGateTests(unittest.TestCase): def test_reference_without_licence_note_is_refused(self): for argv in (["--ai", "--prompt", "x", "--name", "a.png", "--reference", "r.jpg"], ["--ai", "--prompt", "x", "--name", "a.png", "--reference-licence", "CC BY 2.0"]): with mock.patch.object(gt, "generate_ai_textures") as gen: with self.assertRaises(SystemExit): gt._run_ai(gt._build_arg_parser().parse_args(argv)) gen.assert_not_called() def test_reference_pair_calls_with_the_path(self): argv = ["--ai", "--prompt", "x", "--name", "a.png", "--reference", "r.jpg", "--reference-licence", "CC BY 2.0"] with mock.patch.object(gt, "generate_ai_textures") as gen: gt._run_ai(gt._build_arg_parser().parse_args(argv)) gen.assert_called_once_with("x", "a.png", gt.DEFAULT_IMAGE_MODEL, gt.GEN_SIZE, reference_path="r.jpg") class ReferenceCropTests(unittest.TestCase): def test_reference_results_are_cropped_square_before_save(self): wide = Image.new("RGB", (1344, 768), (10, 20, 30)) with mock.patch.object(gt, "generate_image", return_value=wide) as gen, \ mock.patch.object(gt, "save") as saved: gt.generate_ai_textures("p", "t.png", "m", 1024, reference_path="r.jpg") gen.assert_called_once() img = saved.call_args[0][0] self.assertEqual(img.size, (768, 768)) def test_plain_results_keep_their_size(self): wide = Image.new("RGB", (1344, 768), (10, 20, 30)) with mock.patch.object(gt, "generate_image", return_value=wide), \ mock.patch.object(gt, "save") as saved: gt.generate_ai_textures("p", "t.png", "m", 1024) img = saved.call_args[0][0] self.assertEqual(img.size, (1024, 585)) # _fit preserves aspect ratio if __name__ == "__main__": unittest.main()