in src/apps/testapps/testH3NeighborRotations.c [51:120]
void doCell(H3Index h, int maxK, TestOutput* testOutput) {
for (int k = 0; k < maxK; k++) {
int maxSz = H3_EXPORT(maxKringSize)(k);
H3Index* kRingInternalOutput = calloc(sizeof(H3Index), maxSz);
H3Index* hexRangeOutput = calloc(sizeof(H3Index), maxSz);
int* kRingInternalDistances = calloc(sizeof(int), maxSz);
_kRingInternal(h, k, kRingInternalOutput, kRingInternalDistances, maxSz,
0);
int hexRangeFailed = H3_EXPORT(hexRange)(h, k, hexRangeOutput);
if (hexRangeFailed == 2) {
testOutput->ret2++;
continue;
} else if (hexRangeFailed == 0) {
testOutput->ret0++;
int startIdx = 0;
// i is the current ring number
for (int i = 0; i <= k; i++) {
// Number of hexagons on this ring
int n = i * 6;
if (i == 0) n = 1;
for (int ii = 0; ii < n; ii++) {
H3Index h2 = hexRangeOutput[ii + startIdx];
int found = 0;
for (int iii = 0; iii < maxSz; iii++) {
if (kRingInternalOutput[iii] == h2 &&
kRingInternalDistances[iii] == i) {
found = 1;
break;
}
}
if (!found) {
// Failed to find a hexagon in both outputs, or it had
// different distances.
testOutput->ret0ValidationFailures++;
h3Println(h);
return;
}
}
startIdx += n;
}
} else if (hexRangeFailed == 1) {
testOutput->ret1++;
int foundPent = 0;
for (int i = 0; i < maxSz; i++) {
if (H3_EXPORT(h3IsPentagon)(kRingInternalOutput[i])) {
foundPent = 1;
break;
}
}
if (!foundPent) {
// Failed to find the pentagon that caused hexRange
// to fail.
printf("NO C k=%d h=%" PRIx64 "\n", k, h);
testOutput->ret1ValidationFailures++;
return;
}
}
free(kRingInternalOutput);
free(hexRangeOutput);
free(kRingInternalDistances);
}
}