[
  {
    "task_id": 1,
    "text": "Captura el parámetro 'username' de la petición HTTP y devuélvelo como resultado. Si no existe, la variable será None.",
    "code": "addParam(\"username\", username)\naddResult(username)",
    "test_inputs": {
      "username": "alice"
    },
    "test_list": [
      "re.match(r'^alice$', str(username))"
    ]
  },
  {
    "task_id": 2,
    "text": "Recibe el parámetro 'email' y establece el código de estado HTTP en 200. Devuelve el email como resultado.",
    "code": "addParam(\"email\", email)\naddVar(_status, 200)\naddResult(email)",
    "test_inputs": {
      "email": "user@example.com"
    },
    "test_list": [
      "re.match(r'^user@example\\.com$', str(email))",
      "re.match(r'^200$', str(_status))"
    ]
  },
  {
    "task_id": 3,
    "text": "Recibe el parámetro 'password', genera su hash SHA-256 y devuelve el hash como resultado.",
    "code": "addParam(\"password\", password)\nencodeSHA256(password, hashed)\naddResult(hashed)",
    "test_inputs": {
      "password": "secret123"
    },
    "test_list": [
      "re.match(r'^[a-f0-9]{64}$', str(hashed))"
    ]
  },
  {
    "task_id": 4,
    "text": "Recibe el parámetro 'text', reemplaza todos los espacios por guiones bajos y devuelve el resultado.",
    "code": "addParam(\"text\", text)\nreplace(text, \" \", \"_\", result)\naddResult(result)",
    "test_inputs": {
      "text": "hello world foo"
    },
    "test_list": [
      "re.match(r'^hello_world_foo$', str(result))"
    ]
  },
  {
    "task_id": 5,
    "text": "Genera un token aleatorio de 32 caracteres alfanuméricos y devuélvelo como resultado.",
    "code": "randomString(\"[a-zA-Z0-9]\", 32, token)\naddResult(token)",
    "test_inputs": {},
    "test_list": [
      "re.match(r'^[a-zA-Z0-9]{32}$', str(token))"
    ]
  },
  {
    "task_id": 6,
    "text": "Recibe el parámetro 'age'. Si age es mayor que 18, devuelve 'adulto'; de lo contrario devuelve 'menor'.",
    "code": "addParam(\"age\", age)\nif(age, 18, \">\")\nresult = \"adulto\"\nelse()\nresult = \"menor\"\nend()\naddResult(result)",
    "test_inputs": {
      "age": 25
    },
    "test_list": [
      "re.match(r'^adulto$', str(result))"
    ]
  },
  {
    "task_id": 7,
    "text": "Recibe el parámetro 'score'. Si score es igual a 100, establece _status en 200 y result en 'perfecto'; si no, _status en 400 y result en 'incompleto'.",
    "code": "addParam(\"score\", score)\nif(score, 100, \"==\")\naddVar(_status, 200)\nresult = \"perfecto\"\nelse()\naddVar(_status, 400)\nresult = \"incompleto\"\nend()\naddResult(result)",
    "test_inputs": {
      "score": 100
    },
    "test_list": [
      "re.match(r'^perfecto$', str(result))",
      "re.match(r'^200$', str(_status))"
    ]
  },
  {
    "task_id": 8,
    "text": "Crea una lista con el elemento 'item1', obtén su longitud y devuelve la longitud como resultado.",
    "code": "variableToList(\"item1\", myList)\ngetListLen(myList, length)\naddResult(length)",
    "test_inputs": {},
    "test_list": [
      "re.match(r'^1$', str(length))"
    ]
  },
  {
    "task_id": 9,
    "text": "Recibe el parámetro 'items' como lista de query params, obtén su longitud y devuélvela como resultado.",
    "code": "getQueryParamList(\"items\", items)\ngetListLen(items, length)\naddResult(length)",
    "test_inputs": {
      "items": [
        "a",
        "b",
        "c"
      ]
    },
    "test_list": [
      "re.match(r'^\\d+$', str(length))"
    ]
  },
  {
    "task_id": 10,
    "text": "Recibe el parámetro 'data' como JSON, extrae el campo 'name' y devuélvelo como resultado.",
    "code": "addParam(\"data\", data)\nvariableFromJSON(data, \"name\", name)\naddResult(name)",
    "test_inputs": {
      "data": "{\"name\": \"Carlos\", \"age\": 30}"
    },
    "test_list": [
      "re.match(r'^Carlos$', str(name))"
    ]
  },
  {
    "task_id": 11,
    "text": "Crea un objeto JSON vacío, agrega el campo 'status' con valor 'ok' y devuelve el objeto como resultado.",
    "code": "info = {}\nAddVariableToJSON(\"status\", \"ok\", info)\naddResult(info)",
    "test_inputs": {},
    "test_list": [
      "re.match(r'.*ok.*', str(info))"
    ]
  },
  {
    "task_id": 12,
    "text": "Recibe el parámetro 'password', genera su hash MD5 y devuelve el hash como resultado.",
    "code": "addParam(\"password\", password)\nencodeMD5(password, hashed)\naddResult(hashed)",
    "test_inputs": {
      "password": "mypassword"
    },
    "test_list": [
      "re.match(r'^[a-f0-9]{32}$', str(hashed))"
    ]
  },
  {
    "task_id": 13,
    "text": "Obtén la fecha y hora actual en formato 'YYYY-MM-DD' en la zona horaria 'UTC' y devuélvela como resultado.",
    "code": "getDateTime(\"%Y-%m-%d\", 0, \"UTC\", today)\naddResult(today)",
    "test_inputs": {},
    "test_list": [
      "re.match(r'^\\d{4}-\\d{2}-\\d{2}$', str(today))"
    ]
  },
  {
    "task_id": 14,
    "text": "Recibe el parámetro 'epoch', conviértelo a string de fecha en formato 'YYYY-MM-DD HH:MM:SS' y devuelve el resultado.",
    "code": "addParam(\"epoch\", epoch)\nstampToDatetime(epoch, \"%Y-%m-%d %H:%M:%S\", 0, datestr)\naddResult(datestr)",
    "test_inputs": {
      "epoch": 1700000000
    },
    "test_list": [
      "re.match(r'^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$', str(datestr))"
    ]
  },
  {
    "task_id": 15,
    "text": "Recibe el parámetro 'date_str' en formato 'YYYY-MM-DD', conviértelo a epoch y devuelve el epoch como resultado.",
    "code": "addParam(\"date_str\", date_str)\ngetTimeStamp(date_str, \"%Y-%m-%d\", 0, epoch)\naddResult(epoch)",
    "test_inputs": {
      "date_str": "2024-01-15"
    },
    "test_list": [
      "re.match(r'^\\d+$', str(epoch))"
    ]
  },
  {
    "task_id": 16,
    "text": "Define una función que recibe un número y devuelve su cuadrado. Llama a la función con el parámetro 'n' y devuelve el resultado.",
    "code": "function square(n) {\nresult = n * n\nreturn(result)\n}\naddParam(\"n\", n)\nsquared = square(n)\naddResult(squared)",
    "test_inputs": {
      "n": 7
    },
    "test_list": [
      "re.match(r'^49$', str(squared))"
    ]
  },
  {
    "task_id": 17,
    "text": "Define una función que recibe dos números y devuelve su suma. Llama a la función con los parámetros 'a' y 'b' y devuelve el resultado.",
    "code": "function add(a, b) {\nresult = a + b\nreturn(result)\n}\naddParam(\"a\", a)\naddParam(\"b\", b)\nsum = add(a, b)\naddResult(sum)",
    "test_inputs": {
      "a": 15,
      "b": 27
    },
    "test_list": [
      "re.match(r'^42$', str(sum))"
    ]
  },
  {
    "task_id": 18,
    "text": "Usa un bloque try/exception para intentar dividir el parámetro 'num' entre 0. Si ocurre error, devuelve 'error_division'.",
    "code": "addParam(\"num\", num)\ntry()\nresult = num / 0\nexception(err)\nresult = \"error_division\"\nend()\naddResult(result)",
    "test_inputs": {
      "num": 10
    },
    "test_list": [
      "re.match(r'^error_division$', str(result))"
    ]
  },
  {
    "task_id": 19,
    "text": "Recibe el parámetro 'url', realiza una petición GET a esa URL con timeout de 5000ms y devuelve la respuesta.",
    "code": "addParam(\"url\", url)\nRequestGet(url, \"\", \"\", response, 5000)\naddResult(response)",
    "test_inputs": {
      "url": "https://httpbin.org/get"
    },
    "test_list": [
      "re.match(r'^.*$', str(response))"
    ]
  },
  {
    "task_id": 20,
    "text": "Recibe los parámetros 'url' y 'body', realiza una petición POST con timeout de 3000ms y devuelve la respuesta.",
    "code": "addParam(\"url\", url)\naddParam(\"body\", body)\nRequestPost(url, \"\", \"\", body, response, 3000)\naddResult(response)",
    "test_inputs": {
      "url": "https://httpbin.org/post",
      "body": "{\"key\":\"value\"}"
    },
    "test_list": [
      "re.match(r'^.*$', str(response))"
    ]
  },
  {
    "task_id": 21,
    "text": "Instancia un conector externo con UUID '20908e93260147acb2636967021fbf5d', llama al método 'get_status' y devuelve el resultado.",
    "code": "connector = avapConnector(\"20908e93260147acb2636967021fbf5d\")\nstatus = connector.get_status()\naddResult(status)",
    "test_inputs": {},
    "test_list": [
      "re.match(r'^.*$', str(status))"
    ]
  },
  {
    "task_id": 22,
    "text": "Lanza una función 'fetchData' de forma asíncrona con go, espera el resultado con gather (timeout 2000ms) y devuelve el resultado.",
    "code": "function fetchData() {\ndata = \"fetched\"\nreturn(data)\n}\nhandle = go fetchData()\nresult = gather(handle, 2000)\naddResult(result)",
    "test_inputs": {},
    "test_list": [
      "re.match(r'^fetched$', str(result))"
    ]
  },
  {
    "task_id": 23,
    "text": "Recibe el parámetro 'n', itera desde 0 hasta n acumulando la suma y devuelve la suma total.",
    "code": "addParam(\"n\", n)\naccum = 0\nstartLoop(i, 0, n)\naccum = accum + i\nendLoop()\naddResult(accum)",
    "test_inputs": {
      "n": 5
    },
    "test_list": [
      "re.match(r'^10$', str(accum))"
    ]
  },
  {
    "task_id": 24,
    "text": "Recibe el parámetro 'value'. Usando if Modo 2, si value es mayor que 0 y menor que 100, devuelve 'rango_valido'; si no, devuelve 'fuera_de_rango'.",
    "code": "addParam(\"value\", value)\nif(None, None, `value > 0 and value < 100`)\nresult = \"rango_valido\"\nelse()\nresult = \"fuera_de_rango\"\nend()\naddResult(result)",
    "test_inputs": {
      "value": 50
    },
    "test_list": [
      "re.match(r'^rango_valido$', str(result))"
    ]
  },
  {
    "task_id": 25,
    "text": "Realiza una consulta ORM a la tabla 'users' seleccionando todos los campos sin filtro y devuelve los registros.",
    "code": "ormAccessSelect(\"*\", \"users\", \"\", records)\naddResult(records)",
    "test_inputs": {},
    "test_list": [
      "re.match(r'^.*$', str(records))"
    ]
  },
  {
    "task_id": 26,
    "text": "Recibe los parámetros 'username' y 'email', inserta un registro en la tabla 'users' y devuelve el resultado de la inserción.",
    "code": "addParam(\"username\", username)\naddParam(\"email\", email)\nfields = {\"username\": username, \"email\": email}\normAccessInsert(fields, \"users\", insert_result)\naddResult(insert_result)",
    "test_inputs": {
      "username": "bob",
      "email": "bob@example.com"
    },
    "test_list": [
      "re.match(r'^.*$', str(insert_result))"
    ]
  },
  {
    "task_id": 27,
    "text": "Recibe el parámetro 'user_id', actualiza el campo 'active' a 1 en la tabla 'users' donde id coincide y devuelve el resultado.",
    "code": "addParam(\"user_id\", user_id)\nfields = \"active\"\nvalues = {\"active\": 1}\nselector = \"id = \" + str(user_id)\normAccessUpdate(fields, values, \"users\", selector, update_result)\naddResult(update_result)",
    "test_inputs": {
      "user_id": 42
    },
    "test_list": [
      "re.match(r'^.*$', str(update_result))"
    ]
  },
  {
    "task_id": 28,
    "text": "Importa la librería nativa 'math', calcula el cuadrado de 9 usando una función y devuelve el resultado.",
    "code": "import <math>\nfunction calcSquare(x) {\nresult = x * x\nreturn(result)\n}\nresult = calcSquare(9)\naddResult(result)",
    "test_inputs": {},
    "test_list": [
      "re.match(r'^81$', str(result))"
    ]
  },
  {
    "task_id": 29,
    "text": "Recibe el parámetro 'items_json' como JSON con una lista bajo la clave 'items'. Extrae la lista, obtén su longitud y devuelve la longitud.",
    "code": "addParam(\"items_json\", items_json)\nvariableFromJSON(items_json, \"items\", items)\ngetListLen(items, length)\naddResult(length)",
    "test_inputs": {
      "items_json": "{\"items\": [\"x\", \"y\", \"z\"]}"
    },
    "test_list": [
      "re.match(r'^3$', str(length))"
    ]
  },
  {
    "task_id": 30,
    "text": "Recibe el parámetro 'token'. Si el token tiene exactamente 32 caracteres (usando Modo 2), devuelve 'token_valido' con _status 200; si no, devuelve 'token_invalido' con _status 401.",
    "code": "addParam(\"token\", token)\nif(None, None, `len(token) == 32`)\nresult = \"token_valido\"\naddVar(_status, 200)\nelse()\nresult = \"token_invalido\"\naddVar(_status, 401)\nend()\naddResult(result)",
    "test_inputs": {
      "token": "abcdefghijklmnopqrstuvwxyz123456"
    },
    "test_list": [
      "re.match(r'^token_valido$', str(result))",
      "re.match(r'^200$', str(_status))"
    ]
  }
]