Introduction
This task tracks progress of regression tests for mesh operators. A regression takes a test mesh, applies an operator on it and compares the result with a reference mesh (typically called expected object).
Note: Multiple developers can work on this task after discussing with other subscribers/assignee for clarification.
Adding a new test
- Define the test case in the python file blender/tests/python/operators.py
- Create a test mesh and an expected mesh in lib/tests/modeling/operators.blend
- Make sure the test case can fail.
The wiki explains the steps in much more details: Python Tests
Style Guidelines to Follow for the Blend file:
- Collection Name should be same as Operator Name
- Add tests in alphabetical order (Collection Names).
- Keep the test objects in sync with respect to their relative alphabetical positioning between other objects.
Some examples:
D10218 (remove doubles)
rB22a8a3b21497 (Deform tests)
rB8373f497b (Curve tests)
Test cases
First screening of operators can be find in this sheet link for insights.
Add new tests for operators from the list below, they can be accessed by bpy.ops.mesh in the python console in Blender. For documentation, please refer here
Operator | Typical case | Further cases | Comments |
average_normals | D10865 | ||
beautify_fill | D10865 | ||
bevel | x | tests are in bevel_regression.blend and bevel_operator.py | |
bisect | x | TODO: T87863 Add test case from the bug file itself | |
blend_from_shape | x | ||
bridge_edge_loops | x | ||
colors_reverse | |||
colors_rotate | |||
convex_hull | D11200 | ||
customdata_custom_splitnormals_add | |||
customdata_custom_splitnormals_clear | |||
customdata_mask_clear | |||
customdata_skin_add | |||
customdata_skin_clear | |||
decimate | x | ||
delete | x | delete Faces/Verts/Edges | |
delete_edgeloop | x | delete Verts/Edges | |
delete_loose | x | ||
dissolve_degenerate | x | ||
dissolve_edges | x | ||
dissolve_faces | x | ||
dissolve_limited | D15187 | ||
dissolve_mode | D15187 | ||
dissolve_verts | x | ||
dupli_extrude_cursor | Requires user input, cannot test. | ||
duplicate | x | ||
duplicate_move | |||
edge_collapse | |||
edge_face_add | x | ||
edge_rotate | x | ||
edge_split | x | ||
edgering_select | Requires user input, cannot test. | ||
edges_select_sharp | D10400 | ||
extrude_context | Requires user input, cannot test. | ||
extrude_context_move | Requires user input, cannot test. | ||
extrude_edges_indiv | Requires user input, cannot test. | ||
extrude_edges_move | Requires user input, cannot test. | ||
extrude_faces_indiv | Requires user input, cannot test. | ||
extrude_faces_move | Requires user input, cannot test. | ||
extrude_region | Requires user input, cannot test. | ||
extrude_region_move | Requires user input, cannot test. | ||
extrude_region_shrink_fatten | Requires user input, cannot test. | ||
extrude_repeat | Requires user input, cannot test. | ||
extrude_vertices_move | Requires user input, cannot test. | ||
extrude_verts_indiv | Requires user input, cannot test. | ||
face_make_planar | x | ||
face_split_by_edges | x | ||
faces_mirror_uv | |||
faces_select_linked_flat | x | ||
faces_shade_flat | D10893 | Not a real test, appearance can't be tested | |
faces_shade_smooth | D10893 | Not a real test, appearance can't be tested | |
fill | x | ||
fill_grid | x | ||
fill_holes | x | ||
flip_normals | D11802 | ||
hide | D11798 | ||
inset | x | ||
intersect | x | ||
intersect_boolean | x | x | See boolean_operator.py |
knife_project | |||
knife_tool | |||
loop_multi_select | D10400 | ||
loop_select | |||
loop_to_region | |||
loopcut | |||
loopcut_slide | |||
mark_freestyle_edge | |||
mark_freestyle_face | |||
mark_seam | D10893 | ||
mark_sharp | |||
merge | D11083 | ||
merge_normals | D15187 | ||
mod_weighted_strength | |||
normals_make_consistent | |||
normals_tools | |||
offset_edge_loops | |||
offset_edge_loops_slide | |||
paint_mask_extract | |||
paint_mask_slice | |||
point_normals | |||
poke | D11200 | ||
polybuild_delete_at_cursor | |||
polybuild_dissolve_at_cursor | |||
polybuild_extrude_at_cursor_move | |||
polybuild_face_at_cursor | |||
polybuild_face_at_cursor_move | |||
polybuild_split_at_cursor | |||
polybuild_split_at_cursor_move | |||
polybuild_transform_at_cursor | |||
polybuild_transform_at_cursor_move | |||
quads_convert_to_tris | |||
region_to_loop | |||
remove_doubles | D10218 | ||
reveal | D10723 | Operator does not change mesh | |
rip | D11200 | ||
rip_edge | |||
rip_edge_move | |||
rip_move | |||
screw | |||
select_all | D10400 | ||
select_axis | Cannot be tested. Needs active vert selection | ||
select_face_by_sides | D10400 | ||
select_interior_faces | D10400 | ||
select_less | D10400 | ||
select_linked | D10400 | ||
select_linked_pick | Cannot be tested. Needs user input | ||
select_loose | D10839 | ||
select_mirror | D10839 | ||
select_mode | x | Used by framework, so implicitly tested with all other operators | |
select_more | D10839 | ||
select_next_item | |||
select_non_manifold | |||
select_nth | D10893 | ||
select_prev_item | |||
select_random | |||
select_similar | |||
select_similar_region | |||
select_ungrouped | |||
separate | |||
set_normals_from_faces | |||
shape_propagate_to_all | |||
shortest_path_pick | |||
shortest_path_select | |||
smoothen_normals | |||
solidify | D11200 | ||
sort_elements | D10865 | ||
spin | D10865 | ||
split | D11200 | ||
split_normals | |||
subdivide | D10865 | ||
subdivide_edgering | D11798 | Cannot be tested. Does not produce reproducible results | |
symmetrize | D11083 | ||
symmetry_snap | D11798 | ||
tris_convert_to_quads | D11798 | ||
unsubdivide | D10893 | Added test cases for the bug T87259 | |
uv_texture_add | D11798 | ||
uv_texture_remove | D11798 | ||
uvs_reverse | D11798 | ||
uvs_rotate | D11798 | ||
vert_connect | D11200 | ||
vert_connect_concave | D11798 | ||
vert_connect_nonplanar | D11798 | ||
vert_connect_path | D10893 | ||
vertex_color_add | D11798 | ||
vertex_color_remove | D11798 | ||
vertices_smooth | D11200 | ||
vertices_smooth_laplacian | D11798 | ||
wireframe | D11798 |