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); } }
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); }
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); }
/// <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); }