public void WhenTwoPlacementsCloseAndOneHasServer_ThenPlacementIsMerged()
        {
            var p1 = new InstancePlacement(
                null,
                null,
                new DateTime(2020, 1, 1, 10, 0, 0),
                new DateTime(2020, 1, 1, 11, 0, 0));
            var p2 = new InstancePlacement(
                "server-1",
                SampleNodeType,
                new DateTime(2020, 1, 1, 11, 0, 50),
                new DateTime(2020, 1, 1, 12, 0, 0));

            Assert.IsTrue(p1.IsAdjacent(p2));

            var merged = p1.Merge(p2);

            Assert.AreEqual(
                new DateTime(2020, 1, 1, 10, 0, 0),
                merged.From);
            Assert.AreEqual(
                new DateTime(2020, 1, 1, 12, 0, 0),
                merged.To);
            Assert.AreEqual("server-1", merged.ServerId);
            Assert.AreEqual(SampleNodeType, merged.NodeType);
        }
        public void WhenTwoPlacementsCloseAndBothHaveDifferentServers_ThenPlacementIsNotMerged()
        {
            var p1 = new InstancePlacement(
                "server2",
                new DateTime(2020, 1, 1, 10, 0, 0),
                new DateTime(2020, 1, 1, 11, 0, 0));
            var p2 = new InstancePlacement(
                "server1",
                new DateTime(2020, 1, 1, 11, 0, 50),
                new DateTime(2020, 1, 1, 12, 0, 0));

            Assert.IsFalse(p1.IsAdjacent(p2));
        }
        public void WhenTwoPlacementsNotClose_ThenPlacementIsNotMerged()
        {
            var p1 = new InstancePlacement(
                null,
                new DateTime(2020, 1, 1, 10, 0, 0),
                new DateTime(2020, 1, 1, 11, 0, 0));
            var p2 = new InstancePlacement(
                null,
                new DateTime(2020, 1, 1, 11, 2, 0),
                new DateTime(2020, 1, 1, 12, 0, 0));

            Assert.IsFalse(p1.IsAdjacent(p2));
        }
        //public void RefreshObject(string paletteKey, ObjectPlacement placement, string fieldId)
        //{
        //    var holder = InstanceHolders[paletteKey];
        //    var index = holder.Definition.Placements.IndexOf(placement);

        //    if (fieldId == FieldId.Variant)
        //        (holder.Elements[index] as ObjectModel3D)?.SetVariant(placement.Variant);
        //    else if (fieldId == FieldId.PaletteIndex)
        //    {
        //        ConfigurePlacement(holder, index);

        //        var info = holder.GetInfoForIndex(index);
        //        info.TreeItem.Header = info.Placement.GetDisplayName();
        //        info.TreeItem.Tag = info.Element;

        //        var listItem = bspModel.Items.FirstOrDefault(i => i.Tag == info.Placement);
        //        if (listItem != null)
        //            listItem.Content = info.TreeItem.Header;
        //    }
        //}

        private void BindPlacement(InstancePlacement placement, Helix.Element3D model)
        {
            var binding = new MultiBinding {
                Converter = MatrixTransformConverter.Instance, Mode = BindingMode.TwoWay
            };

            binding.Bindings.Add(new Binding(nameof(InstancePlacement.TransformScale))
            {
                Mode = BindingMode.TwoWay
            });
            binding.Bindings.Add(new Binding(nameof(InstancePlacement.Transform))
            {
                Mode = BindingMode.TwoWay
            });

            model.DataContext = placement;
            BindingOperations.SetBinding(model, Helix.Element3D.TransformProperty, binding);
        }