public void TestCreate_2D_Implicit()
        {
            var m_container = new Mock <IAtomContainer>(); var container = m_container.Object;

            m_container.SetupGet(n => n.Atoms.Count).Returns(4);

            var m_c1 = new Mock <IAtom>(); var c1 = m_c1.Object;
            var m_o2 = new Mock <IAtom>(); var o2 = m_o2.Object;
            var m_n3 = new Mock <IAtom>(); var n3 = m_n3.Object;
            var m_c4 = new Mock <IAtom>(); var c4 = m_c4.Object;

            m_container.SetupGet(n => n.Atoms[0]).Returns(c1);
            m_container.SetupGet(n => n.Atoms[1]).Returns(o2);
            m_container.SetupGet(n => n.Atoms[2]).Returns(n3);
            m_container.SetupGet(n => n.Atoms[3]).Returns(c4);

            Vector2 p1 = new Vector2(1.23, -0.29);
            Vector2 p2 = new Vector2(-0.30, -0.29);
            Vector2 p3 = new Vector2(2.00, -1.63);
            Vector2 p4 = new Vector2(2.00, 1.03);

            m_c1.SetupGet(n => n.Point2D).Returns(p1);
            m_o2.SetupGet(n => n.Point2D).Returns(p2);
            m_n3.SetupGet(n => n.Point2D).Returns(p3);
            m_c4.SetupGet(n => n.Point2D).Returns(p4);

            var m_c1c4 = new Mock <IBond>(); var c1c4 = m_c1c4.Object;
            var m_c1o2 = new Mock <IBond>(); var c1o2 = m_c1o2.Object;
            var m_c1n3 = new Mock <IBond>(); var c1n3 = m_c1n3.Object;
            var m_c1h5 = new Mock <IBond>(); var c1h5 = m_c1h5.Object;

            int[][] graph = new int[][] { new[] { 1, 2, 3 }, new[] { 0 }, new[] { 0 }, new[] { 0 }, };

            m_container.Setup(n => n.GetConnectedBonds(c1)).Returns(new[] { c1c4, c1o2, c1n3 });

            // let's say c1 is a chiral carbon
            m_c1.SetupGet(n => n.Hybridization).Returns(Hybridization.SP3);
            // with a hatch bond from c1 to n3
            m_c1n3.SetupGet(n => n.Stereo).Returns(BondStereo.Down);
            m_c1n3.SetupGet(n => n.Begin).Returns(c1);
            m_c1n3.SetupGet(n => n.End).Returns(n3);
            m_c1o2.SetupGet(n => n.Stereo).Returns(BondStereo.None);
            m_c1o2.SetupGet(n => n.Begin).Returns(c1);
            m_c1o2.SetupGet(n => n.End).Returns(o2);
            m_c1c4.SetupGet(n => n.Stereo).Returns(BondStereo.None);
            m_c1c4.SetupGet(n => n.Begin).Returns(c1);
            m_c1c4.SetupGet(n => n.End).Returns(c4);

            IStereoEncoder encoder = new GeometricTetrahedralEncoderFactory().Create(container, graph);

            Assert.AreEqual(1, ExtractEncoders(encoder).Count);

            GeometricParity geometricParity = GetGeometricParity(ExtractEncoders(encoder)[0]);

            Assert.IsTrue(geometricParity is Tetrahedral2DParity);

            Assert.IsTrue(Compares.AreDeepEqual(
                              new Vector2[] { p2, p3, p4, p1 // p1 is from central atom
                              }, Coords2D(geometricParity)));
        }
        public void TestCreate_WrongDegree()
        {
            var m_container = new Mock <IAtomContainer>(); var container = m_container.Object;

            m_container.SetupGet(n => n.Atoms.Count).Returns(5);

            var m_c1 = new Mock <IAtom>(); var c1 = m_c1.Object;
            var m_o2 = new Mock <IAtom>(); var o2 = m_o2.Object;
            var m_n3 = new Mock <IAtom>(); var n3 = m_n3.Object;
            var m_c4 = new Mock <IAtom>(); var c4 = m_c4.Object;
            var m_h5 = new Mock <IAtom>(); var h5 = m_h5.Object;

            m_container.SetupGet(n => n.Atoms[0]).Returns(c1);
            m_container.SetupGet(n => n.Atoms[1]).Returns(o2);
            m_container.SetupGet(n => n.Atoms[2]).Returns(n3);
            m_container.SetupGet(n => n.Atoms[3]).Returns(c4);
            m_container.SetupGet(n => n.Atoms[4]).Returns(h5);

            m_c1.SetupGet(n => n.Point2D).Returns(new Vector2(1.23, -0.29));
            m_o2.SetupGet(n => n.Point2D).Returns(new Vector2(-0.30, -0.29));
            m_n3.SetupGet(n => n.Point2D).Returns(new Vector2(2.00, -1.63));
            m_c4.SetupGet(n => n.Point2D).Returns(new Vector2(2.00, 1.03));
            m_h5.SetupGet(n => n.Point2D).Returns(new Vector2(2.32, -0.29));

            var m_c1c4 = new Mock <IBond>(); var c1c4 = m_c1c4.Object;
            var m_c1o2 = new Mock <IBond>(); var c1o2 = m_c1o2.Object;
            var m_c1n3 = new Mock <IBond>(); var c1n3 = m_c1n3.Object;
            var m_c1h5 = new Mock <IBond>(); var c1h5 = m_c1h5.Object;

            int[][] graph = new int[][] { new[] { 1, 2 }, // 3, 4}, ignore these
                                          new[] { 0 }, new[] { 0 }, new[] { 0 }, new[] { 0 } };

            m_container.Setup(n => n.GetConnectedBonds(c1)).Returns(new[] { c1c4, c1o2, c1n3, c1h5 });

            // ATOM is not SP3
            m_c1.SetupGet(n => n.Hybridization).Returns(Hybridization.SP3);
            // with a hatch bond from c1 to n3
            m_c1n3.SetupGet(n => n.Stereo).Returns(BondStereo.Down);
            m_c1n3.SetupGet(n => n.Begin).Returns(c1);
            m_c1n3.SetupGet(n => n.End).Returns(n3);
            m_c1o2.SetupGet(n => n.Stereo).Returns(BondStereo.None);
            m_c1o2.SetupGet(n => n.Begin).Returns(c1);
            m_c1o2.SetupGet(n => n.End).Returns(o2);
            m_c1c4.SetupGet(n => n.Stereo).Returns(BondStereo.None);
            m_c1c4.SetupGet(n => n.Begin).Returns(c1);
            m_c1c4.SetupGet(n => n.End).Returns(c4);
            m_c1h5.SetupGet(n => n.Stereo).Returns(BondStereo.None);
            m_c1h5.SetupGet(n => n.Begin).Returns(c1);
            m_c1h5.SetupGet(n => n.End).Returns(h5);

            IStereoEncoder encoder = new GeometricTetrahedralEncoderFactory().Create(container, graph);

            Assert.AreEqual(StereoEncoder.Empty, encoder);
        }