Construye una aplicación full stack de JavaScript que sea funcionalmente similar a esta: <https://sudoku-solver.freecodecamp.rocks/>. Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos:
Cuando hayas terminado, asegúrate de que una demostración funcional de tu proyecto esté alojado en algún lugar público. Luego, envía la URL en el campo `Solution Link`. Opcionalmente, también envía un enlace al código fuente de tu proyecto en el campo `GitHub Link`.
- Toda la lógica del rompecabezas puede ir dentro de `/controllers/sudoku-solver.js`
- La función `validate` debe tomar una cadena de rompecabezas dada y revisarla para ver si tiene 81 caracteres válidos para la entrada.
- La función `check` debe estar validando contra el estado *actual* del tablero.
- La función `solve` debe manejar la resolución de cualquier cadena de rompecabezas válida, no solo las entradas de prueba y soluciones. Se espera que escribas la lógica para resolver esto.
- Toda la lógica de enrutamiento puede ir a `/routes/api.js`
- Ve el archivo `puzzle-strings.js` en `/controllers` para algunos rompecabezas de ejemplo que tu aplicación debe resolver
- Para ejecutar las pruebas de desafío en esta página, establece `NODE_ENV` a `test` sin comillas en el archivo `.env`
- Para ejecutar las pruebas en la consola, usa el comando `npm run test`. Para abrir la consola de Replit presiona Ctrl+Shift+P (Cmd si estas en Mac) y escribe "open shell"
Escribe las siguientes pruebas en `tests/1_unit-tests.js`:
- La lógica maneja una cadena de rompecabezas válida de 81 caracteres
- La lógica maneja una cadena de rompecabezas con caracteres inválidos (no 1-9 o `.`)
- La lógica maneja una cadena de rompecabezas que no tiene 81 caracteres de longitud
- La lógica maneja una posición de fila válida
- La lógica maneja una posición de fila inválida
- La lógica maneja una posición de columna válida
- La lógica maneja una posición de columna inválida
- La lógica maneja la ubicación de una región válida (cuadrícula 3x3)
- La lógica maneja la ubicación de una región inválida (cuadrícula 3x3)
- Las cadenas de rompecabezas válidas pasan el solucionador
- Las cadenas de rompecabezas no válidas hacen fallar al solucionador
- El solucionador devuelve la solución esperada para un rompecabezas incompleto
Escribe las siguientes pruebas en `tests/2_functional-tests.js`
- Resuelve un rompecabezas con una cadena de rompecabezas válida: petición POST a `/api/solve`
- Resuelve un rompecabezas con una cadena de rompecabezas faltante: petición POST a `/api/solve`
- Resuelve un rompecabezas con caracteres inválidos: petición POST a `/api/solve`
- Resuelve un rompecabezas con una longitud incorrecta: petición POST a `/api/solve`
- Resuelve un rompecabezas que no se puede resolver: petición POST a `/api/solve`
- Comprueba la ubicación de un rompecabezas con todos los campos: petición POST a `/api/check`
- Comprueba la ubicación de un rompecabezas con un conflicto de posición: petición POST a `/api/check`
- Comprueba la ubicación de un rompecabezas con múltiples conflictos de posición: petición POST a `/api/check`
- Comprueba la ubicación de un rompecabezas con todos los conflictos de posición: petición POST a `/api/check`
- Comprueba la ubicación de un rompecabezas con los campos requeridos faltantes: petición POST a `/api/check`
- Comprueba la ubicación de un rompecabezas con caracteres inválidos: petición POST a `/api/check`
- Comprueba la ubicación de un rompecabezas con una longitud incorrecta: petición POST a `/api/check`
- Comprueba la ubicación de un rompecabezas con coordenadas de posición no válidas: petición POST a `/api/check`
- Comprueba la ubicación de un rompecabezas con valor de posición no válido: petición POST a `/api/check`
Puedes realizar una petición `POST``/api/solve` con datos del formulario que contienen `puzzle` que será una cadena que contiene una combinación de números (1-9) y puntos `.` para representar espacios vacíos. El objeto devuelto contendrá una propiedad de `solution` con el rompecabezas resuelto.
Si el rompecabezas enviado a `/api/solve` contiene valores que no son números o periodos, el valor devuelto será `{ error:'Invalid characters in puzzle' }`
Si el rompecabezas enviado a `/api/solve` es mayor o menor que 81 caracteres, el valor devuelto será `{ error:'Expected puzzle to be 81 characters long' }`
Puedes realizar una petición `POST` a `/api/check` un objeto que contenga `puzzle`, `coordinate`, y `value` donde `coordinate` es la letra del A-I que indica la fila, seguido por un número del 1-9 indicando la columna, y `value` es un numero del 1-9.
El valor devuelto del `POST` a `/api/check` será un objeto que contenga una propiedad `valid`, que es `true` si el número puede colocarse en la coordenada proporcionada y `false` si el número no lo es. Si es falso, el objeto devuelto también contendrá una propiedad `conflict` que contiene las cadenas `"row"`, `"column"`, y/o `"region"` dependiendo de que la ubicación sea inválida.
Si `value` enviado a `/api/check` ya está situado en `puzzle` en esa `coordinate`, el valor devuelto será un objeto que contiene una propiedad `valid` con `true` si `value` no está en conflicto.
Si el rompecabezas enviado a `/api/check` contiene valores que no son números o puntos, el valor devuelto será `{ error:'Invalid characters in puzzle' }`
Si el rompecabezas enviado a `/api/check` es mayor o menor que 81 caracteres, el valor devuelto será `{ error: 'Expected puzzle to be 81 characters long' }`
Las 12 pruebas unitarias están completas y pasan. Consulta `/tests/1_unit-tests.js` para el comportamiento esperado para el que debes escribir pruebas.