<?php
namespace nulib;

use nulib\tests\TestCase;

class clTest extends TestCase {
  function checkKeys(?array $array, ?array $ref, bool $sameKeys, array $expectedKeys, array $expectedRemains, array $expectedMissings): void {
    self::assertSame($sameKeys, cl::same_keys($array, $ref, $keys, $remains, $missings), "sameKeys");
    self::assertSame($expectedKeys, $keys, "keys");
    self::assertSame($expectedRemains, $remains, "remains");
    self::assertSame($expectedMissings, $missings, "missings");
  }
  function test_same_keys() {
    $array = ["a" => 42, "b" => "tesxt"]; $arrayKeys = array_keys($array);
    $xarray = ["parasite0", "a" => 42, "parasite1", "b" => "tesxt"]; $xarrayKeys = array_keys($array);
    $ref = ["a" => "int", "b" => "text"]; $refKeys = array_keys($ref);
    $missingArray = ["c" => true]; $missingKeys = array_keys($missingArray);
    $missingRef = ["c" => "bool"]; $missingKeys = array_keys($missingRef);

    $this->checkKeys(null, null, true, [], [], []);
    $this->checkKeys(null, [], true, [], [], []);
    $this->checkKeys([], null, true, [], [], []);
    $this->checkKeys([], [], true, [], [], []);

    $this->checkKeys(null, $ref, false, [], [], $refKeys);
    $this->checkKeys([], $ref, false, [], [], $refKeys);

    $this->checkKeys($array, null, true, [], $arrayKeys, []);
    $this->checkKeys($array, [], true, [], $arrayKeys, []);

    $this->checkKeys($array, $ref, true, $arrayKeys, [], []);
    $this->checkKeys(cl::merge($array, $missingArray), $ref, true, $arrayKeys, $missingKeys, []);
    $this->checkKeys($array, cl::merge($ref, $missingRef), false, $arrayKeys, [], $missingKeys);

    $this->checkKeys($xarray, $ref, false, $arrayKeys, [0, 1], []);
  }
}