Skip to content

Commit c760a36

Browse files
committed
GRIDEDIT-986: add test
disabled some geometry checks because of GRIDEDIT-988
1 parent 840a7cd commit c760a36

File tree

1 file changed

+119
-1
lines changed

1 file changed

+119
-1
lines changed

test/MeshKernelNETTest/Api/MeshKernelTest.cs

+119-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Linq;
23
using System.Runtime.InteropServices;
34
using MeshKernelNET.Api;
45
using NUnit.Framework;
@@ -2543,6 +2544,123 @@ public void Mesh2dUndoTwoDeleteNodesThroughApi()
25432544
}
25442545
}
25452546

2546-
2547+
[Test]
2548+
public void Mesh2dAddTriangleAndUndoEachStepThroughApi()
2549+
{
2550+
// --- Setup ---
2551+
const int nx = 3;
2552+
const int ny = 3;
2553+
const double dx = 10.0;
2554+
const double dy = 10.0;
2555+
// insert a vertex left of the grid between the two first rows, i.e. between node #0 and node #nx
2556+
const double vx = -0.5 * dx;
2557+
const double vy = 0.5 * dy;
2558+
using (DisposableMesh2D mesh = CreateMesh2D(nx,ny,dx,dy))
2559+
using (var api = new MeshKernelApi())
2560+
{
2561+
var mesh2D = new DisposableMesh2D();
2562+
var id = 0;
2563+
2564+
try
2565+
{
2566+
int initialNumNodes = mesh.NumNodes;
2567+
int initialNumEdges = mesh.NumEdges;
2568+
var initialNodeX = mesh.NodeX.ToArray();
2569+
var initialNodeY = mesh.NodeY.ToArray();
2570+
var initialEdgeNodes = mesh.EdgeNodes.ToArray();
2571+
2572+
int result = -1;
2573+
id = api.AllocateState(0);
2574+
2575+
api.Mesh2dSet(id, mesh);
2576+
2577+
int insertedVertex = 0;
2578+
api.Mesh2dInsertNode(id, vx,vy, ref insertedVertex);
2579+
Assert.That(insertedVertex, Is.EqualTo(initialNumNodes)); // appended at end
2580+
2581+
var insertedEdge = 0;
2582+
api.Mesh2dInsertEdge(id, 0, insertedVertex, ref insertedEdge);
2583+
Assert.That(insertedEdge, Is.EqualTo(initialNumEdges)); // appended at end
2584+
2585+
api.Mesh2dInsertEdge(id, insertedVertex, nx, ref insertedEdge);
2586+
Assert.That(insertedEdge, Is.EqualTo(initialNumEdges+1)); // appended at end
2587+
2588+
// Check mesh topology and geometry with added vertex and edges
2589+
api.Mesh2dGetData(id, out mesh2D);
2590+
Assert.That(mesh2D.NumEdges, Is.EqualTo(initialNumEdges+2));
2591+
Assert.That(mesh2D.EdgeNodes, Is.EquivalentTo(initialEdgeNodes.Concat(new [] { 0,insertedVertex, insertedVertex,nx})));
2592+
Assert.That(mesh2D.NumNodes, Is.EqualTo(initialNumNodes+1));
2593+
Assert.That(mesh2D.NodeX, Is.EquivalentTo(initialNodeX.Concat( new []{ vx })));
2594+
Assert.That(mesh2D.NodeY, Is.EquivalentTo(initialNodeY.Concat( new []{ vy })));
2595+
2596+
// --- Execute & Assert ---
2597+
2598+
// Undo edge (4,3) insertion
2599+
bool undone = false;
2600+
result = api.UndoState(id, ref undone);
2601+
2602+
// Check mesh topology and geometry after undo - expect one extra valid vertex and one extra valid edge
2603+
api.Mesh2dGetData(id, out mesh2D);
2604+
Assert.Multiple(() =>
2605+
{
2606+
Assert.That(result, Is.EqualTo(0));
2607+
Assert.That(undone, Is.True);
2608+
Assert.That(mesh2D.NumValidEdges, Is.EqualTo(initialNumEdges + 1));
2609+
Assert.That(mesh2D.EdgeNodes.Count(n => n >= 0), Is.EqualTo(2 * mesh2D.NumValidEdges));
2610+
// the inserted vertex should still be valid
2611+
Assert.That(mesh2D.NumValidNodes, Is.EqualTo(initialNumNodes + 1));
2612+
Assert.That(mesh2D.NumNodes, Is.EqualTo(mesh2D.NumNodes));
2613+
Assert.That(mesh2D.NodeX.Count(x => x == -999.0), Is.EqualTo(0));
2614+
Assert.That(mesh2D.NodeY.Count(y => y == -999.0), Is.EqualTo(0));
2615+
}
2616+
);
2617+
2618+
// Undo edge (1,3) insertion
2619+
undone = false;
2620+
result = api.UndoState(id, ref undone);
2621+
2622+
// Topology and geometry checks are disabled temporarily because Mesh2dGetData will mark unconnected vertices
2623+
// as invalid, changing the topology of the mesh (GRIDEDIT-988) and causing the unconnected vertex expected
2624+
// after the undo to be marked invalid.
2625+
/*
2626+
// Check mesh topology and geometry after undo - expect one extra valid vertex
2627+
api.Mesh2dGetData(id, out mesh2D);
2628+
Assert.Multiple(() =>
2629+
{
2630+
Assert.That(result, Is.EqualTo(0));
2631+
Assert.That(undone, Is.True);
2632+
Assert.That(mesh2D.NumValidEdges, Is.EqualTo(initialNumEdges));
2633+
Assert.That(mesh2D.EdgeNodes.Count(n => n >= 0), Is.EqualTo(2 * mesh2D.NumValidEdges));
2634+
// the inserted vertex should still be valid
2635+
Assert.That(mesh2D.NumValidNodes, Is.EqualTo(initialNumNodes + 1));
2636+
Assert.That(mesh2D.NumNodes, Is.EqualTo(mesh2D.NumNodes));
2637+
Assert.That(mesh2D.NodeX.Count(x => x == -999.0), Is.EqualTo(0));
2638+
Assert.That(mesh2D.NodeY.Count(y => y == -999.0), Is.EqualTo(0));
2639+
});
2640+
*/
2641+
2642+
// Undo vertex insertion
2643+
undone = false;
2644+
result = api.UndoState(id, ref undone);
2645+
api.Mesh2dGetData(id, out mesh2D);
2646+
Assert.Multiple(() =>
2647+
{
2648+
Assert.That(result, Is.EqualTo(0));
2649+
Assert.That(undone, Is.True);
2650+
Assert.That(mesh2D.NumValidEdges, Is.EqualTo(initialNumEdges));
2651+
Assert.That(mesh2D.NumValidNodes, Is.EqualTo(initialNumNodes));
2652+
Assert.That(mesh2D.EdgeNodes.Count(n => n >= 0), Is.EqualTo(2*mesh2D.NumValidEdges));
2653+
Assert.That(mesh2D.EdgeNodes.Where(n => n >= 0), Is.EquivalentTo(initialEdgeNodes));
2654+
Assert.That(mesh2D.NodeX.Where(x => x != -999.0), Is.EquivalentTo(initialNodeX));
2655+
Assert.That(mesh2D.NodeY.Where(x => x != -999.0), Is.EquivalentTo(initialNodeY));
2656+
});
2657+
}
2658+
finally
2659+
{
2660+
api.DeallocateState(id);
2661+
mesh2D.Dispose();
2662+
}
2663+
}
2664+
}
25472665
}
25482666
}

0 commit comments

Comments
 (0)