in src/apps/testapps/testH3NeighborRotations.c [51:123]
void doCell(H3Index h, int maxK, TestOutput *testOutput) {
for (int k = 0; k < maxK; k++) {
int64_t maxSz;
H3_EXPORT(maxGridDiskSize)(k, &maxSz);
H3Index *gridDiskInternalOutput = calloc(sizeof(H3Index), maxSz);
H3Index *gridDiskUnsafeOutput = calloc(sizeof(H3Index), maxSz);
int *gridDiskInternalDistances = calloc(sizeof(int), maxSz);
H3_EXPORT(gridDiskDistancesSafe)
(h, k, gridDiskInternalOutput, gridDiskInternalDistances);
H3Error gridDiskUnsafeFailed =
H3_EXPORT(gridDiskUnsafe)(h, k, gridDiskUnsafeOutput);
if (gridDiskUnsafeFailed == E_FAILED) {
// TODO: Unreachable
testOutput->ret2++;
continue;
} else if (gridDiskUnsafeFailed == E_SUCCESS) {
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 = gridDiskUnsafeOutput[ii + startIdx];
int found = 0;
for (int64_t iii = 0; iii < maxSz; iii++) {
if (gridDiskInternalOutput[iii] == h2 &&
gridDiskInternalDistances[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 (gridDiskUnsafeFailed == E_PENTAGON) {
testOutput->ret1++;
int foundPent = 0;
for (int64_t i = 0; i < maxSz; i++) {
if (H3_EXPORT(isPentagon)(gridDiskInternalOutput[i])) {
foundPent = 1;
break;
}
}
if (!foundPent) {
// Failed to find the pentagon that caused gridDiskUnsafe
// to fail.
printf("NO C k=%d h=%" PRIx64 "\n", k, h);
testOutput->ret1ValidationFailures++;
return;
}
}
free(gridDiskInternalOutput);
free(gridDiskUnsafeOutput);
free(gridDiskInternalDistances);
}
}