void doCell()

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);
    }
}