File: Metafiles\Validators\EmfValidator.cs
Web Access
Project: src\src\System.Windows.Forms.Primitives\tests\TestUtilities\System.Windows.Forms.Primitives.TestUtilities.csproj (System.Windows.Forms.Primitives.TestUtilities)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable enable
 
using Xunit.Sdk;
 
namespace System.Windows.Forms.Metafiles;
 
internal static partial class EmfValidator
{
    internal static void Validate(
        this EmfScope emf,
        DeviceContextState state,
        params IEmfValidator[] validationSteps)
    {
        ArgumentNullException.ThrowIfNull(state);
        ArgumentNullException.ThrowIfNull(validationSteps);
 
        int currentIndex = 0;
        IEmfValidator? currentValidator = validationSteps[currentIndex];
 
        emf.EnumerateWithState((ref EmfRecord record, DeviceContextState state) =>
            {
                if (currentValidator?.ShouldValidate(record.Type) ?? false)
                {
                    try
                    {
                        currentValidator.Validate(ref record, state, out bool complete);
 
                        if (complete)
                        {
                            // Current validator doesn't want to look at any more records.
                            currentIndex++;
                            currentValidator = currentIndex < validationSteps.Length
                                ? validationSteps[currentIndex]
                                : null;
                        }
                    }
                    catch (XunitException ex)
                    {
                        throw new WrappedXunitException(
                            $"\nValidator index {currentIndex}: {currentValidator!.GetType().Name} failed\n\n{emf.RecordsToString()}",
                            ex);
                    }
                }
                else
                {
                    Assert.False(IsRenderingRecord(record.Type), $"Got unexpected {record.Type}\n\n{emf.RecordsToString()}");
                }
 
                return true;
            },
            state);
 
        if (currentValidator is not null)
        {
            Assert.False(
                currentValidator.FailIfIncomplete,
                $"{currentValidator.GetType().Name} did not receive expected records\n\n{emf.RecordsToString()}");
        }
    }
 
    private static bool IsRenderingRecord(ENHANCED_METAFILE_RECORD_TYPE recordType)
        => recordType switch
        {
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYBEZIER               => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYGON                  => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYLINE                 => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYBEZIERTO             => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYLINETO               => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYPOLYLINE             => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYPOLYGON              => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_SETPIXELV                => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_ANGLEARC                 => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_ELLIPSE                  => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_RECTANGLE                => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_ROUNDRECT                => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_ARC                      => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_CHORD                    => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_PIE                      => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_EXTFLOODFILL             => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_LINETO                   => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_ARCTO                    => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYDRAW                 => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_CLOSEFIGURE              => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_FILLPATH                 => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_STROKEANDFILLPATH        => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_STROKEPATH               => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_FILLRGN                  => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_FRAMERGN                 => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_INVERTRGN                => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_PAINTRGN                 => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_BITBLT                   => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_STRETCHBLT               => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_MASKBLT                  => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_PLGBLT                   => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_SETDIBITSTODEVICE        => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_STRETCHDIBITS            => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_EXTTEXTOUTA              => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_EXTTEXTOUTW              => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYBEZIER16             => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYGON16                => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYLINE16               => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYBEZIERTO16           => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYLINETO16             => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYPOLYLINE16           => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYPOLYGON16            => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYDRAW16               => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYTEXTOUTA             => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_POLYTEXTOUTW             => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_ALPHABLEND               => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_TRANSPARENTBLT           => true,
            ENHANCED_METAFILE_RECORD_TYPE.EMR_GRADIENTFILL             => true,
            _ => false
        };
}