| #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"; | |
| } |