@@ -13,6 +13,10 @@ namespace Xtensive.Orm.Tests.Linq
1313 [ TestFixture ( Description = "Test cases when System.MemoryExtensions are applied instead of more general versions of methods from EnumerableExtensions" ) ]
1414 public class MemoryExtensionsTest : ChinookDOModelTest
1515 {
16+ private readonly int unknownTracksCount = 0 ;
17+ private readonly int audioTracksCount = 3289 ;
18+ private readonly int videoTracksCount = 214 ;
19+
1620 private int [ ] existingGenreIds ;
1721 private string [ ] existingGenreNames ;
1822
@@ -390,6 +394,169 @@ public void StringArrayContainsInSingleOrDefaultTest2()
390394 }
391395
392396 #endregion
397+
398+
399+ #region Contains over ReadOnlySpan<T> where T is not IComparable, like enums
400+
401+ [ Test ]
402+ public void EnumArrayContainsInAllTest ( )
403+ {
404+ var formats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Audio } ;
405+ var allFormats = ( MediaFormat [ ] ) Enum . GetValues ( typeof ( MediaFormat ) ) ;
406+
407+ var query = Session . Query . All < IntermediateTrack > ( )
408+ . All ( t => formats . Contains ( t . MediaFormat ) ) ;
409+ Assert . That ( query , Is . False ) ;
410+
411+ query = Session . Query . All < IntermediateTrack > ( )
412+ . All ( t => allFormats . Contains ( t . MediaFormat ) ) ;
413+ Assert . That ( query , Is . True ) ;
414+ }
415+
416+ [ Test ]
417+ public void EnumArrayContainsInAnyTest ( )
418+ {
419+ var formats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Audio } ;
420+ var allFormats = ( MediaFormat [ ] ) Enum . GetValues ( typeof ( MediaFormat ) ) ;
421+
422+ var query = Session . Query . All < IntermediateTrack > ( )
423+ . Any ( t => formats . Contains ( t . MediaFormat ) ) ;
424+ Assert . That ( query , Is . True ) ;
425+
426+ var inexistentFormats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Video } ;
427+ query = Session . Query . All < AudioTrack > ( ) . Any ( t => inexistentFormats . Contains ( t . MediaFormat ) ) ;
428+ Assert . That ( query , Is . False ) ;
429+ }
430+
431+ [ Test ]
432+ public void EnumArrayContainsInCountTest ( )
433+ {
434+ var formats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Audio } ;
435+ var allFormats = ( MediaFormat [ ] ) Enum . GetValues ( typeof ( MediaFormat ) ) ;
436+
437+ var query = Session . Query . All < IntermediateTrack > ( )
438+ . Count ( t => formats . Contains ( t . MediaFormat ) ) ;
439+ Assert . That ( query , Is . EqualTo ( unknownTracksCount + audioTracksCount ) ) ;
440+
441+ var inexistentFormats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Video } ;
442+ query = Session . Query . All < AudioTrack > ( )
443+ . Count ( t => inexistentFormats . Contains ( t . MediaFormat ) ) ;
444+ Assert . That ( query , Is . EqualTo ( 0 ) ) ;
445+ }
446+
447+ [ Test ]
448+ public void EnumArrayContainsInGroupByTest ( )
449+ {
450+ var formats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Audio } ;
451+ var allFormats = ( MediaFormat [ ] ) Enum . GetValues ( typeof ( MediaFormat ) ) ;
452+
453+ var query = Session . Query . All < IntermediateTrack > ( )
454+ . GroupBy ( t => formats . Contains ( t . MediaFormat ) ) . ToArray ( ) ;
455+ Assert . That ( query . Length , Is . EqualTo ( 2 ) ) ;
456+ var firstGroup = query [ 0 ] ;
457+ Assert . That ( firstGroup . Key , Is . False ) ;
458+ Assert . That ( firstGroup . Count ( ) , Is . EqualTo ( videoTracksCount ) ) ;
459+
460+ var secondGroup = query [ 1 ] ;
461+ Assert . That ( secondGroup . Key , Is . True ) ;
462+ Assert . That ( secondGroup . Count ( ) , Is . EqualTo ( unknownTracksCount + audioTracksCount ) ) ;
463+
464+ var inexistentFormats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Video } ;
465+ query = Session . Query . All < AudioTrack > ( )
466+ . GroupBy ( t => inexistentFormats . Contains ( t . MediaFormat ) ) . ToArray ( ) ;
467+ Assert . That ( query . Length , Is . EqualTo ( 1 ) ) ;
468+ firstGroup = query [ 0 ] ;
469+ Assert . That ( firstGroup . Key , Is . False ) ;
470+ Assert . That ( firstGroup . Count ( ) , Is . EqualTo ( audioTracksCount ) ) ;
471+ }
472+
473+ [ Test ]
474+ public void EnumArrayContainsInOrderByTest ( )
475+ {
476+ var formats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Audio } ;
477+ var allFormats = ( MediaFormat [ ] ) Enum . GetValues ( typeof ( MediaFormat ) ) ;
478+
479+ var tracks = Session . Query . All < IntermediateTrack > ( )
480+ . OrderBy ( t => formats . Contains ( t . MediaFormat ) ) . ToArray ( ) ;
481+
482+ Assert . That ( tracks . Take ( videoTracksCount ) . All ( t => ! formats . Contains ( t . MediaFormat ) ) , Is . True ) ;
483+ Assert . That ( tracks . Skip ( videoTracksCount ) . All ( t => formats . Contains ( t . MediaFormat ) ) , Is . True ) ;
484+
485+ var inexistentFormats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Video } ;
486+ tracks = Session . Query . All < AudioTrack > ( )
487+ . OrderBy ( t => inexistentFormats . Contains ( t . MediaFormat ) ) . ToArray ( ) ;
488+ Assert . That ( tracks . All ( t => ! inexistentFormats . Contains ( t . MediaFormat ) ) , Is . True ) ;
489+ }
490+
491+ [ Test ]
492+ public void EnumArrayContainsInSelectTest ( )
493+ {
494+ var formats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Audio } ;
495+ var allFormats = ( MediaFormat [ ] ) Enum . GetValues ( typeof ( MediaFormat ) ) ;
496+
497+ var queryResult = Session . Query . All < IntermediateTrack > ( )
498+ . Select ( t => formats . Contains ( t . MediaFormat ) ) . ToArray ( ) ;
499+ Assert . That ( queryResult . Length , Is . EqualTo ( unknownTracksCount + audioTracksCount + videoTracksCount ) ) ;
500+ Assert . That ( queryResult . Count ( b => b == true ) , Is . EqualTo ( unknownTracksCount + audioTracksCount ) ) ;
501+
502+ var inexistentFormats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Video } ;
503+ queryResult = Session . Query . All < AudioTrack > ( )
504+ . Select ( t => inexistentFormats . Contains ( t . MediaFormat ) ) . ToArray ( ) ;
505+ Assert . That ( queryResult . Length , Is . EqualTo ( audioTracksCount ) ) ;
506+ Assert . That ( queryResult . Count ( b => b == true ) , Is . EqualTo ( 0 ) ) ;
507+ }
508+
509+ [ Test ]
510+ public void EnumArrayContainsInWhereTest ( )
511+ {
512+ var formats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Audio } ;
513+ var allFormats = ( MediaFormat [ ] ) Enum . GetValues ( typeof ( MediaFormat ) ) ;
514+
515+ var tracks = Session . Query . All < IntermediateTrack > ( )
516+ . Where ( t => formats . Contains ( t . MediaFormat ) ) . ToArray ( ) ;
517+
518+ Assert . That ( tracks . Length , Is . EqualTo ( unknownTracksCount + audioTracksCount ) ) ;
519+ Assert . That ( tracks . All ( t => formats . Contains ( t . MediaFormat ) ) ) ;
520+
521+
522+ var inexistentFormats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Video } ;
523+ tracks = Session . Query . All < AudioTrack > ( )
524+ . Where ( t => inexistentFormats . Contains ( t . MediaFormat ) ) . ToArray ( ) ;
525+
526+ Assert . That ( tracks . Length , Is . EqualTo ( 0 ) ) ;
527+ Assert . That ( tracks . All ( t => ! formats . Contains ( t . MediaFormat ) ) ) ;
528+ }
529+
530+ [ Test ]
531+ public void EnumArrayContainsInFirstTest ( )
532+ {
533+ var formats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Audio } ;
534+ var allFormats = ( MediaFormat [ ] ) Enum . GetValues ( typeof ( MediaFormat ) ) ;
535+
536+ var track = Session . Query . All < IntermediateTrack > ( )
537+ . First ( t => formats . Contains ( t . MediaFormat ) ) ;
538+
539+ Assert . That ( formats . Contains ( track . MediaFormat ) , Is . True ) ;
540+ }
541+
542+ [ Test ]
543+ public void EnumArrayContainsInFirstOrDefaultTest ( )
544+ {
545+ var formats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Audio } ;
546+
547+ var track = Session . Query . All < IntermediateTrack > ( )
548+ . FirstOrDefault ( t => formats . Contains ( t . MediaFormat ) ) ;
549+
550+ Assert . That ( track , Is . Not . Null ) ;
551+ Assert . That ( formats . Contains ( track . MediaFormat ) , Is . True ) ;
552+
553+ var inexistentFormats = new MediaFormat [ ] { MediaFormat . Unknown , MediaFormat . Video } ;
554+ track = Session . Query . All < AudioTrack > ( )
555+ . FirstOrDefault ( t => inexistentFormats . Contains ( t . MediaFormat ) ) ;
556+ Assert . That ( track , Is . Null ) ;
557+ }
558+
559+ #endregion
393560 }
394561}
395562#endif
0 commit comments