@@ -171,6 +171,35 @@ public void TryDetectSerializedFile_NonExistentFile_ReturnsFalse()
171171
172172 #region SerializedFile Metadata Parsing Tests
173173
174+ [ Test ]
175+ public void TryParseMetadata_VersionTooOld_ReturnsFalseWithMessage ( )
176+ {
177+ var headerInfo = new SerializedFileInfo { Version = 18 } ;
178+
179+ bool result = SerializedFileDetector . TryParseMetadata ( "irrelevant" , headerInfo , out var metadata , out var errorMessage ) ;
180+
181+ Assert . IsFalse ( result ) ;
182+ Assert . IsNull ( metadata ) ;
183+ Assert . IsNotNull ( errorMessage ) ;
184+ Assert . That ( errorMessage , Does . Contain ( "18" ) , "Error should mention the actual version" ) ;
185+ Assert . That ( errorMessage , Does . Contain ( "19" ) , "Error should mention the minimum supported version" ) ;
186+ }
187+
188+ [ Test ]
189+ public void TryParseMetadata_VersionTooNew_ReturnsFalseWithMessage ( )
190+ {
191+ var headerInfo = new SerializedFileInfo { Version = 24 } ;
192+
193+ bool result = SerializedFileDetector . TryParseMetadata ( "irrelevant" , headerInfo , out var metadata , out var errorMessage ) ;
194+
195+ Assert . IsFalse ( result ) ;
196+ Assert . IsNull ( metadata ) ;
197+ Assert . IsNotNull ( errorMessage ) ;
198+ Assert . That ( errorMessage , Does . Contain ( "24" ) , "Error should mention the actual version" ) ;
199+ Assert . That ( errorMessage , Does . Contain ( "23" ) , "Error should mention the maximum supported version" ) ;
200+ Assert . That ( errorMessage , Does . Contain ( "UnityDataTool" ) , "Error should mention UnityDataTool" ) ;
201+ }
202+
174203 [ Test ]
175204 public void TryParseMetadata_PlayerDataLevel0_ReturnsExpectedValues ( )
176205 {
@@ -211,7 +240,7 @@ public void TryParseMetadata_PlayerDataLevel0_ReturnsExpectedValues()
211240 $ "TypeTreeSerializedSize should be non-zero (persistentTypeID={ entry . PersistentTypeID } )") ;
212241 Assert . Greater ( entry . PersistentTypeID , 0 ,
213242 $ "PersistentTypeID should be positive for native types (got { entry . PersistentTypeID } )") ;
214- Assert . AreNotEqual ( 114 , entry . PersistentTypeID ,
243+ Assert . That ( entry . PersistentTypeID , Is . Not . EqualTo ( 114 ) ,
215244 "No MonoBehaviour types expected in this scene" ) ;
216245 Assert . That ( entry . ScriptTypeIndex , Is . EqualTo ( ( short ) - 1 ) ,
217246 $ "ScriptTypeIndex should be -1 for native types (persistentTypeID={ entry . PersistentTypeID } )") ;
@@ -344,6 +373,43 @@ public void TryParseMetadata_V22PrefabWithSerializedReference_ReturnsExpectedTyp
344373 Assert . That ( refType . AssemblyName , Is . EqualTo ( "Assembly-CSharp" ) ) ;
345374 }
346375
376+ [ Test ]
377+ public void TryParseMetadata_V23ExtractedMonoscriptBundle_ReturnsExpectedTypeTreeData ( )
378+ {
379+ // This is a v23 (kExtractedTypeTreeSupport) file where the TypeTree blobs have been
380+ // extracted to a shared external store. The metadata records a non-zero TypeTreeContentHash
381+ // as a cache key, but typeTreeSerializedSize == 0 and InlineTypeTree == false for every entry.
382+ var testFile = Path . Combine ( m_TestDataPath , "AssetBundleTypeTreeVariations" , "v23_extracted" ,
383+ "monoscriptbundle.serializedfile" ) ;
384+
385+ bool headerResult = SerializedFileDetector . TryDetectSerializedFile ( testFile , out var headerInfo ) ;
386+ Assert . IsTrue ( headerResult , "File should be detected as a valid SerializedFile" ) ;
387+
388+ bool result = SerializedFileDetector . TryParseMetadata ( testFile , headerInfo , out var metadata , out var errorMessage ) ;
389+ Assert . IsTrue ( result , $ "Metadata parsing should succeed. Error: { errorMessage } ") ;
390+ Assert . IsNotNull ( metadata ) ;
391+
392+ // --- Initial metadata fields ---
393+ Assert . IsTrue ( metadata . EnableTypeTree , "EnableTypeTree should be true" ) ;
394+
395+ // --- Type counts ---
396+ Assert . That ( metadata . TypeTreeCount , Is . EqualTo ( 2 ) , "Should have 2 regular type entries" ) ;
397+ Assert . That ( metadata . SerializedReferenceTypeTreeCount , Is . EqualTo ( 0 ) , "Should have 0 SerializeReference type entries" ) ;
398+ Assert . IsNotNull ( metadata . TypeTrees , "TypeTrees array should be populated" ) ;
399+ Assert . That ( metadata . TypeTrees . Length , Is . EqualTo ( 2 ) ) ;
400+
401+ // --- All TypeTree blobs are extracted: non-zero content hash, zero size, not inline ---
402+ foreach ( var entry in metadata . TypeTrees )
403+ {
404+ Assert . IsFalse ( entry . TypeTreeContentHash . IsZero ,
405+ $ "TypeTreeContentHash should be non-zero for extracted v23 entry (persistentTypeID={ entry . PersistentTypeID } )") ;
406+ Assert . That ( entry . TypeTreeSerializedSize , Is . EqualTo ( 0u ) ,
407+ $ "TypeTreeSerializedSize should be 0 for extracted entry (persistentTypeID={ entry . PersistentTypeID } )") ;
408+ Assert . IsFalse ( entry . InlineTypeTree ,
409+ $ "InlineTypeTree should be false for extracted entry (persistentTypeID={ entry . PersistentTypeID } )") ;
410+ }
411+ }
412+
347413 #endregion
348414
349415 #region YAML SerializedFile Detection Tests
0 commit comments