import { describe, it } from 'node:test';
import assert from 'node:assert/strict';
import { normalizeProjectLang, resolveJdkVersionForWorkflow } from './cicd-workflow.js';

// ── normalizeProjectLang ──────────────────────────────────────────────────────

describe('normalizeProjectLang', () => {
  it('lowercases the language', () => {
    assert.equal(normalizeProjectLang('Java'), 'java');
    assert.equal(normalizeProjectLang('COBOL'), 'cobol');
    assert.equal(normalizeProjectLang('TypeScript'), 'typescript');
  });

  it('strips version suffix after a space', () => {
    assert.equal(normalizeProjectLang('Java 22'), 'java');
    assert.equal(normalizeProjectLang('Python 3.12'), 'python');
    assert.equal(normalizeProjectLang('COBOL-85'), 'cobol');
  });

  it('strips hyphenated version suffixes', () => {
    assert.equal(normalizeProjectLang('TypeScript-5'), 'typescript');
    assert.equal(normalizeProjectLang('java-21'), 'java');
    assert.equal(normalizeProjectLang('cobol-2023'), 'cobol');
  });

  it('handles null and undefined gracefully', () => {
    assert.equal(normalizeProjectLang(null), '');
    assert.equal(normalizeProjectLang(undefined), '');
  });

  it('returns empty string for blank input', () => {
    assert.equal(normalizeProjectLang(''), '');
    assert.equal(normalizeProjectLang('   '), '');
  });

  it('preserves languages without version suffixes', () => {
    assert.equal(normalizeProjectLang('python'), 'python');
    assert.equal(normalizeProjectLang('go'), 'go');
    assert.equal(normalizeProjectLang('rust'), 'rust');
  });
});

// ── resolveJdkVersionForWorkflow ──────────────────────────────────────────────

describe('resolveJdkVersionForWorkflow', () => {
  it('extracts 2-digit JDK version from "Java 21 LTS"', () => {
    assert.equal(resolveJdkVersionForWorkflow('java', 'Java 21 LTS'), '21');
  });

  it('extracts 2-digit JDK version from "Java 17 LTS"', () => {
    assert.equal(resolveJdkVersionForWorkflow('java', 'Java 17 LTS'), '17');
  });

  it('extracts the highest supported 2-digit JDK version "Java 99"', () => {
    // The function accepts 2–3 digit matches in the range 8–99; 100+ falls back to default.
    assert.equal(resolveJdkVersionForWorkflow('java', 'Java 99'), '99');
  });

  it('falls back to 21 when no version is recognisable', () => {
    assert.equal(resolveJdkVersionForWorkflow('java', 'latest'), '21');
    assert.equal(resolveJdkVersionForWorkflow('java', ''), '21');
  });

  it('extracts version for kotlin from "Kotlin 2.0"', () => {
    // Kotlin uses the tail-number path since there is no "java" in the version string
    const v = resolveJdkVersionForWorkflow('kotlin', 'Java 21 LTS');
    assert.equal(v, '21');
  });

  it('handles "java8" (no space)', () => {
    assert.equal(resolveJdkVersionForWorkflow('java', 'java8'), '8');
  });

  it('maps single-digit "java7" to "7" (but treated as supported JDK)', () => {
    // single-digit path: n must be >= 8; java7 → n=7 → returns '8'
    assert.equal(resolveJdkVersionForWorkflow('java', 'java7'), '8');
  });

  it('handles mixed-case version strings', () => {
    assert.equal(resolveJdkVersionForWorkflow('java', 'JAVA 11 LTS'), '11');
  });
});
