Blender  V3.3
keyframes_keylist_test.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0 */
2 
3 #include "testing/testing.h"
4 
5 #include "BLI_utildefines.h"
6 
7 #include "ED_keyframes_keylist.h"
8 
9 #include "DNA_anim_types.h"
10 #include "DNA_curve_types.h"
11 
12 #include "MEM_guardedalloc.h"
13 
14 #include "BKE_fcurve.h"
15 
16 #include <functional>
17 #include <optional>
18 
20 
21 const float KEYLIST_NEAR_ERROR = 0.1;
22 const float FRAME_STEP = 0.005;
23 
24 static void build_fcurve(FCurve &fcurve)
25 {
26  fcurve.totvert = 3;
27  fcurve.bezt = static_cast<BezTriple *>(
28  MEM_callocN(sizeof(BezTriple) * fcurve.totvert, "BezTriples"));
29  fcurve.bezt[0].vec[1][0] = 10.0f;
30  fcurve.bezt[0].vec[1][1] = 1.0f;
31  fcurve.bezt[1].vec[1][0] = 20.0f;
32  fcurve.bezt[1].vec[1][1] = 2.0f;
33  fcurve.bezt[2].vec[1][0] = 30.0f;
34  fcurve.bezt[2].vec[1][1] = 1.0f;
35 }
36 
38 {
39  FCurve *fcurve = BKE_fcurve_create();
40  build_fcurve(*fcurve);
41 
42  AnimKeylist *keylist = ED_keylist_create();
43  fcurve_to_keylist(nullptr, fcurve, keylist, 0);
44  BKE_fcurve_free(fcurve);
45 
47  return keylist;
48 }
49 
50 static void assert_act_key_column(const ActKeyColumn *column,
51  const std::optional<float> expected_frame)
52 {
53  if (expected_frame.has_value()) {
54  EXPECT_NE(column, nullptr);
55  EXPECT_NEAR(column->cfra, *expected_frame, KEYLIST_NEAR_ERROR);
56  }
57  else {
58  EXPECT_EQ(column, nullptr);
59  }
60 }
61 
62 using KeylistFindFunction = std::function<const ActKeyColumn *(const AnimKeylist *, float)>;
63 
64 static float check_keylist_find_range(const AnimKeylist *keylist,
65  KeylistFindFunction keylist_find_func,
66  const float frame_from,
67  const float frame_to,
68  const std::optional<float> expected_frame)
69 {
70  float cfra = frame_from;
71  for (; cfra < frame_to; cfra += FRAME_STEP) {
72  const ActKeyColumn *found = keylist_find_func(keylist, cfra);
73  assert_act_key_column(found, expected_frame);
74  }
75  return cfra;
76 }
77 
78 static float check_keylist_find_next_range(const AnimKeylist *keylist,
79  const float frame_from,
80  const float frame_to,
81  const std::optional<float> expected_frame)
82 {
84  keylist, ED_keylist_find_next, frame_from, frame_to, expected_frame);
85 }
86 
87 TEST(keylist, find_next)
88 {
89  AnimKeylist *keylist = create_test_keylist();
90 
91  float cfra = check_keylist_find_next_range(keylist, 0.0f, 9.99f, 10.0f);
92  cfra = check_keylist_find_next_range(keylist, cfra, 19.99f, 20.0f);
93  cfra = check_keylist_find_next_range(keylist, cfra, 29.99f, 30.0f);
94  cfra = check_keylist_find_next_range(keylist, cfra, 39.99f, std::nullopt);
95 
96  ED_keylist_free(keylist);
97 }
98 
99 static float check_keylist_find_prev_range(const AnimKeylist *keylist,
100  const float frame_from,
101  const float frame_to,
102  const std::optional<float> expected_frame)
103 {
105  keylist, ED_keylist_find_prev, frame_from, frame_to, expected_frame);
106 }
107 
108 TEST(keylist, find_prev)
109 {
110  AnimKeylist *keylist = create_test_keylist();
111 
112  float cfra = check_keylist_find_prev_range(keylist, 0.0f, 10.01f, std::nullopt);
113  cfra = check_keylist_find_prev_range(keylist, cfra, 20.01f, 10.0f);
114  cfra = check_keylist_find_prev_range(keylist, cfra, 30.01f, 20.0f);
115  cfra = check_keylist_find_prev_range(keylist, cfra, 49.99f, 30.0f);
116 
117  ED_keylist_free(keylist);
118 }
119 
120 static float check_keylist_find_exact_range(const AnimKeylist *keylist,
121  const float frame_from,
122  const float frame_to,
123  const std::optional<float> expected_frame)
124 {
126  keylist, ED_keylist_find_exact, frame_from, frame_to, expected_frame);
127 }
128 
129 TEST(keylist, find_exact)
130 {
131  AnimKeylist *keylist = create_test_keylist();
132 
133  float cfra = check_keylist_find_exact_range(keylist, 0.0f, 9.99f, std::nullopt);
134  cfra = check_keylist_find_exact_range(keylist, cfra, 10.01f, 10.0f);
135  cfra = check_keylist_find_exact_range(keylist, cfra, 19.99f, std::nullopt);
136  cfra = check_keylist_find_exact_range(keylist, cfra, 20.01f, 20.0f);
137  cfra = check_keylist_find_exact_range(keylist, cfra, 29.99f, std::nullopt);
138  cfra = check_keylist_find_exact_range(keylist, cfra, 30.01f, 30.0f);
139  cfra = check_keylist_find_exact_range(keylist, cfra, 49.99f, std::nullopt);
140 
141  ED_keylist_free(keylist);
142 }
143 
144 } // namespace blender::editor::animation::tests
typedef float(TangentPoint)[2]
void BKE_fcurve_free(struct FCurve *fcu)
Definition: fcurve.c:65
struct FCurve * BKE_fcurve_create(void)
Definition: fcurve.c:53
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
Read Guarded memory(de)allocation.
void fcurve_to_keylist(AnimData *adt, FCurve *fcu, AnimKeylist *keylist, const int saction_flag)
AnimKeylist * ED_keylist_create()
void ED_keylist_prepare_for_direct_access(AnimKeylist *keylist)
const ActKeyColumn * ED_keylist_find_next(const AnimKeylist *keylist, const float cfra)
void ED_keylist_free(AnimKeylist *keylist)
const ActKeyColumn * ED_keylist_find_prev(const AnimKeylist *keylist, const float cfra)
const ActKeyColumn * ED_keylist_find_exact(const AnimKeylist *keylist, const float cfra)
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
static float check_keylist_find_next_range(const AnimKeylist *keylist, const float frame_from, const float frame_to, const std::optional< float > expected_frame)
static void assert_act_key_column(const ActKeyColumn *column, const std::optional< float > expected_frame)
static float check_keylist_find_exact_range(const AnimKeylist *keylist, const float frame_from, const float frame_to, const std::optional< float > expected_frame)
static void build_fcurve(FCurve &fcurve)
std::function< const ActKeyColumn *(const AnimKeylist *, float)> KeylistFindFunction
static float check_keylist_find_prev_range(const AnimKeylist *keylist, const float frame_from, const float frame_to, const std::optional< float > expected_frame)
static float check_keylist_find_range(const AnimKeylist *keylist, KeylistFindFunction keylist_find_func, const float frame_from, const float frame_to, const std::optional< float > expected_frame)
float vec[3][3]
BezTriple * bezt
unsigned int totvert