public void Setup()
        {
            m_MousePosition = Vector2.zero;
            m_HoveredVertex = -1;
            m_HoveredEdge   = -1;
            m_ClosestEdge   = -1;

            m_View = Substitute.For <ISpriteMeshView>();
            m_View.mouseWorldPosition.Returns(x => m_MousePosition);
            m_View.hoveredVertex.Returns(x => m_HoveredVertex);
            m_View.hoveredEdge.Returns(x => m_HoveredEdge);
            m_View.closestEdge.Returns(x => m_ClosestEdge);
            m_View.WorldToScreen(Arg.Any <Vector2>()).Returns(x => ((Vector2)x[0] * 100f));
            m_View.IsActionTriggered(Arg.Any <MeshEditorAction>()).Returns(true);

            m_SelectedVertices = new List <int>();
            m_Selection        = Substitute.For <ISelection <int> >();
            m_Selection.Count.Returns(x => m_SelectedVertices.Count);
            m_Selection.Contains(Arg.Any <int>()).Returns(x => m_SelectedVertices.Contains((int)x[0]));
            m_Selection.elements.Returns(x => m_SelectedVertices.ToArray());
            m_Selection.activeElement.Returns(x =>
            {
                if (m_SelectedVertices.Count == 0)
                {
                    return(-1);
                }
                return(m_SelectedVertices[0]);
            });

            m_CacheUndo    = Substitute.For <ICacheUndo>();
            m_Triangulator = Substitute.For <ITriangulator>();

            m_SpriteMeshData                      = new SpriteMeshData();
            m_SpriteMeshData.frame                = new Rect(0f, 0f, 100f, 100f);
            m_SpriteMeshController                = new SpriteMeshController();
            m_SpriteMeshController.frame          = m_SpriteMeshData.frame;
            m_SpriteMeshController.spriteMeshData = m_SpriteMeshData;
            m_SpriteMeshController.spriteMeshView = m_View;
            m_SpriteMeshController.selection      = m_Selection;
            m_SpriteMeshController.cacheUndo      = m_CacheUndo;
            m_SpriteMeshController.triangulator   = m_Triangulator;

            m_SpriteMeshDataController.spriteMeshData = m_SpriteMeshData;
        }
        public void MoveEdge_MovesSelectedVertices()
        {
            Vector2 position1 = Vector2.zero;
            Vector2 position2 = Vector2.left;
            Vector2 position3 = Vector2.one;
            Vector2 position4 = Vector2.up;

            m_SpriteMeshDataController.CreateVertex(position1);
            m_SpriteMeshDataController.CreateVertex(position2);
            m_SpriteMeshDataController.CreateVertex(position3);
            m_SpriteMeshDataController.CreateVertex(position4);
            m_SpriteMeshDataController.CreateEdge(0, 1);

            m_SelectedVertices.Add(0);
            m_SelectedVertices.Add(1);
            m_SelectedVertices.Add(2);
            m_SelectedVertices.Add(3);

            Vector2 deltaPosition = Vector2.one * 10f;
            Vector2 delta;

            m_View.DoMoveEdge(out delta).Returns(x =>
            {
                x[0] = deltaPosition;
                return(true);
            });
            m_View.IsActionTriggered(MeshEditorAction.MoveEdge).Returns(x => true);

            m_SpriteMeshController.OnGUI();

            Assert.AreEqual(4, m_SpriteMeshData.vertices.Count, "Incorrect number of vertices");
            Assert.AreEqual(position1 + deltaPosition, m_SpriteMeshData.vertices[0].position, "Vertex position is incorrect");
            Assert.AreEqual(position2 + deltaPosition, m_SpriteMeshData.vertices[1].position, "Vertex position is incorrect");
            Assert.AreEqual(position3 + deltaPosition, m_SpriteMeshData.vertices[2].position, "Vertex position is incorrect");
            Assert.AreEqual(position4 + deltaPosition, m_SpriteMeshData.vertices[3].position, "Vertex position is incorrect");
            m_CacheUndo.Received().BeginUndoOperation(Arg.Any <string>());
            m_Triangulator.Received().Triangulate(Arg.Any <IList <Vector2> >(), Arg.Any <IList <Edge> >(), Arg.Any <IList <int> >());
        }