aboutsummaryrefslogtreecommitdiff
path: root/util/tests/heap_test.cc
blob: 4fe50a4aeba0243147a20d96c5fa529c3d6187e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include "gtest/gtest.h"
#include "chre/util/heap.h"

#include <algorithm>
#include <array>

using chre::DynamicVector;
using chre::FixedSizeVector;

TEST(HeapDeathTest, PushHeapWhenEmpty) {
  DynamicVector<int> v;
  std::less<int> comp;
  EXPECT_DEATH(chre::push_heap(v, comp), "");
}

TEST(HeapDeathTest, PopHeapWhenEmpty) {
  DynamicVector<int> v;
  std::less<int> comp;
  EXPECT_DEATH(chre::pop_heap(v, comp), "");
}

TEST(HeapTest, NestedPushPopHeap) {
  DynamicVector<int> v;
  std::less<int> comp;

  // generate random test data
  const size_t MaxSize = 1000;
  std::array<int, MaxSize> array;
  std::array<int, MaxSize> array_sorted;
  std::srand(0xcafe);
  for (size_t i = 0; i < MaxSize; ++i) {
    array[i] = std::rand();
    array_sorted[i] = array[i];
  }

  // make sure the popped data is in the right order of various array sizes.
  for (size_t s = 1; s < MaxSize + 1; ++s) {
    for (size_t i = 0; i < s; ++i) {
      v.push_back(array[i]);
      chre::push_heap(v, comp);
    }

    std::sort(array_sorted.begin(), array_sorted.begin() + s, std::greater<int>());

    for (size_t i = 0; i < s; ++i) {
      chre::pop_heap(v, comp);
      EXPECT_EQ(array_sorted[i], v[v.size() - 1]);
      v.erase(v.size() - 1);
    }
  }
}

TEST(HeapDeathTest, RemoveHeapWithInvalidIndex) {
  DynamicVector<int> v;
  std::less<int> comp;

  v.push_back(0);
  chre::push_heap(v, comp);
  EXPECT_DEATH(chre::remove_heap(v, 1, comp), "");
}

TEST(HeapTest, NestedRemoveHeap) {
  DynamicVector<int> v;
  std::less<int> comp;

  // generate random test data
  const size_t MaxSize = 1000;
  std::array<int, MaxSize> array;
  std::array<int, MaxSize> array_sorted;
  std::srand(0xcafe);
  for (size_t i = 0; i < MaxSize; ++i) {
    array[i] = std::rand();
    array_sorted[i] = array[i];
  }

  for (size_t s = 1; s < MaxSize + 1; ++s) {
    for (size_t i = 0; i < s; ++i) {
      v.push_back(array[i]);
      chre::push_heap(v, comp);
    }

    std::sort(array_sorted.begin(), array_sorted.begin() + s, std::greater<int>());

    // randomly remove one
    chre::remove_heap(v, std::rand() % s, comp);
    int data = v[v.size() - 1];
    v.erase(v.size() - 1);

    for (size_t i = 0; i < s; ++i) {
      if (array_sorted[i] == data) {
        continue;
      }

      chre::pop_heap(v, comp);
      EXPECT_EQ(array_sorted[i], v[v.size() - 1]);
      v.erase(v.size() - 1);
    }
  }
}

TEST(HeapTest, FixedSizeVectorMinHeap) {
  FixedSizeVector<int, 16> v;

  for (size_t i = 0; i < 5; ++i) {
    v.push_back(i);
    chre::push_heap(v, std::greater<int>());
  }

  for (size_t i = 0; i < 5; ++i) {
    chre::pop_heap(v, std::greater<int>());
    EXPECT_EQ(i, v[v.size() - 1]);
    v.erase(v.size() - 1);
  }
}