// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;

using Microsoft.Build.Framework;
using Microsoft.Build.Tasks;
using Microsoft.Build.Utilities;

using Xunit;

#nullable disable

namespace Microsoft.Build.UnitTests
{
    public sealed class CommandLineBuilderExtensionTest
    {
        /*
        * Method:   AppendItemWithInvalidBooleanAttribute
        *
        * When appending an ITaskItem[] where some of the flags are 'bool', it's possible that
        * the boolean flag has a string value that cannot be converted to a boolean. In this
        * case we expect an exception.
        */
        [Fact]
        public void AppendItemWithInvalidBooleanAttribute()
        {
            Assert.Throws<ArgumentException>(() =>
            {
                // Construct the task item.
                TaskItem i = new TaskItem();
                i.ItemSpec = "MyResource.bmp";
                i.SetMetadata("Name", "Kenny");
                i.SetMetadata("Private", "Yes");       // This is our flag.

                CommandLineBuilderExtension c = new CommandLineBuilderExtension();

                // Validate that a legitimate bool works first.
                try
                {
                    c.AppendSwitchIfNotNull(
                        "/myswitch:",
                        new ITaskItem[] { i },
                        new string[] { "Name", "Private" },
                        new bool[] { false, true });
                    Assert.Equal(@"/myswitch:MyResource.bmp,Kenny,Private", c.ToString());
                }
                catch (ArgumentException e)
                {
                    Assert.Fail("Got an unexpected exception:" + e.Message);
                }

                // Now try a bogus boolean.
                i.SetMetadata("Private", "Maybe");       // This is our flag.
                c.AppendSwitchIfNotNull(
                    "/myswitch:",
                    new ITaskItem[] { i },
                    new string[] { "Name", "Private" },
                    new bool[] { false, true });  // <-- Expect an ArgumentException here.
            });
        }
        /// <summary>
        /// When appending an ITaskItem[] where some of the optional attributes are
        /// present, but others aren't.  We can't be emitted attributes in the wrong
        /// order on the command-line, so we skip all subsequent attributes as soon
        /// as we find one missing.
        /// </summary>
        [Fact]
        public void AppendItemWithMissingAttribute()
        {
            // Construct the task items.
            TaskItem i = new TaskItem();
            i.ItemSpec = "MySoundEffect.wav";
            i.SetMetadata("Name", "Kenny");
            i.SetMetadata("Access", "Private");

            TaskItem j = new TaskItem();
            j.ItemSpec = "MySplashScreen.bmp";
            j.SetMetadata("Name", "Cartman");
            j.SetMetadata("HintPath", @"c:\foo");
            j.SetMetadata("Access", "Public");

            CommandLineBuilderExtension c = new CommandLineBuilderExtension();

            c.AppendSwitchIfNotNull(
                "/myswitch:",
                new ITaskItem[] { i, j },
                new string[] { "Name", "HintPath", "Access" },
                null);

            Assert.Equal(
               @"/myswitch:MySoundEffect.wav,Kenny "
               + @"/myswitch:MySplashScreen.bmp,Cartman,c:\foo,Public",
               c.ToString());
        }
    }
}
