"""Private generic bounds; synthetic Source/PNG fixtures, no real art or engine.""" import ast, copy, hashlib, importlib.util, json, pathlib, struct, sys, tempfile, unittest from unittest import mock ROOT=pathlib.Path(__file__).resolve().parents[1] sys.path.insert(0,str(ROOT/'tools'));sys.path.insert(0,str(ROOT/'tests')) import hd_frame_policy as policy import hd_art_audit as audit import hd_register_reviewed as registrar import hd_candidate_review as candidate import test_hd_retained_original_policy as old from PIL import Image def raw_source(painted, width=32, height=32): data=struct.pack('<5i',0,0,0,width,height) for y in range(height): n=max(0,min(width,painted-y*width)) if n: data+=struct.pack('<4i',0,y,y*width,n)+bytes((y*width+x)%256 for x in range(n)) return data+struct.pack('<4i',0,0,-1,0) def frame(count, painted=625): raw=raw_source(painted) cells=sorted([[i%32,i//32] for i in range(painted)])[:count] return dict(frame=0,file='synthetic.png',logical_width=32,logical_height=32,origin=[0,0],source_sha256=hashlib.sha256(raw).hexdigest(),original_detail_cells=cells) class ExtendedPolicy(unittest.TestCase): def test_exact_quarter_and_maximum_boundaries(self): for n,painted,ok in [(64,64,True),(65,260,True),(65,259,False),(73,625,True),(128,512,True),(128,511,False),(129,600,False)]: with self.subTest(n=n,painted=painted): if ok: policy.validate_frame_policy(frame(n,painted),raw_source(painted)) else: with self.assertRaises(ValueError): policy.validate_frame_policy(frame(n,painted),raw_source(painted)) def test_legacy_full_small_source_still_valid_without_new_density_rule(self): f=old.frame();f['original_detail_cells']=[[0,0],[0,1],[1,0],[1,1]] policy.validate_frame_policy(f,old.payload()) def test_transparent_canvas_area_is_never_denominator(self): f=frame(65,259) self.assertEqual(f['logical_width']*f['logical_height'],1024) with self.assertRaisesRegex(ValueError,'quarter'): policy.validate_frame_policy(f,raw_source(259)) def test_schema_preparation_is_not_final_density_approval(self): f=frame(65,259);policy.validate_frame_policy(f) rows=candidate.proposal_frames({'sequences':[dict(base_asset=1,frame_count=1,frames=[f])]}) self.assertEqual(len(rows['00001']['original_detail_cells']),65) with self.assertRaises(ValueError):policy.validate_frame_policy(f,raw_source(259)) def test_sorted_unique_inbounds_typed_and_painted_guards_remain(self): mutations=[lambda c:c[::-1],lambda c:c[:64]+[c[0]],lambda c:c[:64]+[[32,0]],lambda c:c[:64]+[[True,0]],lambda c:c[:64]+[[31,31]]] for mutate in mutations: f=frame(65);f['original_detail_cells']=mutate(f['original_detail_cells']) with self.subTest(cells=f['original_detail_cells'][-1]),self.assertRaises(ValueError):policy.validate_frame_policy(f,raw_source(625)) def test_extended_reserved_painted_domain_and_nearest_cue_overlap(self): f=frame(128,512);policy.validate_frame_policy(f,raw_source(512)) #256 is transparency, while raw labels0 and240..255 remain painted. self.assertEqual(sum(0<=p<=255 for p in policy._indices(raw_source(512))[2]),512) f['native_nearest_cues']=[f['original_detail_cells'][0]] with self.assertRaises(ValueError):policy.validate_frame_policy(f,raw_source(512)) def test_legacy_v2_cannot_authorize_extended_and_v3_can_keep_legacy(self): for n in [1,64]: self.assertTrue(policy.retained_review_version_ok(policy.LEGACY_RETAINED_POLICY,{'00001':[[0,0]]*n})) self.assertTrue(policy.retained_review_version_ok(policy.EXTENDED_RETAINED_POLICY,{'00001':[[0,0]]*n})) self.assertFalse(policy.retained_review_version_ok(policy.LEGACY_RETAINED_POLICY,{'00001':[[0,0]]*65})) self.assertTrue(policy.retained_review_version_ok(policy.EXTENDED_RETAINED_POLICY,{'00001':[[0,0]]*65})) for bad in [None,True,'retained-original-details-v1',[]]:self.assertFalse(policy.retained_review_version_ok(bad,{'00001':[[0,0]]*65})) def test_audit_rejects_density_before_png_access(self): raw=raw_source(259);f=frame(65,259) with mock.patch.object(audit.Image,'open',side_effect=AssertionError('PNG read forbidden')): with self.assertRaisesRegex(ValueError,'quarter'):audit.validate_hd_frame(pathlib.Path('/absent'),f,raw,Image.new('RGBA',(32,32))) def test_real_synthetic_audit_accepts128_of512_without_raw_changes(self): with tempfile.TemporaryDirectory() as temp: q=pathlib.Path(temp);raw=raw_source(512);src=q/'Source';src.write_bytes(raw) picture=audit.decode(src,[(i,i,i) for i in range(256)]) image=Image.new('RGBA',(64,64),(40,50,60,255));image.putpixel((63,63),(0,0,0,0));image.save(q/'synthetic.png') before=(q/'synthetic.png').read_bytes() self.assertEqual(audit.validate_hd_frame(q,frame(128,512),raw,picture),64*64*4) self.assertEqual(before,(q/'synthetic.png').read_bytes()) def test_malformed_source_and_canvas_still_rejected(self): f=frame(65) for raw in [b'',struct.pack('<5i',1,0,0,32,32),raw_source(625,25,25)]: with self.subTest(length=len(raw)),self.assertRaises(ValueError):policy.validate_frame_policy(f,raw) class ExtendedRegistrar(old.ActualRegistrarProvenance): # Inherited legacy tests exercise actual approved_job unmodified call surface. def extended(self, painted=625, count=73, layout='project'): self.f=frame(count,painted);self.f['file']='raw.png';raw=raw_source(painted) self.candidate['sequences'][0]['frames']=[self.f];self.rows=candidate.proposal_frames(self.candidate);digest=candidate.binding_digest(self.rows) self.review['frame_bindings_sha256']=digest decl=self.review['retained_original_detail_review'];decl.update(cells_by_asset={'00001':self.f['original_detail_cells']},frame_bindings_sha256=digest,policy_version=policy.EXTENDED_RETAINED_POLICY) self.write_json(self.job_dir/'candidate.json',self.candidate) self.write_json(self.job_dir/'job.json',dict(job_id='synthetic-complete1',targets=[dict(asset='00001',source_sha256=self.f['source_sha256'],logical_canvas=[32,32])])) qa=json.loads((self.root/'qa.json').read_text());qa['frame_bindings_sha256']=digest;qa['frames'][0].update(source_sha256=self.f['source_sha256'],logical_canvas=[32,32]);self.write_json(self.root/'qa.json',qa) data=(self.project/'data') if layout=='project' else self.project.parent/'data' (data/'sprites').mkdir(parents=True,exist_ok=True);(data/'sprites/fixture.pic').write_bytes(raw);(data/'INDEX').write_text(f'00001 {len(raw)} sprites/fixture.pic\n');return data def test_extended_actual_approved_job_both_catalog_layouts(self): data=self.extended();self.assertEqual(len(self.approve()[2]['00001']['original_detail_cells']),73) #Identical authenticated payload under the other product layout, no larger raw copies. (data/'INDEX').unlink();self.extended(layout='parent');self.assertEqual(len(self.approve()[2]['00001']['original_detail_cells']),73) def test_extended_old_version_rejected(self): self.extended();d=copy.deepcopy(self.review['retained_original_detail_review']);d['policy_version']=policy.LEGACY_RETAINED_POLICY with self.assertRaisesRegex(ValueError,'provenance'):self.approve(d) def test_extended_actual_source_density_beats_forged_claim(self): self.extended(259,65);self.review['retained_original_detail_review']['claimed_painted_Source_cell_count']=1024 with self.assertRaisesRegex(ValueError,'quarter'):self.approve() def test_extended_actual_source_hash_required(self): data=self.extended();(data/'sprites/fixture.pic').write_bytes(raw_source(624)) with self.assertRaisesRegex(ValueError,'authentic catalog Source'):self.approve() def test_extended_missing_source_rejected(self): data=self.extended();(data/'INDEX').unlink() with self.assertRaisesRegex(ValueError,'authentic catalog Source'):self.approve() def test_extended_source_path_escape_rejected(self): data=self.extended();(data/'INDEX').write_text('00001 4 ../outside.pic\n') with self.assertRaisesRegex(ValueError,'escapes catalog'):self.approve() def test_extended_genuine_context_and_retained_not_generated_still_required(self): self.extended() for key in ['hybrid_allscale_and_genuine_context_independent_review','retained_original_not_generated_HD']: d=copy.deepcopy(self.review['retained_original_detail_review']);d[key]=False with self.subTest(key=key),self.assertRaisesRegex(ValueError,'provenance'):self.approve(d) def test_density_helper_legacy_path_needs_no_catalog_io(self): with mock.patch.object(pathlib.Path,'read_text',side_effect=AssertionError('legacy catalog read')): registrar.validate_extended_retained_sources(pathlib.Path('/absent'),{'00001':old.selected()}) class RustSourceCompatibility(unittest.TestCase): def test_legacy_hd_function_bodies_and_normalized_key_tags_remain_exact(self): # Exact pre-bounds atlas baseline (36b3502e), formerly read from the # private proposal's sibling original/src/hd.rs. Inline fingerprints # preserve those exact guards in an ordinary standalone checkout. expected = {'source_reference_budget': '1e544a7639fd123a6e813fbb34f1ded100a1db192973faeb7ce1b96ad54339a0', 'retain_original_detail_samples': '5b1516291d05de782f4d81242f38686be1dca24d00ab0ee4858e3b92729a73b4', 'sprite_with_policy': '7def63d10f179c30ad71c02b3670ca457a7652a976b4c97c1a9098388655fed5', 'terrain_sprite': 'b5d713c0ed8e5327d96c1dae464b2aca4b5e8c9450f85c53928bdde5c99b6e99', 'frame_key': '3605c9fc321571dbc777036ff500f8c436ebb1e717343c056e363c4b634ea1a1', 'original_detail_cache_identity': 'bb9baa84ba832e34dea5274866ddbde52b35f48634cff0ff80533a4dc6d81ffc'} new=(ROOT/'src/hd.rs').read_text() def function(s,name): start=s.index('fn '+name+'(');left=s.index('{',start);depth=1;end=left+1 while depth:depth+=(s[end]=='{')-(s[end]=='}');end+=1 return s[start:end] for name in ['source_reference_budget','retain_original_detail_samples','sprite_with_policy','terrain_sprite']: self.assertEqual(expected[name],hashlib.sha256(function(new,name).encode()).hexdigest(),name) for name,old_bytes,call in [('frame_key','b"raptor-retained-original-details-v2-painted0255"','original_detail_policy_tag(frame.original_detail_cells.len(), false)'),('original_detail_cache_identity','b"retained-original-rejected-fallback-v2-painted0255"','original_detail_policy_tag(frame.original_detail_cells.len(), true)')]: self.assertEqual(expected[name],hashlib.sha256(function(new,name).replace(call,old_bytes).encode()).hexdigest(),name) def test_audit_still_calls_actual_payload_validator(self): tree=ast.parse((ROOT/'tools/hd_art_audit.py').read_text()) node=next(n for n in tree.body if isinstance(n,ast.FunctionDef) and n.name=='validate_hd_frame') self.assertIsInstance(node.body[1],ast.Expr) self.assertEqual(ast.unparse(node.body[1]),'validate_frame_policy(frame, payload)') if __name__=='__main__':unittest.main(verbosity=2)