public void CreateMultipleTriangles()
        {
            int maxpoints = 4;
            var pts       = utils.Util.CreateRandomPoints(-5, 5, maxpoints);

            Triangle[] triangles             = utils.Util.FindAllTriangles(pts);
            List <int> idsOfVerticesOriginal = new List <int>();

            idsOfVerticesOriginal.AddRange(triangles.SelectMany(tri => tri.Vertices.Select(tv => tv.Vertex.ID)));
            Assert.AreEqual(4, triangles.Length);
            DemoLib.SqlDbContext ctx = utils.Util.CreateSqlLiteContext();
            ctx.Points.AddRange(pts);
            ctx.Triangles.AddRange(triangles);
            ctx.SaveChanges();
            Point[]    ptsFromDb           = ctx.Points.ToArray();
            Triangle[] trisFromDb          = ctx.Triangles.ToArray();
            List <int> idsOfVerticesFromDb = new List <int>();

            idsOfVerticesFromDb.AddRange(trisFromDb.SelectMany(tri => tri.Vertices.Select(tv => tv.Vertex.ID)));
            CollectionAssert.AreEquivalent(idsOfVerticesFromDb, idsOfVerticesOriginal);
            for (int i = 0; i < triangles.Length; i++)
            {
                Triangle triOriginal = triangles[i];
                Triangle triFromDb   = trisFromDb[i];
                Assert.AreEqual(triFromDb.Vertices.Count(), 3);
                CollectionAssert.AreEquivalent(
                    triFromDb.Vertices.Select(tv => tv.Vertex).ToArray(),
                    triOriginal.Vertices.Select(tv => tv.Vertex).ToArray());
            }
        }
        public void CreateOneTriangle()
        {
            var pts = utils.Util.CreateRandomPoints(-5, 5, 3);

            DemoLib.entity.Triangle tri = new Triangle();
            tri.Vertices.Add(new TriangleVertex {
                ParentID = tri.ID, Vertex = pts[0]
            });
            tri.Vertices.Add(new TriangleVertex {
                ParentID = tri.ID, Vertex = pts[1]
            });
            tri.Vertices.Add(new TriangleVertex {
                ParentID = tri.ID, Vertex = pts[2]
            });
            DemoLib.SqlDbContext ctx = utils.Util.CreateSqlLiteContext();
            ctx.Points.AddRange(pts);
            ctx.Triangles.Add(tri);
            ctx.SaveChanges();
            Point[] ptsFromDb = ctx.Points.ToArray();
            var     triFromDb = ctx.Triangles.First();

            Assert.AreEqual(triFromDb.Vertices.Count(), 3);
            for (int i = 0; i < 3; i++)
            {
                Assert.AreEqual(ptsFromDb[i], triFromDb.Vertices.ElementAt(i).Vertex);
            }
        }
Example #3
0
        public void Query_For_TriangleGive_Point()
        {
            Random rnd = new Random(DateTime.Now.Second);
            long   timetakenUsingBasicLists = 0;
            int    countOfPoints            = 100;
            ///
            /// Using simple List
            ///
            {
                Trace.WriteLine("Simple lists");
                Trace.WriteLine("----------------------------");
                var       lstPoints         = utils.Util.CreateRandomPoints(0, 100, countOfPoints).ToList();
                var       lstTriangles      = utils.Util.FindAllTriangles(lstPoints).ToList();
                int[]     idsOfPointsRandom = lstPoints.Select(p => p.ID).OrderBy(id => rnd.Next()).ToArray();
                Stopwatch sw = new Stopwatch();
                sw.Start();
                foreach (int idOfPoint in idsOfPointsRandom)
                {
                    var tri = lstTriangles.Where(t => t.Vertices.Any(tv => tv.Vertex.ID == idOfPoint)).ToArray();
                    Assert.IsNotNull(tri);
                    Assert.IsTrue(tri.Length > 0);
                }
                sw.Stop();
                timetakenUsingBasicLists = sw.ElapsedMilliseconds;
                Trace.WriteLine($"List<>-Time taken to query for {idsOfPointsRandom.Length} points and '{lstTriangles.Count()}' triangles was {timetakenUsingBasicLists} ms ");
            }
            long timetakenUsingSqlLite = 0;

            ///
            /// Using SQLite
            ///
            {
                Trace.WriteLine("SQLlite");
                Trace.WriteLine("----------------------------");
                var pts                  = utils.Util.CreateRandomPoints(0, 100, countOfPoints);
                var triangles            = utils.Util.FindAllTriangles(pts);
                DemoLib.SqlDbContext ctx = utils.Util.CreateSqlLiteContext();
                ctx.Points.AddRange(pts);
                ctx.Triangles.AddRange(triangles);
                ctx.SaveChanges();
                int[]     idsOfPointsRandom = pts.Select(p => p.ID).OrderBy(id => rnd.Next()).ToArray();
                Stopwatch sw = new Stopwatch();
                sw.Start();
                var q = ctx.Triangles.AsQueryable();
                foreach (int idOfPoint in idsOfPointsRandom)
                {
                    var tri = from t in ctx.Triangles join tv in ctx.TriangleVertices on t.ID equals tv.ParentID where tv.PointID == idOfPoint select t;
                    //ctx.Triangles.Single(t=>t.ve)
                    //AsQueryable().in.Single(t => t.Vertices.Any(tv => tv.Vertex.ID == idOfPoint)).ToArray();
                    Assert.IsTrue(tri.Count() > 0);
                    //Assert.IsTrue(tri.Vertices.Any(tv => tv.PointID == idOfPoint));
                }
                sw.Stop();
                timetakenUsingSqlLite = sw.ElapsedMilliseconds;
                Trace.WriteLine($"SQLLite-Time taken to query for '{idsOfPointsRandom.Length}' points and '{triangles.Length}' triangles was {timetakenUsingSqlLite} ms ");
            }
            Assert.IsTrue(timetakenUsingSqlLite < 0.5 * timetakenUsingBasicLists);
        }
Example #4
0
        public void Query_For_Triangle_Using_PrimaryKey()
        {
            int countOfPoints = 50;
            ///
            /// Query for triangle using the Primary Key - using very basic List<>
            ///
            long timeTakenUsingBasicLists = 0;
            {
                Random    rnd                  = new Random(DateTime.Now.Second);
                var       lstPoints            = utils.Util.CreateRandomPoints(0, 100, countOfPoints).ToList();
                var       lstTriangles         = utils.Util.FindAllTriangles(lstPoints).ToList();
                int[]     idsOfTrianglesRandom = lstTriangles.Select(p => p.ID).OrderBy(id => rnd.Next()).ToArray();
                Stopwatch sw = new Stopwatch();
                sw.Start();
                foreach (int idOfTriangle in idsOfTrianglesRandom)
                {
                    var tri = lstTriangles.Where(t => t.ID == idOfTriangle).ToArray();
                    Assert.IsTrue(tri.Length == 1);
                    Assert.AreEqual(idOfTriangle, tri[0].ID);
                }
                sw.Stop();
                timeTakenUsingBasicLists = sw.ElapsedMilliseconds;
                Trace.WriteLine($"List<>-Time taken to query for all '{lstTriangles.Count()}' triangles one by one was {timeTakenUsingBasicLists} ms ");
            }
            ///
            /// Query for triangle using the Primary key - using EF Find
            ///
            long timeTakenUsingEF = 0;

            {
                Random rnd                  = new Random(DateTime.Now.Second);
                var    lstPoints            = utils.Util.CreateRandomPoints(0, 100, countOfPoints).ToList();
                var    lstTriangles         = utils.Util.FindAllTriangles(lstPoints).ToList();
                int[]  idsOfTrianglesRandom = lstTriangles.Select(p => p.ID).OrderBy(id => rnd.Next()).ToArray();
                DemoLib.SqlDbContext ctx    = utils.Util.CreateSqlLiteContext();
                ctx.Points.AddRange(lstPoints);
                ctx.Triangles.AddRange(lstTriangles);
                ctx.SaveChanges();
                Stopwatch sw = new Stopwatch();
                sw.Start();
                foreach (int idOfTriangle in idsOfTrianglesRandom)
                {
                    var tri = ctx.Triangles.Find(idOfTriangle);
                    Assert.AreEqual(idOfTriangle, tri.ID);
                }
                sw.Stop();
                timeTakenUsingEF = sw.ElapsedMilliseconds;
                Trace.WriteLine($"SQLLITE-Time taken to query for all '{lstTriangles.Count()}' triangles one by one was {timeTakenUsingEF} ms ");
            }
            //TODO How about testing the PK performance using Where clause. e.g. ctx.Triangles.Where(t=>t.ID==idOfTriangle).FirstOrDefault();

            ///
            /// The time taken by EF-SQLLITE Find() should be significantly lower than that of raw List
            ///
            Assert.IsTrue(timeTakenUsingEF < timeTakenUsingBasicLists / 100);
        }
        public void SaveSinglePoint()
        {
            var pts = utils.Util.CreateRandomPoints(-1, 1, 1);

            Point[] ptsCloned        = pts.Select(p => p.Clone()).ToArray();
            DemoLib.SqlDbContext ctx = utils.Util.CreateSqlLiteContext();
            ctx.Points.AddRange(pts);
            ctx.SaveChanges();
            Point[] ptsFromDb = ctx.Points.ToArray();
            Assert.IsTrue(ptsFromDb.Length == 1);
            Assert.AreEqual(ptsFromDb[0], ptsCloned[0]);
        }
        public void CascadeDeletePoint()
        {
            int maxpointsUsedForTriangles = 4, maxpointsNotUsedForTriangles = 3;
            var ptsUsedForTriangles    = utils.Util.CreateRandomPoints(-5, 5, maxpointsUsedForTriangles);
            var ptsNotUsedForTriangles = utils.Util.CreateRandomPoints(-5, 5, maxpointsNotUsedForTriangles);

            Triangle[]           triangles = utils.Util.FindAllTriangles(ptsUsedForTriangles);
            DemoLib.SqlDbContext ctx       = utils.Util.CreateSqlLiteContext();
            ctx.Points.AddRange(ptsUsedForTriangles);
            ctx.Points.AddRange(ptsNotUsedForTriangles);
            ctx.Triangles.AddRange(triangles);
            ctx.SaveChanges();
            Point[] ptsFromDb = ctx.Points.ToArray();
            Assert.IsTrue(ptsFromDb.Length == maxpointsUsedForTriangles + maxpointsNotUsedForTriangles);
            Triangle[] trisFromDb = ctx.Triangles.ToArray();
            Assert.IsTrue(trisFromDb.Length == 4);
            ///
            /// Try to delete the points which are not being used for any triangles - should be deleted
            ///
            for (int i = 0; i < ptsFromDb.Length; i++)
            {
                var pt = ptsFromDb[i];
                if (ptsUsedForTriangles.Any(p => p.ID == pt.ID))
                {
                    continue;
                }
                ctx.Points.Remove(pt);
                ctx.SaveChanges();
            }
            ///
            /// Try to delete the points which participate in triangles  - should not be allowed
            ///
            Point[] ptsFromDb2 = ctx.Points.ToArray();
            foreach (var pt in ptsFromDb2)
            {
                try
                {
                    ctx.Points.Remove(pt);
                    ctx.SaveChanges();
                }
                catch (DbUpdateException ex)
                {
                    //OK - we expected this because of preventing cascade delete
                    Assert.IsTrue(ex.InnerException.Message.Contains("'FOREIGN KEY constraint failed"));
                }
                catch (Exception ex)
                {
                    Assert.Fail();
                }
            }
            Point[] ptsFromDb3 = ctx.Points.ToArray();
            Assert.AreEqual(maxpointsUsedForTriangles, ptsFromDb3.Length);
        }
Example #7
0
        /// <summary>
        /// Single creation method, responsible for creating the Db context with right parameters
        /// </summary>
        /// <returns></returns>
        internal static DemoLib.SqlDbContext CreateSqlLiteContext()
        {
            var connection = new SqliteConnection("DataSource=:memory:");
            var opts       = new DbContextOptionsBuilder <DemoLib.SqlDbContext>()
                             .UseSqlite(connection)
                             .Options;

            connection.Open();
            var _dbctxInner = new DemoLib.SqlDbContext(opts);

            //_dbctxInner.Connection = connection;//We could add the Connection for a more unified Dispose management
            _dbctxInner.Database.EnsureCreated();
            return(_dbctxInner);
        }
        public void SaveMultiplePoints()
        {
            int maxpoints = 10;
            var pts       = utils.Util.CreateRandomPoints(-5, 5, maxpoints);

            Point[] ptsCloned        = pts.Select(p => p.Clone()).ToArray();
            DemoLib.SqlDbContext ctx = utils.Util.CreateSqlLiteContext();
            ctx.Points.AddRange(pts);
            ctx.SaveChanges();
            Point[] ptsFromDb = ctx.Points.ToArray();
            Assert.IsTrue(ptsFromDb.Length == maxpoints);
            for (int i = 0; i < maxpoints; i++)
            {
                Assert.AreEqual(ptsFromDb[i], ptsCloned[i]);
            }
        }
        public void Query_Point_Using_PrimaryKey()
        {
            Random rnd       = new Random(DateTime.Now.Second);
            int    maxpoints = 4;
            var    pts       = utils.Util.CreateRandomPoints(-5, 5, maxpoints);

            Triangle[]           triangles = utils.Util.FindAllTriangles(pts);
            DemoLib.SqlDbContext ctx       = utils.Util.CreateSqlLiteContext();
            ctx.Points.AddRange(pts);
            ctx.Triangles.AddRange(triangles);
            ctx.SaveChanges();
            int[] idsOfPointsRandom = pts.Select(p => p.ID).OrderBy(id => rnd.Next()).ToArray();
            foreach (int idOfPoint in idsOfPointsRandom)
            {
                var point = ctx.Points.Find(idOfPoint);
                Assert.AreEqual(idOfPoint, point.ID);
            }
        }
        public void QueryForTriangle_Given_Point()
        {
            Random rnd       = new Random(DateTime.Now.Second);
            int    maxpoints = 4;
            var    pts       = utils.Util.CreateRandomPoints(-5, 5, maxpoints);

            Triangle[]           triangles = utils.Util.FindAllTriangles(pts);
            DemoLib.SqlDbContext ctx       = utils.Util.CreateSqlLiteContext();
            ctx.Points.AddRange(pts);
            ctx.Triangles.AddRange(triangles);
            ctx.SaveChanges();
            ///
            /// We have the database ready, now iterate over every point and verify that a LINQ query works
            ///
            int[] idsOfPointsRandom = pts.Select(p => p.ID).OrderBy(id => rnd.Next()).ToArray();
            foreach (int idOfPoint in idsOfPointsRandom)
            {
                var tri = ctx.Triangles.Where(t => t.Vertices.Any(tv => tv.Vertex.ID == idOfPoint)).FirstOrDefault();
                Assert.IsNotNull(tri);
                Assert.IsTrue(tri.Vertices.Any(tv => tv.PointID == idOfPoint));
            }
        }
 public void CreateDbContext()
 {
     DemoLib.SqlDbContext ctx = utils.Util.CreateSqlLiteContext();
     Assert.IsNotNull(ctx);
 }