/// <summary>
        /// Creates and seeds a new part.
        /// </summary>
        /// <param name="item">The item this part should belong to.</param>
        /// <param name="roleId">The optional part role ID.</param>
        /// <param name="factory">The part seeder factory. This is used
        /// for layer parts, which need to seed a set of fragments.</param>
        /// <returns>A new part.</returns>
        /// <exception cref="ArgumentNullException">item or factory</exception>
        public override IPart GetPart(IItem item, string roleId,
                                      PartSeederFactory factory)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }
            if (factory == null)
            {
                throw new ArgumentNullException(nameof(factory));
            }

            MsNumberingsPart part = new MsNumberingsPart();

            SetPartMetadata(part, roleId, item);

            for (int n = 1; n <= Randomizer.Seed.Next(1, 3 + 1); n++)
            {
                part.Numberings.Add(new Faker <MsNumbering>()
                                    .RuleFor(p => p.IsMain, n == 1)
                                    .RuleFor(p => p.IsPagination, n == 1)
                                    .RuleFor(p => p.Era, f => f.PickRandom("ancient", "modern"))
                                    .RuleFor(p => p.System, f => f.PickRandom("roman", "arabic"))
                                    .RuleFor(p => p.Technique, f => f.Lorem.Word())
                                    .RuleFor(p => p.Century, f => f.Random.Short(12, 15))
                                    .RuleFor(p => p.Position, f => f.PickRandom("bottom", "top"))
                                    .RuleFor(p => p.Issues, f => f.PickRandom(null, f.Lorem.Sentence()))
                                    .Generate());
            }

            return(part);
        }
        private static MsNumberingsPart GetPart(int count)
        {
            MsNumberingsPart part = new MsNumberingsPart
            {
                ItemId    = Guid.NewGuid().ToString(),
                RoleId    = "some-role",
                CreatorId = "zeus",
                UserId    = "another"
            };

            for (int n = 1; n <= count; n++)
            {
                string eo = n % 2 == 0 ? "even" : "odd";
                part.Numberings.Add(new MsNumbering
                {
                    IsMain       = n == 1,
                    IsPagination = n % 2 == 0,
                    Era          = eo,
                    System       = "s-" + eo,
                    Technique    = "t-" + eo,
                    Century      = (short)(10 + n),
                    Position     = $"pos-{n}"
                });
            }

            return(part);
        }
        public void GetDataPins_Numberings_Ok()
        {
            MsNumberingsPart part = GetPart(3);

            List <DataPin> pins = part.GetDataPins(null).ToList();

            Assert.Equal(13, pins.Count);
            TestHelper.AssertValidDataPinNames(pins);

            DataPin pin = pins.Find(p => p.Name == "tot-count");

            Assert.NotNull(pin);
            TestHelper.AssertPinIds(part, pin);
            Assert.Equal("3", pin.Value);

            pin = pins.Find(p => p.Name == "era-odd-count");
            Assert.NotNull(pin);
            TestHelper.AssertPinIds(part, pin);
            Assert.Equal("2", pin.Value);

            pin = pins.Find(p => p.Name == "era-even-count");
            Assert.NotNull(pin);
            TestHelper.AssertPinIds(part, pin);
            Assert.Equal("1", pin.Value);

            pin = pins.Find(p => p.Name == "sys-s-odd-count");
            Assert.NotNull(pin);
            TestHelper.AssertPinIds(part, pin);
            Assert.Equal("2", pin.Value);

            pin = pins.Find(p => p.Name == "sys-s-even-count");
            Assert.NotNull(pin);
            TestHelper.AssertPinIds(part, pin);
            Assert.Equal("1", pin.Value);

            pin = pins.Find(p => p.Name == "tech-t-odd-count");
            Assert.NotNull(pin);
            TestHelper.AssertPinIds(part, pin);
            Assert.Equal("2", pin.Value);

            pin = pins.Find(p => p.Name == "tech-t-even-count");
            Assert.NotNull(pin);
            TestHelper.AssertPinIds(part, pin);
            Assert.Equal("1", pin.Value);

            for (int n = 1; n <= 3; n++)
            {
                pin = pins.Find(p => p.Name == "century" &&
                                p.Value == (n + 10).ToString(CultureInfo.InvariantCulture));
                Assert.NotNull(pin);
                TestHelper.AssertPinIds(part, pin);

                pin = pins.Find(p => p.Name == "position" && p.Value == $"pos-{n}");
                Assert.NotNull(pin);
                TestHelper.AssertPinIds(part, pin);
            }
        }
        public void GetDataPins_NoNumberings_Ok()
        {
            MsNumberingsPart part = GetPart(0);

            List <DataPin> pins = part.GetDataPins(null).ToList();

            Assert.Single(pins);

            DataPin pin = pins[0];

            Assert.Equal("tot-count", pin.Name);
            TestHelper.AssertPinIds(part, pin);
            Assert.Equal("0", pin.Value);
        }
        public void Part_Is_Serializable()
        {
            MsNumberingsPart part = GetPart(2);

            string           json  = TestHelper.SerializePart(part);
            MsNumberingsPart part2 =
                TestHelper.DeserializePart <MsNumberingsPart>(json);

            Assert.Equal(part.Id, part2.Id);
            Assert.Equal(part.TypeId, part2.TypeId);
            Assert.Equal(part.ItemId, part2.ItemId);
            Assert.Equal(part.RoleId, part2.RoleId);
            Assert.Equal(part.CreatorId, part2.CreatorId);
            Assert.Equal(part.UserId, part2.UserId);

            // TODO: details
        }
        public void Seed_Ok()
        {
            MsNumberingsPartSeeder seeder = new MsNumberingsPartSeeder();

            seeder.SetSeedOptions(_seedOptions);

            IPart part = seeder.GetPart(_item, null, _factory);

            Assert.NotNull(part);

            MsNumberingsPart p = part as MsNumberingsPart;

            Assert.NotNull(p);

            TestHelper.AssertPartMetadata(p);

            Assert.NotEmpty(p.Numberings);
        }