Toponaming/Part: Fix elementMatch to use full clause and be deterministic
This commit is contained in:
@@ -81,47 +81,67 @@ TEST_F(FeatureMirroringTest, testYMirrorWithExistingElementMap)
|
||||
EXPECT_TRUE(boxesMatch(bb, Base::BoundBox3d(0, 0, -3, 1, 3, 0)));
|
||||
// Assert correct element Map
|
||||
#ifdef FC_USE_TNP_FIX
|
||||
EXPECT_TRUE(elementsMatch(
|
||||
_mirror->Shape.getShape(),
|
||||
{
|
||||
"Edge10;:M;FUS;:H30a:7,E;:M;MIR;:H310:7,E",
|
||||
"Edge11;:M;FUS;:H309:7,E;:M;MIR;:H310:7,E",
|
||||
"Edge12;:M;FUS;:H309:7,E;:M;MIR;:H310:7,E",
|
||||
"Edge1;:M;FUS;:H30a:7,E;:M;MIR;:H310:7,E",
|
||||
"Edge1;:M;FUS;:H30a:7,E;:U2;FUS;:H30a:8,V;:M;MIR;:H310:7,V",
|
||||
"Edge1;:M;FUS;:H30a:7,E;:U;FUS;:H30a:7,V;:M;MIR;:H310:7,V",
|
||||
"Edge2;:M2(Edge2;:H30a,E);FUS;:H309:17,E;:M;MIR;:H310:7,E",
|
||||
"Edge2;:M2(Edge2;:H30a,E);FUS;:H309:17,E;:U2;FUS;:H309:8,V;:M;MIR;:H310:7,V",
|
||||
"Edge2;:M2;FUS;:H30a:8,E;:M;MIR;:H310:7,E",
|
||||
"Edge2;:M2;FUS;:H30a:8,E;:U2;FUS;:H30a:8,V;:M;MIR;:H310:7,V",
|
||||
"Edge2;:M;FUS;:H309:7,E;:M;MIR;:H310:7,E",
|
||||
"Edge2;:M;FUS;:H309:7,E;:U;FUS;:H309:7,V;:M;MIR;:H310:7,V",
|
||||
"Edge3;:M;FUS;:H309:7,E;:M;MIR;:H310:7,E",
|
||||
"Edge3;:M;FUS;:H309:7,E;:U2;FUS;:H309:8,V;:M;MIR;:H310:7,V",
|
||||
"Edge4;:M2(Edge4;:H30a,E);FUS;:H309:17,E;:M;MIR;:H310:7,E",
|
||||
"Edge4;:M2;FUS;:H30a:8,E;:M;MIR;:H310:7,E",
|
||||
"Edge4;:M2;FUS;:H30a:8,E;:U2;FUS;:H30a:8,V;:M;MIR;:H310:7,V",
|
||||
"Edge4;:M;FUS;:H309:7,E;:M;MIR;:H310:7,E",
|
||||
"Edge4;:M;FUS;:H309:7,E;:U;FUS;:H309:7,V;:M;MIR;:H310:7,V",
|
||||
"Edge5;:M;FUS;:H30a:7,E;:M;MIR;:H310:7,E",
|
||||
"Edge5;:M;FUS;:H30a:7,E;:U2;FUS;:H30a:8,V;:M;MIR;:H310:7,V",
|
||||
"Edge5;:M;FUS;:H30a:7,E;:U;FUS;:H30a:7,V;:M;MIR;:H310:7,V",
|
||||
"Edge6;:M2(Edge6;:H30a,E);FUS;:H309:17,E;:M;MIR;:H310:7,E",
|
||||
"Edge6;:M2(Edge6;:H30a,E);FUS;:H309:17,E;:U2;FUS;:H309:8,V;:M;MIR;:H310:7,V",
|
||||
"Edge6;:M2;FUS;:H30a:8,E;:M;MIR;:H310:7,E",
|
||||
"Edge6;:M2;FUS;:H30a:8,E;:U2;FUS;:H30a:8,V;:M;MIR;:H310:7,V",
|
||||
"Edge6;:M;FUS;:H309:7,E;:M;MIR;:H310:7,E",
|
||||
"Edge6;:M;FUS;:H309:7,E;:U;FUS;:H309:7,V;:M;MIR;:H310:7,V",
|
||||
"Edge7;:M;FUS;:H309:7,E;:M;MIR;:H310:7,E",
|
||||
"Edge7;:M;FUS;:H309:7,E;:U2;FUS;:H309:8,V;:M;MIR;:H310:7,V",
|
||||
"Edge8;:M2(Edge8;:H30a,E);FUS;:H309:17,E;:M;MIR;:H310:7,E",
|
||||
"Edge8;:M2;FUS;:H30a:8,E;:M;MIR;:H310:7,E",
|
||||
"Edge8;:M2;FUS;:H30a:8,E;:U2;FUS;:H30a:8,V;:M;MIR;:H310:7,V",
|
||||
"Edge8;:M;FUS;:H309:7,E;:M;MIR;:H310:7,E",
|
||||
"Edge8;:M;FUS;:H309:7,E;:U;FUS;:H309:7,V;:M;MIR;:H310:7,V",
|
||||
"Edge9;:M;FUS;:H30a:7,E;:M;MIR;:H310:7,E",
|
||||
// TODO: Testing the Faces here was non-deterministic from run to run. Is that okay?
|
||||
}));
|
||||
EXPECT_TRUE(elementsMatch(_mirror->Shape.getShape(),
|
||||
{
|
||||
"Edge10;FUS;:Hfd6:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge10;FUS;:Hfd7:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge11;FUS;:Hfd6:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge11;FUS;:Hfd7:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge12;FUS;:Hfd6:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge12;FUS;:Hfd7:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge1;FUS;:Hfd6:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge1;FUS;:Hfd7:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge2;:M2(Edge2;:Hfd7,E);FUS;:Hfd6:17,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge2;:M2;FUS;:Hfd7:8,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge2;:M;FUS;:Hfd6:7,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge3;FUS;:Hfd6:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge3;FUS;:Hfd7:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge4;:M2(Edge4;:Hfd7,E);FUS;:Hfd6:17,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge4;:M2;FUS;:Hfd7:8,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge4;:M;FUS;:Hfd6:7,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge5;FUS;:Hfd6:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge5;FUS;:Hfd7:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge6;:M2(Edge6;:Hfd7,E);FUS;:Hfd6:17,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge6;:M2;FUS;:Hfd7:8,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge6;:M;FUS;:Hfd6:7,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge7;FUS;:Hfd6:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge7;FUS;:Hfd7:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge8;:M2(Edge8;:Hfd7,E);FUS;:Hfd6:17,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge8;:M2;FUS;:Hfd7:8,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge8;:M;FUS;:Hfd6:7,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge9;FUS;:Hfd6:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Edge9;FUS;:Hfd7:4,E;:M;MIR;:Hfdd:7,E",
|
||||
"Face1;:M2(Face1;:Hfd7,F);FUS;:Hfd6:17,F;:M;MIR;:Hfdd:7,F",
|
||||
"Face1;:M2;FUS;:Hfd7:8,F;:M;MIR;:Hfdd:7,F",
|
||||
"Face1;:M;FUS;:Hfd6:7,F;:M;MIR;:Hfdd:7,F",
|
||||
"Face2;:M2(Face2;:Hfd7,F);FUS;:Hfd6:17,F;:M;MIR;:Hfdd:7,F",
|
||||
"Face2;:M2;FUS;:Hfd7:8,F;:M;MIR;:Hfdd:7,F",
|
||||
"Face2;:M;FUS;:Hfd6:7,F;:M;MIR;:Hfdd:7,F",
|
||||
"Face3;FUS;:Hfd6:4,F;:M;MIR;:Hfdd:7,F",
|
||||
"Face4;FUS;:Hfd7:4,F;:M;MIR;:Hfdd:7,F",
|
||||
"Face5;:M2(Face5;:Hfd7,F);FUS;:Hfd6:17,F;:M;MIR;:Hfdd:7,F",
|
||||
"Face5;:M2;FUS;:Hfd7:8,F;:M;MIR;:Hfdd:7,F",
|
||||
"Face5;:M;FUS;:Hfd6:7,F;:M;MIR;:Hfdd:7,F",
|
||||
"Face6;:M2(Face6;:Hfd7,F);FUS;:Hfd6:17,F;:M;MIR;:Hfdd:7,F",
|
||||
"Face6;:M2;FUS;:Hfd7:8,F;:M;MIR;:Hfdd:7,F",
|
||||
"Face6;:M;FUS;:Hfd6:7,F;:M;MIR;:Hfdd:7,F",
|
||||
"Vertex1;FUS;:Hfd6:4,V;:M;MIR;:Hfdd:7,V",
|
||||
"Vertex1;FUS;:Hfd7:4,V;:M;MIR;:Hfdd:7,V",
|
||||
"Vertex2;FUS;:Hfd6:4,V;:M;MIR;:Hfdd:7,V",
|
||||
"Vertex2;FUS;:Hfd7:4,V;:M;MIR;:Hfdd:7,V",
|
||||
"Vertex3;FUS;:Hfd6:4,V;:M;MIR;:Hfdd:7,V",
|
||||
"Vertex3;FUS;:Hfd7:4,V;:M;MIR;:Hfdd:7,V",
|
||||
"Vertex4;FUS;:Hfd6:4,V;:M;MIR;:Hfdd:7,V",
|
||||
"Vertex4;FUS;:Hfd7:4,V;:M;MIR;:Hfdd:7,V",
|
||||
"Vertex5;FUS;:Hfd6:4,V;:M;MIR;:Hfdd:7,V",
|
||||
"Vertex5;FUS;:Hfd7:4,V;:M;MIR;:Hfdd:7,V",
|
||||
"Vertex6;FUS;:Hfd6:4,V;:M;MIR;:Hfdd:7,V",
|
||||
"Vertex6;FUS;:Hfd7:4,V;:M;MIR;:Hfdd:7,V",
|
||||
"Vertex7;FUS;:Hfd6:4,V;:M;MIR;:Hfdd:7,V",
|
||||
"Vertex7;FUS;:Hfd7:4,V;:M;MIR;:Hfdd:7,V",
|
||||
"Vertex8;FUS;:Hfd6:4,V;:M;MIR;:Hfdd:7,V",
|
||||
"Vertex8;FUS;:Hfd7:4,V;:M;MIR;:Hfdd:7,V",
|
||||
}));
|
||||
#else
|
||||
EXPECT_EQ(_mirror->Shape.getShape().getElementMapSize(), 0);
|
||||
#endif
|
||||
|
||||
@@ -86,39 +86,40 @@ TEST_F(FeatureOffsetTest, testOffset3DWithExistingElementMap)
|
||||
EXPECT_TRUE(elementsMatch(
|
||||
_offset->Shape.getShape(),
|
||||
{
|
||||
"Edge2;:M2(Edge2;:H366,E);FUS;:H365:17,E;:G(Edge2;:M2;FUS;:H366:8,E;K-1;:H366:4,E|"
|
||||
"Edge2;:M;FUS;:H365:7,E;K-1;:H365:4,E);RFI;:H365:53,E;:G;OFS;:H36c:7,E;SLD;:H36c:4,E",
|
||||
"Edge2;:M2(Edge2;:H366,E);FUS;:H365:17,E;:G(Edge2;:M2;FUS;:H366:8,E;K-1;:H366:4,E|"
|
||||
"Edge2;:M;FUS;:H365:7,E;K-1;:H365:4,E);RFI;:H365:53,E;:U2;RFI;:H365:8,V;:G;OFS;:H36c:7,"
|
||||
"V;SLD;:H36c:4,V",
|
||||
"Edge2;:M2(Edge2;:H366,E);FUS;:H365:17,E;:G(Edge2;:M2;FUS;:H366:8,E;K-1;:H366:4,E|"
|
||||
"Edge2;:M;FUS;:H365:7,E;K-1;:H365:4,E);RFI;:H365:53,E;:U;RFI;:H365:7,V;:G;OFS;:H36c:7,"
|
||||
"V;SLD;:H36c:4,V",
|
||||
"Edge4;:M2(Edge4;:H366,E);FUS;:H365:17,E;:G(Edge4;:M2;FUS;:H366:8,E;K-1;:H366:4,E|"
|
||||
"Edge4;:M;FUS;:H365:7,E;K-1;:H365:4,E);RFI;:H365:53,E;:G;OFS;:H36c:7,E;SLD;:H36c:4,E",
|
||||
"Edge4;:M2(Edge4;:H366,E);FUS;:H365:17,E;:G(Edge4;:M2;FUS;:H366:8,E;K-1;:H366:4,E|"
|
||||
"Edge4;:M;FUS;:H365:7,E;K-1;:H365:4,E);RFI;:H365:53,E;:U2;RFI;:H365:8,V;:G;OFS;:H36c:7,"
|
||||
"V;SLD;:H36c:4,V",
|
||||
"Edge4;:M2(Edge4;:H366,E);FUS;:H365:17,E;:G(Edge4;:M2;FUS;:H366:8,E;K-1;:H366:4,E|"
|
||||
"Edge4;:M;FUS;:H365:7,E;K-1;:H365:4,E);RFI;:H365:53,E;:U;RFI;:H365:7,V;:G;OFS;:H36c:7,"
|
||||
"V;SLD;:H36c:4,V",
|
||||
"Edge6;:M2(Edge6;:H366,E);FUS;:H365:17,E;:G(Edge6;:M2;FUS;:H366:8,E;K-1;:H366:4,E|"
|
||||
"Edge6;:M;FUS;:H365:7,E;K-1;:H365:4,E);RFI;:H365:53,E;:G;OFS;:H36c:7,E;SLD;:H36c:4,E",
|
||||
"Edge6;:M2(Edge6;:H366,E);FUS;:H365:17,E;:G(Edge6;:M2;FUS;:H366:8,E;K-1;:H366:4,E|"
|
||||
"Edge6;:M;FUS;:H365:7,E;K-1;:H365:4,E);RFI;:H365:53,E;:U2;RFI;:H365:8,V;:G;OFS;:H36c:7,"
|
||||
"V;SLD;:H36c:4,V",
|
||||
"Edge6;:M2(Edge6;:H366,E);FUS;:H365:17,E;:G(Edge6;:M2;FUS;:H366:8,E;K-1;:H366:4,E|"
|
||||
"Edge6;:M;FUS;:H365:7,E;K-1;:H365:4,E);RFI;:H365:53,E;:U;RFI;:H365:7,V;:G;OFS;:H36c:7,"
|
||||
"V;SLD;:H36c:4,V",
|
||||
"Edge8;:M2(Edge8;:H366,E);FUS;:H365:17,E;:G(Edge8;:M2;FUS;:H366:8,E;K-1;:H366:4,E|"
|
||||
"Edge8;:M;FUS;:H365:7,E;K-1;:H365:4,E);RFI;:H365:53,E;:G;OFS;:H36c:7,E;SLD;:H36c:4,E",
|
||||
"Edge8;:M2(Edge8;:H366,E);FUS;:H365:17,E;:G(Edge8;:M2;FUS;:H366:8,E;K-1;:H366:4,E|"
|
||||
"Edge8;:M;FUS;:H365:7,E;K-1;:H365:4,E);RFI;:H365:53,E;:U2;RFI;:H365:8,V;:G;OFS;:H36c:7,"
|
||||
"V;SLD;:H36c:4,V",
|
||||
"Edge8;:M2(Edge8;:H366,E);FUS;:H365:17,E;:G(Edge8;:M2;FUS;:H366:8,E;K-1;:H366:4,E|"
|
||||
"Edge8;:M;FUS;:H365:7,E;K-1;:H365:4,E);RFI;:H365:53,E;:U;RFI;:H365:7,V;:G;OFS;:H36c:7,"
|
||||
"V;SLD;:H36c:4,V",
|
||||
// TODO: Testing the Faces here was non-deterministic from run to run. Is that okay?
|
||||
"Edge10;FUS;:He59:4,E;RFI;:He59:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
|
||||
"Edge11;FUS;:He5a:4,E;RFI;:He5a:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
|
||||
"Edge12;FUS;:He5a:4,E;RFI;:He5a:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
|
||||
"Edge1;FUS;:He59:4,E;RFI;:He59:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
|
||||
"Edge2;:M2(Edge2;:He5a,E);FUS;:He59:17,E;:G(Edge2;:M2;FUS;:He5a:8,E;K-1;:He5a:4,E|"
|
||||
"Edge2;:M;FUS;:He59:7,E;K-1;:He59:4,E);RFI;:He59:53,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
|
||||
"Edge3;FUS;:He5a:4,E;RFI;:He5a:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
|
||||
"Edge4;:M2(Edge4;:He5a,E);FUS;:He59:17,E;:G(Edge4;:M2;FUS;:He5a:8,E;K-1;:He5a:4,E|"
|
||||
"Edge4;:M;FUS;:He59:7,E;K-1;:He59:4,E);RFI;:He59:53,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
|
||||
"Edge5;FUS;:He59:4,E;RFI;:He59:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
|
||||
"Edge6;:M2(Edge6;:He5a,E);FUS;:He59:17,E;:G(Edge6;:M2;FUS;:He5a:8,E;K-1;:He5a:4,E|"
|
||||
"Edge6;:M;FUS;:He59:7,E;K-1;:He59:4,E);RFI;:He59:53,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
|
||||
"Edge7;FUS;:He5a:4,E;RFI;:He5a:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
|
||||
"Edge8;:M2(Edge8;:He5a,E);FUS;:He59:17,E;:G(Edge8;:M2;FUS;:He5a:8,E;K-1;:He5a:4,E|"
|
||||
"Edge8;:M;FUS;:He59:7,E;K-1;:He59:4,E);RFI;:He59:53,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
|
||||
"Edge9;FUS;:He59:4,E;RFI;:He59:4,E;:G;OFS;:He60:7,E;SLD;:He60:4,E",
|
||||
"Face1;:M2(Face1;:He5a,F);FUS;:He59:17,F;:G(Face1;:M2;FUS;:He5a:8,F;K-1;:He5a:4,F|"
|
||||
"Face1;:M;FUS;:He59:7,F;K-1;:He59:4,F);RFI;:He59:53,F;:G;OFS;:He60:7,F;SLD;:He60:4,F",
|
||||
"Face2;:M2(Face2;:He5a,F);FUS;:He59:17,F;:G(Face2;:M2;FUS;:He5a:8,F;K-1;:He5a:4,F|"
|
||||
"Face2;:M;FUS;:He59:7,F;K-1;:He59:4,F);RFI;:He59:53,F;:G;OFS;:He60:7,F;SLD;:He60:4,F",
|
||||
"Face3;FUS;:He59:4,F;RFI;:He59:4,F;:G;OFS;:He60:7,F;SLD;:He60:4,F",
|
||||
"Face4;FUS;:He5a:4,F;RFI;:He5a:4,F;:G;OFS;:He60:7,F;SLD;:He60:4,F",
|
||||
"Face5;:M2(Face5;:He5a,F);FUS;:He59:17,F;:G(Face5;:M2;FUS;:He5a:8,F;K-1;:He5a:4,F|"
|
||||
"Face5;:M;FUS;:He59:7,F;K-1;:He59:4,F);RFI;:He59:53,F;:G;OFS;:He60:7,F;SLD;:He60:4,F",
|
||||
"Face6;:M2(Face6;:He5a,F);FUS;:He59:17,F;:G(Face6;:M2;FUS;:He5a:8,F;K-1;:He5a:4,F|"
|
||||
"Face6;:M;FUS;:He59:7,F;K-1;:He59:4,F);RFI;:He59:53,F;:G;OFS;:He60:7,F;SLD;:He60:4,F",
|
||||
"Vertex1;FUS;:He59:4,V;RFI;:He59:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
|
||||
"Vertex2;FUS;:He59:4,V;RFI;:He59:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
|
||||
"Vertex3;FUS;:He5a:4,V;RFI;:He5a:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
|
||||
"Vertex4;FUS;:He5a:4,V;RFI;:He5a:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
|
||||
"Vertex5;FUS;:He59:4,V;RFI;:He59:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
|
||||
"Vertex6;FUS;:He59:4,V;RFI;:He59:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
|
||||
"Vertex7;FUS;:He5a:4,V;RFI;:He5a:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
|
||||
"Vertex8;FUS;:He5a:4,V;RFI;:He5a:4,V;:G;OFS;:He60:7,V;SLD;:He60:4,V",
|
||||
}));
|
||||
#else
|
||||
EXPECT_EQ(_offset->Shape.getShape().getElementMapSize(), 0);
|
||||
|
||||
@@ -175,15 +175,17 @@ testing::AssertionResult elementsMatch(const TopoShape& shape,
|
||||
if (std::find_if(elements.begin(),
|
||||
elements.end(),
|
||||
[&, name](const Data::MappedElement& element) {
|
||||
return matchStringsWithoutClause(element.name.toString(),
|
||||
name,
|
||||
"(;D|;:H|;K)-?[a-fA-F0-9]+");
|
||||
return matchStringsWithoutClause(
|
||||
element.name.toString(),
|
||||
name,
|
||||
"(;D|;:H|;K)-?[a-fA-F0-9]+(:[0-9]+)?");
|
||||
// ;D ;:H and ;K are the sections of an encoded name for
|
||||
// Duplicate, Tag and a Face name in slices. All three of these
|
||||
// can vary from run to run or platform to platform, as they are
|
||||
// based on either explicit random numbers or memory addresses.
|
||||
// Thus we remove the value from comparisons and just check that
|
||||
// they exist.
|
||||
// they exist. The full form could be something like ;:He59:53
|
||||
// which is what we match and remove.
|
||||
})
|
||||
== elements.end()) {
|
||||
return testing::AssertionFailure() << mappedElementVectorToString(elements);
|
||||
|
||||
Reference in New Issue
Block a user