import { assert, assertEquals } from 'jsr:@std/assert';
import {
  convertSetToArray,
  createUniqueNumberSet,
  createUserMap,
  filterEvenNumbers,
  findFirstGreaterThan,
  getAllUserIds,
  getAllUserNames,
  getUserById,
  isNumberInSet,
  modifyArray,
  sliceNumbers,
  sortNumbersDescending,
  squareNumbers,
  sumNumbers,
} from './solution.ts';

Deno.test('squareNumbers quadriert alle Zahlen', () => {
  assertEquals(squareNumbers([1, 2, 3]), [1, 4, 9]);
});

Deno.test('filterEvenNumbers filtert nur gerade Zahlen', () => {
  assertEquals(filterEvenNumbers([1, 2, 3, 4, 5]), [2, 4]);
});

Deno.test('sumNumbers berechnet die Summe', () => {
  assertEquals(sumNumbers([1, 2, 3, 4, 5]), 15);
});

Deno.test(
  'findFirstGreaterThan findet das erste Element über dem Limit',
  () => {
    assertEquals(findFirstGreaterThan([1, 2, 3, 4, 5], 3), 4);
  }
);

Deno.test('sortNumbersDescending sortiert das Array absteigend', () => {
  assertEquals(sortNumbersDescending([3, 1, 4, 2, 5]), [5, 4, 3, 2, 1]);
});

Deno.test('sliceNumbers extrahiert den gewünschten Teil des Arrays', () => {
  assertEquals(sliceNumbers([1, 2, 3, 4, 5], 1, 3), [2, 3]);
});

Deno.test('modifyArray ersetzt das Element an einem bestimmten Index', () => {
  assertEquals(modifyArray([1, 2, 3, 4, 5], 2, 99), [1, 2, 99, 4, 5]);
});

Deno.test('createUserMap erstellt eine Map mit Nutzern', () => {
  const users = createUserMap();
  assert(users.size === 2);
});

Deno.test('getUserById gibt den richtigen Nutzer zurück', () => {
  const users = createUserMap();
  assertEquals(getUserById(users, 1), 'Alice');
});

Deno.test('getAllUserIds gibt alle Schlüssel zurück', () => {
  const users = createUserMap();
  assertEquals(getAllUserIds(users), [1, 2]);
});

Deno.test('getAllUserNames gibt alle Werte zurück', () => {
  const users = createUserMap();
  assertEquals(getAllUserNames(users), ['Alice', 'Bob']);
});

Deno.test('createUniqueNumberSet erstellt ein Set ohne Duplikate', () => {
  assertEquals(
    Array.from(createUniqueNumberSet([1, 2, 2, 3, 3, 4])),
    [1, 2, 3, 4]
  );
});

Deno.test('isNumberInSet prüft, ob eine Zahl existiert', () => {
  const set = new Set([1, 2, 3]);
  assert(isNumberInSet(set, 2));
  assert(!isNumberInSet(set, 5));
});

Deno.test('convertSetToArray wandelt ein Set in ein Array um', () => {
  const set = new Set([1, 2, 3]);
  assertEquals(convertSetToArray(set), [1, 2, 3]);
});
