Files
test/tests/python/operators.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

1049 lines
38 KiB
Python
Raw Permalink Normal View History

# SPDX-FileCopyrightText: 2020-2023 Blender Authors
#
# SPDX-License-Identifier: GPL-2.0-or-later
import bpy
import os
import sys
2023-07-25 21:43:53 +10:00
from random import seed
seed(0)
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
Regression Testing: Running tests based on blend files Runs tests based on blend files with minimum python interaction. Developed as part of GSoC 2021 - Regression Testing of Geometry Nodes. Earlier, tests were built from scratch by adding a modifier/operation from the Python API. Now, tests can also be created inside blender and are compared using Python script. Features: Automatically adding expected object if it doesn't exist. This patch adds tests for the following Geometry Nodes category: * Curves * Geometry * Mesh * Points The implemented UML diagram for refactoring of mesh test framework. {F10225906} Technical Changes: SpecMeshTest: It adds the modifier/operation based on the Spec provided. BlendFileTest: It applies already existing modifier/operation from the blend file. Test folders hierarchy with tests. This folder should be extracted to `lib\tests\modeling` {F10240651} Note: The `geometry_nodes` folder might lie under another `geometry_nodes` folder while extracting, please double check. Use the inner-most one. The hierarchy should be: -`lib\tests\modeling\geometry_nodes\mesh` -`lib\tests\modeling\geometry_nodes\points` and so on. * From `ctest` the tests should be run as `ctest -R geo_node -C [Configuration]` on Windows. * Each single test can be run with its entire name e..g `ctest -R geo_node_geometry_join_geometry`.(just an example). Run `ctest -N -R geo_node` to see all tests. * From blender, the tests can be run `blender -b path\to\blend\file --python path\to\geo_node_test.py` Reviewed By: zazizizou, JacquesLucke Differential Revision: https://developer.blender.org/D11611
2021-07-27 21:00:28 +05:30
from modules.mesh_test import SpecMeshTest, OperatorSpecEditMode, RunTest
# Central vertical loop of Suzanne
MONKEY_LOOP_VERT = {
68, 69, 71, 73, 74, 75, 76, 77, 90, 129, 136, 175, 188, 189, 198, 207,
216, 223, 230, 301, 302, 303, 304, 305, 306, 307, 308,
}
MONKEY_LOOP_EDGE = {
131, 278, 299, 305, 307, 334, 337, 359, 384, 396, 399, 412, 415, 560,
567, 572, 577, 615, 622, 627, 632, 643, 648, 655, 660, 707,
}
def main():
tests = [
# bisect
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeBisect",
"testCubeBisect",
"expectedCubeBisect",
[
OperatorSpecEditMode(
"bisect",
{"plane_co": (0, 0, 0), "plane_no": (0, 1, 1), "clear_inner": True, "use_fill": True},
'FACE',
{0, 1, 2, 3, 4, 5},
)
],
2022-04-19 15:25:55 +10:00
),
# blend from shape
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeBlendFromShape",
"testCubeBlendFromShape",
"expectedCubeBlendFromShape",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("blend_from_shape", {"shape": "Key 1"}, 'FACE', {0, 1, 2, 3, 4, 5})],
),
# bridge edge loops
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeBridgeEdgeLoop",
"testCubeBrigeEdgeLoop",
"expectedCubeBridgeEdgeLoop",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("bridge_edge_loops", {}, "FACE", {0, 1})],
),
# decimate
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"MonkeyDecimate",
"testMonkeyDecimate",
"expectedMonkeyDecimate",
[OperatorSpecEditMode("decimate", {"ratio": 0.1}, "FACE", {i for i in range(500)})],
2022-04-19 15:25:55 +10:00
),
# delete
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeDeleteVertices",
"testCubeDeleteVertices",
"expectedCubeDeleteVertices",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("delete", {}, "VERT", {3})],
),
SpecMeshTest(
"CubeDeleteFaces",
"testCubeDeleteFaces",
"expectedCubeDeleteFaces",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("delete", {}, "FACE", {0})],
),
SpecMeshTest(
"CubeDeleteEdges",
"testCubeDeleteEdges",
"expectedCubeDeleteEdges",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("delete", {}, "EDGE", {0, 1, 2, 3})],
),
# delete edge loop
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"MonkeyDeleteEdgeLoopVertices",
"testMokneyDeleteEdgeLoopVertices",
2022-04-19 15:25:55 +10:00
"expectedMonkeyDeleteEdgeLoopVertices",
[OperatorSpecEditMode("delete_edgeloop", {}, "VERT", MONKEY_LOOP_VERT)],
),
SpecMeshTest(
"MonkeyDeleteEdgeLoopEdges",
"testMokneyDeleteEdgeLoopEdges",
2022-04-19 15:25:55 +10:00
"expectedMonkeyDeleteEdgeLoopEdges",
[OperatorSpecEditMode("delete_edgeloop", {}, "EDGE", MONKEY_LOOP_EDGE)],
),
# delete loose
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeDeleteLooseVertices",
"testCubeDeleteLooseVertices",
2022-04-19 15:25:55 +10:00
"expectedCubeDeleteLooseVertices",
[
OperatorSpecEditMode(
"delete_loose",
{"use_verts": True, "use_edges": False, "use_faces": False},
"VERT",
{i for i in range(12)},
)
],
),
SpecMeshTest(
"CubeDeleteLooseEdges",
"testCubeDeleteLooseEdges",
2022-04-19 15:25:55 +10:00
"expectedCubeDeleteLooseEdges",
[
OperatorSpecEditMode(
"delete_loose",
{"use_verts": False, "use_edges": True, "use_faces": False},
"EDGE",
{i for i in range(14)},
)
],
),
SpecMeshTest(
"CubeDeleteLooseFaces",
"testCubeDeleteLooseFaces",
2022-04-19 15:25:55 +10:00
"expectedCubeDeleteLooseFaces",
[
OperatorSpecEditMode(
"delete_loose",
{"use_verts": False, "use_edges": False, "use_faces": True},
"FACE",
{i for i in range(7)},
)
],
2022-04-19 15:25:55 +10:00
),
# dissolve degenerate
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeDissolveDegenerate",
"testCubeDissolveDegenerate",
2022-04-19 15:25:55 +10:00
"expectedCubeDissolveDegenerate",
[OperatorSpecEditMode("dissolve_degenerate", {}, "VERT", {i for i in range(8)})],
),
# dissolve edges
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CylinderDissolveEdges.UseVertsFalse",
"testCylinderDissolveEdges",
"expectedCylinderDissolveEdges.DissolveNoVerts",
[OperatorSpecEditMode("dissolve_edges", {"use_verts": False}, "EDGE", {0, 5, 6, 9})],
),
SpecMeshTest(
"CylinderDissolveEdges.AngleThrehsoldNoDissolve",
"testCylinderDissolveEdges",
"expectedCylinderDissolveEdges.DissolveNoVerts",
[OperatorSpecEditMode("dissolve_edges", {"use_verts": True, "angle_threshold": 0}, "EDGE", {0, 5, 6, 9})],
),
SpecMeshTest(
"CylinderDissolveEdges.AngleThresholdSomeDissolve",
"testCylinderDissolveEdges",
"expectedCylinderDissolveEdges.DissolveThresh.218166",
[
OperatorSpecEditMode(
"dissolve_edges", {"use_verts": True, "angle_threshold": 0.218166}, "EDGE", {0, 5, 6, 9}
)
],
),
SpecMeshTest(
"CylinderDissolveEdges.AngleThresholdAllDissolve",
"testCylinderDissolveEdges",
"expectedCylinderDissolveEdges.DissolveAllVerts",
[
OperatorSpecEditMode(
"dissolve_edges", {"use_verts": True, "angle_threshold": 3.14159}, "EDGE", {0, 5, 6, 9}
)
],
2022-04-19 15:25:55 +10:00
),
# dissolve faces
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeDissolveFaces",
"testCubeDissolveFaces",
"expectedCubeDissolveFaces",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("dissolve_faces", {}, "VERT", {5, 34, 47, 49, 83, 91, 95})],
),
# dissolve limited
SpecMeshTest(
"SphereDissolveLimited",
"testSphereDissolveLimited",
"expectedSphereDissolveLimited",
[OperatorSpecEditMode("dissolve_limited", {"angle_limit": 0.610865}, "FACE", {20, 23, 26, 29, 32})],
),
# dissolve mode
SpecMeshTest(
"PlaneDissolveMode",
"testPlaneDissolveMode",
"expectedPlaneDissolveMode",
[OperatorSpecEditMode("dissolve_mode", {"use_verts": True}, "FACE", {0, 1, 2, 10, 12, 13})],
),
# dissolve verts
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeDissolveVerts",
"testCubeDissolveVerts",
"expectedCubeDissolveVerts",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("dissolve_verts", {}, "VERT", {16, 20, 22, 23, 25})],
),
# duplicate
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"ConeDuplicateVertices",
"testConeDuplicateVertices",
2022-04-19 15:25:55 +10:00
"expectedConeDuplicateVertices",
[OperatorSpecEditMode("duplicate", {}, "VERT", {i for i in range(33)} - {23})],
),
SpecMeshTest(
"ConeDuplicateOneVertex",
"testConeDuplicateOneVertex",
"expectedConeDuplicateOneVertex",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("duplicate", {}, "VERT", {23})],
),
SpecMeshTest(
"ConeDuplicateFaces",
"testConeDuplicateFaces",
"expectedConeDuplicateFaces",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("duplicate", {}, "FACE", {6, 9})],
),
SpecMeshTest(
"ConeDuplicateEdges",
"testConeDuplicateEdges",
"expectedConeDuplicateEdges",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("duplicate", {}, "EDGE", {i for i in range(64)})],
),
# edge collapse
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CylinderEdgeCollapse",
"testCylinderEdgeCollapse",
"expectedCylinderEdgeCollapse",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("edge_collapse", {}, "EDGE", {1, 9, 4})],
),
# edge face add
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeEdgeFaceAddFace",
"testCubeEdgeFaceAddFace",
"expectedCubeEdgeFaceAddFace",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("edge_face_add", {}, "VERT", {1, 3, 4, 5, 7})],
),
SpecMeshTest(
"CubeEdgeFaceAddEdge",
"testCubeEdgeFaceAddEdge",
"expectedCubeEdgeFaceAddEdge",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("edge_face_add", {}, "VERT", {4, 5})],
),
# edge rotate
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeEdgeRotate",
"testCubeEdgeRotate",
"expectedCubeEdgeRotate",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("edge_rotate", {}, "EDGE", {1})],
),
# edge split
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeEdgeSplit",
"testCubeEdgeSplit",
"expectedCubeEdgeSplit",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("edge_split", {}, "EDGE", {2, 5, 8, 11, 14, 17, 20, 23})],
),
# edge ring select - Cannot be tested. Need user input.
# SpecMeshTest(
# "CubeEdgeRingSelect",
# "testCubeEdgeRingSelect",
# "expectedCubeEdgeRingSelect",
# [OperatorSpecEditMode("edgering_select", {}, "EDGE", {5, 20, 25, 26})],
# ),
# SpecMeshTest(
# "EmptyMeshEdgeRingSelect",
# "testGridEdgeRingSelect",
# "expectedGridEdgeRingSelect",
# [OperatorSpecEditMode("edgering_select", {}, "VERT", {65, 66, 67})],
# ),
# SpecMeshTest(
# "EmptyMeshEdgeRingSelect",
# "testEmptyMeshdgeRingSelect",
# "expectedEmptyMeshEdgeRingSelect",
# [OperatorSpecEditMode("edgering_select", {}, "VERT", {})],
# ),
# edges select sharp
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeEdgesSelectSharp",
"testCubeEdgeSelectSharp",
"expectedCubeEdgeSelectSharp",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("edges_select_sharp", {}, "EDGE", {20})],
),
SpecMeshTest(
"SphereEdgesSelectSharp",
"testSphereEdgesSelectSharp",
"expectedSphereEdgeSelectSharp",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("edges_select_sharp", {"sharpness": 0.25}, "EDGE", {288})],
),
SpecMeshTest(
"HoledSphereEdgesSelectSharp",
"testHoledSphereEdgesSelectSharp",
"expectedHoledSphereEdgeSelectSharp",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("edges_select_sharp", {"sharpness": 0.18}, "VERT", {})],
),
SpecMeshTest(
"EmptyMeshEdgesSelectSharp",
"testEmptyMeshEdgeSelectSharp",
"expectedEmptyMeshEdgeSelectSharp",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("edges_select_sharp", {}, "VERT", {})],
),
# face make planar
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"MonkeyFaceMakePlanar",
"testMonkeyFaceMakePlanar",
2022-04-19 15:25:55 +10:00
"expectedMonkeyFaceMakePlanar",
[OperatorSpecEditMode("face_make_planar", {}, "FACE", {i for i in range(500)})],
),
# face split by edges
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"PlaneFaceSplitByEdges",
"testPlaneFaceSplitByEdges",
2022-04-19 15:25:55 +10:00
"expectedPlaneFaceSplitByEdges",
[OperatorSpecEditMode("face_split_by_edges", {}, "VERT", {i for i in range(6)})],
),
# faces select linked flat
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeFacesSelectLinkedFlat",
"testCubeFaceSelectLinkedFlat",
"expectedCubeFaceSelectLinkedFlat",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("faces_select_linked_flat", {}, "FACE", {7})],
),
SpecMeshTest(
"PlaneFacesSelectLinkedFlat",
"testPlaneFaceSelectLinkedFlat",
"expectedPlaneFaceSelectLinkedFlat",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("faces_select_linked_flat", {}, "VERT", {1})],
),
SpecMeshTest(
"EmptyMeshFacesSelectLinkedFlat",
"testEmptyMeshFaceSelectLinkedFlat",
2022-04-19 15:25:55 +10:00
"expectedEmptyMeshFaceSelectLinkedFlat",
[OperatorSpecEditMode("faces_select_linked_flat", {}, "VERT", {})],
),
# fill
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"IcosphereFill",
"testIcosphereFill",
"expectedIcosphereFill",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("fill", {}, "EDGE", {20, 21, 22, 23, 24, 45, 46, 47, 48, 49})],
),
SpecMeshTest(
"IcosphereFillUseBeautyFalse",
"testIcosphereFillUseBeautyFalse",
"expectedIcosphereFillUseBeautyFalse",
[OperatorSpecEditMode("fill", {"use_beauty": False}, "EDGE", {20, 21, 22, 23, 24, 45, 46, 47, 48, 49})],
2022-04-19 15:25:55 +10:00
),
# fill grid
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"PlaneFillGrid",
"testPlaneFillGrid",
2022-04-19 15:25:55 +10:00
"expectedPlaneFillGrid",
[OperatorSpecEditMode("fill_grid", {}, "EDGE", {1, 2, 3, 4, 5, 7, 9, 10, 11, 12, 13, 15})],
),
SpecMeshTest(
"PlaneFillGridSimpleBlending",
"testPlaneFillGridSimpleBlending",
"expectedPlaneFillGridSimpleBlending",
[
OperatorSpecEditMode(
"fill_grid", {"use_interp_simple": True}, "EDGE", {1, 2, 3, 4, 5, 7, 9, 10, 11, 12, 13, 15}
)
],
2022-04-19 15:25:55 +10:00
),
SpecMeshTest(
"PlaneFillGridReplaceExistingTris",
"testPlaneFillGridReplaceExisting",
"expectedPlaneFillGridReplaceExistingTris",
[OperatorSpecEditMode("fill_grid", {}, "EDGE", {44, 60, 45, 68, 43, 75, 76, 73, 74, 70, 33, 59, 35, 67})],
),
SpecMeshTest(
"PlaneFillGridReplaceExistingQuads",
"testPlaneFillGridReplaceExisting",
"expectedPlaneFillGridReplaceExistingQuads",
[OperatorSpecEditMode("fill_grid", {}, "FACE", {3, 4, 5, 9, 10, 11, 14, 15, 16})],
),
# fill holes
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"SphereFillHoles",
"testSphereFillHoles",
"expectedSphereFillHoles",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("fill_holes", {"sides": 9}, "VERT", {i for i in range(481)})],
),
# face shade smooth (not a real test)
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeShadeSmooth",
"testCubeShadeSmooth",
"expectedCubeShadeSmooth",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("faces_shade_smooth", {}, "VERT", {i for i in range(8)})],
),
# faces shade flat (not a real test)
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeShadeFlat",
"testCubeShadeFlat",
"expectedCubeShadeFlat",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("faces_shade_flat", {}, "FACE", {i for i in range(6)})],
),
# hide
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"HideFace",
"testCubeHideFace",
"expectedCubeHideFace",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("hide", {}, "FACE", {3})],
),
SpecMeshTest(
"HideEdge",
"testCubeHideEdge",
"expectedCubeHideEdge",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("hide", {}, "EDGE", {1})],
),
SpecMeshTest(
"HideVertex",
"testCubeHideVertex",
"expectedCubeHideVertex",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("hide", {}, "VERT", {0})],
),
# inset faces
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeInset",
"testCubeInset",
"expectedCubeInset",
[
OperatorSpecEditMode(
"inset",
{"thickness": 0.2},
"VERT",
{5, 16, 17, 19, 20, 22, 23, 34, 47, 49, 50, 52, 59, 61, 62, 65, 83, 91, 95},
)
],
2022-04-19 15:25:55 +10:00
),
SpecMeshTest(
"CubeInsetEvenOffsetFalse",
"testCubeInsetEvenOffsetFalse",
"expectedCubeInsetEvenOffsetFalse",
[
OperatorSpecEditMode(
"inset",
{"thickness": 0.2, "use_even_offset": False},
"VERT",
{5, 16, 17, 19, 20, 22, 23, 34, 47, 49, 50, 52, 59, 61, 62, 65, 83, 91, 95},
)
],
2022-04-19 15:25:55 +10:00
),
SpecMeshTest(
"CubeInsetDepth",
"testCubeInsetDepth",
"expectedCubeInsetDepth",
[
OperatorSpecEditMode(
"inset",
{"thickness": 0.2, "depth": 0.2},
"VERT",
{5, 16, 17, 19, 20, 22, 23, 34, 47, 49, 50, 52, 59, 61, 62, 65, 83, 91, 95},
)
],
),
SpecMeshTest(
"GridInsetRelativeOffset",
"testGridInsetRelativeOffset",
2022-04-19 15:25:55 +10:00
"expectedGridInsetRelativeOffset",
[
OperatorSpecEditMode(
"inset",
{"thickness": 0.4, "use_relative_offset": True},
"FACE",
{35, 36, 37, 45, 46, 47, 55, 56, 57},
)
],
2022-04-19 15:25:55 +10:00
),
# loop multi select
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"MokeyLoopMultiSelect",
"testMonkeyLoopMultiSelect",
"expectedMonkeyLoopMultiSelect",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("loop_multi_select", {}, "VERT", {355, 359, 73, 301, 302})],
),
SpecMeshTest(
"HoledGridLoopMultiSelect",
"testGridLoopMultiSelect",
"expectedGridLoopMultiSelect",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("loop_multi_select", {}, "VERT", {257, 169, 202, 207, 274, 278, 63})],
),
SpecMeshTest(
"EmptyMeshLoopMultiSelect",
"testEmptyMeshLoopMultiSelect",
"expectedEmptyMeshLoopMultiSelect",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("loop_multi_select", {}, "VERT", {})],
),
# mark seam
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeMarkSeam",
"testCubeMarkSeam",
"expectedCubeMarkSeam",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("mark_seam", {}, "EDGE", {1})],
),
# merge normals
SpecMeshTest(
"CubeMergeNormals",
"testCubeMergeNormals",
"expectedCubeMergeNormals",
[OperatorSpecEditMode("merge_normals", {}, "FACE", {3, 5})],
),
# Quads convert to tris
SpecMeshTest(
"CubeQuadsConvertToTris",
"testCubeQuadsConvertToTris",
"expectedCubeQuadsConvertToTris",
[
OperatorSpecEditMode(
"quads_convert_to_tris",
{"quad_method": "BEAUTY", "ngon_method": "BEAUTY"},
'FACE',
{0, 1, 2, 3, 4, 5},
)
],
),
# select all
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CircleSelectAll",
"testCircleSelectAll",
"expectedCircleSelectAll",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("select_all", {}, "VERT", {1})],
),
SpecMeshTest(
"IsolatedVertsSelectAll",
"testIsolatedVertsSelectAll",
"expectedIsolatedVertsSelectAll",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("select_all", {}, "VERT", {})],
),
SpecMeshTest(
"EmptyMeshSelectAll",
"testEmptyMeshSelectAll",
"expectedEmptyMeshSelectAll",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("select_all", {}, "VERT", {})],
),
# select axis - Cannot be tested. Needs active vert selection
Regression Testing: Running tests based on blend files Runs tests based on blend files with minimum python interaction. Developed as part of GSoC 2021 - Regression Testing of Geometry Nodes. Earlier, tests were built from scratch by adding a modifier/operation from the Python API. Now, tests can also be created inside blender and are compared using Python script. Features: Automatically adding expected object if it doesn't exist. This patch adds tests for the following Geometry Nodes category: * Curves * Geometry * Mesh * Points The implemented UML diagram for refactoring of mesh test framework. {F10225906} Technical Changes: SpecMeshTest: It adds the modifier/operation based on the Spec provided. BlendFileTest: It applies already existing modifier/operation from the blend file. Test folders hierarchy with tests. This folder should be extracted to `lib\tests\modeling` {F10240651} Note: The `geometry_nodes` folder might lie under another `geometry_nodes` folder while extracting, please double check. Use the inner-most one. The hierarchy should be: -`lib\tests\modeling\geometry_nodes\mesh` -`lib\tests\modeling\geometry_nodes\points` and so on. * From `ctest` the tests should be run as `ctest -R geo_node -C [Configuration]` on Windows. * Each single test can be run with its entire name e..g `ctest -R geo_node_geometry_join_geometry`.(just an example). Run `ctest -N -R geo_node` to see all tests. * From blender, the tests can be run `blender -b path\to\blend\file --python path\to\geo_node_test.py` Reviewed By: zazizizou, JacquesLucke Differential Revision: https://developer.blender.org/D11611
2021-07-27 21:00:28 +05:30
# SpecMeshTest("MonkeySelectAxisX", "testMonkeySelectAxisX", "expectedMonkeySelectAxisX",
# [OperatorSpecEditMode("select_axis", {"axis": "X"}, "VERT", {13})]),
Regression Testing: Running tests based on blend files Runs tests based on blend files with minimum python interaction. Developed as part of GSoC 2021 - Regression Testing of Geometry Nodes. Earlier, tests were built from scratch by adding a modifier/operation from the Python API. Now, tests can also be created inside blender and are compared using Python script. Features: Automatically adding expected object if it doesn't exist. This patch adds tests for the following Geometry Nodes category: * Curves * Geometry * Mesh * Points The implemented UML diagram for refactoring of mesh test framework. {F10225906} Technical Changes: SpecMeshTest: It adds the modifier/operation based on the Spec provided. BlendFileTest: It applies already existing modifier/operation from the blend file. Test folders hierarchy with tests. This folder should be extracted to `lib\tests\modeling` {F10240651} Note: The `geometry_nodes` folder might lie under another `geometry_nodes` folder while extracting, please double check. Use the inner-most one. The hierarchy should be: -`lib\tests\modeling\geometry_nodes\mesh` -`lib\tests\modeling\geometry_nodes\points` and so on. * From `ctest` the tests should be run as `ctest -R geo_node -C [Configuration]` on Windows. * Each single test can be run with its entire name e..g `ctest -R geo_node_geometry_join_geometry`.(just an example). Run `ctest -N -R geo_node` to see all tests. * From blender, the tests can be run `blender -b path\to\blend\file --python path\to\geo_node_test.py` Reviewed By: zazizizou, JacquesLucke Differential Revision: https://developer.blender.org/D11611
2021-07-27 21:00:28 +05:30
# SpecMeshTest("MonkeySelectAxisY", "testMonkeySelectAxisY", "expectedMonkeySelectAxisY",
# [OperatorSpecEditMode("select_axis", {"axis": "Y", "sign": "NEG"}, "FACE", {317})]),
Regression Testing: Running tests based on blend files Runs tests based on blend files with minimum python interaction. Developed as part of GSoC 2021 - Regression Testing of Geometry Nodes. Earlier, tests were built from scratch by adding a modifier/operation from the Python API. Now, tests can also be created inside blender and are compared using Python script. Features: Automatically adding expected object if it doesn't exist. This patch adds tests for the following Geometry Nodes category: * Curves * Geometry * Mesh * Points The implemented UML diagram for refactoring of mesh test framework. {F10225906} Technical Changes: SpecMeshTest: It adds the modifier/operation based on the Spec provided. BlendFileTest: It applies already existing modifier/operation from the blend file. Test folders hierarchy with tests. This folder should be extracted to `lib\tests\modeling` {F10240651} Note: The `geometry_nodes` folder might lie under another `geometry_nodes` folder while extracting, please double check. Use the inner-most one. The hierarchy should be: -`lib\tests\modeling\geometry_nodes\mesh` -`lib\tests\modeling\geometry_nodes\points` and so on. * From `ctest` the tests should be run as `ctest -R geo_node -C [Configuration]` on Windows. * Each single test can be run with its entire name e..g `ctest -R geo_node_geometry_join_geometry`.(just an example). Run `ctest -N -R geo_node` to see all tests. * From blender, the tests can be run `blender -b path\to\blend\file --python path\to\geo_node_test.py` Reviewed By: zazizizou, JacquesLucke Differential Revision: https://developer.blender.org/D11611
2021-07-27 21:00:28 +05:30
# SpecMeshTest("MonkeySelectAxisXYZ", "testMonkeySelectAxisXYZ", "expectedMonkeySelectAxisXYZ",
# [OperatorSpecEditMode("select_axis", {"axis": "X", "sign": "NEG"}, "FACE", {317}),
# OperatorSpecEditMode("select_axis", {"axis": "Y", "sign": "POS"}, "FACE", {}),
# OperatorSpecEditMode("select_axis", {"axis": "Z", "sign": "NEG"}, "FACE", {})]),
# select faces by sides
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeSelectFacesBySide",
"testCubeSelectFacesBySide",
"expectedCubeSelectFacesBySide",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("select_face_by_sides", {"number": 4}, "FACE", {})],
),
SpecMeshTest(
"CubeSelectFacesBySideGreater",
"testCubeSelectFacesBySideGreater",
"expectedCubeSelectFacesBySideGreater",
[
OperatorSpecEditMode(
"select_face_by_sides", {"number": 4, "type": "GREATER", "extend": True}, "FACE", {}
)
],
2022-04-19 15:25:55 +10:00
),
SpecMeshTest(
"CubeSelectFacesBySideLess",
"testCubeSelectFacesBySideLess",
"expectedCubeSelectFacesBySideLess",
[
OperatorSpecEditMode(
"select_face_by_sides", {"number": 4, "type": "GREATER", "extend": True}, "FACE", {}
)
],
2022-04-19 15:25:55 +10:00
),
# select interior faces
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeSelectInteriorFaces",
"testCubeSelectInteriorFaces",
"expectedCubeSelectInteriorFaces",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("select_face_by_sides", {"number": 4}, "FACE", {})],
),
SpecMeshTest(
"HoledCubeSelectInteriorFaces",
"testHoledCubeSelectInteriorFaces",
"expectedHoledCubeSelectInteriorFaces",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("select_face_by_sides", {"number": 4}, "FACE", {})],
),
SpecMeshTest(
"EmptyMeshSelectInteriorFaces",
"testEmptyMeshSelectInteriorFaces",
"expectedEmptyMeshSelectInteriorFaces",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("select_face_by_sides", {"number": 4}, "FACE", {})],
),
# select less
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"MonkeySelectLess",
"testMonkeySelectLess",
"expectedMonkeySelectLess",
[
OperatorSpecEditMode(
"select_less",
{},
"VERT",
{
2, 8, 24, 34, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 68,
69, 70, 71, 74, 75, 78, 80, 81, 82, 83, 90, 91, 93, 95, 97, 99,
101, 109, 111, 115, 117, 119, 121, 123, 125, 127, 129, 130, 131,
132, 133, 134, 135, 136, 138, 141, 143, 145, 147, 149, 151, 153,
155, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
175, 176, 177, 178, 181, 182, 184, 185, 186, 187, 188, 189, 190,
192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204,
206, 207, 208, 210, 216, 217, 218, 219, 220, 221, 222, 229, 230,
231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 255,
257, 259, 263, 267, 269, 271, 275, 277, 289, 291, 293, 295, 309,
310, 311, 312, 316, 317, 318, 319, 320, 323, 325, 327, 329, 331,
341, 347, 349, 350, 351, 354, 356, 359, 361, 363, 365, 367, 369,
375, 379, 381, 382, 385, 386, 387, 388, 389, 390, 391, 392, 393,
394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406,
407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419,
420, 421, 423, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434,
435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447,
448, 449, 450, 451, 452, 454, 455, 456, 457, 458, 459, 460, 461,
462, 463, 464, 471, 473, 474, 475, 476, 477, 478, 479, 480, 481,
482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 495,
496, 497, 498, 499, 502, 505,
},
)
],
),
SpecMeshTest(
"HoledCubeSelectLess",
"testHoledCubeSelectLess",
"expectedHoledCubeSelectLess",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("select_face_by_sides", {}, "FACE", {})],
),
SpecMeshTest(
"EmptyMeshSelectLess",
"testEmptyMeshSelectLess",
"expectedEmptyMeshSelectLess",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("select_face_by_sides", {}, "VERT", {})],
),
# select linked
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"PlanesSelectLinked",
"testPlanesSelectLinked",
"expectedPlanesSelectedLinked",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("select_linked", {}, "VERT", {7})],
),
SpecMeshTest(
"CubesSelectLinked",
"testCubesSelectLinked",
"expectedCubesSelectLinked",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("select_linked", {}, "VERT", {11})],
),
SpecMeshTest(
"EmptyMeshSelectLinked",
"testEmptyMeshSelectLinked",
"expectedEmptyMeshSelectLinked",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("select_linked", {}, "VERT", {})],
),
# select nth (checkered deselect)
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CircleSelect2nd",
"testCircleSelect2nd",
"expectedCircleSelect2nd",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("select_nth", {}, "VERT", {i for i in range(32)})],
),
# Subdivide edgering - Not currently functional, operator returns inconsistently
# SpecMeshTest(
# "SubdivideEdgeringSurface",
# "testCylinderSubdivideEdgering",
# "expectedCylinderSubdivideEdgeringSurface",
# [
# OperatorSpecEditMode(
# "subdivide_edgering",
# {"number_cuts": 5, "interpolation": 'SURFACE', "profile_shape_factor": 0.1},
# "EDGE",
# {0, (i for i in range(96) if (i % 3))},
# )
# ],
# ),
# SpecMeshTest(
# "SubdivideEdgeringPath",
# "testCylinderSubdivideEdgering",
# "expectedCylinderSubdivideEdgeringPath",
# [
# OperatorSpecEditMode(
# "subdivide_edgering",
# {"number_cuts": 5, "interpolation": 'PATH', "profile_shape_factor": 0.1},
# "EDGE",
# {0, (i for i in range(96) if (i % 3))},
# )
# ],
# ),
# SpecMeshTest(
# "SubdivideEdgeringLinear",
# "testCylinderSubdivideEdgering",
# "expectedCylinderSubdivideEdgeringLinear",
# [
# OperatorSpecEditMode(
# "subdivide_edgering",
# {"number_cuts": 5, "interpolation": 'LINEAR', "profile_shape_factor": 0.1},
# "EDGE",
# {0, (i for i in range(96) if (i % 3))},
# )
# ],
# ),
# Symmetry Snap
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"SymmetrySnap",
"testPlaneSymmetrySnap",
"expectedPlaneSymmetrySnap",
[
OperatorSpecEditMode(
"symmetry_snap",
{"direction": 'POSITIVE_X', "threshold": 1, "factor": 0.75, "use_center": False},
"VERT",
{i for i in range(5)},
)
],
),
SpecMeshTest(
"SymmetrySnapCenter",
"testPlaneSymmetrySnap",
"expectedPlaneSymmetrySnapCenter",
[
OperatorSpecEditMode(
"symmetry_snap",
{"direction": 'NEGATIVE_X', "threshold": 1, "factor": 0.75, "use_center": True},
"VERT",
{i for i in range(5)},
)
],
2022-04-19 15:25:55 +10:00
),
# Triangulate Faces
SpecMeshTest(
"Triangulate Faces",
"testCubeTriangulate",
"expectedCubeTriangulate",
[OperatorSpecEditMode("quads_convert_to_tris", {}, "FACE", {i for i in range(6)})],
),
# Tris to Quads
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"TrisToQuads 10 deg no topo",
"testPlanesTrisToQuad",
"expectedPlanesTrisToQuad.10.notopo",
[
OperatorSpecEditMode(
"tris_convert_to_quads",
{
"face_threshold": 0.174533,
"shape_threshold": 0.174533,
"topology_influence": 0,
"deselect_joined": False,
"uvs": True,
"vcols": True,
"seam": True,
"sharp": True,
"materials": True,
},
"VERT",
{i for i in range(42)},
)
],
),
SpecMeshTest(
"TrisToQuads 10 deg negligible topo",
"testPlanesTrisToQuad",
"expectedPlanesTrisToQuad.10.notopo",
[
OperatorSpecEditMode(
"tris_convert_to_quads",
{
"face_threshold": 0.174533,
"shape_threshold": 0.174533,
"topology_influence": 0.01,
"deselect_joined": False,
"uvs": True,
"vcols": True,
"seam": True,
"sharp": True,
"materials": True,
},
"VERT",
{i for i in range(42)},
)
],
),
SpecMeshTest(
"TrisToQuads 180 deg no topo",
"testPlanesTrisToQuad",
"expectedPlanesTrisToQuad.180.notopo",
[
OperatorSpecEditMode(
"tris_convert_to_quads",
{
"face_threshold": 3.14159,
"shape_threshold": 3.14159,
"topology_influence": 0,
"deselect_joined": False,
"uvs": True,
"vcols": True,
"seam": True,
"sharp": True,
"materials": True,
},
"VERT",
{i for i in range(42)},
)
],
),
SpecMeshTest(
"TrisToQuads 180 deg topo",
"testPlanesTrisToQuad",
"expectedPlanesTrisToQuad.180.topo",
[
OperatorSpecEditMode(
"tris_convert_to_quads",
{
"face_threshold": 3.14159,
"shape_threshold": 3.14159,
"topology_influence": 1,
"deselect_joined": False,
"uvs": True,
"vcols": True,
"seam": True,
"sharp": True,
"materials": True,
},
"VERT",
{i for i in range(42)},
)
],
),
# unsubdivide
# normal case
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeFaceUnsubdivide",
"testCubeUnsubdivide",
"expectedCubeUnsubdivide",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("unsubdivide", {}, "FACE", {i for i in range(6)})],
),
# UV Manipulation
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"UVRotate",
"testCubeUV",
"expectedCubeUVRotate",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("uvs_rotate", {}, "FACE", {2})],
),
SpecMeshTest(
"UVRotateCCW",
"testCubeUV",
"expectedCubeUVRotateCCW",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("uvs_rotate", {"use_ccw": True}, "FACE", {2})],
),
SpecMeshTest(
"UVReverse",
"testCubeUV",
"expectedCubeUVReverse",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("uvs_reverse", {}, "FACE", {2})],
),
SpecMeshTest(
"UVAdd",
"testCubeUV",
"expectedCubeUVAdd",
[OperatorSpecEditMode("uv_texture_add", {}, "FACE", {})],
2022-04-19 15:25:55 +10:00
),
SpecMeshTest(
"UVRemove",
"testCubeUV",
"expectedCubeUVRemove",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("uv_texture_remove", {}, "FACE", {})],
),
# Vert Connect Concave
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"VertexConnectConcave",
"testPlaneVertConnectConcave",
"expectedPlaneVertConnectConcave",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("vert_connect_concave", {}, "FACE", {0})],
),
SpecMeshTest(
"VertexConnectConcaveConvexPentagon",
"testPentagonVertConnectConcave",
"expectedPentagonVertConnectConcave",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("vert_connect_concave", {}, "FACE", {0})],
),
SpecMeshTest(
"VertexConnectConcaveQuad",
"testPlaneVertConnectConcaveQuad",
"expectedPlaneVertConnectConcaveQuad",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("vert_connect_concave", {}, "FACE", {0})],
),
# Vert Connect Nonplanar
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"VertexConnectNonplanar",
"testPlaneVertConnectNonplanar",
"expectedPlaneVertConnectNonplanar",
[
OperatorSpecEditMode(
"vert_connect_nonplanar", {"angle_limit": 0.17453292}, "VERT", {i for i in range(9)}
)
],
2022-04-19 15:25:55 +10:00
),
SpecMeshTest(
"VertexConnectNonplanarNgon",
"testPlaneVertConnectNonplanarNgon",
"expectedPlaneVertConnectNonplanarNgon",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("vert_connect_nonplanar", {"angle_limit": 0.218166}, "VERT", {i for i in range(6)})],
),
# #87259 - test cases
2022-04-19 15:25:55 +10:00
SpecMeshTest(
"CubeEdgeUnsubdivide",
"testCubeEdgeUnsubdivide",
"expectedCubeEdgeUnsubdivide",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("unsubdivide", {}, "EDGE", {i for i in range(6)})],
),
SpecMeshTest(
"UVSphereUnsubdivide",
"testUVSphereUnsubdivide",
"expectedUVSphereUnsubdivide",
2022-04-19 15:25:55 +10:00
[OperatorSpecEditMode("unsubdivide", {'iterations': 9}, "FACE", {i for i in range(512)})],
),
# vert connect path
# Tip: It works only if there is an already existing face or more than 2 vertices.
SpecMeshTest(
"PlaneVertConnectPath",
"testPlaneVertConnectPath",
"expectedPlaneVertConnectPath",
[
OperatorSpecEditMode(
"vert_connect_path",
{},
"VERT",
(0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14),
select_history=True,
)
],
),
# Laplacian Smooth
SpecMeshTest(
"LaplacianSmoothDefault",
"testSphereLaplacianSmoothDefault",
"expectedSphereLaplacianSmoothDefault",
[
OperatorSpecEditMode(
"vertices_smooth_laplacian", {"preserve_volume": False}, "VERT", {i for i in range(482)}
)
],
),
SpecMeshTest(
"LaplacianSmoothHighValues",
"testSphereLaplacianSmoothHigh",
"expectedSphereLaplacianSmoothHigh",
[
OperatorSpecEditMode(
"vertices_smooth_laplacian",
{"preserve_volume": False, "repeat": 100, "lambda_factor": 10.0},
"VERT",
{i for i in range(482)},
)
],
),
SpecMeshTest(
"LaplacianSmoothBorder",
"testCubeLaplacianSmoothBorder",
"expectedCubeLaplacianSmoothBorder",
[
OperatorSpecEditMode(
"vertices_smooth_laplacian",
{"preserve_volume": False, "lambda_border": 1.0},
"VERT",
{i for i in range(25)},
)
],
),
SpecMeshTest(
"LaplacianSmoothHighBorder",
"testCubeLaplacianSmoothHighBorder",
"expectedCubeLaplacianSmoothHighBorder",
[
OperatorSpecEditMode(
"vertices_smooth_laplacian",
{"preserve_volume": False, "lambda_border": 100.0},
"VERT",
{i for i in range(25)},
)
],
),
SpecMeshTest(
"LaplacianSmoothPreserveVolume",
"testSphereLaplacianSmoothPreserveVol",
"expectedSphereLaplacianSmoothPreserveVol",
[
OperatorSpecEditMode(
"vertices_smooth_laplacian", {"preserve_volume": True}, "VERT", {i for i in range(482)}
)
],
),
# wireframe
SpecMeshTest(
"WireFrameDefault",
"testCubeWireframeDefault",
"expectedCubeWireframeDefault",
[OperatorSpecEditMode("wireframe", {}, "FACE", {i for i in range(6)})],
),
SpecMeshTest(
"WireFrameAlt",
"testCubeWireframeAlt",
"expectedCubeWireframeAlt",
[
OperatorSpecEditMode(
"wireframe",
{
"use_boundary": False,
"use_even_offset": False,
"use_relative_offset": True,
"use_replace": False,
"thickness": 0.3,
"offset": 0.3,
"use_crease": True,
"crease_weight": 0.01,
},
"FACE",
{i for i in range(6)},
)
],
),
]
operators_test = RunTest(tests)
command = list(sys.argv)
for i, cmd in enumerate(command):
if cmd == "--run-all-tests":
operators_test.do_compare = True
operators_test.run_all_tests()
break
elif cmd == "--run-test":
operators_test.do_compare = False
name = command[i + 1]
operators_test.run_test(name)
break
if __name__ == "__main__":
main()