Files
RustRaptor/tests/test_hd_atlas_grid.py
raptorreplica a073f73f3a Fix HD atlas sampling and protected terrain joins
Add rational atlas cells and bounded authenticated Original-detail retention with standalone synthetic regression checks. Rebuild Linux and Windows runtimes; validate all 5384 supplied frames and preserve three exact 1080p regression controls.
2026-10-17 19:22:20 +11:00

178 lines
9.7 KiB
Python

import copy
from fractions import Fraction
import hashlib
import importlib.util
import json
from pathlib import Path
import struct
import sys
import tempfile
import unittest
from PIL import Image
PROJECT = Path(__file__).resolve().parents[1]
Q = Path(__file__).resolve().parent
sys.path.insert(0, str(PROJECT / 'tools'))
import hd_frame_policy as policy
import hd_art_audit as audit
import hd_candidate_review as candidate
import hd_register_reviewed as registration
from grid_sampler_reference import axis_weights, sample_fractional
def frame(columns=2, rows=2, column=0, row=0, size=(1, 1)):
return dict(frame=0, file='synthetic.png', logical_width=size[0], logical_height=size[1],
origin=[0, 0], source_sha256='0' * 64,
atlas_grid=dict(columns=columns, rows=rows, column=column, row=row))
class Geometry(unittest.TestCase):
def test_exact_fractional_extents(self):
item = frame(4, 2, 3, 1, (32, 32))
result = policy.atlas_grid_geometry(item, 1774, 887)
self.assertEqual(result['bounds'], (Fraction(2661, 2), Fraction(887, 2), Fraction(1774), Fraction(887)))
self.assertEqual(result['pixels'], (1330, 443, 1774, 887))
self.assertEqual(result['resident'], (128, 128))
def test_no_strip_gaps_or_omissions(self):
for count in range(1, 17):
extent = count * 5 + 1
spans = [policy.atlas_grid_geometry(frame(count, count, cell, 0), extent, extent)['bounds'] for cell in range(count)]
self.assertEqual(spans[0][0], 0)
self.assertEqual(spans[-1][2], extent)
self.assertTrue(all(left[2] == right[0] for left, right in zip(spans, spans[1:])))
self.assertTrue(all(span[2] - span[0] == Fraction(extent, count) for span in spans))
def test_last_cell_bounds_never_exceed_atlas(self):
for cols, rows, width, height in [(2, 2, 5, 5), (4, 2, 1774, 887), (7, 7, 31, 31), (1, 1, 9, 9)]:
g = policy.atlas_grid_geometry(frame(cols, rows, cols-1, rows-1), width, height)
self.assertEqual(g['pixels'][2:], (width, height))
for output in [1, 2, 4, 16]:
for weights in axis_weights(g['bounds'][0], g['bounds'][2], output):
self.assertTrue(all(g['pixels'][0] <= index < width for index, _ in weights))
def test_resolution_is_common_bounded_factor(self):
self.assertEqual(policy.atlas_grid_geometry(frame(), 5, 5)['resident'], (2, 2))
self.assertEqual(policy.atlas_grid_geometry(frame(), 7, 7)['resident'], (3, 3))
self.assertEqual(policy.atlas_grid_geometry(frame(), 13, 13)['resident'], (4, 4))
def test_non_square_logical_aspect(self):
self.assertEqual(policy.atlas_grid_geometry(frame(2, 2, size=(2, 1)), 10, 5)['resident'], (4, 2))
def test_odd_grid_size_does_not_mutate_frame(self):
item = frame(4, 2, 1, 0, (32, 32)); old = copy.deepcopy(item)
policy.atlas_grid_geometry(item, 1774, 887)
self.assertEqual(item, old)
def test_grid_and_crop_are_mutually_exclusive(self):
item = frame(); item['crop'] = [0, 0, 2, 2]
with self.assertRaises(ValueError): policy.validate_frame_policy(item)
def test_absent_grid_is_noop_and_adds_no_default_key(self):
item = frame(); item.pop('atlas_grid'); old = copy.deepcopy(item)
policy.validate_frame_policy(item)
self.assertIsNone(policy.atlas_grid_geometry(item, 5, 4))
self.assertEqual(item, old)
self.assertNotIn('atlas_grid', item)
def test_null_grid_is_noop_without_adding_or_removing_keys(self):
item = frame(); item['atlas_grid'] = None; old = copy.deepcopy(item)
self.assertIsNone(policy.validate_atlas_grid(item)); self.assertEqual(item, old)
def test_invalid_typed_grid_fields(self):
for field, value in [('columns', 0), ('rows', 0), ('columns', -1), ('rows', 2**32),
('column', True), ('row', 0.0), ('columns', '2'), ('column', 2), ('row', 2)]:
with self.subTest(field=field, value=value):
item = frame(); item['atlas_grid'][field] = value
with self.assertRaises(ValueError): policy.validate_frame_policy(item)
def test_grid_cell_budget_and_unknown_fields(self):
for grid in [{}, [], 7, dict(columns=129, rows=129, column=0, row=0),
dict(columns=2, rows=2, column=0, row=0, extra=1)]:
item = frame(); item['atlas_grid'] = grid
with self.assertRaises(ValueError): policy.validate_frame_policy(item)
def test_bad_aspect_resolution_and_dimensions(self):
for size in [(5, 6), (3, 3), (0, 5), (5, 0), (-1, 5), (True, 5)]:
with self.subTest(size=size):
with self.assertRaises(ValueError): policy.atlas_grid_geometry(frame(), *size)
class Sampler(unittest.TestCase):
def test_constant_rgba_preserved(self):
g = policy.atlas_grid_geometry(frame(), 5, 5)
pixels = [[(40, 80, 120, 255)] * 5 for _ in range(5)]
self.assertEqual(sample_fractional(pixels, g), [[(40, 80, 120, 255)] * 2 for _ in range(2)])
def test_half_boundary_pixel_participates_on_both_sides(self):
for start, end in [(Fraction(0), Fraction(5, 2)), (Fraction(5, 2), Fraction(5))]:
weights = axis_weights(start, end, 2)
self.assertTrue(any(index == 2 and weight != 0 for row in weights for index, weight in row))
def test_no_neighbor_pixel_bleed(self):
pixels = [[(255, 0, 0, 255), (255, 0, 0, 255), (0, 255, 0, 255), (0, 0, 255, 255), (0, 0, 255, 255)] for _ in range(5)]
left = sample_fractional(pixels, policy.atlas_grid_geometry(frame(), 5, 5))
right = sample_fractional(pixels, policy.atlas_grid_geometry(frame(column=1), 5, 5))
self.assertTrue(all(pixel[2] == 0 for row in left for pixel in row))
self.assertTrue(all(pixel[0] == 0 for row in right for pixel in row))
def test_alpha_is_sampled_as_raw_channel(self):
pixels = [[(0, 0, 0, 1)] * 5 for _ in range(5)]
self.assertTrue(all(pixel[3] == 1 for row in sample_fractional(pixels, policy.atlas_grid_geometry(frame(), 5, 5)) for pixel in row))
def test_weight_normalization(self):
for extent, output in [(Fraction(5, 2), 2), (Fraction(887, 2), 128), (Fraction(31, 7), 4)]:
for weights in axis_weights(0, extent, output):
self.assertAlmostEqual(sum(value for _, value in weights), 1, places=6)
class Consumers(unittest.TestCase):
def test_candidate_retains_grid_and_source_identity(self):
item = frame(); proposal = dict(sequences=[dict(name='Synthetic', base_asset=1, frame_count=1, frames=[item])])
rows = candidate.proposal_frames(proposal)
self.assertEqual(rows['00001']['atlas_grid'], item['atlas_grid'])
changed = copy.deepcopy(rows); changed['00001']['atlas_grid']['column'] = 1
self.assertNotEqual(candidate.binding_digest(rows), candidate.binding_digest(changed))
self.assertEqual(candidate.binding_digest(rows), candidate.binding_digest(candidate.proposal_frames(proposal)))
def test_registration_typed_identity_cannot_ignore_grid_changes(self):
original = frame()
changed = copy.deepcopy(original); changed['atlas_grid']['row'] = 1
self.assertFalse(registration.same_json(original, changed))
changed = copy.deepcopy(original); changed['atlas_grid']['row'] = False
self.assertFalse(registration.same_json(original, changed))
self.assertTrue(registration.same_json(original, copy.deepcopy(original)))
def test_grid_policy_does_not_silently_drop_unknown_metadata(self):
original = frame(); original['atlas_grid']['automatic_fit'] = True
with self.assertRaises(ValueError): policy.validate_frame_policy(original)
original = frame(); original['crop'] = [0, 0, 2, 2]
with self.assertRaises(ValueError): candidate.proposal_frames(dict(sequences=[
dict(name='Synthetic', base_asset=1, frame_count=1, frames=[original])]))
def test_candidate_targets_must_bind_same_grid(self):
item = frame(); target = copy.deepcopy(item); target['asset'] = '00001'; target['atlas_grid']['column'] = 1
proposal = dict(targets=[target], sequences=[dict(name='Synthetic', base_asset=1, frame_count=1, frames=[item])])
with self.assertRaises(ValueError): candidate.proposal_frames(proposal)
def test_audit_rejects_bad_grid_and_accepts_fractional_without_modifying_png(self):
payload = struct.pack('<5i', 1, 0, 0, 1, 1) + b'\x01'
picture = Image.new('RGBA', (1, 1), (1, 1, 1, 255))
with tempfile.TemporaryDirectory(prefix='synthetic-', dir=Q) as directory:
root = Path(directory); path = root / 'synthetic.png'
Image.new('RGBA', (5, 5), (30, 50, 70, 255)).save(path)
previous = path.read_bytes(); item = frame(); item['source_sha256'] = hashlib.sha256(payload).hexdigest()
self.assertEqual(audit.validate_hd_frame(root, item, payload, picture), 16)
self.assertEqual(path.read_bytes(), previous)
item['crop'] = [0, 0, 2, 2]
with self.assertRaises(ValueError): audit.validate_hd_frame(root, item, payload, picture)
def test_audit_transparent_original_needs_raw_transparency(self):
payload = struct.pack('<5i', 1, 0, 0, 1, 1) + b'\x01'
picture = Image.new('RGBA', (1, 1), (0, 0, 0, 0))
with tempfile.TemporaryDirectory(prefix='synthetic-', dir=Q) as directory:
root = Path(directory); path = root / 'synthetic.png'
Image.new('RGBA', (5, 5), (30, 50, 70, 255)).save(path)
item = frame(); item['source_sha256'] = hashlib.sha256(payload).hexdigest()
with self.assertRaises(ValueError): audit.validate_hd_frame(root, item, payload, picture)
if __name__ == '__main__':
unittest.main(verbosity=2)