public void DrawingObjectの位置交換()
        {
            var window = new EPuzzleWindow();
            var state = new WindowState(window);
            window.State = state;

            var container0 = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Relative,
                MarginLeft = 1f, MarginTop = 10f,
                Height = 100,
            };
            state.Items.Add(container0);
            var container1 = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Relative,
                MarginLeft = 1f, MarginTop = 10f,
                Height = 100,
            };
            state.Items.Add(container1);

            var a = new EigoTestLabelItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Width = 10, Height = 100,
                Name = "a",
            };
            container0.Items.Add(a);
            var b = new EigoTestLabelItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 0, Top = 0,
                Width = 20, Height = 100,
                Name = "b",
            };
            container1.Items.Add(b);
            var c = new EigoTestLabelItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 21, Top = 0,
                Width = 10, Height = 100,
                Name = "c",
            };
            container1.Items.Add(c);

            // container0
            Assert.AreEqual(1, container0.BorderLeft);
            Assert.AreEqual(10, container0.BorderTop);
            Assert.AreEqual(100, container0.Height);
            CollectionAssert.AreEqual(new [] { a, }, container0.Items);

            // container1
            Assert.AreEqual(1, container1.BorderLeft);
            Assert.AreEqual(120, container1.BorderTop);
            Assert.AreEqual(100, container1.Height);
            CollectionAssert.AreEqual(new [] { b, c, }, container1.Items);

            // a
            Assert.AreEqual("a", a.Name);
            Assert.AreEqual(1, a.OuterLeft);
            Assert.AreEqual(10, a.OuterTop);
            Assert.AreEqual(11, a.OuterRight);
            Assert.AreEqual(110, a.OuterBottom);

            // b
            Assert.AreEqual("b", b.Name);
            Assert.AreEqual(1, b.OuterLeft);
            Assert.AreEqual(120, b.OuterTop);
            Assert.AreEqual(21, b.OuterRight);
            Assert.AreEqual(220, b.OuterBottom);

            // c
            Assert.AreEqual("c", c.Name);
            Assert.AreEqual(22, c.OuterLeft);
            Assert.AreEqual(120, c.OuterTop);
            Assert.AreEqual(32, c.OuterRight);
            Assert.AreEqual(220, c.OuterBottom);

            WindowState.NowObject = new TestNowObject();
            WindowState.NowObject.Now = DateTime.MinValue;

            var idouJikan = TimeSpan.FromSeconds(1d);
            state.場所の入れ換え(a, c, idouJikan);

            var aa = state.Items.Single(x => "a" == x.Name);
            var cc = state.Items.Single(x => "c" == x.Name);

            Assert.False(a.IsClickable);
            Assert.False(a.IsVisible);
            Assert.False(c.IsClickable);
            Assert.False(c.IsVisible);

            Assert.False(aa.IsClickable);
            Assert.True(aa.IsVisible);
            Assert.AreEqual(DrawingObjectPosition.Absolute, aa.Position);
            Assert.AreSame(state.DrawingObjectRoot, aa.Parent);
            Assert.AreEqual(a.OuterLeft, aa.OuterLeft);
            Assert.AreEqual(a.OuterTop, aa.OuterTop);
            Assert.AreEqual(a.OuterWidth, aa.OuterWidth);

            Assert.False(cc.IsClickable);
            Assert.True(cc.IsVisible);
            Assert.AreEqual(DrawingObjectPosition.Absolute, cc.Position);
            Assert.AreSame(state.DrawingObjectRoot, cc.Parent);
            Assert.AreEqual(c.OuterLeft, cc.OuterLeft);
            Assert.AreEqual(c.OuterTop, cc.OuterTop);
            Assert.AreEqual(c.OuterWidth, cc.OuterWidth);

            // 移動中
            WindowState.NowObject.Now += TimeSpan.FromTicks((int)Math.Round(idouJikan.Ticks * 0.5f));
            window.Tick();

            Assert.AreEqual(c.OuterLeft + (a.OuterLeft - c.OuterLeft) * 0.5f, cc.OuterLeft, 0.1f);
            Assert.AreEqual(c.OuterTop + (a.OuterTop - c.OuterTop) * 0.5f, cc.OuterTop, 0.1f);
            Assert.AreEqual(c.Width + (a.Width - c.Width) * 0.5f, c.Width, 0.1f);

            Assert.AreEqual(a.OuterLeft + (c.OuterLeft - a.OuterLeft) * 0.5f, aa.OuterLeft, 0.1f);
            Assert.AreEqual(a.OuterTop + (c.OuterTop - a.OuterTop) * 0.5f, aa.OuterTop, 0.1f);
            Assert.AreEqual(a.Width + (c.Width - a.Width) * 0.5f, a.Width, 0.1f);

            // 場所の入れ換え完了
            WindowState.NowObject.Now += idouJikan;
            window.Tick();

            CollectionAssert.DoesNotContain(state.GetAllItems(), a);
            CollectionAssert.DoesNotContain(state.GetAllItems(), c);
            Assert.Null(a.Parent);
            Assert.Null(c.Parent);
            CollectionAssert.AreEqual(new [] { cc, }, container0.Items);
            CollectionAssert.AreEqual(new [] { b, aa }, container1.Items);
            Assert.True(aa.IsClickable);
            Assert.True(aa.IsVisible);
            Assert.True(cc.IsClickable);
            Assert.True(cc.IsVisible);

            // cc
            Assert.AreEqual("c", cc.Name);
            Assert.AreEqual(1, cc.OuterLeft);
            Assert.AreEqual(10, cc.OuterTop);
            Assert.AreEqual(11, cc.OuterRight);
            Assert.AreEqual(110, cc.OuterBottom);

            // aa
            Assert.AreEqual("a", aa.Name);
            Assert.AreEqual(22, aa.OuterLeft);
            Assert.AreEqual(120, aa.OuterTop);
            Assert.AreEqual(32, aa.OuterRight);
            Assert.AreEqual(220, aa.OuterBottom);
        }