private static void SetHierarchyPart(int index, HierarchyPart part,
                                             string[] itemIds)
        {
            switch (index)
            {
            case 0:     // A (root)
                part.Y = 1;
                part.X = 1;
                part.ChildrenIds.Add(itemIds[1]);
                part.ChildrenIds.Add(itemIds[2]);
                break;

            case 1:     // B (child)
                part.Y        = 2;
                part.X        = 1;
                part.ParentId = itemIds[0];
                break;

            case 2:     // C (child)
                part.Y        = 2;
                part.X        = 2;
                part.ParentId = itemIds[0];
                part.ChildrenIds.Add(itemIds[3]);
                break;

            case 3:     // D (grandson)
                part.Y        = 3;
                part.X        = 1;
                part.ParentId = itemIds[2];
                break;
            }
        }
        public void GetDataPins_Tag_3()
        {
            HierarchyPart part = GetPart();

            Dictionary <string, string> pins = part.GetDataPins()
                                               .ToDictionary(p => p.Name, p => p.Value);

            Assert.Equal(3, pins.Count);
            Assert.True(pins.ContainsKey("y"));
            Assert.Equal("1", pins["y"]);
            Assert.True(pins.ContainsKey("x"));
            Assert.Equal("2", pins["x"]);
            Assert.True(pins.ContainsKey("tag"));
            Assert.Equal("some-tag", pins["tag"]);
        }
        public void GetDataPins_NoTag_2()
        {
            HierarchyPart part = GetPart();

            part.Tag = null;

            Dictionary <string, string> pins = part.GetDataPins()
                                               .ToDictionary(p => p.Name, p => p.Value);

            Assert.Equal(2, pins.Count);
            Assert.True(pins.ContainsKey("y"));
            Assert.Equal("1", pins["y"]);
            Assert.True(pins.ContainsKey("x"));
            Assert.Equal("2", pins["x"]);
        }
        private static HierarchyPart GetPart()
        {
            HierarchyPart part = new HierarchyPart
            {
                ItemId    = Guid.NewGuid().ToString(),
                RoleId    = "some-role",
                CreatorId = "zeus",
                UserId    = "another",
                ParentId  = PARENT_GUID,
                Y         = 1,
                X         = 2,
                Tag       = "some-tag"
            };

            part.ChildrenIds.Add(CHILD1_GUID);
            part.ChildrenIds.Add(CHILD2_GUID);
            return(part);
        }
        public void Part_Is_Serializable()
        {
            HierarchyPart part = GetPart();

            string        json  = TestHelper.SerializePart(part);
            HierarchyPart part2 = TestHelper.DeserializePart <HierarchyPart>(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);

            Assert.Equal(part.Y, part2.Y);
            Assert.Equal(part.X, part2.X);
            Assert.Equal(part.Tag, part2.Tag);
            Assert.Equal(part.ParentId, part2.ParentId);
            Assert.Equal(part.ChildrenIds.Count, part2.ChildrenIds.Count);
            Assert.Contains(CHILD1_GUID, part2.ChildrenIds);
            Assert.Contains(CHILD2_GUID, part2.ChildrenIds);
        }
        private MongoItem[] SeedItems()
        {
            EnsureClientCreated(CONNECTION);
            IMongoDatabase db = Client.GetDatabase(DB_NAME);
            IMongoCollection <MongoItem> items =
                db.GetCollection <MongoItem>(MongoItem.COLLECTION);
            IMongoCollection <MongoPart> parts =
                db.GetCollection <MongoPart>(MongoPart.COLLECTION);

            var jsonOptions = new JsonSerializerOptions
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase
            };

            // generate IDs
            string[] itemIds = new string[4];
            for (int i = 0; i < 4; i++)
            {
                itemIds[i] = Guid.NewGuid().ToString();
            }

            // generate items and seed
            // 4 items: A B C D with hierarchy:
            // A (y=1)
            // +--B (y=2 x=1)
            // +--C (y=2 x=2)
            //    +--D (y=3)
            MongoItem[] mongoItems = new MongoItem[4];
            for (int i = 0; i < 4; i++)
            {
                char letter = (char)('A' + i);

                // item
                MongoItem mongoItem = new MongoItem
                {
                    Id          = itemIds[i],
                    Title       = $"Item {letter}",
                    Description = $"Description for {letter}",
                    FacetId     = "default",
                    SortKey     = $"item {letter}",
                    CreatorId   = "zeus",
                    UserId      = "zeus"
                };
                mongoItems[i] = mongoItem;
                items.InsertOne(mongoItem);

                // hierarchy part
                HierarchyPart part = new HierarchyPart
                {
                    ItemId    = mongoItem.Id,
                    CreatorId = mongoItem.CreatorId,
                    UserId    = mongoItem.UserId
                };
                SetHierarchyPart(i, part, itemIds);
                parts.InsertOne(new MongoPart(part)
                {
                    Content = BsonDocument.Parse(
                        JsonSerializer.Serialize(part, part.GetType(), jsonOptions))
                });
            }

            return(mongoItems);
        }