public void TestParity_Four_NNNU()
        {
            Vector2[] coords = new Vector2[] { new Vector2((float)-7.75, (float)5.79), // -O
                                               new Vector2((float)-6.42, (float)3.48), // -N
                                               new Vector2((float)-9.09, (float)3.48), // -C
                                               new Vector2(-9.09, (float)5.02),        // -H (up)
            };
            int[]           elev   = new int[] { 0, 0, 0, 1 };
            GeometricParity parity = new Tetrahedral2DParity(coords, elev);

            Assert.AreEqual(AntiClockwise, parity.Parity);
        }
        public void TestParity_Four_NNNN()
        {
            Vector2[] coords = new Vector2[] { new Vector2((float)-7.75, (float)5.79), // -O
                                               new Vector2((float)-6.42, (float)3.48), // -N
                                               new Vector2((float)-9.09, (float)3.48), // -C
                                               new Vector2((float)-9.09, (float)5.02), // -H
            };
            int[]           elev   = new int[] { 0, 0, 0, 0 };                         // no wedge/hatch bonds
            GeometricParity parity = new Tetrahedral2DParity(coords, elev);

            Assert.AreEqual(None, parity.Parity);
        }
        public void TestParity_Three_DDD()
        {
            Vector2[] coords = new Vector2[] { new Vector2(-7.75, (float)5.79),        // -O (down)
                                               new Vector2((float)-6.42, (float)3.48), // -N
                                               new Vector2((float)-9.09, (float)3.48), // -C
                                               new Vector2(-7.75, (float)4.25),        //  C (centre)
            };
            int[]           elev   = new int[] { -1, -1, -1, 0 };
            GeometricParity parity = new Tetrahedral2DParity(coords, elev);

            Assert.AreEqual(AntiClockwise, parity.Parity);
        }
        /// <summary>
        /// Create an encoder for axial 2D stereochemistry for the given start and
        /// end atoms.
        /// </summary>
        /// <param name="container">the molecule</param>
        /// <param name="start">start of the cumulated system</param>
        /// <param name="startBonds">bonds connected to the start</param>
        /// <param name="end">end of the cumulated system</param>
        /// <param name="endBonds">bonds connected to the end</param>
        /// <returns>an encoder</returns>
        private static IStereoEncoder Axial2DEncoder(IAtomContainer container, IAtom start, IEnumerable <IBond> startBonds, IAtom end, IEnumerable <IBond> endBonds)
        {
            Vector2[] ps = new Vector2[4];
            int[]     es = new int[4];

            PermutationParity perm = new CombinedPermutationParity(Fill2DCoordinates(container, start, startBonds, ps, es, 0), Fill2DCoordinates(container, end, endBonds, ps, es, 2));
            GeometricParity   geom = new Tetrahedral2DParity(ps, es);

            int u = container.Atoms.IndexOf(start);
            int v = container.Atoms.IndexOf(end);

            return(new GeometryEncoder(new int[] { u, v }, perm, geom));
        }