IntervalTreeTest.cc 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "IntervalTreeTest.h"
  2. namespace inet {
  3. void IntervalTreeTest::insertNodes(int nodeCount)
  4. {
  5. for (int i = 0; i < nodeCount; i++) {
  6. double low = (double) rand() / RAND_MAX;
  7. double high = low + (double) rand() / RAND_MAX;
  8. char *c = new char[16];
  9. sprintf(c, "%d", i);
  10. Interval *interval = new Interval(low, high, c);
  11. intervals.push_back(interval);
  12. tree.insert(interval);
  13. }
  14. }
  15. void IntervalTreeTest::deleteNodes()
  16. {
  17. for (auto interval : intervals) {
  18. if ((double) rand() / RAND_MAX < 0.5) {
  19. tree.deleteNode(interval);
  20. }
  21. }
  22. }
  23. void IntervalTreeTest::checkTree()
  24. {
  25. checkNil();
  26. checkNode(tree.root->left);
  27. checkNode(tree.root->right);
  28. }
  29. void IntervalTreeTest::checkNil()
  30. {
  31. IntervalTreeNode *nil = tree.nil;
  32. if (nil->left != nil || nil->right != nil)
  33. throw std::runtime_error("Broken: nil left or right");
  34. // if (nil->parent != nil)
  35. // throw std::runtime_error("Broken: nil parent");
  36. if (nil->red || nil->stored_interval)
  37. throw std::runtime_error("Broken: nil color");
  38. const auto nts = -SimTime::getMaxTime();
  39. if (nil->key != nts || nil->high != nts || nil->max_high != nts)
  40. throw std::runtime_error("Broken: nil key");
  41. }
  42. int IntervalTreeTest::checkNode(IntervalTreeNode *node)
  43. {
  44. int ld = 0, rd = 0; // black depths on each subtree
  45. if (node->left != tree.nil) {
  46. ld = checkNode(node->left);
  47. if (node->left->parent != node)
  48. throw std::runtime_error("Broken: node left parent");
  49. if (node->red && node->left->red)
  50. throw std::runtime_error("Broken: node left color");
  51. if (node->left->key > node->key)
  52. throw std::runtime_error("Broken: node left key");
  53. }
  54. if (node->right != tree.nil) {
  55. rd = checkNode(node->right);
  56. if (node->right->parent != node)
  57. throw std::runtime_error("Broken: node right parent");
  58. if (node->red && node->right->red)
  59. throw std::runtime_error("Broken: node right color");
  60. if (node->key > node->right->key)
  61. throw std::runtime_error("Broken: node right key");
  62. }
  63. if (ld != rd)
  64. throw std::runtime_error("Broken: node depth");
  65. if (!node->red)
  66. ++ld;
  67. return ld;
  68. }
  69. void IntervalTreeTest::run(int nodeCount)
  70. {
  71. std::cout << "Testing IntervalTree with " << nodeCount << " nodes\n";
  72. insertNodes(nodeCount);
  73. deleteNodes();
  74. checkTree();
  75. }
  76. } // namespace inet