O Gerador De CPF O Gerador De CPF

Gerar CPF em JavaScript: Função com Testes Vitest

O gerador de CPF da página principal cria números válidos em um clique — mas quando os testes precisam rodar sem dependência de browser, gerar CPF em JavaScript direto no código é a melhor opção. A função abaixo aplica o algoritmo de módulo 11 para produzir números de 11 dígitos com dígitos verificadores corretos.

Código

'use strict';

var CPF = function CPF() { };

CPF.generate = function () {
  var digits = [];
  for (var i = 0; i < 9; i++) {
    digits.push(Math.floor(Math.random() * 10));
  }

  var sum1 = 0;
  for (var j = 0; j < 9; j++) {
    sum1 += digits[j] * (10 - j);
  }
  var r1 = sum1 % 11;
  var d1 = r1 < 2 ? 0 : 11 - r1;
  digits.push(d1);

  var sum2 = 0;
  for (var k = 0; k < 10; k++) {
    sum2 += digits[k] * (11 - k);
  }
  var r2 = sum2 % 11;
  var d2 = r2 < 2 ? 0 : 11 - r2;
  digits.push(d2);

  return digits.join('');
};

CPF.validate = function (value) {
  if (!value) return false;
  var cleanCPF = String(value).replace(/[^\d]/g, '');
  if (cleanCPF.length !== 11) return false;

  for (var i = 0; i < 10; i++) {
    if (cleanCPF === Array(12).join(String(i))) return false;
  }

  var sum1 = 0;
  for (var j = 0; j < 9; j++) {
    sum1 += parseInt(cleanCPF.charAt(j), 10) * (10 - j);
  }
  var r1 = sum1 % 11;
  var d1 = r1 < 2 ? 0 : 11 - r1;
  if (parseInt(cleanCPF.charAt(9), 10) !== d1) return false;

  var sum2 = 0;
  for (var k = 0; k < 10; k++) {
    sum2 += parseInt(cleanCPF.charAt(k), 10) * (11 - k);
  }
  var r2 = sum2 % 11;
  var d2 = r2 < 2 ? 0 : 11 - r2;
  return parseInt(cleanCPF.charAt(10), 10) === d2;
};

Análise do código

CPF.generate cria um array com 9 dígitos aleatórios via Math.floor(Math.random() * 10). Em seguida, calcula o primeiro dígito verificador multiplicando cada dígito pelo peso decrescente (10 a 2), aplicando % 11 e convertendo: resto menor que 2 vira 0, senão 11 - resto. O segundo verificador repete o processo com 10 dígitos e pesos de 11 a 2.

CPF.validate limpa a entrada com regex, rejeita CPFs com 11 dígitos iguais, recalcula os dois dígitos verificadores e compara com os informados. Está incluída para que os testes possam verificar que o CPF gerado é válido.

O retorno é uma string de 11 dígitos numéricos sem formatação. Para exibir com máscara, aplique a função de máscara de CPF em JavaScript.

Uso

var cpf = CPF.generate();
console.log(cpf);              // "52998224725" (exemplo)
console.log(CPF.validate(cpf)); // true

Testes

Testes com Vitest:

import { describe, it, expect } from 'vitest';

describe('CPF.generate', () => {
  it('retorna string com 11 dígitos numéricos', () => {
    var cpf = CPF.generate();
    expect(cpf).toMatch(/^\d{11}$/);
  });

  it('gera CPF que passa na validação', () => {
    var cpf = CPF.generate();
    expect(CPF.validate(cpf)).toBe(true);
  });

  it('gera CPFs diferentes entre si', () => {
    var cpfs = new Set();
    for (var i = 0; i < 50; i++) {
      cpfs.add(CPF.generate());
    }
    expect(cpfs.size).toBeGreaterThan(1);
  });
});

Veja também: validar CPF em JavaScript e o gerador de CPF online.