| 108 | }; |
| 109 | |
| 110 | UNIT_TEST(CellID_CheckRectPoints) |
| 111 | { |
| 112 | int const level = 6; |
| 113 | int const count = 1 << 2 * level; |
| 114 | |
| 115 | using Id = m2::CellId<19>; |
| 116 | using Converter = CellIdConverter<mercator::Bounds, Id>; |
| 117 | |
| 118 | for (size_t i = 0; i < count; ++i) |
| 119 | { |
| 120 | Id const cell = Id::FromBitsAndLevel(i, level); |
| 121 | std::pair<uint32_t, uint32_t> const xy = cell.XY(); |
| 122 | uint32_t const r = 2 * cell.Radius(); |
| 123 | uint32_t const bound = (1 << level) * r; |
| 124 | |
| 125 | double minX, minY, maxX, maxY; |
| 126 | Converter::GetCellBounds(cell, minX, minY, maxX, maxY); |
| 127 | |
| 128 | double minX_, minY_, maxX_, maxY_; |
| 129 | if (xy.first > r) |
| 130 | { |
| 131 | Id neighbour = Id::FromXY(xy.first - r, xy.second, level); |
| 132 | Converter::GetCellBounds(neighbour, minX_, minY_, maxX_, maxY_); |
| 133 | |
| 134 | TEST_ALMOST_EQUAL_ULPS(minX, maxX_, ()); |
| 135 | TEST_ALMOST_EQUAL_ULPS(minY, minY_, ()); |
| 136 | TEST_ALMOST_EQUAL_ULPS(maxY, maxY_, ()); |
| 137 | |
| 138 | TEST_EQUAL(D2I(minX, minY), D2I(maxX_, minY_), ()); |
| 139 | TEST_EQUAL(D2I(minX, maxY), D2I(maxX_, maxY_), ()); |
| 140 | } |
| 141 | |
| 142 | if (xy.first + r < bound) |
| 143 | { |
| 144 | Id neighbour = Id::FromXY(xy.first + r, xy.second, level); |
| 145 | Converter::GetCellBounds(neighbour, minX_, minY_, maxX_, maxY_); |
| 146 | |
| 147 | TEST_ALMOST_EQUAL_ULPS(maxX, minX_, ()); |
| 148 | TEST_ALMOST_EQUAL_ULPS(minY, minY_, ()); |
| 149 | TEST_ALMOST_EQUAL_ULPS(maxY, maxY_, ()); |
| 150 | |
| 151 | TEST_EQUAL(D2I(maxX, minY), D2I(minX_, minY_), ()); |
| 152 | TEST_EQUAL(D2I(maxX, maxY), D2I(minX_, maxY_), ()); |
| 153 | } |
| 154 | |
| 155 | if (xy.second > r) |
| 156 | { |
| 157 | Id neighbour = Id::FromXY(xy.first, xy.second - r, level); |
| 158 | Converter::GetCellBounds(neighbour, minX_, minY_, maxX_, maxY_); |
| 159 | |
| 160 | TEST_ALMOST_EQUAL_ULPS(minY, maxY_, ()); |
| 161 | TEST_ALMOST_EQUAL_ULPS(minX, minX_, ()); |
| 162 | TEST_ALMOST_EQUAL_ULPS(maxX, maxX_, ()); |
| 163 | |
| 164 | TEST_EQUAL(D2I(minX, minY), D2I(minX_, maxY_), ()); |
| 165 | TEST_EQUAL(D2I(maxX, minY), D2I(maxX_, maxY_), ()); |
| 166 | } |
| 167 | |