using System.Collections.Generic;

using AIRuntime.Runtime.Agents.Permissions;
using AIRuntime.Runtime.Capabilities;

using Newtonsoft.Json.Linq;

using NUnit.Framework;


namespace AIRuntime.Tests
{
    public sealed class CapabilityFilterTests
    {
        [Test]
        public void Filter_ReturnsAllowedCapabilitiesOnly()
        {
            CapabilityDescriptor allowed =
                new CapabilityDescriptor(
                    "filesystem.read",
                    "Reads files",
                    new JObject());


            CapabilityDescriptor denied =
                new CapabilityDescriptor(
                    "filesystem.delete",
                    "Deletes files",
                    new JObject());


            List<CapabilityDescriptor> capabilities =
                new List<CapabilityDescriptor>
                {
                    allowed,
                    denied
                };


            CapabilityAccessPolicy policy =
                new CapabilityAccessPolicy();


            policy.Allow(
                "filesystem.read");


            CapabilityFilter filter =
                new CapabilityFilter();


            IReadOnlyList<CapabilityDescriptor> result =
                filter.Filter(
                    capabilities,
                    policy);


            Assert.AreEqual(
                1,
                result.Count);


            Assert.AreSame(
                allowed,
                result[0]);
        }



        [Test]
        public void Filter_WithNoPermissionsReturnsEmpty()
        {
            CapabilityFilter filter =
                new CapabilityFilter();


            CapabilityDescriptor capability =
                new CapabilityDescriptor(
                    "filesystem.read",
                    "Reads files",
                    new JObject());


            IReadOnlyList<CapabilityDescriptor> result =
                filter.Filter(
                    new List<CapabilityDescriptor>
                    {
                        capability
                    },
                    new CapabilityAccessPolicy());


            Assert.AreEqual(
                0,
                result.Count);
        }
    }
}
