File indexing completed on 2025-05-11 08:24:50
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 #ifdef HAVE_CONFIG_H
0053 #include "config.h"
0054 #endif
0055
0056 #include <string.h>
0057 #include <rtems/score/rbtreeimpl.h>
0058
0059 #include <rtems/test.h>
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112 typedef struct {
0113 int id;
0114 int key;
0115 RBTree_Node Node;
0116 } TestNode;
0117
0118 static TestNode node_array[ 100 ];
0119
0120 static int Color( const RBTree_Node *n )
0121 {
0122 return RTEMS_RB_COLOR( n, Node );
0123 }
0124
0125 static bool Less( const void *left, const RBTree_Node *right )
0126 {
0127 const int *the_left;
0128 const TestNode *the_right;
0129
0130 the_left = left;
0131 the_right = RTEMS_CONTAINER_OF( right, TestNode, Node );
0132
0133 return *the_left < the_right->key;
0134 }
0135
0136
0137
0138
0139
0140 static int VerifyTree( RBTree_Node *root )
0141 {
0142 RBTree_Node *ln;
0143 RBTree_Node *rn;
0144 TestNode *tn;
0145 TestNode *ltn;
0146 TestNode *rtn;
0147 int lh;
0148 int rh;
0149
0150 if ( root == NULL ) {
0151 return 1;
0152 }
0153
0154 ln = _RBTree_Left( root );
0155 rn = _RBTree_Right( root );
0156 tn = RTEMS_CONTAINER_OF( root, TestNode, Node );
0157 ltn = RTEMS_CONTAINER_OF( ln, TestNode, Node );
0158 rtn = RTEMS_CONTAINER_OF( rn, TestNode, Node );
0159
0160
0161 if (
0162 Color( root ) == RTEMS_RB_RED &&
0163 ( ( ln != NULL && Color( ln ) == RTEMS_RB_RED ) ||
0164 ( rn != NULL && Color( rn ) == RTEMS_RB_RED ) )
0165 ) {
0166 return -1;
0167 }
0168
0169 lh = VerifyTree ( ln );
0170 rh = VerifyTree ( rn );
0171
0172 if ( lh == -1 || rh == -1 ) {
0173 return -1;
0174 }
0175
0176
0177 if ( lh != rh ) {
0178 return -1;
0179 }
0180
0181
0182 if (
0183 ( ln != NULL && tn->key != ltn->key && !Less( <n->key, root ) ) ||
0184 ( rn != NULL && tn->key != rtn->key && !Less( &tn->key, rn ) )
0185 ) {
0186 return -1;
0187 }
0188
0189
0190 return Color( root ) == RTEMS_RB_BLACK ? lh + 1 : lh;
0191 }
0192
0193 #define TN( i ) &node_array[ i ].Node
0194
0195 typedef struct {
0196 int key;
0197 const RBTree_Node *parent;
0198 const RBTree_Node *left;
0199 const RBTree_Node *right;
0200 int color;
0201 } TestNodeDescription;
0202
0203 typedef struct {
0204 int current;
0205 int count;
0206 const TestNodeDescription *tree;
0207 } VisitorContext;
0208
0209 static bool VisitNodes(
0210 const RBTree_Node *node,
0211 void *visitor_arg
0212 )
0213 {
0214 VisitorContext *ctx;
0215 const TestNodeDescription *td;
0216 const TestNode *tn;
0217
0218 ctx = visitor_arg;
0219 td = &ctx->tree[ ctx->current ];
0220 tn = RTEMS_CONTAINER_OF( node, TestNode, Node );
0221
0222 T_lt_int( ctx->current, ctx->count );
0223
0224 T_eq_int( td->key, tn->key );
0225
0226 if ( td->parent == NULL ) {
0227 T_true( _RBTree_Is_root( &tn->Node ) );
0228 } else {
0229 T_eq_ptr( td->parent, _RBTree_Parent( &tn->Node ) );
0230 }
0231
0232 T_eq_ptr( td->left, _RBTree_Left( &tn->Node ) );
0233 T_eq_ptr( td->right, _RBTree_Right( &tn->Node ) );
0234 T_eq_int( td->color, Color( &tn->Node ) );
0235
0236 ++ctx->current;
0237
0238 return false;
0239 }
0240
0241 static const TestNodeDescription random_ops_tree_unique_1[] = {
0242 { 0, NULL, NULL, NULL, RTEMS_RB_BLACK }
0243 };
0244
0245 static const TestNodeDescription random_ops_tree_multiple_1[] = {
0246 { 0, NULL, NULL, NULL, RTEMS_RB_BLACK }
0247 };
0248
0249 static const TestNodeDescription random_ops_tree_unique_2[] = {
0250 };
0251
0252 static const TestNodeDescription random_ops_tree_multiple_2[] = {
0253 };
0254
0255 static const TestNodeDescription random_ops_tree_unique_3[] = {
0256 { 2, NULL, NULL, NULL, RTEMS_RB_BLACK }
0257 };
0258
0259 static const TestNodeDescription random_ops_tree_multiple_3[] = {
0260 { 1, NULL, NULL, NULL, RTEMS_RB_BLACK }
0261 };
0262
0263 static const TestNodeDescription random_ops_tree_unique_4[] = {
0264 { 0, TN( 3 ), NULL, NULL, RTEMS_RB_RED },
0265 { 3, NULL, TN( 0 ), NULL, RTEMS_RB_BLACK }
0266 };
0267
0268 static const TestNodeDescription random_ops_tree_multiple_4[] = {
0269 { 0, NULL, NULL, TN( 3 ), RTEMS_RB_BLACK },
0270 { 1, TN( 0 ), NULL, NULL, RTEMS_RB_RED }
0271 };
0272
0273 static const TestNodeDescription random_ops_tree_unique_5[] = {
0274 { 0, TN( 1 ), NULL, NULL, RTEMS_RB_RED },
0275 { 1, NULL, TN( 0 ), TN( 4 ), RTEMS_RB_BLACK },
0276 { 4, TN( 1 ), NULL, NULL, RTEMS_RB_RED }
0277 };
0278
0279 static const TestNodeDescription random_ops_tree_multiple_5[] = {
0280 { 0, TN( 1 ), NULL, NULL, RTEMS_RB_RED },
0281 { 0, NULL, TN( 0 ), TN( 4 ), RTEMS_RB_BLACK },
0282 { 2, TN( 1 ), NULL, NULL, RTEMS_RB_RED }
0283 };
0284
0285 static const TestNodeDescription random_ops_tree_unique_6[] = {
0286 { 0, TN( 2 ), NULL, NULL, RTEMS_RB_RED },
0287 { 2, NULL, TN( 0 ), NULL, RTEMS_RB_BLACK }
0288 };
0289
0290 static const TestNodeDescription random_ops_tree_multiple_6[] = {
0291 { 0, TN( 2 ), NULL, NULL, RTEMS_RB_RED },
0292 { 1, NULL, TN( 0 ), NULL, RTEMS_RB_BLACK }
0293 };
0294
0295 static const TestNodeDescription random_ops_tree_unique_7[] = {
0296 { 0, TN( 2 ), NULL, TN( 1 ), RTEMS_RB_BLACK },
0297 { 1, TN( 0 ), NULL, NULL, RTEMS_RB_RED },
0298 { 2, NULL, TN( 0 ), TN( 5 ), RTEMS_RB_BLACK },
0299 { 4, TN( 5 ), NULL, NULL, RTEMS_RB_RED },
0300 { 5, TN( 2 ), TN( 4 ), NULL, RTEMS_RB_BLACK }
0301 };
0302
0303 static const TestNodeDescription random_ops_tree_multiple_7[] = {
0304 { 0, TN( 2 ), NULL, TN( 1 ), RTEMS_RB_BLACK },
0305 { 0, TN( 0 ), NULL, NULL, RTEMS_RB_RED },
0306 { 1, NULL, TN( 0 ), TN( 4 ), RTEMS_RB_BLACK },
0307 { 2, TN( 4 ), NULL, NULL, RTEMS_RB_RED },
0308 { 2, TN( 2 ), TN( 5 ), NULL, RTEMS_RB_BLACK }
0309 };
0310
0311 static const TestNodeDescription random_ops_tree_unique_8[] = {
0312 { 0, TN( 1 ), NULL, NULL, RTEMS_RB_BLACK },
0313 { 1, NULL, TN( 0 ), TN( 6 ), RTEMS_RB_BLACK },
0314 { 5, TN( 6 ), NULL, NULL, RTEMS_RB_RED },
0315 { 6, TN( 1 ), TN( 5 ), NULL, RTEMS_RB_BLACK }
0316 };
0317
0318 static const TestNodeDescription random_ops_tree_multiple_8[] = {
0319 { 0, TN( 5 ), NULL, TN( 0 ), RTEMS_RB_BLACK },
0320 { 0, TN( 1 ), NULL, NULL, RTEMS_RB_RED },
0321 { 2, NULL, TN( 1 ), TN( 6 ), RTEMS_RB_BLACK },
0322 { 3, TN( 5 ), NULL, NULL, RTEMS_RB_BLACK }
0323 };
0324
0325 static const TestNodeDescription random_ops_tree_unique_9[] = {
0326 { 1, TN( 2 ), NULL, NULL, RTEMS_RB_BLACK },
0327 { 2, TN( 6 ), TN( 1 ), TN( 4 ), RTEMS_RB_RED },
0328 { 4, TN( 2 ), NULL, TN( 5 ), RTEMS_RB_BLACK },
0329 { 5, TN( 4 ), NULL, NULL, RTEMS_RB_RED },
0330 { 6, NULL, TN( 2 ), TN( 7 ), RTEMS_RB_BLACK },
0331 { 7, TN( 6 ), NULL, TN( 8 ), RTEMS_RB_BLACK },
0332 { 8, TN( 7 ), NULL, NULL, RTEMS_RB_RED }
0333 };
0334
0335 static const TestNodeDescription random_ops_tree_multiple_9[] = {
0336 { 0, TN( 2 ), NULL, NULL, RTEMS_RB_BLACK },
0337 { 1, TN( 6 ), TN( 1 ), TN( 4 ), RTEMS_RB_RED },
0338 { 2, TN( 2 ), NULL, TN( 5 ), RTEMS_RB_BLACK },
0339 { 2, TN( 4 ), NULL, NULL, RTEMS_RB_RED },
0340 { 3, NULL, TN( 2 ), TN( 7 ), RTEMS_RB_BLACK },
0341 { 3, TN( 6 ), NULL, TN( 8 ), RTEMS_RB_BLACK },
0342 { 4, TN( 7 ), NULL, NULL, RTEMS_RB_RED }
0343 };
0344
0345 static const TestNodeDescription random_ops_tree_unique_10[] = {
0346 { 0, TN( 2 ), NULL, NULL, RTEMS_RB_BLACK },
0347 { 2, TN( 6 ), TN( 0 ), TN( 4 ), RTEMS_RB_RED },
0348 { 3, TN( 4 ), NULL, NULL, RTEMS_RB_RED },
0349 { 4, TN( 2 ), TN( 3 ), NULL, RTEMS_RB_BLACK },
0350 { 6, NULL, TN( 2 ), TN( 8 ), RTEMS_RB_BLACK },
0351 { 8, TN( 6 ), NULL, NULL, RTEMS_RB_BLACK }
0352 };
0353
0354 static const TestNodeDescription random_ops_tree_multiple_10[] = {
0355 { 0, TN( 2 ), NULL, NULL, RTEMS_RB_BLACK },
0356 { 1, TN( 6 ), TN( 0 ), TN( 4 ), RTEMS_RB_RED },
0357 { 1, TN( 4 ), NULL, NULL, RTEMS_RB_RED },
0358 { 2, TN( 2 ), TN( 3 ), NULL, RTEMS_RB_BLACK },
0359 { 3, NULL, TN( 2 ), TN( 8 ), RTEMS_RB_BLACK },
0360 { 4, TN( 6 ), NULL, NULL, RTEMS_RB_BLACK }
0361 };
0362
0363 static const TestNodeDescription random_ops_tree_unique_11[] = {
0364 { 2, TN( 6 ), NULL, NULL, RTEMS_RB_BLACK },
0365 { 6, NULL, TN( 2 ), TN( 8 ), RTEMS_RB_BLACK },
0366 { 7, TN( 8 ), NULL, NULL, RTEMS_RB_RED },
0367 { 8, TN( 6 ), TN( 7 ), TN( 9 ), RTEMS_RB_BLACK },
0368 { 9, TN( 8 ), NULL, NULL, RTEMS_RB_RED }
0369 };
0370
0371 static const TestNodeDescription random_ops_tree_multiple_11[] = {
0372 { 1, TN( 6 ), NULL, NULL, RTEMS_RB_BLACK },
0373 { 3, NULL, TN( 2 ), TN( 8 ), RTEMS_RB_BLACK },
0374 { 3, TN( 8 ), NULL, NULL, RTEMS_RB_RED },
0375 { 4, TN( 6 ), TN( 7 ), TN( 9 ), RTEMS_RB_BLACK },
0376 { 4, TN( 8 ), NULL, NULL, RTEMS_RB_RED }
0377 };
0378
0379 static const TestNodeDescription random_ops_tree_unique_12[] = {
0380 { 0, TN( 1 ), NULL, NULL, RTEMS_RB_RED },
0381 { 1, TN( 3 ), TN( 0 ), TN( 2 ), RTEMS_RB_BLACK },
0382 { 2, TN( 1 ), NULL, NULL, RTEMS_RB_RED },
0383 { 3, TN( 5 ), TN( 1 ), TN( 4 ), RTEMS_RB_RED },
0384 { 4, TN( 3 ), NULL, NULL, RTEMS_RB_BLACK },
0385 { 5, NULL, TN( 3 ), TN( 9 ), RTEMS_RB_BLACK },
0386 { 9, TN( 5 ), NULL, TN( 11 ), RTEMS_RB_BLACK },
0387 { 11, TN( 9 ), NULL, NULL, RTEMS_RB_RED }
0388 };
0389
0390 static const TestNodeDescription random_ops_tree_multiple_12[] = {
0391 { 0, TN( 1 ), NULL, NULL, RTEMS_RB_BLACK },
0392 { 0, TN( 5 ), TN( 0 ), TN( 3 ), RTEMS_RB_RED },
0393 { 1, TN( 1 ), NULL, TN( 2 ), RTEMS_RB_BLACK },
0394 { 1, TN( 3 ), NULL, NULL, RTEMS_RB_RED },
0395 { 2, NULL, TN( 1 ), TN( 9 ), RTEMS_RB_BLACK },
0396 { 2, TN( 9 ), NULL, NULL, RTEMS_RB_BLACK },
0397 { 4, TN( 5 ), TN( 4 ), TN( 11 ), RTEMS_RB_RED },
0398 { 5, TN( 9 ), NULL, NULL, RTEMS_RB_BLACK }
0399 };
0400
0401 static const TestNodeDescription random_ops_tree_unique_13[] = {
0402 { 0, TN( 1 ), NULL, NULL, RTEMS_RB_RED },
0403 { 1, TN( 3 ), TN( 0 ), NULL, RTEMS_RB_BLACK },
0404 { 3, TN( 8 ), TN( 1 ), TN( 5 ), RTEMS_RB_RED },
0405 { 4, TN( 5 ), NULL, NULL, RTEMS_RB_RED },
0406 { 5, TN( 3 ), TN( 4 ), TN( 6 ), RTEMS_RB_BLACK },
0407 { 6, TN( 5 ), NULL, NULL, RTEMS_RB_RED },
0408 { 8, NULL, TN( 3 ), TN( 11 ), RTEMS_RB_BLACK },
0409 { 10, TN( 11 ), NULL, NULL, RTEMS_RB_RED },
0410 { 11, TN( 8 ), TN( 10 ), NULL, RTEMS_RB_BLACK }
0411 };
0412
0413 static const TestNodeDescription random_ops_tree_multiple_13[] = {
0414 { 0, TN( 0 ), NULL, NULL, RTEMS_RB_RED },
0415 { 0, TN( 3 ), TN( 1 ), NULL, RTEMS_RB_BLACK },
0416 { 1, TN( 6 ), TN( 0 ), TN( 4 ), RTEMS_RB_RED },
0417 { 2, TN( 3 ), NULL, TN( 5 ), RTEMS_RB_BLACK },
0418 { 2, TN( 4 ), NULL, NULL, RTEMS_RB_RED },
0419 { 3, NULL, TN( 3 ), TN( 11 ), RTEMS_RB_BLACK },
0420 { 4, TN( 11 ), NULL, NULL, RTEMS_RB_RED },
0421 { 5, TN( 6 ), TN( 8 ), TN( 10 ), RTEMS_RB_BLACK },
0422 { 5, TN( 11 ), NULL, NULL, RTEMS_RB_RED }
0423 };
0424
0425 static const TestNodeDescription random_ops_tree_unique_14[] = {
0426 { 3, TN( 5 ), NULL, NULL, RTEMS_RB_RED },
0427 { 5, TN( 6 ), TN( 3 ), NULL, RTEMS_RB_BLACK },
0428 { 6, NULL, TN( 5 ), TN( 12 ), RTEMS_RB_BLACK },
0429 { 8, TN( 12 ), NULL, NULL, RTEMS_RB_BLACK },
0430 { 12, TN( 6 ), TN( 8 ), TN( 13 ), RTEMS_RB_RED },
0431 { 13, TN( 12 ), NULL, NULL, RTEMS_RB_BLACK }
0432 };
0433
0434 static const TestNodeDescription random_ops_tree_multiple_14[] = {
0435 { 1, TN( 5 ), NULL, NULL, RTEMS_RB_RED },
0436 { 2, TN( 6 ), TN( 3 ), NULL, RTEMS_RB_BLACK },
0437 { 3, NULL, TN( 5 ), TN( 13 ), RTEMS_RB_BLACK },
0438 { 4, TN( 13 ), NULL, NULL, RTEMS_RB_BLACK },
0439 { 6, TN( 6 ), TN( 8 ), TN( 12 ), RTEMS_RB_RED },
0440 { 6, TN( 13 ), NULL, NULL, RTEMS_RB_BLACK }
0441 };
0442
0443 static const TestNodeDescription random_ops_tree_unique_15[] = {
0444 { 0, TN( 2 ), NULL, NULL, RTEMS_RB_RED },
0445 { 2, TN( 8 ), TN( 0 ), TN( 7 ), RTEMS_RB_BLACK },
0446 { 7, TN( 2 ), NULL, NULL, RTEMS_RB_RED },
0447 { 8, NULL, TN( 2 ), TN( 12 ), RTEMS_RB_BLACK },
0448 { 9, TN( 12 ), NULL, TN( 10 ), RTEMS_RB_BLACK },
0449 { 10, TN( 9 ), NULL, NULL, RTEMS_RB_RED },
0450 { 12, TN( 8 ), TN( 9 ), TN( 13 ), RTEMS_RB_RED },
0451 { 13, TN( 12 ), NULL, TN( 14 ), RTEMS_RB_BLACK },
0452 { 14, TN( 13 ), NULL, NULL, RTEMS_RB_RED }
0453 };
0454
0455 static const TestNodeDescription random_ops_tree_multiple_15[] = {
0456 { 0, TN( 2 ), NULL, NULL, RTEMS_RB_RED },
0457 { 1, TN( 9 ), TN( 0 ), TN( 7 ), RTEMS_RB_BLACK },
0458 { 3, TN( 2 ), NULL, NULL, RTEMS_RB_RED },
0459 { 4, NULL, TN( 2 ), TN( 10 ), RTEMS_RB_BLACK },
0460 { 4, TN( 10 ), NULL, NULL, RTEMS_RB_BLACK },
0461 { 5, TN( 9 ), TN( 8 ), TN( 12 ), RTEMS_RB_RED },
0462 { 6, TN( 12 ), NULL, NULL, RTEMS_RB_RED },
0463 { 6, TN( 10 ), TN( 13 ), TN( 14 ), RTEMS_RB_BLACK },
0464 { 7, TN( 12 ), NULL, NULL, RTEMS_RB_RED }
0465 };
0466
0467 static const TestNodeDescription random_ops_tree_unique_16[] = {
0468 { 0, TN( 5 ), NULL, TN( 3 ), RTEMS_RB_BLACK },
0469 { 3, TN( 0 ), NULL, NULL, RTEMS_RB_RED },
0470 { 5, TN( 10 ), TN( 0 ), TN( 7 ), RTEMS_RB_RED },
0471 { 7, TN( 5 ), NULL, NULL, RTEMS_RB_BLACK },
0472 { 10, NULL, TN( 5 ), TN( 12 ), RTEMS_RB_BLACK },
0473 { 12, TN( 10 ), NULL, NULL, RTEMS_RB_BLACK }
0474 };
0475
0476 static const TestNodeDescription random_ops_tree_multiple_16[] = {
0477 { 0, TN( 5 ), NULL, TN( 3 ), RTEMS_RB_BLACK },
0478 { 1, TN( 0 ), NULL, NULL, RTEMS_RB_RED },
0479 { 2, TN( 10 ), TN( 0 ), TN( 7 ), RTEMS_RB_RED },
0480 { 3, TN( 5 ), NULL, NULL, RTEMS_RB_BLACK },
0481 { 5, NULL, TN( 5 ), TN( 12 ), RTEMS_RB_BLACK },
0482 { 6, TN( 10 ), NULL, NULL, RTEMS_RB_BLACK }
0483 };
0484
0485 static const TestNodeDescription random_ops_tree_unique_17[] = {
0486 { 0, TN( 1 ), NULL, NULL, RTEMS_RB_RED },
0487 { 1, TN( 3 ), TN( 0 ), NULL, RTEMS_RB_BLACK },
0488 { 3, TN( 7 ), TN( 1 ), TN( 5 ), RTEMS_RB_RED },
0489 { 4, TN( 5 ), NULL, NULL, RTEMS_RB_RED },
0490 { 5, TN( 3 ), TN( 4 ), NULL, RTEMS_RB_BLACK },
0491 { 7, NULL, TN( 3 ), TN( 9 ), RTEMS_RB_BLACK },
0492 { 8, TN( 9 ), NULL, NULL, RTEMS_RB_BLACK },
0493 { 9, TN( 7 ), TN( 8 ), TN( 16 ), RTEMS_RB_RED },
0494 { 16, TN( 9 ), NULL, NULL, RTEMS_RB_BLACK }
0495 };
0496
0497 static const TestNodeDescription random_ops_tree_multiple_17[] = {
0498 { 0, TN( 0 ), NULL, NULL, RTEMS_RB_RED },
0499 { 0, TN( 3 ), TN( 1 ), NULL, RTEMS_RB_BLACK },
0500 { 1, TN( 7 ), TN( 0 ), TN( 5 ), RTEMS_RB_RED },
0501 { 2, TN( 3 ), NULL, TN( 4 ), RTEMS_RB_BLACK },
0502 { 2, TN( 5 ), NULL, NULL, RTEMS_RB_RED },
0503 { 3, NULL, TN( 3 ), TN( 8 ), RTEMS_RB_BLACK },
0504 { 4, TN( 8 ), NULL, NULL, RTEMS_RB_BLACK },
0505 { 4, TN( 7 ), TN( 9 ), TN( 16 ), RTEMS_RB_RED },
0506 { 8, TN( 8 ), NULL, NULL, RTEMS_RB_BLACK }
0507 };
0508
0509 static const TestNodeDescription random_ops_tree_unique_18[] = {
0510 { 0, TN( 2 ), NULL, TN( 1 ), RTEMS_RB_BLACK },
0511 { 1, TN( 0 ), NULL, NULL, RTEMS_RB_RED },
0512 { 2, TN( 4 ), TN( 0 ), TN( 3 ), RTEMS_RB_BLACK },
0513 { 3, TN( 2 ), NULL, NULL, RTEMS_RB_BLACK },
0514 { 4, NULL, TN( 2 ), TN( 12 ), RTEMS_RB_BLACK },
0515 { 5, TN( 6 ), NULL, NULL, RTEMS_RB_RED },
0516 { 6, TN( 8 ), TN( 5 ), TN( 7 ), RTEMS_RB_BLACK },
0517 { 7, TN( 6 ), NULL, NULL, RTEMS_RB_RED },
0518 { 8, TN( 12 ), TN( 6 ), TN( 10 ), RTEMS_RB_RED },
0519 { 9, TN( 10 ), NULL, NULL, RTEMS_RB_RED },
0520 { 10, TN( 8 ), TN( 9 ), NULL, RTEMS_RB_BLACK },
0521 { 12, TN( 4 ), TN( 8 ), TN( 17 ), RTEMS_RB_BLACK },
0522 { 14, TN( 17 ), NULL, NULL, RTEMS_RB_RED },
0523 { 17, TN( 12 ), TN( 14 ), NULL, RTEMS_RB_BLACK }
0524 };
0525
0526 static const TestNodeDescription random_ops_tree_multiple_18[] = {
0527 { 0, TN( 3 ), NULL, TN( 1 ), RTEMS_RB_BLACK },
0528 { 0, TN( 0 ), NULL, NULL, RTEMS_RB_RED },
0529 { 1, TN( 4 ), TN( 0 ), TN( 2 ), RTEMS_RB_BLACK },
0530 { 1, TN( 3 ), NULL, NULL, RTEMS_RB_BLACK },
0531 { 2, NULL, TN( 3 ), TN( 12 ), RTEMS_RB_BLACK },
0532 { 2, TN( 6 ), NULL, NULL, RTEMS_RB_RED },
0533 { 3, TN( 8 ), TN( 5 ), TN( 7 ), RTEMS_RB_BLACK },
0534 { 3, TN( 6 ), NULL, NULL, RTEMS_RB_RED },
0535 { 4, TN( 12 ), TN( 6 ), TN( 10 ), RTEMS_RB_RED },
0536 { 4, TN( 10 ), NULL, NULL, RTEMS_RB_RED },
0537 { 5, TN( 8 ), TN( 9 ), NULL, RTEMS_RB_BLACK },
0538 { 6, TN( 4 ), TN( 8 ), TN( 14 ), RTEMS_RB_BLACK },
0539 { 7, TN( 12 ), NULL, TN( 17 ), RTEMS_RB_BLACK },
0540 { 8, TN( 14 ), NULL, NULL, RTEMS_RB_RED }
0541 };
0542
0543 static const TestNodeDescription random_ops_tree_unique_19[] = {
0544 { 1, TN( 2 ), NULL, NULL, RTEMS_RB_RED },
0545 { 2, TN( 6 ), TN( 1 ), NULL, RTEMS_RB_BLACK },
0546 { 6, TN( 11 ), TN( 2 ), TN( 8 ), RTEMS_RB_BLACK },
0547 { 8, TN( 6 ), NULL, TN( 9 ), RTEMS_RB_BLACK },
0548 { 9, TN( 8 ), NULL, NULL, RTEMS_RB_RED },
0549 { 11, NULL, TN( 6 ), TN( 14 ), RTEMS_RB_BLACK },
0550 { 12, TN( 14 ), NULL, NULL, RTEMS_RB_BLACK },
0551 { 14, TN( 11 ), TN( 12 ), TN( 16 ), RTEMS_RB_BLACK },
0552 { 16, TN( 14 ), NULL, NULL, RTEMS_RB_BLACK }
0553 };
0554
0555 static const TestNodeDescription random_ops_tree_multiple_19[] = {
0556 { 0, TN( 2 ), NULL, NULL, RTEMS_RB_RED },
0557 { 1, TN( 6 ), TN( 1 ), NULL, RTEMS_RB_BLACK },
0558 { 3, TN( 11 ), TN( 2 ), TN( 9 ), RTEMS_RB_BLACK },
0559 { 4, TN( 6 ), NULL, TN( 8 ), RTEMS_RB_BLACK },
0560 { 4, TN( 9 ), NULL, NULL, RTEMS_RB_RED },
0561 { 5, NULL, TN( 6 ), TN( 14 ), RTEMS_RB_BLACK },
0562 { 6, TN( 14 ), NULL, NULL, RTEMS_RB_BLACK },
0563 { 7, TN( 11 ), TN( 12 ), TN( 16 ), RTEMS_RB_BLACK },
0564 { 8, TN( 14 ), NULL, NULL, RTEMS_RB_BLACK }
0565 };
0566
0567 static const TestNodeDescription random_ops_tree_unique_20[] = {
0568 { 0, TN( 3 ), NULL, TN( 1 ), RTEMS_RB_BLACK },
0569 { 1, TN( 0 ), NULL, NULL, RTEMS_RB_RED },
0570 { 3, TN( 9 ), TN( 0 ), TN( 7 ), RTEMS_RB_BLACK },
0571 { 4, TN( 7 ), NULL, NULL, RTEMS_RB_RED },
0572 { 7, TN( 3 ), TN( 4 ), NULL, RTEMS_RB_BLACK },
0573 { 9, NULL, TN( 3 ), TN( 12 ), RTEMS_RB_BLACK },
0574 { 10, TN( 12 ), NULL, NULL, RTEMS_RB_BLACK },
0575 { 12, TN( 9 ), TN( 10 ), TN( 17 ), RTEMS_RB_BLACK },
0576 { 14, TN( 17 ), NULL, NULL, RTEMS_RB_BLACK },
0577 { 17, TN( 12 ), TN( 14 ), TN( 18 ), RTEMS_RB_RED },
0578 { 18, TN( 17 ), NULL, TN( 19 ), RTEMS_RB_BLACK },
0579 { 19, TN( 18 ), NULL, NULL, RTEMS_RB_RED }
0580 };
0581
0582 static const TestNodeDescription random_ops_tree_multiple_20[] = {
0583 { 0, TN( 3 ), NULL, TN( 1 ), RTEMS_RB_BLACK },
0584 { 0, TN( 0 ), NULL, NULL, RTEMS_RB_RED },
0585 { 1, TN( 9 ), TN( 0 ), TN( 7 ), RTEMS_RB_BLACK },
0586 { 2, TN( 7 ), NULL, NULL, RTEMS_RB_RED },
0587 { 3, TN( 3 ), TN( 4 ), NULL, RTEMS_RB_BLACK },
0588 { 4, NULL, TN( 3 ), TN( 14 ), RTEMS_RB_BLACK },
0589 { 5, TN( 14 ), NULL, TN( 12 ), RTEMS_RB_BLACK },
0590 { 6, TN( 10 ), NULL, NULL, RTEMS_RB_RED },
0591 { 7, TN( 9 ), TN( 10 ), TN( 18 ), RTEMS_RB_BLACK },
0592 { 8, TN( 18 ), NULL, NULL, RTEMS_RB_RED },
0593 { 9, TN( 14 ), TN( 17 ), TN( 19 ), RTEMS_RB_BLACK },
0594 { 9, TN( 18 ), NULL, NULL, RTEMS_RB_RED }
0595 };
0596
0597 static const TestNodeDescription random_ops_tree_unique_21[] = {
0598 { 0, TN( 3 ), NULL, TN( 1 ), RTEMS_RB_BLACK },
0599 { 1, TN( 0 ), NULL, NULL, RTEMS_RB_RED },
0600 { 3, TN( 11 ), TN( 0 ), TN( 5 ), RTEMS_RB_BLACK },
0601 { 4, TN( 5 ), NULL, NULL, RTEMS_RB_BLACK },
0602 { 5, TN( 3 ), TN( 4 ), TN( 8 ), RTEMS_RB_RED },
0603 { 8, TN( 5 ), NULL, NULL, RTEMS_RB_BLACK },
0604 { 11, NULL, TN( 3 ), TN( 15 ), RTEMS_RB_BLACK },
0605 { 13, TN( 15 ), NULL, NULL, RTEMS_RB_BLACK },
0606 { 15, TN( 11 ), TN( 13 ), TN( 17 ), RTEMS_RB_BLACK },
0607 { 16, TN( 17 ), NULL, NULL, RTEMS_RB_RED },
0608 { 17, TN( 15 ), TN( 16 ), NULL, RTEMS_RB_BLACK }
0609 };
0610
0611 static const TestNodeDescription random_ops_tree_multiple_21[] = {
0612 { 0, TN( 3 ), NULL, TN( 1 ), RTEMS_RB_BLACK },
0613 { 0, TN( 0 ), NULL, NULL, RTEMS_RB_RED },
0614 { 1, TN( 8 ), TN( 0 ), TN( 4 ), RTEMS_RB_BLACK },
0615 { 2, TN( 3 ), NULL, TN( 5 ), RTEMS_RB_BLACK },
0616 { 2, TN( 4 ), NULL, NULL, RTEMS_RB_RED },
0617 { 4, NULL, TN( 3 ), TN( 13 ), RTEMS_RB_BLACK },
0618 { 5, TN( 13 ), NULL, NULL, RTEMS_RB_BLACK },
0619 { 6, TN( 8 ), TN( 11 ), TN( 17 ), RTEMS_RB_BLACK },
0620 { 7, TN( 17 ), NULL, NULL, RTEMS_RB_BLACK },
0621 { 8, TN( 13 ), TN( 15 ), TN( 16 ), RTEMS_RB_RED },
0622 { 8, TN( 17 ), NULL, NULL, RTEMS_RB_BLACK }
0623 };
0624
0625 static const TestNodeDescription random_ops_tree_unique_22[] = {
0626 { 1, TN( 3 ), NULL, TN( 2 ), RTEMS_RB_BLACK },
0627 { 2, TN( 1 ), NULL, NULL, RTEMS_RB_RED },
0628 { 3, TN( 8 ), TN( 1 ), TN( 7 ), RTEMS_RB_BLACK },
0629 { 4, TN( 7 ), NULL, NULL, RTEMS_RB_RED },
0630 { 7, TN( 3 ), TN( 4 ), NULL, RTEMS_RB_BLACK },
0631 { 8, NULL, TN( 3 ), TN( 14 ), RTEMS_RB_BLACK },
0632 { 10, TN( 11 ), NULL, NULL, RTEMS_RB_RED },
0633 { 11, TN( 14 ), TN( 10 ), NULL, RTEMS_RB_BLACK },
0634 { 14, TN( 8 ), TN( 11 ), TN( 18 ), RTEMS_RB_BLACK },
0635 { 15, TN( 18 ), NULL, NULL, RTEMS_RB_BLACK },
0636 { 18, TN( 14 ), TN( 15 ), TN( 21 ), RTEMS_RB_RED },
0637 { 21, TN( 18 ), NULL, NULL, RTEMS_RB_BLACK }
0638 };
0639
0640 static const TestNodeDescription random_ops_tree_multiple_22[] = {
0641 { 0, TN( 3 ), NULL, NULL, RTEMS_RB_BLACK },
0642 { 1, TN( 8 ), TN( 1 ), TN( 4 ), RTEMS_RB_BLACK },
0643 { 1, TN( 4 ), NULL, NULL, RTEMS_RB_BLACK },
0644 { 2, TN( 3 ), TN( 2 ), TN( 7 ), RTEMS_RB_RED },
0645 { 3, TN( 4 ), NULL, NULL, RTEMS_RB_BLACK },
0646 { 4, NULL, TN( 3 ), TN( 14 ), RTEMS_RB_BLACK },
0647 { 5, TN( 14 ), NULL, TN( 10 ), RTEMS_RB_BLACK },
0648 { 5, TN( 11 ), NULL, NULL, RTEMS_RB_RED },
0649 { 7, TN( 8 ), TN( 11 ), TN( 18 ), RTEMS_RB_BLACK },
0650 { 7, TN( 18 ), NULL, NULL, RTEMS_RB_BLACK },
0651 { 9, TN( 14 ), TN( 15 ), TN( 21 ), RTEMS_RB_RED },
0652 { 10, TN( 18 ), NULL, NULL, RTEMS_RB_BLACK }
0653 };
0654
0655 static const TestNodeDescription random_ops_tree_unique_23[] = {
0656 { 0, TN( 2 ), NULL, NULL, RTEMS_RB_RED },
0657 { 2, TN( 8 ), TN( 0 ), TN( 7 ), RTEMS_RB_BLACK },
0658 { 7, TN( 2 ), NULL, NULL, RTEMS_RB_RED },
0659 { 8, TN( 12 ), TN( 2 ), TN( 11 ), RTEMS_RB_BLACK },
0660 { 11, TN( 8 ), NULL, NULL, RTEMS_RB_BLACK },
0661 { 12, NULL, TN( 8 ), TN( 17 ), RTEMS_RB_BLACK },
0662 { 13, TN( 15 ), NULL, TN( 14 ), RTEMS_RB_BLACK },
0663 { 14, TN( 13 ), NULL, NULL, RTEMS_RB_RED },
0664 { 15, TN( 17 ), TN( 13 ), TN( 16 ), RTEMS_RB_RED },
0665 { 16, TN( 15 ), NULL, NULL, RTEMS_RB_BLACK },
0666 { 17, TN( 12 ), TN( 15 ), TN( 20 ), RTEMS_RB_BLACK },
0667 { 20, TN( 17 ), NULL, TN( 21 ), RTEMS_RB_BLACK },
0668 { 21, TN( 20 ), NULL, NULL, RTEMS_RB_RED }
0669 };
0670
0671 static const TestNodeDescription random_ops_tree_multiple_23[] = {
0672 { 0, TN( 2 ), NULL, NULL, RTEMS_RB_RED },
0673 { 1, TN( 8 ), TN( 0 ), TN( 7 ), RTEMS_RB_BLACK },
0674 { 3, TN( 2 ), NULL, NULL, RTEMS_RB_RED },
0675 { 4, TN( 12 ), TN( 2 ), TN( 11 ), RTEMS_RB_BLACK },
0676 { 5, TN( 8 ), NULL, NULL, RTEMS_RB_BLACK },
0677 { 6, NULL, TN( 8 ), TN( 17 ), RTEMS_RB_BLACK },
0678 { 6, TN( 15 ), NULL, NULL, RTEMS_RB_BLACK },
0679 { 7, TN( 17 ), TN( 13 ), TN( 16 ), RTEMS_RB_RED },
0680 { 7, TN( 16 ), NULL, NULL, RTEMS_RB_RED },
0681 { 8, TN( 15 ), TN( 14 ), NULL, RTEMS_RB_BLACK },
0682 { 8, TN( 12 ), TN( 15 ), TN( 20 ), RTEMS_RB_BLACK },
0683 { 10, TN( 17 ), NULL, TN( 21 ), RTEMS_RB_BLACK },
0684 { 10, TN( 20 ), NULL, NULL, RTEMS_RB_RED }
0685 };
0686
0687 static const TestNodeDescription random_ops_tree_unique_24[] = {
0688 { 4, TN( 6 ), NULL, TN( 5 ), RTEMS_RB_BLACK },
0689 { 5, TN( 4 ), NULL, NULL, RTEMS_RB_RED },
0690 { 6, TN( 14 ), TN( 4 ), TN( 10 ), RTEMS_RB_BLACK },
0691 { 8, TN( 10 ), NULL, NULL, RTEMS_RB_RED },
0692 { 10, TN( 6 ), TN( 8 ), NULL, RTEMS_RB_BLACK },
0693 { 14, NULL, TN( 6 ), TN( 20 ), RTEMS_RB_BLACK },
0694 { 15, TN( 16 ), NULL, NULL, RTEMS_RB_RED },
0695 { 16, TN( 20 ), TN( 15 ), NULL, RTEMS_RB_BLACK },
0696 { 20, TN( 14 ), TN( 16 ), TN( 22 ), RTEMS_RB_BLACK },
0697 { 22, TN( 20 ), NULL, NULL, RTEMS_RB_BLACK }
0698 };
0699
0700 static const TestNodeDescription random_ops_tree_multiple_24[] = {
0701 { 2, TN( 6 ), NULL, TN( 5 ), RTEMS_RB_BLACK },
0702 { 2, TN( 4 ), NULL, NULL, RTEMS_RB_RED },
0703 { 3, TN( 14 ), TN( 4 ), TN( 10 ), RTEMS_RB_BLACK },
0704 { 4, TN( 10 ), NULL, NULL, RTEMS_RB_RED },
0705 { 5, TN( 6 ), TN( 8 ), NULL, RTEMS_RB_BLACK },
0706 { 7, NULL, TN( 6 ), TN( 20 ), RTEMS_RB_BLACK },
0707 { 7, TN( 16 ), NULL, NULL, RTEMS_RB_RED },
0708 { 8, TN( 20 ), TN( 15 ), NULL, RTEMS_RB_BLACK },
0709 { 10, TN( 14 ), TN( 16 ), TN( 22 ), RTEMS_RB_BLACK },
0710 { 11, TN( 20 ), NULL, NULL, RTEMS_RB_BLACK }
0711 };
0712
0713 static const TestNodeDescription random_ops_tree_unique_25[] = {
0714 { 0, TN( 1 ), NULL, NULL, RTEMS_RB_RED },
0715 { 1, TN( 3 ), TN( 0 ), NULL, RTEMS_RB_BLACK },
0716 { 3, TN( 13 ), TN( 1 ), TN( 5 ), RTEMS_RB_BLACK },
0717 { 4, TN( 5 ), NULL, NULL, RTEMS_RB_BLACK },
0718 { 5, TN( 3 ), TN( 4 ), TN( 6 ), RTEMS_RB_RED },
0719 { 6, TN( 5 ), NULL, TN( 9 ), RTEMS_RB_BLACK },
0720 { 9, TN( 6 ), NULL, NULL, RTEMS_RB_RED },
0721 { 13, NULL, TN( 3 ), TN( 19 ), RTEMS_RB_BLACK },
0722 { 14, TN( 15 ), NULL, NULL, RTEMS_RB_RED },
0723 { 15, TN( 16 ), TN( 14 ), NULL, RTEMS_RB_BLACK },
0724 { 16, TN( 19 ), TN( 15 ), TN( 17 ), RTEMS_RB_RED },
0725 { 17, TN( 16 ), NULL, NULL, RTEMS_RB_BLACK },
0726 { 19, TN( 13 ), TN( 16 ), TN( 23 ), RTEMS_RB_BLACK },
0727 { 23, TN( 19 ), NULL, TN( 24 ), RTEMS_RB_BLACK },
0728 { 24, TN( 23 ), NULL, NULL, RTEMS_RB_RED }
0729 };
0730
0731 static const TestNodeDescription random_ops_tree_multiple_25[] = {
0732 { 0, TN( 3 ), NULL, TN( 1 ), RTEMS_RB_BLACK },
0733 { 0, TN( 0 ), NULL, NULL, RTEMS_RB_RED },
0734 { 1, TN( 13 ), TN( 0 ), TN( 4 ), RTEMS_RB_BLACK },
0735 { 2, TN( 4 ), NULL, NULL, RTEMS_RB_BLACK },
0736 { 2, TN( 3 ), TN( 5 ), TN( 6 ), RTEMS_RB_RED },
0737 { 3, TN( 4 ), NULL, TN( 9 ), RTEMS_RB_BLACK },
0738 { 4, TN( 6 ), NULL, NULL, RTEMS_RB_RED },
0739 { 6, NULL, TN( 3 ), TN( 19 ), RTEMS_RB_BLACK },
0740 { 7, TN( 17 ), NULL, TN( 14 ), RTEMS_RB_BLACK },
0741 { 7, TN( 15 ), NULL, NULL, RTEMS_RB_RED },
0742 { 8, TN( 19 ), TN( 15 ), TN( 16 ), RTEMS_RB_RED },
0743 { 8, TN( 17 ), NULL, NULL, RTEMS_RB_BLACK },
0744 { 9, TN( 13 ), TN( 17 ), TN( 23 ), RTEMS_RB_BLACK },
0745 { 11, TN( 19 ), NULL, TN( 24 ), RTEMS_RB_BLACK },
0746 { 12, TN( 23 ), NULL, NULL, RTEMS_RB_RED }
0747 };
0748
0749 static const TestNodeDescription random_ops_tree_unique_26[] = {
0750 { 0, TN( 1 ), NULL, NULL, RTEMS_RB_RED },
0751 { 1, TN( 3 ), TN( 0 ), NULL, RTEMS_RB_BLACK },
0752 { 3, TN( 11 ), TN( 1 ), TN( 9 ), RTEMS_RB_BLACK },
0753 { 6, TN( 9 ), NULL, NULL, RTEMS_RB_RED },
0754 { 9, TN( 3 ), TN( 6 ), TN( 10 ), RTEMS_RB_BLACK },
0755 { 10, TN( 9 ), NULL, NULL, RTEMS_RB_RED },
0756 { 11, NULL, TN( 3 ), TN( 14 ), RTEMS_RB_BLACK },
0757 { 12, TN( 14 ), NULL, TN( 13 ), RTEMS_RB_BLACK },
0758 { 13, TN( 12 ), NULL, NULL, RTEMS_RB_RED },
0759 { 14, TN( 11 ), TN( 12 ), TN( 20 ), RTEMS_RB_BLACK },
0760 { 18, TN( 20 ), NULL, NULL, RTEMS_RB_BLACK },
0761 { 20, TN( 14 ), TN( 18 ), TN( 23 ), RTEMS_RB_RED },
0762 { 21, TN( 23 ), NULL, NULL, RTEMS_RB_RED },
0763 { 23, TN( 20 ), TN( 21 ), NULL, RTEMS_RB_BLACK }
0764 };
0765
0766 static const TestNodeDescription random_ops_tree_multiple_26[] = {
0767 { 0, TN( 3 ), NULL, TN( 0 ), RTEMS_RB_BLACK },
0768 { 0, TN( 1 ), NULL, NULL, RTEMS_RB_RED },
0769 { 1, TN( 9 ), TN( 1 ), TN( 6 ), RTEMS_RB_BLACK },
0770 { 3, TN( 3 ), NULL, NULL, RTEMS_RB_BLACK },
0771 { 4, NULL, TN( 3 ), TN( 14 ), RTEMS_RB_BLACK },
0772 { 5, TN( 12 ), NULL, TN( 10 ), RTEMS_RB_BLACK },
0773 { 5, TN( 11 ), NULL, NULL, RTEMS_RB_RED },
0774 { 6, TN( 14 ), TN( 11 ), TN( 13 ), RTEMS_RB_RED },
0775 { 6, TN( 12 ), NULL, NULL, RTEMS_RB_BLACK },
0776 { 7, TN( 9 ), TN( 12 ), TN( 20 ), RTEMS_RB_BLACK },
0777 { 9, TN( 20 ), NULL, NULL, RTEMS_RB_BLACK },
0778 { 10, TN( 14 ), TN( 18 ), TN( 23 ), RTEMS_RB_RED },
0779 { 10, TN( 23 ), NULL, NULL, RTEMS_RB_RED },
0780 { 11, TN( 20 ), TN( 21 ), NULL, RTEMS_RB_BLACK }
0781 };
0782
0783 static const TestNodeDescription random_ops_tree_unique_27[] = {
0784 { 3, TN( 8 ), NULL, NULL, RTEMS_RB_BLACK },
0785 { 8, TN( 19 ), TN( 3 ), TN( 17 ), RTEMS_RB_BLACK },
0786 { 12, TN( 17 ), NULL, NULL, RTEMS_RB_RED },
0787 { 17, TN( 8 ), TN( 12 ), NULL, RTEMS_RB_BLACK },
0788 { 19, NULL, TN( 8 ), TN( 24 ), RTEMS_RB_BLACK },
0789 { 20, TN( 21 ), NULL, NULL, RTEMS_RB_RED },
0790 { 21, TN( 24 ), TN( 20 ), TN( 23 ), RTEMS_RB_BLACK },
0791 { 23, TN( 21 ), NULL, NULL, RTEMS_RB_RED },
0792 { 24, TN( 19 ), TN( 21 ), TN( 25 ), RTEMS_RB_BLACK },
0793 { 25, TN( 24 ), NULL, TN( 26 ), RTEMS_RB_BLACK },
0794 { 26, TN( 25 ), NULL, NULL, RTEMS_RB_RED }
0795 };
0796
0797 static const TestNodeDescription random_ops_tree_multiple_27[] = {
0798 { 1, TN( 8 ), NULL, NULL, RTEMS_RB_BLACK },
0799 { 4, TN( 19 ), TN( 3 ), TN( 17 ), RTEMS_RB_BLACK },
0800 { 6, TN( 17 ), NULL, NULL, RTEMS_RB_RED },
0801 { 8, TN( 8 ), TN( 12 ), NULL, RTEMS_RB_BLACK },
0802 { 9, NULL, TN( 8 ), TN( 25 ), RTEMS_RB_BLACK },
0803 { 10, TN( 21 ), NULL, NULL, RTEMS_RB_RED },
0804 { 10, TN( 25 ), TN( 20 ), TN( 23 ), RTEMS_RB_BLACK },
0805 { 11, TN( 21 ), NULL, NULL, RTEMS_RB_RED },
0806 { 12, TN( 19 ), TN( 21 ), TN( 24 ), RTEMS_RB_BLACK },
0807 { 12, TN( 25 ), NULL, TN( 26 ), RTEMS_RB_BLACK },
0808 { 13, TN( 24 ), NULL, NULL, RTEMS_RB_RED }
0809 };
0810
0811 static const TestNodeDescription random_ops_tree_unique_28[] = {
0812 { 0, TN( 5 ), NULL, NULL, RTEMS_RB_BLACK },
0813 { 5, TN( 13 ), TN( 0 ), TN( 7 ), RTEMS_RB_RED },
0814 { 7, TN( 5 ), NULL, NULL, RTEMS_RB_BLACK },
0815 { 13, NULL, TN( 5 ), TN( 17 ), RTEMS_RB_BLACK },
0816 { 15, TN( 17 ), NULL, NULL, RTEMS_RB_BLACK },
0817 { 17, TN( 13 ), TN( 15 ), TN( 26 ), RTEMS_RB_RED },
0818 { 21, TN( 26 ), NULL, NULL, RTEMS_RB_RED },
0819 { 26, TN( 17 ), TN( 21 ), NULL, RTEMS_RB_BLACK }
0820 };
0821
0822 static const TestNodeDescription random_ops_tree_multiple_28[] = {
0823 { 0, TN( 5 ), NULL, NULL, RTEMS_RB_BLACK },
0824 { 2, TN( 13 ), TN( 0 ), TN( 7 ), RTEMS_RB_RED },
0825 { 3, TN( 5 ), NULL, NULL, RTEMS_RB_BLACK },
0826 { 6, NULL, TN( 5 ), TN( 17 ), RTEMS_RB_BLACK },
0827 { 7, TN( 17 ), NULL, NULL, RTEMS_RB_BLACK },
0828 { 8, TN( 13 ), TN( 15 ), TN( 26 ), RTEMS_RB_RED },
0829 { 10, TN( 26 ), NULL, NULL, RTEMS_RB_RED },
0830 { 13, TN( 17 ), TN( 21 ), NULL, RTEMS_RB_BLACK }
0831 };
0832
0833 static const TestNodeDescription random_ops_tree_unique_29[] = {
0834 { 0, TN( 3 ), NULL, TN( 1 ), RTEMS_RB_BLACK },
0835 { 1, TN( 0 ), NULL, NULL, RTEMS_RB_RED },
0836 { 3, TN( 12 ), TN( 0 ), TN( 6 ), RTEMS_RB_BLACK },
0837 { 4, TN( 6 ), NULL, NULL, RTEMS_RB_BLACK },
0838 { 6, TN( 3 ), TN( 4 ), TN( 8 ), RTEMS_RB_RED },
0839 { 7, TN( 8 ), NULL, NULL, RTEMS_RB_RED },
0840 { 8, TN( 6 ), TN( 7 ), TN( 11 ), RTEMS_RB_BLACK },
0841 { 11, TN( 8 ), NULL, NULL, RTEMS_RB_RED },
0842 { 12, NULL, TN( 3 ), TN( 17 ), RTEMS_RB_BLACK },
0843 { 13, TN( 17 ), NULL, TN( 14 ), RTEMS_RB_BLACK },
0844 { 14, TN( 13 ), NULL, NULL, RTEMS_RB_RED },
0845 { 17, TN( 12 ), TN( 13 ), TN( 25 ), RTEMS_RB_BLACK },
0846 { 22, TN( 25 ), NULL, NULL, RTEMS_RB_RED },
0847 { 25, TN( 17 ), TN( 22 ), TN( 27 ), RTEMS_RB_BLACK },
0848 { 27, TN( 25 ), NULL, NULL, RTEMS_RB_RED }
0849 };
0850
0851 static const TestNodeDescription random_ops_tree_multiple_29[] = {
0852 { 0, TN( 3 ), NULL, TN( 1 ), RTEMS_RB_BLACK },
0853 { 0, TN( 0 ), NULL, NULL, RTEMS_RB_RED },
0854 { 1, TN( 11 ), TN( 0 ), TN( 6 ), RTEMS_RB_BLACK },
0855 { 2, TN( 6 ), NULL, NULL, RTEMS_RB_BLACK },
0856 { 3, TN( 3 ), TN( 4 ), TN( 7 ), RTEMS_RB_RED },
0857 { 3, TN( 6 ), NULL, TN( 8 ), RTEMS_RB_BLACK },
0858 { 4, TN( 7 ), NULL, NULL, RTEMS_RB_RED },
0859 { 5, NULL, TN( 3 ), TN( 22 ), RTEMS_RB_BLACK },
0860 { 6, TN( 12 ), NULL, NULL, RTEMS_RB_BLACK },
0861 { 6, TN( 22 ), TN( 13 ), TN( 17 ), RTEMS_RB_RED },
0862 { 7, TN( 17 ), NULL, NULL, RTEMS_RB_RED },
0863 { 8, TN( 12 ), TN( 14 ), NULL, RTEMS_RB_BLACK },
0864 { 11, TN( 11 ), TN( 12 ), TN( 25 ), RTEMS_RB_BLACK },
0865 { 12, TN( 22 ), NULL, TN( 27 ), RTEMS_RB_BLACK },
0866 { 13, TN( 25 ), NULL, NULL, RTEMS_RB_RED }
0867 };
0868
0869 static const TestNodeDescription random_ops_tree_unique_30[] = {
0870 { 0, TN( 4 ), NULL, NULL, RTEMS_RB_RED },
0871 { 4, TN( 6 ), TN( 0 ), NULL, RTEMS_RB_BLACK },
0872 { 6, TN( 13 ), TN( 4 ), TN( 9 ), RTEMS_RB_RED },
0873 { 8, TN( 9 ), NULL, NULL, RTEMS_RB_RED },
0874 { 9, TN( 6 ), TN( 8 ), TN( 12 ), RTEMS_RB_BLACK },
0875 { 12, TN( 9 ), NULL, NULL, RTEMS_RB_RED },
0876 { 13, NULL, TN( 6 ), TN( 18 ), RTEMS_RB_BLACK },
0877 { 14, TN( 16 ), NULL, NULL, RTEMS_RB_RED },
0878 { 16, TN( 18 ), TN( 14 ), TN( 17 ), RTEMS_RB_BLACK },
0879 { 17, TN( 16 ), NULL, NULL, RTEMS_RB_RED },
0880 { 18, TN( 13 ), TN( 16 ), TN( 27 ), RTEMS_RB_RED },
0881 { 20, TN( 27 ), NULL, NULL, RTEMS_RB_RED },
0882 { 27, TN( 18 ), TN( 20 ), TN( 28 ), RTEMS_RB_BLACK },
0883 { 28, TN( 27 ), NULL, NULL, RTEMS_RB_RED }
0884 };
0885
0886 static const TestNodeDescription random_ops_tree_multiple_30[] = {
0887 { 0, TN( 4 ), NULL, NULL, RTEMS_RB_BLACK },
0888 { 2, TN( 13 ), TN( 0 ), TN( 9 ), RTEMS_RB_RED },
0889 { 3, TN( 9 ), NULL, NULL, RTEMS_RB_RED },
0890 { 4, TN( 4 ), TN( 6 ), TN( 8 ), RTEMS_RB_BLACK },
0891 { 4, TN( 9 ), NULL, NULL, RTEMS_RB_RED },
0892 { 6, TN( 14 ), TN( 4 ), TN( 12 ), RTEMS_RB_BLACK },
0893 { 6, TN( 13 ), NULL, NULL, RTEMS_RB_BLACK },
0894 { 7, NULL, TN( 13 ), TN( 18 ), RTEMS_RB_BLACK },
0895 { 8, TN( 18 ), NULL, TN( 16 ), RTEMS_RB_BLACK },
0896 { 8, TN( 17 ), NULL, NULL, RTEMS_RB_RED },
0897 { 9, TN( 14 ), TN( 17 ), TN( 27 ), RTEMS_RB_BLACK },
0898 { 10, TN( 27 ), NULL, NULL, RTEMS_RB_RED },
0899 { 13, TN( 18 ), TN( 20 ), TN( 28 ), RTEMS_RB_BLACK },
0900 { 14, TN( 27 ), NULL, NULL, RTEMS_RB_RED }
0901 };
0902
0903 static const TestNodeDescription random_ops_tree_unique_31[] = {
0904 { 0, TN( 2 ), NULL, NULL, RTEMS_RB_RED },
0905 { 2, TN( 5 ), TN( 0 ), NULL, RTEMS_RB_BLACK },
0906 { 5, TN( 11 ), TN( 2 ), TN( 9 ), RTEMS_RB_BLACK },
0907 { 7, TN( 9 ), NULL, NULL, RTEMS_RB_RED },
0908 { 9, TN( 5 ), TN( 7 ), NULL, RTEMS_RB_BLACK },
0909 { 11, NULL, TN( 5 ), TN( 21 ), RTEMS_RB_BLACK },
0910 { 14, TN( 16 ), NULL, NULL, RTEMS_RB_RED },
0911 { 16, TN( 21 ), TN( 14 ), TN( 18 ), RTEMS_RB_BLACK },
0912 { 18, TN( 16 ), NULL, NULL, RTEMS_RB_RED },
0913 { 21, TN( 11 ), TN( 16 ), TN( 30 ), RTEMS_RB_BLACK },
0914 { 30, TN( 21 ), NULL, NULL, RTEMS_RB_BLACK }
0915 };
0916
0917 static const TestNodeDescription random_ops_tree_multiple_31[] = {
0918 { 0, TN( 2 ), NULL, NULL, RTEMS_RB_RED },
0919 { 1, TN( 5 ), TN( 0 ), NULL, RTEMS_RB_BLACK },
0920 { 2, TN( 11 ), TN( 2 ), TN( 9 ), RTEMS_RB_BLACK },
0921 { 3, TN( 9 ), NULL, NULL, RTEMS_RB_RED },
0922 { 4, TN( 5 ), TN( 7 ), NULL, RTEMS_RB_BLACK },
0923 { 5, NULL, TN( 5 ), TN( 21 ), RTEMS_RB_BLACK },
0924 { 7, TN( 16 ), NULL, NULL, RTEMS_RB_RED },
0925 { 8, TN( 21 ), TN( 14 ), TN( 18 ), RTEMS_RB_BLACK },
0926 { 9, TN( 16 ), NULL, NULL, RTEMS_RB_RED },
0927 { 10, TN( 11 ), TN( 16 ), TN( 30 ), RTEMS_RB_BLACK },
0928 { 15, TN( 21 ), NULL, NULL, RTEMS_RB_BLACK }
0929 };
0930
0931 #define RANDOM_OPS_TREE( i ) \
0932 { &random_ops_tree_multiple_##i[ 0 ], &random_ops_tree_unique_##i[ 0 ] }
0933
0934 static const TestNodeDescription *const random_ops_trees[][2] = {
0935 RANDOM_OPS_TREE( 1 ),
0936 RANDOM_OPS_TREE( 2 ),
0937 RANDOM_OPS_TREE( 3 ),
0938 RANDOM_OPS_TREE( 4 ),
0939 RANDOM_OPS_TREE( 5 ),
0940 RANDOM_OPS_TREE( 6 ),
0941 RANDOM_OPS_TREE( 7 ),
0942 RANDOM_OPS_TREE( 8 ),
0943 RANDOM_OPS_TREE( 9 ),
0944 RANDOM_OPS_TREE( 10 ),
0945 RANDOM_OPS_TREE( 11 ),
0946 RANDOM_OPS_TREE( 12 ),
0947 RANDOM_OPS_TREE( 13 ),
0948 RANDOM_OPS_TREE( 14 ),
0949 RANDOM_OPS_TREE( 15 ),
0950 RANDOM_OPS_TREE( 16 ),
0951 RANDOM_OPS_TREE( 17 ),
0952 RANDOM_OPS_TREE( 18 ),
0953 RANDOM_OPS_TREE( 19 ),
0954 RANDOM_OPS_TREE( 20 ),
0955 RANDOM_OPS_TREE( 21 ),
0956 RANDOM_OPS_TREE( 22 ),
0957 RANDOM_OPS_TREE( 23 ),
0958 RANDOM_OPS_TREE( 24 ),
0959 RANDOM_OPS_TREE( 25 ),
0960 RANDOM_OPS_TREE( 26 ),
0961 RANDOM_OPS_TREE( 27 ),
0962 RANDOM_OPS_TREE( 28 ),
0963 RANDOM_OPS_TREE( 29 ),
0964 RANDOM_OPS_TREE( 30 ),
0965 RANDOM_OPS_TREE( 31 )
0966 };
0967
0968 #define RANDOM_OPS_TREE_COUNT( i ) \
0969 { \
0970 RTEMS_ARRAY_SIZE( random_ops_tree_multiple_##i ), \
0971 RTEMS_ARRAY_SIZE( random_ops_tree_unique_##i ) \
0972 }
0973
0974 static const size_t random_ops_tree_counts[][2] = {
0975 RANDOM_OPS_TREE_COUNT( 1 ),
0976 RANDOM_OPS_TREE_COUNT( 2 ),
0977 RANDOM_OPS_TREE_COUNT( 3 ),
0978 RANDOM_OPS_TREE_COUNT( 4 ),
0979 RANDOM_OPS_TREE_COUNT( 5 ),
0980 RANDOM_OPS_TREE_COUNT( 6 ),
0981 RANDOM_OPS_TREE_COUNT( 7 ),
0982 RANDOM_OPS_TREE_COUNT( 8 ),
0983 RANDOM_OPS_TREE_COUNT( 9 ),
0984 RANDOM_OPS_TREE_COUNT( 10 ),
0985 RANDOM_OPS_TREE_COUNT( 11 ),
0986 RANDOM_OPS_TREE_COUNT( 12 ),
0987 RANDOM_OPS_TREE_COUNT( 13 ),
0988 RANDOM_OPS_TREE_COUNT( 14 ),
0989 RANDOM_OPS_TREE_COUNT( 15 ),
0990 RANDOM_OPS_TREE_COUNT( 16 ),
0991 RANDOM_OPS_TREE_COUNT( 17 ),
0992 RANDOM_OPS_TREE_COUNT( 18 ),
0993 RANDOM_OPS_TREE_COUNT( 19 ),
0994 RANDOM_OPS_TREE_COUNT( 20 ),
0995 RANDOM_OPS_TREE_COUNT( 21 ),
0996 RANDOM_OPS_TREE_COUNT( 22 ),
0997 RANDOM_OPS_TREE_COUNT( 23 ),
0998 RANDOM_OPS_TREE_COUNT( 24 ),
0999 RANDOM_OPS_TREE_COUNT( 25 ),
1000 RANDOM_OPS_TREE_COUNT( 26 ),
1001 RANDOM_OPS_TREE_COUNT( 27 ),
1002 RANDOM_OPS_TREE_COUNT( 28 ),
1003 RANDOM_OPS_TREE_COUNT( 29 ),
1004 RANDOM_OPS_TREE_COUNT( 30 ),
1005 RANDOM_OPS_TREE_COUNT( 31 )
1006 };
1007
1008 static uint32_t SimpleRandom( uint32_t v )
1009 {
1010 v *= 1664525;
1011 v += 1013904223;
1012
1013 return v;
1014 }
1015
1016 static void RandomOps( size_t n, bool unique )
1017 {
1018 VisitorContext ctx = {
1019 .current = 0,
1020 .count = random_ops_tree_counts[ n - 1 ][ unique ],
1021 .tree = random_ops_trees[ n - 1 ][ unique ]
1022 };
1023 RBTree_Control tree;
1024 TestNode *nodes;
1025 size_t m;
1026 size_t s;
1027 uint32_t v;
1028 size_t i;
1029
1030 nodes = &node_array[ 0 ];
1031 m = n * n * n;
1032 s = unique ? 1 : 2;
1033 v = 0xdeadbeef;
1034 _RBTree_Initialize_empty( &tree );
1035
1036 memset( nodes, 0, n * sizeof( *nodes ) );
1037
1038 for ( i = 0; i < n; ++i ) {
1039 nodes[ i ].key = (int) ( i / s );
1040 }
1041
1042 for ( i = 0; i < m; ++i ) {
1043 size_t j = ( v >> 13 ) % n;
1044 TestNode *tn = &nodes[ j ];
1045
1046 if ( tn->id == 0 ) {
1047 tn->id = 1;
1048 _RBTree_Initialize_node( &tn->Node );
1049 _RBTree_Insert_inline( &tree, &tn->Node, &tn->key, Less );
1050 } else {
1051 tn->id = 0;
1052 _RBTree_Extract( &tree, &tn->Node );
1053 }
1054
1055 T_ne_int( VerifyTree( _RBTree_Root( &tree ) ), -1 );
1056
1057 v = SimpleRandom( v );
1058 }
1059
1060 _RBTree_Iterate( &tree, VisitNodes, &ctx );
1061 T_true( ctx.current == ctx.count );
1062 }
1063
1064
1065
1066
1067 static void ScoreRbtreeUnitRbtree_Action_0( void )
1068 {
1069 RBTree_Control tree;
1070 RBTree_Node node;
1071
1072 _RBTree_Initialize_node( &node );
1073 _RBTree_Initialize_one( &tree, &node );
1074
1075
1076
1077
1078 T_false( _RBTree_Is_empty( &tree ) );
1079
1080
1081
1082
1083 T_true( _RBTree_Is_root( &node ) );
1084
1085
1086
1087
1088 T_false( _RBTree_Is_node_off_tree( &node ) );
1089
1090
1091
1092
1093 T_null( _RBTree_Left( &node ) );
1094
1095
1096
1097
1098 T_null( _RBTree_Right( &node ) );
1099
1100
1101
1102
1103 T_null( _RBTree_Parent( &node ) );
1104
1105
1106
1107
1108 T_null( _RBTree_Successor( &node ) );
1109
1110
1111
1112
1113 T_null( _RBTree_Predecessor( &node ) );
1114
1115
1116
1117
1118 T_eq_ptr( _RBTree_Minimum( &tree ), &node );
1119
1120
1121
1122
1123 T_eq_ptr( _RBTree_Maximum( &tree ), &node );
1124
1125
1126
1127
1128 _RBTree_Extract( &tree, &node );
1129 T_true( _RBTree_Is_empty( &tree ) );
1130 }
1131
1132
1133
1134
1135
1136 static void ScoreRbtreeUnitRbtree_Action_1( void )
1137 {
1138 RBTree_Control tree;
1139 TestNode a;
1140 TestNode b;
1141 TestNode c;
1142 bool is_new_minimum;
1143
1144 _RBTree_Initialize_empty( &tree );
1145
1146
1147
1148
1149 _RBTree_Initialize_node( &b.Node );
1150 b.key = 2;
1151 is_new_minimum = _RBTree_Insert_inline( &tree, &b.Node, &b.key, Less );
1152 T_true( is_new_minimum );
1153
1154
1155
1156
1157 _RBTree_Initialize_node( &c.Node );
1158 c.key = 3;
1159 is_new_minimum = _RBTree_Insert_inline( &tree, &c.Node, &c.key, Less );
1160 T_false( is_new_minimum );
1161
1162
1163
1164
1165 _RBTree_Initialize_node( &a.Node );
1166 a.key = 1;
1167 is_new_minimum = _RBTree_Insert_inline( &tree, &a.Node, &a.key, Less );
1168 T_true( is_new_minimum );
1169 }
1170
1171
1172
1173
1174
1175 static void ScoreRbtreeUnitRbtree_Action_2( void )
1176 {
1177 size_t n;
1178
1179 for ( n = 0; n < RTEMS_ARRAY_SIZE( random_ops_trees ); ++n ) {
1180 RandomOps( n + 1, true );
1181 RandomOps( n + 1, false );
1182 }
1183 }
1184
1185
1186
1187
1188 T_TEST_CASE( ScoreRbtreeUnitRbtree )
1189 {
1190 ScoreRbtreeUnitRbtree_Action_0();
1191 ScoreRbtreeUnitRbtree_Action_1();
1192 ScoreRbtreeUnitRbtree_Action_2();
1193 }
1194
1195