void doCell()

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