import { distributions, generateInt, generateFloatRange } from "./generators";
import { test, expectEqual } from "./lib";

let checkDistributionSame = (
  distribution: string,
  operation: (arg: string) => string
): void => {
  expectEqual(
    operation(distribution),
    operation(`toPointSet(${distribution})`)
  );
  expectEqual(
    operation(distribution),
    operation(`toSampleSet(${distribution})`)
  );
};

Object.entries(distributions).map(([key, generator]) => {
  let distribution = generator();
  test(`mean is the same for ${key} distribution under all distribution types`, () =>
    checkDistributionSame(distribution, (d: string) => `mean(${d})`));

  test(`cdf is the same for ${key} distribution under all distribution types`, () => {
    let cdf_value = generateInt();
    checkDistributionSame(
      distribution,
      (d: string) => `cdf(${d}, ${cdf_value})`
    );
  });

  test(`pdf is the same for ${key} distribution under all distribution types`, () => {
    let pdf_value = generateInt();
    checkDistributionSame(
      distribution,
      (d: string) => `pdf(${d}, ${pdf_value})`
    );
  });

  test(`inv is the same for ${key} distribution under all distribution types`, () => {
    let inv_value = generateFloatRange(0, 1);
    checkDistributionSame(
      distribution,
      (d: string) => `inv(${d}, ${inv_value})`
    );
  });
});