<?php
declare(strict_types=1);$q=static function(){throw new RuntimeException('No PDO/SQL in metadata contract');};require __DIR__.'/schema.php';$n=0;$assert=static function($ok,$why)use(&$n){$n++;if(!$ok)throw new RuntimeException($why);};$base=['columns'=>[['data_length'=>8,'column_id'=>1,'data_scale'=>0,'data_default'=>'1','nullable'=>'N','data_type'=>'SMALLINT']],'indexes'=>[['index_name'=>'PK','initial_extent'=>1]],'index_columns'=>[['column_position'=>1]],'constraint_columns'=>[['position'=>1]],'DDL'=>[['ddl'=>'EXACT_DDL']]];$raw=$base;foreach(['data_length','column_id','data_scale'] as $f)$raw['columns'][0][$f]=(float)$raw['columns'][0][$f];$raw['indexes'][0]['initial_extent']=1.0;$raw['index_columns'][0]['column_position']=1.0;$raw['constraint_columns'][0]['position']=1.0;$assert(normalizeSchemaNumericMetadata($raw)===$base,'Only observed small integral metadata roundtrip');foreach(['default','nullable','type','DDL','index'] as $kind){$bad=$raw;if($kind==='default')$bad['columns'][0]['data_default']='0';elseif($kind==='nullable')$bad['columns'][0]['nullable']='Y';elseif($kind==='type')$bad['columns'][0]['data_type']='INT';elseif($kind==='DDL')$bad['DDL'][0]['ddl']='CHANGED';else $bad['indexes'][0]['index_name']='DIFFERENT';$assert(normalizeSchemaNumericMetadata($bad)!==$base,'Real schema change rejected '.$kind);}foreach([1.5,1000001.0,INF,NAN] as $badValue){$bad=$raw;$bad['columns'][0]['data_length']=$badValue;$rejected=false;try{normalizeSchemaNumericMetadata($bad);}catch(RuntimeException $e){$rejected=true;}$assert($rejected,'Non-small-integral metadata rejected');}$bad=$raw;$bad['columns'][0]['data_length']='8';$assert(normalizeSchemaNumericMetadata($bad)!==$base,'String must not coerce');$bad=$raw;$bad['columns'][0]['data_default']=1.0;$assert(normalizeSchemaNumericMetadata($bad)!==$base,'Unapproved float field not normalized');echo json_encode(['assertions'=>$n,'PDO'=>0,'SQL'=>0,'passed'=>true]),"\n";
