source: rtems/testsuites/sptests/sprbtree01/init.c @ f53aa8d

4.115
Last change on this file since f53aa8d was f53aa8d, checked in by Gedare Bloom <gedare@…>, on 05/03/12 at 16:43:29

rbtree: API changes. Remove rbtree control node from RBTree_Next.

The implementation of RBTree_Next was using an awkward construction to detect
and avoid accessing the false root of the red-black tree. To deal with the
false root, RBTree_Next was comparing node parents with the control node.
Instead the false root can be detected by checking if the grandparent of a
node exists; the grandparent of the tree's true root is NULL by definition
so the root of the tree is found while walking up the tree by checking for
the non-existence of a grandparent.

This change propagates into the predecessor/successor and iterate functions.

  • Property mode set to 100644
File size: 19.3 KB
Line 
1/*
2 * Copyright (c) 2010 Gedare Bloom.
3 *
4 *  The license and distribution terms for this file may be
5 *  found in the file LICENSE in this distribution or at
6 *  http://www.rtems.com/license/LICENSE.
7 *
8 *  $Id$
9 */
10
11#ifdef HAVE_CONFIG_H
12#include "config.h"
13#endif
14
15#include <tmacros.h>
16#include <rtems/rbtree.h>
17
18int numbers[20] = {
1952, 99, 0, 85, 43, 44, 10, 60, 50, 19, 8, 68, 48, 57, 17, 67, 90, 12, 77, 71};
20
21int numbers_sorted[20] = {
22  0, 8, 10, 12, 17, 19, 43, 44, 48, 50, 52, 57, 60, 67, 68, 71, 77, 85, 90, 99};
23
24typedef struct {
25  int              id;
26  int              key;
27  rtems_rbtree_node Node;
28} test_node;
29
30static int test_compare_function (
31  const rtems_rbtree_node *n1,
32  const rtems_rbtree_node *n2
33)
34{
35  int key1 = rtems_rbtree_container_of( n1, test_node, Node )->key;
36  int key2 = rtems_rbtree_container_of( n2, test_node, Node )->key;
37
38  return key1 - key2;
39}
40
41/*
42 * recursively checks tree. if the tree is built properly it should only
43 * be a depth of 7 function calls for 100 entries in the tree.
44 */
45static int rb_assert ( rtems_rbtree_node *root )
46{
47  int lh, rh;
48
49  if ( root == NULL )
50    return 1;
51  else {
52    rtems_rbtree_node *ln = rtems_rbtree_left(root);
53    rtems_rbtree_node *rn = rtems_rbtree_right(root);
54
55    /* Consecutive red links */
56    if ( root->color == RBT_RED ) {
57      if ((ln && ln->color == RBT_RED)  || (rn && rn->color == RBT_RED)) {
58        puts ( "Red violation" );
59        return -1;
60      }
61    }
62
63      lh = rb_assert ( ln );
64      rh = rb_assert ( rn );
65
66    /* Invalid binary search tree */
67    if ( ( ln != NULL && test_compare_function(ln, root) > 0 )
68        || ( rn != NULL && test_compare_function(rn, root) < 0 ) )
69    {
70      puts ( "Binary tree violation" );
71      return -1;
72    }
73
74    /* Black height mismatch */
75    if ( lh != -1 && rh != -1 && lh != rh ) {
76      puts ( "Black violation" );
77      return -1;
78    }
79
80    /* Only count black links */
81    if ( lh != -1 && rh != -1 )
82      return ( root->color == RBT_RED ) ? lh : lh + 1;
83    else
84      return -1;
85  }
86}
87
88
89
90rtems_task Init(
91    rtems_task_argument ignored
92    )
93{
94  rtems_rbtree_control  rbtree1;
95  rtems_rbtree_node    *p;
96  test_node            node1, node2;
97  test_node            node_array[100];
98  test_node            search_node;
99  int                  id;
100  int i;
101
102  puts( "\n\n*** TEST OF RTEMS RBTREE API ***" );
103
104  puts( "Init - Initialize rbtree empty" );
105  rtems_rbtree_initialize_empty( &rbtree1, &test_compare_function, true );
106
107  if ( !rtems_rbtree_is_unique( &rbtree1 ) )
108    puts( "INIT - FAILED IS UNIQUE CHECK" );
109  if ( rtems_rbtree_is_unique( NULL ) )
110    puts( "INIT - FAILED IS UNIQUE CHECK" );
111
112  /* verify that the rbtree insert work */
113  puts( "INIT - Verify rtems_rbtree_insert with two nodes" );
114  node1.id = 1;
115  node1.key = 1;
116  node2.id = 2;
117  node2.key = 2;
118  rtems_rbtree_insert( &rbtree1, &node1.Node );
119  rtems_rbtree_insert( &rbtree1, &node2.Node );
120
121  p = rtems_rbtree_insert( &rbtree1, NULL );
122  if (p != (void *)(-1))
123    puts( "INIT - FAILED NULL NODE INSERT" );
124
125  _RBTree_Rotate(NULL, RBT_LEFT);
126  i = (node1.Node.parent == &node2.Node);
127  _RBTree_Rotate( &node1.Node,
128                  !node1.Node.child[RBT_LEFT] ? RBT_RIGHT : RBT_LEFT
129                );
130  if ( (node1.Node.parent == &node2.Node) != i )
131    puts( "INIT - FAILED FALSE ROTATION" );
132
133  if (!rb_assert(rbtree1.root) )
134    puts( "INIT - FAILED TREE CHECK" );
135
136  for ( p = rtems_rbtree_get_min(&rbtree1), id = 1 ; p ;
137      p = rtems_rbtree_get_min(&rbtree1) , id++ ) {
138    test_node *t = rtems_rbtree_container_of(p,test_node,Node);
139    if ( id > 2 ) {
140      puts( "INIT - TOO MANY NODES ON RBTREE" );
141      rtems_test_exit(0);
142    }
143    if ( t->id != id ) {
144      puts( "INIT - ERROR ON RBTREE ID MISMATCH" );
145      rtems_test_exit(0);
146    }
147
148    if (!rb_assert(rbtree1.root) )
149      puts( "INIT - FAILED TREE CHECK" );
150  }
151  if (id < 2) {
152    puts("INIT - NOT ENOUGH NODES ON RBTREE");
153    rtems_test_exit(0);
154  }
155
156  puts("INIT - Verify rtems_rbtree_insert with the same value twice");
157  node2.key = node1.key;
158  rtems_rbtree_insert(&rbtree1, &node1.Node);
159  p = rtems_rbtree_insert(&rbtree1, &node2.Node);
160
161  if (p != &node1.Node)
162    puts( "INIT - FAILED DUPLICATE INSERT" );
163
164  for ( p = rtems_rbtree_get_min(&rbtree1), id = 1 ; p ;
165      p = rtems_rbtree_get_min(&rbtree1) , id++ ) {
166    test_node *t = rtems_rbtree_container_of(p,test_node,Node);
167    if ( id > 1 ) {
168      puts( "INIT - TOO MANY NODES ON RBTREE" );
169      rtems_test_exit(0);
170    }
171    if ( t->id != id ) {
172      puts( "INIT - ERROR ON RBTREE ID MISMATCH" );
173      rtems_test_exit(0);
174    }
175
176    if (!rb_assert(rbtree1.root) )
177      puts( "INIT - FAILED TREE CHECK" );
178  }
179  if (id < 1) {
180    puts("INIT - NOT ENOUGH NODES ON RBTREE");
181    rtems_test_exit(0);
182  }
183  node2.key = 2;
184
185  /* verify that the rbtree is empty */
186  puts( "INIT - Verify rtems_rbtree_is_empty" );
187  if(!rtems_rbtree_is_empty(&rbtree1)) {
188    puts( "INIT - TREE NOT EMPTY" );
189    rtems_test_exit(0);
190  }
191
192  puts( "INIT - Verify rtems_XXX on an empty tree" );
193  if(rtems_rbtree_get_min(&rbtree1)) {
194    puts("INIT - get_min on empty returned non-NULL");
195    rtems_test_exit(0);
196  }
197  if(rtems_rbtree_get_max(&rbtree1)) {
198    puts("INIT - get_max on empty returned non-NULL");
199    rtems_test_exit(0);
200  }
201  if(rtems_rbtree_peek_min(&rbtree1)) {
202    puts("INIT - peek_min on empty returned non-NULL");
203    rtems_test_exit(0);
204  }
205  if(rtems_rbtree_peek_max(&rbtree1)) {
206    puts("INIT - peek_max on empty returned non-NULL");
207    rtems_test_exit(0);
208  }
209
210
211  /* verify that the rbtree insert works after a tree is emptied */
212  puts( "INIT - Verify rtems_rbtree_insert after empty tree" );
213  node1.id = 2;
214  node1.key = 2;
215  node2.id = 1;
216  node2.key = 1;
217  rtems_rbtree_insert( &rbtree1, &node1.Node );
218  rtems_rbtree_insert( &rbtree1, &node2.Node );
219
220  puts( "INIT - Verify rtems_rbtree_peek_max/min, rtems_rbtree_extract" );
221  test_node *t1 = rtems_rbtree_container_of(rtems_rbtree_peek_max(&rbtree1),
222         test_node,Node);
223  test_node *t2 = rtems_rbtree_container_of(rtems_rbtree_peek_min(&rbtree1),
224         test_node,Node);
225  if (t1->key - t2->key != 1) {
226    puts( "INIT - Peek Min - Max failed" );
227    rtems_test_exit(0);
228  }
229  p = rtems_rbtree_peek_max(&rbtree1);
230  rtems_rbtree_extract(&rbtree1, p);
231  t1 = rtems_rbtree_container_of(p,test_node,Node);
232  if (t1->key != 2) {
233    puts( "INIT - rtems_rbtree_extract failed");
234    rtems_test_exit(0);
235  }
236  rtems_rbtree_insert(&rbtree1, p);
237
238  for ( p = rtems_rbtree_get_min(&rbtree1), id = 1 ; p ;
239      p = rtems_rbtree_get_min(&rbtree1) , id++ ) {
240    test_node *t = rtems_rbtree_container_of(p,test_node,Node);
241    if ( id > 2 ) {
242      puts( "INIT - TOO MANY NODES ON RBTREE" );
243      rtems_test_exit(0);
244    }
245    if ( t->id != id ) {
246      puts( "INIT - ERROR ON RBTREE ID MISMATCH" );
247      rtems_test_exit(0);
248    }
249  }
250 
251  puts( "INIT - Verify rtems_rbtree_insert with 100 nodes value [0,99]" );
252  for (i = 0; i < 100; i++) {
253    node_array[i].id = i;
254    node_array[i].key = i;
255    rtems_rbtree_insert( &rbtree1, &node_array[i].Node );
256
257    if (!rb_assert(rbtree1.root) )
258      puts( "INIT - FAILED TREE CHECK" );
259  }
260
261  puts( "INIT - Removing 100 nodes" );
262
263  for ( p = rtems_rbtree_get_min(&rbtree1), id = 0 ; p ;
264      p = rtems_rbtree_get_min(&rbtree1) , id++ ) {
265    test_node *t = rtems_rbtree_container_of(p,test_node,Node);
266    if ( id > 99 ) {
267      puts( "INIT - TOO MANY NODES ON RBTREE" );
268      rtems_test_exit(0);
269    }
270    if ( t->id != id ) {
271      puts( "INIT - ERROR ON RBTREE ID MISMATCH" );
272      rtems_test_exit(0);
273    }
274
275    if (!rb_assert(rbtree1.root) )
276      puts( "INIT - FAILED TREE CHECK" );
277  }
278 
279  if(!rtems_rbtree_is_empty(&rbtree1)) {
280    puts( "INIT - TREE NOT EMPTY" );
281    rtems_test_exit(0);
282  }
283
284  puts( "INIT - Verify rtems_rbtree_insert with 100 nodes value [99,0]" );
285  for (i = 0; i < 100; i++) {
286    node_array[i].id = 99-i;
287    node_array[i].key = 99-i;
288    rtems_rbtree_insert( &rbtree1, &node_array[i].Node );
289
290    if (!rb_assert(rbtree1.root) )
291      puts( "INIT - FAILED TREE CHECK" );
292  }
293
294  puts( "INIT - Removing 100 nodes" );
295
296  for ( p = rtems_rbtree_get_min(&rbtree1), id = 0 ; p ;
297      p = rtems_rbtree_get_min(&rbtree1) , id++ ) {
298    test_node *t = rtems_rbtree_container_of(p,test_node,Node);
299    if ( id > 99 ) {
300      puts( "INIT - TOO MANY NODES ON RBTREE" );
301      rtems_test_exit(0);
302    }
303    if ( t->id != id ) {
304      puts( "INIT - ERROR ON RBTREE ID MISMATCH" );
305      rtems_test_exit(0);
306    }
307
308    if (!rb_assert(rbtree1.root) )
309      puts( "INIT - FAILED TREE CHECK" );
310  }
311
312  if(!rtems_rbtree_is_empty(&rbtree1)) {
313    puts( "INIT - TREE NOT EMPTY" );
314    rtems_test_exit(0);
315  }
316
317  /* testing rbtree_extract by adding 100 nodes then removing the 20 with
318   * keys specified by the numbers array, then removing the rest */
319  puts( "INIT - Verify rtems_rbtree_extract with 100 nodes value [0,99]" );
320  for (i = 0; i < 100; i++) {
321    node_array[i].id = i;
322    node_array[i].key = i;
323    rtems_rbtree_insert( &rbtree1, &node_array[i].Node );
324
325    if (!rb_assert(rbtree1.root) )
326      puts( "INIT - FAILED TREE CHECK" );
327  }
328
329  puts( "INIT - Extracting 20 random nodes" );
330
331  for (i = 0; i < 20; i++) {
332    id = numbers[i];
333    rtems_rbtree_extract( &rbtree1, &node_array[id].Node );
334    if (!rb_assert(rbtree1.root) )
335      puts( "INIT - FAILED TREE CHECK" );
336  }
337
338  puts( "INIT - Removing 80 nodes" );
339
340  for ( p = rtems_rbtree_get_min(&rbtree1), id = 0, i = 0 ; p ;
341      p = rtems_rbtree_get_min(&rbtree1) , id++ ) {
342    test_node *t = rtems_rbtree_container_of(p, test_node, Node);
343
344    while ( id == numbers_sorted[i] ) {
345      /* skip if expected minimum (id) is in the set of extracted numbers */
346      id++;
347      i++;
348    }
349
350    if ( id > 99 ) {
351      puts( "INIT - TOO MANY NODES ON RBTREE" );
352      rtems_test_exit(0);
353    }
354
355    if ( t->id != id ) {
356      puts( "INIT - ERROR ON RBTREE ID MISMATCH" );
357      rtems_test_exit(0);
358    }
359
360    if (!rb_assert(rbtree1.root) )
361      puts( "INIT - FAILED TREE CHECK" );
362  }
363
364  if(!rtems_rbtree_is_empty(&rbtree1)) {
365    puts( "INIT - TREE NOT EMPTY" );
366    rtems_test_exit(0);
367  }
368
369  /* Additional rtems_rbtree_extract test which removes a node
370   * with two children while target node has a left child only. */
371  for ( i = 0; i < 7; i++ ) {
372    node_array[i].id = i;
373    node_array[i].key = i;
374  }
375  rtems_rbtree_insert( &rbtree1, &node_array[3].Node );
376  rtems_rbtree_insert( &rbtree1, &node_array[1].Node );
377  rtems_rbtree_insert( &rbtree1, &node_array[5].Node );
378  rtems_rbtree_insert( &rbtree1, &node_array[0].Node );
379  rtems_rbtree_insert( &rbtree1, &node_array[2].Node );
380  rtems_rbtree_insert( &rbtree1, &node_array[4].Node );
381  rtems_rbtree_insert( &rbtree1, &node_array[6].Node );
382  rtems_rbtree_extract( &rbtree1, &node_array[2].Node );
383  /* node_array[1] has now only a left child. */
384  if ( !node_array[1].Node.child[RBT_LEFT] ||
385        node_array[1].Node.child[RBT_RIGHT] )
386     puts( "INIT - LEFT CHILD ONLY NOT FOUND" );
387  rtems_rbtree_extract( &rbtree1, &node_array[3].Node );
388  while( (p = rtems_rbtree_get_max(&rbtree1)) );
389
390  puts( "INIT - Verify rtems_rbtree_get_max with 100 nodes value [99,0]" );
391  for (i = 0; i < 100; i++) {
392    node_array[i].id = 99-i;
393    node_array[i].key = 99-i;
394    rtems_rbtree_insert( &rbtree1, &node_array[i].Node );
395
396    if (!rb_assert(rbtree1.root) )
397      puts( "INIT - FAILED TREE CHECK" );
398  }
399
400  puts( "INIT - Removing 100 nodes" );
401
402  for ( p = rtems_rbtree_get_max(&rbtree1), id = 0 ; p ;
403      p = rtems_rbtree_get_max(&rbtree1) , id++ ) {
404    test_node *t = rtems_rbtree_container_of(p,test_node,Node);
405    if ( id > 99 ) {
406      puts( "INIT - TOO MANY NODES ON RBTREE" );
407      rtems_test_exit(0);
408    }
409    if ( t->id != 99-id ) {
410      puts( "INIT - ERROR ON RBTREE ID MISMATCH" );
411      rtems_test_exit(0);
412    }
413
414    if (!rb_assert(rbtree1.root) )
415      puts( "INIT - FAILED TREE CHECK" );
416  }
417
418  if(!rtems_rbtree_is_empty(&rbtree1)) {
419    puts( "INIT - TREE NOT EMPTY" );
420    rtems_test_exit(0);
421  }
422
423  puts( "INIT - Verify rtems_rbtree_get_max with 100 nodes value [0,99]" );
424  for (i = 0; i < 100; i++) {
425    node_array[i].id = i;
426    node_array[i].key = i;
427    rtems_rbtree_insert( &rbtree1, &node_array[i].Node );
428
429    if (!rb_assert(rbtree1.root) )
430      puts( "INIT - FAILED TREE CHECK" );
431  }
432
433  puts( "INIT - Verify rtems_rbtree_find" );
434  search_node.key = 30;
435  p = rtems_rbtree_find(&rbtree1, &search_node.Node);
436  if(rtems_rbtree_container_of(p,test_node,Node)->id != 30) {
437    puts ("INIT - ERROR ON RBTREE ID MISMATCH");
438    rtems_test_exit(0);
439  }
440
441  puts( "INIT - Verify rtems_rbtree_predecessor/successor");
442  p = rtems_rbtree_predecessor(p);
443  if(p && rtems_rbtree_container_of(p,test_node,Node)->id != 29) {
444    puts ("INIT - ERROR ON RBTREE ID MISMATCH");
445    rtems_test_exit(0);
446  }
447  p = rtems_rbtree_find(&rbtree1, &search_node.Node);
448  p = rtems_rbtree_successor(p);
449  if(p && rtems_rbtree_container_of(p,test_node,Node)->id != 31) {
450    puts ("INIT - ERROR ON RBTREE ID MISMATCH");
451    rtems_test_exit(0);
452  }
453
454  p = rtems_rbtree_find(&rbtree1, &search_node.Node);
455  puts( "INIT - Verify rtems_rbtree_find_header" );
456  if (rtems_rbtree_find_header(p) != &rbtree1) {
457    puts ("INIT - ERROR ON RBTREE HEADER MISMATCH");
458    rtems_test_exit(0);
459  }
460
461  if ( _RBTree_Sibling( NULL ) != NULL )
462    puts ( "INIT - ERROR ON RBTREE NULL SIBLING MISMATCH" );
463  if ( _RBTree_Sibling( rbtree1.root ) != NULL )
464    puts ( "INIT - ERROR ON RBTREE NULL SIBLING MISMATCH" );
465  if ( _RBTree_Grandparent( NULL ) != NULL )
466    puts ( "INIT - ERROR ON RBTREE NULL GRANDPARENT MISMATCH" );
467  if ( _RBTree_Is_red( NULL ) != 0 )
468    puts ( "INIT - ERROR ON RBTREE NULL IS RED MISMATCH" );
469  if ( _RBTree_Is_red( rbtree1.root ) != 0 )
470    puts ( "INIT - ERROR ON RBTREE NULL IS RED MISMATCH" );
471
472  puts( "INIT - Removing 100 nodes" );
473
474  for ( p = rtems_rbtree_get_max(&rbtree1), id = 99 ; p ;
475      p = rtems_rbtree_get_max(&rbtree1) , id-- ) {
476    test_node *t = rtems_rbtree_container_of(p,test_node,Node);
477    if ( id < 0 ) {
478      puts( "INIT - TOO MANY NODES ON RBTREE" );
479      rtems_test_exit(0);
480    }
481    if ( t->id != id ) {
482      puts( "INIT - ERROR ON RBTREE ID MISMATCH" );
483      rtems_test_exit(0);
484    }
485
486    if (!rb_assert(rbtree1.root) )
487      puts( "INIT - FAILED TREE CHECK" );
488  }
489
490  if(!rtems_rbtree_is_empty(&rbtree1)) {
491    puts( "INIT - TREE NOT EMPTY" );
492    rtems_test_exit(0);
493  }
494
495  if (rtems_rbtree_find_header(&node_array[0].Node) != NULL) {
496    puts ("INIT - ERROR ON RBTREE HEADER MISMATCH");
497    rtems_test_exit(0);
498  }
499  if (rtems_rbtree_find_header(NULL) != NULL) {
500    puts ("INIT - ERROR ON RBTREE HEADER MISMATCH");
501    rtems_test_exit(0);
502  }
503
504  puts("INIT - Insert 20 random numbers");
505  for (i = 0; i < 20; i++) {
506    node_array[i].id = numbers[i];
507    node_array[i].key = numbers[i];
508    rtems_rbtree_insert( &rbtree1, &node_array[i].Node );
509
510    if (!rb_assert(rbtree1.root) )
511      puts( "INIT - FAILED TREE CHECK" );
512  }
513
514  puts( "INIT - Removing 20 nodes" );
515
516  for ( p = rtems_rbtree_get_min(&rbtree1), id = 0 ; p ;
517      p = rtems_rbtree_get_min(&rbtree1) , id++ ) {
518    test_node *t = rtems_rbtree_container_of(p,test_node,Node);
519    if ( id > 19 ) {
520      puts( "INIT - TOO MANY NODES ON RBTREE" );
521      rtems_test_exit(0);
522    }
523    if ( t->id != numbers_sorted[id] ) {
524      puts( "INIT - ERROR ON RBTREE ID MISMATCH" );
525      rtems_test_exit(0);
526    }
527
528    if (!rb_assert(rbtree1.root) )
529      puts( "INIT - FAILED TREE CHECK" );
530  }
531
532  if(!rtems_rbtree_is_empty(&rbtree1)) {
533    puts( "INIT - TREE NOT EMPTY" );
534    rtems_test_exit(0);
535  }
536
537  puts( "INIT - Verify rtems_rbtree_initialize with 100 nodes value [0,99]" );
538  for (i = 0; i < 100; i++) {
539    node_array[i].id = i;
540    node_array[i].key = i;
541  }
542  rtems_rbtree_initialize( &rbtree1, &test_compare_function,
543                           &node_array[0].Node, 100,
544                           sizeof(test_node), true );
545
546  puts( "INIT - Removing 100 nodes" );
547
548  for ( p = rtems_rbtree_get_min(&rbtree1), id = 0 ; p ;
549      p = rtems_rbtree_get_min(&rbtree1) , id++ ) {
550    test_node *t = rtems_rbtree_container_of(p,test_node,Node);
551    if ( id > 99 ) {
552      puts( "INIT - TOO MANY NODES ON RBTREE" );
553      rtems_test_exit(0);
554    }
555
556    if ( t->id != id ) {
557      puts( "INIT - ERROR ON RBTREE ID MISMATCH" );
558      rtems_test_exit(0);
559    }
560
561    if (!rb_assert(rbtree1.root) )
562      puts( "INIT - FAILED TREE CHECK" );
563  }
564
565  if(!rtems_rbtree_is_empty(&rbtree1)) {
566    puts( "INIT - TREE NOT EMPTY" );
567    rtems_test_exit(0);
568  }
569
570  /* Initialize the tree for duplicate keys */
571  puts( "Init - Initialize duplicate rbtree empty" );
572  rtems_rbtree_initialize_empty( &rbtree1, &test_compare_function, false );
573
574  if ( rtems_rbtree_is_unique( &rbtree1 ) )
575    puts( "INIT - FAILED IS UNIQUE CHECK" );
576  if ( rtems_rbtree_is_unique( NULL ) )
577    puts( "INIT - FAILED IS UNIQUE CHECK" );
578
579  puts( "INIT - Verify rtems_rbtree_insert with 100 nodes value [0,99]" );
580  for (i = 0; i < 100; i++) {
581    node_array[i].id = i;
582    node_array[i].key = i%5;
583    rtems_rbtree_insert( &rbtree1, &node_array[i].Node );
584
585    if (!rb_assert(rbtree1.root) )
586      puts( "INIT - FAILED TREE CHECK" );
587  }
588
589  puts( "INIT - Verify rtems_rbtree_find in a duplicate tree" );
590  search_node.key = 2;
591  p = rtems_rbtree_find(&rbtree1, &search_node.Node);
592  if(rtems_rbtree_container_of(p,test_node,Node)->id != 2) {
593    puts ("INIT - ERROR ON RBTREE ID MISMATCH");
594    rtems_test_exit(0);
595  }
596
597  puts( "INIT - Removing 100 nodes" );
598
599  for ( p = rtems_rbtree_get_min(&rbtree1), id = 0 ; p ;
600      p = rtems_rbtree_get_min(&rbtree1) , id++ ) {
601    test_node *t = rtems_rbtree_container_of(p,test_node,Node);
602    if ( id > 99 ) {
603      puts( "INIT - TOO MANY NODES ON RBTREE" );
604      rtems_test_exit(0);
605    }
606    if ( t->id != ( ((id*5)%100) + (id/20) ) ) {
607      puts( "INIT - ERROR ON RBTREE ID MISMATCH" );
608      rtems_test_exit(0);
609    }
610
611    if (!rb_assert(rbtree1.root) )
612      puts( "INIT - FAILED TREE CHECK" );
613  }
614
615  if(!rtems_rbtree_is_empty(&rbtree1)) {
616    puts( "INIT - TREE NOT EMPTY" );
617    rtems_test_exit(0);
618  }
619
620  puts( "INIT - Verify rtems_rbtree_insert with 100 nodes value [99,0]" );
621  for (i = 0; i < 100; i++) {
622    node_array[i].id = 99-i;
623    node_array[i].key = (99-i)%5;
624    rtems_rbtree_insert( &rbtree1, &node_array[i].Node );
625
626    if (!rb_assert(rbtree1.root) )
627      puts( "INIT - FAILED TREE CHECK" );
628  }
629
630  puts( "INIT - Verify rtems_rbtree_find in a duplicate tree" );
631  search_node.key = 2;
632  p = rtems_rbtree_find(&rbtree1, &search_node.Node);
633  if(rtems_rbtree_container_of(p,test_node,Node)->id != 97) {
634    puts ("INIT - ERROR ON RBTREE ID MISMATCH");
635    rtems_test_exit(0);
636  }
637
638  puts( "INIT - Removing 100 nodes" );
639
640  for ( p = rtems_rbtree_get_min(&rbtree1), id = 0 ; p ;
641      p = rtems_rbtree_get_min(&rbtree1) , id++ ) {
642    test_node *t = rtems_rbtree_container_of(p,test_node,Node);
643    if ( id > 99 ) {
644      puts( "INIT - TOO MANY NODES ON RBTREE" );
645      rtems_test_exit(0);
646    }
647    if ( t->id != ( (((99-id)*5)%100) + (id/20) ) ) {
648      puts( "INIT - ERROR ON RBTREE ID MISMATCH" );
649      rtems_test_exit(0);
650    }
651
652    if (!rb_assert(rbtree1.root) )
653      puts( "INIT - FAILED TREE CHECK" );
654  }
655
656  if(!rtems_rbtree_is_empty(&rbtree1)) {
657    puts( "INIT - TREE NOT EMPTY" );
658    rtems_test_exit(0);
659  }
660
661  puts( "*** END OF RTEMS RBTREE API TEST ***" );
662  rtems_test_exit(0);
663}
664
665/* configuration information */
666
667#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
668#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
669
670#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
671#define CONFIGURE_MAXIMUM_TASKS 1
672
673#define CONFIGURE_INIT
674#include <rtems/confdefs.h>
675
676/* global variables */
Note: See TracBrowser for help on using the repository browser.