import { test } from "node:test";
import assert from "node:assert/strict";
import { numeroDoTexto, textoDecimalValido, textoDoNumero, textoInteiroValido } from "./numero-do-campo.ts";

test("lê vírgula e ponto como decimal", () => {
  assert.equal(numeroDoTexto("0,160"), 0.16);
  assert.equal(numeroDoTexto("0.160"), 0.16);
  assert.equal(numeroDoTexto(",5"), 0.5);
  assert.equal(numeroDoTexto("120"), 120);
  assert.equal(numeroDoTexto("12,50"), 12.5);
});

test("separador de milhar só quando não há dúvida", () => {
  assert.equal(numeroDoTexto("1.234,56"), 1234.56);
  assert.equal(numeroDoTexto("1,234.56"), 1234.56);
  assert.equal(numeroDoTexto("1.234.567"), 1234567);
});

test("texto sem número vira zero", () => {
  assert.equal(numeroDoTexto(""), 0);
  assert.equal(numeroDoTexto("-"), 0);
  assert.equal(numeroDoTexto(","), 0);
  assert.equal(numeroDoTexto("abc"), 0);
  assert.equal(numeroDoTexto(null), 0);
  assert.equal(numeroDoTexto(undefined), 0);
  assert.equal(numeroDoTexto(NaN), 0);
});

test("ignora moeda, porcentagem e espaço", () => {
  assert.equal(numeroDoTexto("R$ 12,50"), 12.5);
  assert.equal(numeroDoTexto("10 %"), 10);
  assert.equal(numeroDoTexto(7), 7);
});

test("enquanto digita: aceita o texto incompleto, recusa letra e segundo separador", () => {
  for (const t of ["", "0", "0,", "0,1", "0,16", "0,160", ".", "12.", "1200"]) {
    assert.equal(textoDecimalValido(t), true, `devia aceitar "${t}"`);
  }
  for (const t of ["0,1,", "1.2.3", "1,2.3", "a", "1a", "-1", "1-"]) {
    assert.equal(textoDecimalValido(t), false, `devia recusar "${t}"`);
  }
  assert.equal(textoDecimalValido("-1", true), true);
  assert.equal(textoDecimalValido("-", true), true);
});

test("campo de inteiros só aceita dígitos", () => {
  assert.equal(textoInteiroValido(""), true);
  assert.equal(textoInteiroValido("90"), true);
  assert.equal(textoInteiroValido("9,5"), false);
  assert.equal(textoInteiroValido("9."), false);
});

test("escreve o número em português, sem milhar", () => {
  assert.equal(textoDoNumero(0.16), "0,16");
  assert.equal(textoDoNumero(120), "120");
  assert.equal(textoDoNumero(1234.5), "1234,5");
  assert.equal(textoDoNumero(0), "0");
  assert.equal(textoDoNumero(0, true), "");
  assert.equal(textoDoNumero(null), "");
  assert.equal(textoDoNumero(0.0016), "0,0016");
});

test("ida e volta preserva o valor", () => {
  for (const n of [0.16, 0.0016, 1.5, 33.33, 1200, 0]) {
    assert.equal(numeroDoTexto(textoDoNumero(n)), n);
  }
});
