diff options
Diffstat (limited to 'test/example/space.cpp')
-rw-r--r-- | test/example/space.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/test/example/space.cpp b/test/example/space.cpp new file mode 100644 index 000000000..33256eedf --- /dev/null +++ b/test/example/space.cpp @@ -0,0 +1,115 @@ +#include <cassert> +#include <iostream> + +#include <support/space.h> + +using namespace wasm; + +using Span = DisjointSpans::Span; + +int main() { + // No spans + { + DisjointSpans root; + // Nothing in root + assert(!root.checkOverlap(Span{0, 100})); + } + // One span + { + DisjointSpans root; + root.add(Span{0, 100}); + // It is there + assert(root.checkOverlap(Span{0, 100})); + } + { + DisjointSpans root; + root.add(Span{40, 60}); + // Exact match + assert(root.checkOverlap(Span{40, 60})); + // No overlap + assert(!root.checkOverlap(Span{20, 30})); + // Touching, but no overlap + assert(!root.checkOverlap(Span{20, 40})); + // Overlap + assert(root.checkOverlap(Span{20, 41})); + assert(root.checkOverlap(Span{40, 41})); + // Internal + assert(root.checkOverlap(Span{45, 50})); + // Touches other side + assert(root.checkOverlap(Span{45, 60})); + // Overlaps on other side + assert(root.checkOverlap(Span{45, 70})); + // Just inside. + assert(root.checkOverlap(Span{59, 60})); + // Just outside + assert(!root.checkOverlap(Span{60, 61})); + // Totally outside + assert(!root.checkOverlap(Span{70, 80})); + } + // Two spans, different subtrees + { + DisjointSpans root; + root.add(Span{30, 40}); + root.add(Span{60, 70}); + assert(!root.checkOverlap(Span{10, 20})); + assert(!root.checkOverlap(Span{10, 30})); + assert(root.checkOverlap(Span{10, 40})); + assert(root.checkOverlap(Span{35, 40})); + assert(!root.checkOverlap(Span{40, 60})); + assert(!root.checkOverlap(Span{45, 55})); + assert(root.checkOverlap(Span{50, 61})); + assert(root.checkOverlap(Span{50, 100})); + assert(root.checkOverlap(Span{60, 70})); + assert(root.checkOverlap(Span{60, 61})); + assert(!root.checkOverlap(Span{70, 80})); + assert(!root.checkOverlap(Span{70, 100})); + } + // Two spans, same subtree + { + DisjointSpans root; + root.add(Span{30, 40}); + root.add(Span{40, 45}); + assert(!root.checkOverlap(Span{10, 20})); + assert(!root.checkOverlap(Span{10, 30})); + assert(root.checkOverlap(Span{10, 40})); + assert(root.checkOverlap(Span{35, 40})); + assert(root.checkOverlap(Span{40, 41})); + assert(root.checkOverlap(Span{35, 45})); + assert(!root.checkOverlap(Span{45, 100})); + } + // "Pixels" + { + const int N = 40; + for (int i = 0; i < N; i++) { + DisjointSpans root; + for (int j = 0; j < N; j++) { + // add all pixels but the i-th + if (j != i) { + root.add(Span{j, j + 1}); + } + } + for (int j = 0; j < N; j++) { + if (j != i) { + assert(root.checkOverlap(Span{j, j + 1})); + } else { + assert(!root.checkOverlap(Span{j, j + 1})); + } + } + assert(root.checkOverlap(Span{10, N + 10})); + assert(!root.checkOverlap(Span{N + 10, N + 20})); + } + } + // Large numbers. + { + DisjointSpans root; + assert(!root.checkOverlap(Span{2948, 2949})); + root.add(Span{2948, 2949}); + assert(root.checkOverlap(Span{2948, 2949})); + assert(root.checkOverlap(Span{2940, 2949})); + assert(root.checkOverlap(Span{2948, 2959})); + assert(root.checkOverlap(Span{0, 18766})); + assert(!root.checkOverlap(Span{2000, 2001})); + assert(!root.checkOverlap(Span{3000, 3001})); + } + std::cout << "success.\n"; +} |