@@ -150,6 +150,26 @@ public void ConvertVariant_WhenByteArrayEmpty_ShouldReturnEmptyArray()
150150 Assert . Empty ( ( byte [ ] ) result ) ;
151151 }
152152
153+ [ Theory ]
154+ [ InlineData ( ( int ) EvtVariantType . ByteArray ) ]
155+ [ InlineData ( ( int ) EvtVariantType . UInt16Array ) ]
156+ [ InlineData ( ( int ) EvtVariantType . UInt32Array ) ]
157+ [ InlineData ( ( int ) EvtVariantType . HexInt32Array ) ]
158+ [ InlineData ( ( int ) EvtVariantType . StringArray ) ]
159+ [ InlineData ( ( int ) EvtVariantType . Binary ) ]
160+ public void ConvertVariant_WhenCountOverflows_ShouldThrowInvalidDataException ( int variantType )
161+ {
162+ // Arrange
163+ var type = ( EvtVariantType ) variantType ;
164+ var variant = CreateVariantWithCount ( type , IntPtr . Zero , uint . MaxValue ) ;
165+
166+ // Act & Assert
167+ var ex = Assert . Throws < InvalidDataException > ( ( ) => EventMethods . ConvertVariant ( variant ) ) ;
168+ Assert . Contains ( type . ToString ( ) , ex . Message ) ;
169+ Assert . Contains ( uint . MaxValue . ToString ( ) , ex . Message ) ;
170+ Assert . IsType < OverflowException > ( ex . InnerException ) ;
171+ }
172+
153173 [ Fact ]
154174 public void ConvertVariant_WhenDouble_ShouldReturnDouble ( )
155175 {
@@ -227,6 +247,52 @@ public void ConvertVariant_WhenHexInt32_ShouldReturnInt32()
227247 Assert . Equal ( expectedValue , result ) ;
228248 }
229249
250+ [ Fact ]
251+ public void ConvertVariant_WhenHexInt32Array_ShouldReturnInt32Array ( )
252+ {
253+ // Arrange
254+ int [ ] expectedValues = [ 0x1A , 0x2B , 0x3C , 0x4D ] ;
255+ IntPtr arrayPtr = Marshal . AllocHGlobal ( sizeof ( int ) * expectedValues . Length ) ;
256+
257+ try
258+ {
259+ unsafe
260+ {
261+ var dest = new Span < int > ( ( void * ) arrayPtr , expectedValues . Length ) ;
262+ expectedValues . CopyTo ( dest ) ;
263+ }
264+
265+ var variant = CreateVariantWithCount ( EvtVariantType . HexInt32Array , arrayPtr , ( uint ) expectedValues . Length ) ;
266+
267+ // Act
268+ var result = EventMethods . ConvertVariant ( variant ) ;
269+
270+ // Assert
271+ Assert . NotNull ( result ) ;
272+ Assert . IsType < int [ ] > ( result ) ;
273+ Assert . Equal ( expectedValues , ( int [ ] ) result ) ;
274+ }
275+ finally
276+ {
277+ Marshal . FreeHGlobal ( arrayPtr ) ;
278+ }
279+ }
280+
281+ [ Fact ]
282+ public void ConvertVariant_WhenHexInt32ArrayEmpty_ShouldReturnEmptyArray ( )
283+ {
284+ // Arrange
285+ var variant = CreateVariantWithCount ( EvtVariantType . HexInt32Array , IntPtr . Zero , 0 ) ;
286+
287+ // Act
288+ var result = EventMethods . ConvertVariant ( variant ) ;
289+
290+ // Assert
291+ Assert . NotNull ( result ) ;
292+ Assert . IsType < int [ ] > ( result ) ;
293+ Assert . Empty ( ( int [ ] ) result ) ;
294+ }
295+
230296 [ Fact ]
231297 public void ConvertVariant_WhenHexInt64_ShouldReturnUInt64 ( )
232298 {
@@ -305,6 +371,24 @@ public void ConvertVariant_WhenInvalidType_ShouldThrowInvalidDataException()
305371 Assert . Contains ( "9999" , exception . Message ) ;
306372 }
307373
374+ [ Theory ]
375+ [ InlineData ( ( int ) EvtVariantType . Binary ) ]
376+ [ InlineData ( ( int ) EvtVariantType . ByteArray ) ]
377+ [ InlineData ( ( int ) EvtVariantType . UInt16Array ) ]
378+ [ InlineData ( ( int ) EvtVariantType . UInt32Array ) ]
379+ [ InlineData ( ( int ) EvtVariantType . HexInt32Array ) ]
380+ [ InlineData ( ( int ) EvtVariantType . StringArray ) ]
381+ public void ConvertVariant_WhenNonZeroCountWithNullReference_ShouldThrowInvalidDataException ( int variantType )
382+ {
383+ // Arrange
384+ var type = ( EvtVariantType ) variantType ;
385+ var variant = CreateVariantWithCount ( type , IntPtr . Zero , 5 ) ;
386+
387+ // Act & Assert
388+ var ex = Assert . Throws < InvalidDataException > ( ( ) => EventMethods . ConvertVariant ( variant ) ) ;
389+ Assert . Contains ( type . ToString ( ) , ex . Message ) ;
390+ }
391+
308392 [ Fact ]
309393 public void ConvertVariant_WhenNull_ShouldReturnNull ( )
310394 {
@@ -513,6 +597,52 @@ public void ConvertVariant_WhenUInt16_ShouldReturnUInt16()
513597 Assert . Equal ( expectedValue , result ) ;
514598 }
515599
600+ [ Fact ]
601+ public void ConvertVariant_WhenUInt16Array_ShouldReturnUInt16Array ( )
602+ {
603+ // Arrange
604+ ushort [ ] expectedValues = [ 100 , 200 , 300 , 400 ] ;
605+ IntPtr arrayPtr = Marshal . AllocHGlobal ( sizeof ( ushort ) * expectedValues . Length ) ;
606+
607+ try
608+ {
609+ unsafe
610+ {
611+ var dest = new Span < ushort > ( ( void * ) arrayPtr , expectedValues . Length ) ;
612+ expectedValues . CopyTo ( dest ) ;
613+ }
614+
615+ var variant = CreateVariantWithCount ( EvtVariantType . UInt16Array , arrayPtr , ( uint ) expectedValues . Length ) ;
616+
617+ // Act
618+ var result = EventMethods . ConvertVariant ( variant ) ;
619+
620+ // Assert
621+ Assert . NotNull ( result ) ;
622+ Assert . IsType < ushort [ ] > ( result ) ;
623+ Assert . Equal ( expectedValues , ( ushort [ ] ) result ) ;
624+ }
625+ finally
626+ {
627+ Marshal . FreeHGlobal ( arrayPtr ) ;
628+ }
629+ }
630+
631+ [ Fact ]
632+ public void ConvertVariant_WhenUInt16ArrayEmpty_ShouldReturnEmptyArray ( )
633+ {
634+ // Arrange
635+ var variant = CreateVariantWithCount ( EvtVariantType . UInt16Array , IntPtr . Zero , 0 ) ;
636+
637+ // Act
638+ var result = EventMethods . ConvertVariant ( variant ) ;
639+
640+ // Assert
641+ Assert . NotNull ( result ) ;
642+ Assert . IsType < ushort [ ] > ( result ) ;
643+ Assert . Empty ( ( ushort [ ] ) result ) ;
644+ }
645+
516646 [ Fact ]
517647 public void ConvertVariant_WhenUInt32_ShouldReturnUInt32 ( )
518648 {
@@ -786,7 +916,9 @@ private static EvtVariant CreateVariantWithCount(EvtVariantType type, object? va
786916 case EvtVariantType. Binary:
787917 case EvtVariantType. StringArray:
788918 case EvtVariantType. ByteArray:
919+ case EvtVariantType. UInt16Array:
789920 case EvtVariantType. UInt32Array:
921+ case EvtVariantType. HexInt32Array:
790922 * ( nint * ) buffer = ( IntPtr ) value ;
791923 break ;
792924 case EvtVariantType. SByte :
0 commit comments