// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Collections;
using System.Linq;

using Microsoft.CmdPal.Ext.Registry.Helpers;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Microsoft.CmdPal.Ext.Registry.UnitTests;

[TestClass]
public class RegistryHelperTest
{
    [TestMethod]
    [DataRow(@"HKCC\System\CurrentControlSet\Control", "HKEY_CURRENT_CONFIG")]
    [DataRow(@"HKCR\*\OpenWithList", "HKEY_CLASSES_ROOT")]
    [DataRow(@"HKCU\Control Panel\Accessibility", "HKEY_CURRENT_USER")]
    [DataRow(@"HKLM\HARDWARE\UEFI", "HKEY_LOCAL_MACHINE")]
    [DataRow(@"HKPD\???", "HKEY_PERFORMANCE_DATA")]
    [DataRow(@"HKU\.DEFAULT\Environment", "HKEY_USERS")]
    public void GetRegistryBaseKeyTestOnlyOneBaseKey(string query, string expectedBaseKey)
    {
        var (baseKeyList, _) = RegistryHelper.GetRegistryBaseKey(query);
        Assert.IsNotNull(baseKeyList);
        Assert.IsTrue(baseKeyList.Count() == 1);
        Assert.AreEqual(expectedBaseKey, baseKeyList.First().Name);
    }

    [TestMethod]
    public void GetRegistryBaseKeyTestMoreThanOneBaseKey()
    {
        var (baseKeyList, _) = RegistryHelper.GetRegistryBaseKey("HKC\\Control Panel\\Accessibility"); /* #no-spell-check-line */

        Assert.IsNotNull(baseKeyList);
        Assert.IsTrue(baseKeyList.Count() > 1);

        var list = baseKeyList.Select(found => found.Name);
        Assert.IsTrue(list.Contains("HKEY_CLASSES_ROOT"));
        Assert.IsTrue(list.Contains("HKEY_CURRENT_CONFIG"));
        Assert.IsTrue(list.Contains("HKEY_CURRENT_USER"));
    }

    [TestMethod]
    [DataRow(@"HKCR\*\OpenWithList", @"*\OpenWithList")]
    [DataRow(@"HKCU\Control Panel\Accessibility", @"Control Panel\Accessibility")]
    [DataRow(@"HKLM\HARDWARE\UEFI", @"HARDWARE\UEFI")]
    [DataRow(@"HKU\.DEFAULT\Environment", @".DEFAULT\Environment")]
    [DataRow(@"HKCC\System\CurrentControlSet\Control", @"System\CurrentControlSet\Control")]
    [DataRow(@"HKPD\???", @"???")]
    public void GetRegistryBaseKeyTestSubKey(string query, string expectedSubKey)
    {
        var (_, subKey) = RegistryHelper.GetRegistryBaseKey(query);
        Assert.AreEqual(expectedSubKey, subKey);
    }

    [TestMethod]
    public void GetAllBaseKeysTest()
    {
        var list = RegistryHelper.GetAllBaseKeys();

        CollectionAssert.AllItemsAreNotNull((ICollection)list);
        CollectionAssert.AllItemsAreUnique((ICollection)list);

        var keys = list.Select(found => found.Key).ToList() as ICollection;

        CollectionAssert.Contains(keys, Win32.Registry.ClassesRoot);
        CollectionAssert.Contains(keys, Win32.Registry.CurrentConfig);
        CollectionAssert.Contains(keys, Win32.Registry.CurrentUser);
        CollectionAssert.Contains(keys, Win32.Registry.LocalMachine);
        CollectionAssert.Contains(keys, Win32.Registry.PerformanceData);
        CollectionAssert.Contains(keys, Win32.Registry.Users);
    }
}
