private static void AssertFindExpiredResourcesThrows <TException>(
            IReadOnlyCollection <IResource <string> > resources)
            where TException : Exception
        {
            // Arrange.
            var validRules = "5:4 10:2".ParseRules();
            var policy     = new RetentionPolicy(validRules);

            // Act + Assert.
            Assert.Throws <TException>(
                () => policy.FindExpiredResources(resources));
        }
        public void FindExpiredResources_should_find_expired_resources_in_accordance_with_retention_rules(
            string rulesData,
            string resourceDetails,
            string expectedExpiredSrourcesIdsData)
        {
            // Arrange.
            var rules     = rulesData.ParseRules();
            var policy    = new RetentionPolicy(rules);
            var resources = resourceDetails.ParseResources();
            var expectedExpiredResourceIds = expectedExpiredSrourcesIdsData.Split(" ", RemoveEmptyEntries);

            // Act.
            var actualExpiredResourceIds = policy.FindExpiredResources(resources).ToArray();

            // Assert.
            actualExpiredResourceIds.Should().BeEquivalentTo(expectedExpiredResourceIds);
        }