es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo codificar este comando de línea de comandos (CLI) de manera que el test se apruebe?

¿Qué debo escribir en task.js para que este test en task.test.js pase?

const fs = require("fs");
const { execSync } = require("child_process");

let deleteFile = (path) => {
  try {
    fs.unlinkSync(path);
  } catch (err) {}
};

beforeEach(() => {
  deleteFile(`${__dirname}/task.txt`);
  deleteFile(`${__dirname}/completed.txt`);
});

let tasksTxtCli = (...args) => [`${__dirname}/task.sh`, ...args].join(" ");

let usage = `Usage :-
$ ./task add 2 hello world    # Agrega un nuevo ítem con prioridad 2 y texto "hello world" a la lista
$ ./task ls                   # Muestra los ítems incompletos de la lista ordenados por prioridad en orden ascendente
$ ./task del INDEX            # Elimina el ítem incompleto con el índice especificado
$ ./task done INDEX           # Marca el ítem incompleto con el índice especificado como completo
$ ./task help                 # Muestra el uso
$ ./task report               # Estadísticas`;

test("imprime la ayuda cuando no se proporcionan argumentos adicionales", () => {
  let received = execSync(tasksTxtCli()).toString("utf8");
  expect(received).toEqual(expect.stringContaining(usage));
});

Cuando escribo ./task help en la línea de comandos, debo mostrar el texto de usage en la consola. Actualmente, task.js está vacío. Si alguien pudiera guiarme, sería de gran ayuda.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para que el test pase, necesitas crear un script en task.js que acepte argumentos de línea de comandos y ejecute la funcionalidad correspondiente basada en los argumentos de entrada. El script debe analizar los argumentos de línea de comandos e implementar varias funciones como agregar nuevos elementos, eliminar elementos incompletos, marcar elementos incompletos como completados, etc.

    Para el comando ./task help, el script simplemente debe imprimir el texto de “usage” en la consola.

    Aquí tienes un código de ejemplo que podrías usar para task.js:

    const fs = require("fs");
    
    let tasks = [];
    
    let usage = `Uso:
    $ ./task add 2 hola mundo     # Agrega un nuevo elemento con prioridad 2 y texto "hola mundo" a la lista
    $ ./task ls                   # Muestra los elementos incompletos de la lista ordenados por prioridad de forma ascendente
    $ ./task del INDICE           # Elimina el elemento incompleto con el índice dado
    $ ./task done INDICE          # Marca el elemento incompleto con el índice dado como completado
    $ ./task help                 # Muestra el uso
    $ ./task report               # Estadísticas`;
    
    let addTask = (prioridad, texto) => {
      tasks.push({ prioridad, texto, completado: false });
    };
    
    let deleteTask = (indice) => {
      tasks.splice(indice, 1);
    };
    
    let completeTask = (indice) => {
      tasks[indice].completado = true;
    };
    
    let showTasks = () => {
      let tareasIncompletas = tasks.filter((tarea) => !tarea.completado);
      tareasIncompletas.sort((a, b) => a.prioridad - b.prioridad);
      return tareasIncompletas.map((tarea, indice) => `${indice + 1}. ${tarea.texto} (Prioridad: ${tarea.prioridad})`).join("\n");
    };
    
    let showReport = () => {
      let cantidadTareasCompletadas = tasks.filter((tarea) => tarea.completado).length;
      let cantidadTareasIncompletas = tasks.filter((tarea) => !tarea.completado).length;
      return `Tareas Completadas: ${cantidadTareasCompletadas}\nTareas Incompletas: ${cantidadTareasIncompletas}`;
    };
    
    let executeCommand = (comando, args) => {
      switch (comando) {
        case "add":
          let [prioridad, ...texto] = args;
          addTask(Number(prioridad), texto.join(" "));
          break;
        case "ls":
          console.log(showTasks());
          break;
        case "del":
          deleteTask(Number(args[0]) - 1);
          break;
        case "done":
          completeTask(Number(args[0]) - 1);
          break;
        case "help":
          console.log(usage);
          break;
        case "report":
          console.log(showReport());
          break;
        default:
          console.log("Comando inválido!");
          break;
      }
    };
    
    let [, , comando, ...args] = process.argv;
    executeCommand(comando, args);
    

    Este script define varias funciones como addTask, deleteTask, completeTask, etc. que son responsables de agregar nuevas tareas, eliminar tareas incompletas, marcar tareas incompletas como completadas, etc. También define una función showTasks que devuelve las tareas incompletas ordenadas por prioridad.

    La función executeCommand utiliza una declaración switch para llamar a la función apropiada según el comando de entrada. Para el comando ./task help, simplemente imprime el texto de “usage” en la consola.

    Con este script en su lugar, el comando ./task help ahora debería funcionar como se espera y el test en task.test.js debería pasar.

Comments are closed.