RandomGenerator.spec.ts 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import 'reflect-metadata';
  2. import { assert } from 'chai';
  3. import { ServiceIdentifiers } from '../../../src/container/ServiceIdentifiers';
  4. import { IInversifyContainerFacade } from '../../../src/interfaces/container/IInversifyContainerFacade';
  5. import { IRandomGenerator } from '../../../src/interfaces/utils/IRandomGenerator';
  6. import { InversifyContainerFacade } from '../../../src/container/InversifyContainerFacade';
  7. describe('RandomGenerator', () => {
  8. let randomGenerator: IRandomGenerator;
  9. before(() => {
  10. const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade();
  11. inversifyContainerFacade.load('', '', {});
  12. randomGenerator = inversifyContainerFacade.get<IRandomGenerator>(ServiceIdentifiers.IRandomGenerator);
  13. });
  14. describe('getRandomIntegerExcluding', () => {
  15. describe('Variant #1: avoid excluded values', () => {
  16. const samplesCount: number = 500;
  17. const minValue: number = 5;
  18. const maxValue: number = 10;
  19. const valuesToExclude: number[] = [6, 9];
  20. const expectedRandomIntegerValues: number[] = [5, 7, 8, 10];
  21. let isRandomIntegerInAllowedValuesRange: boolean = true;
  22. before(() => {
  23. for (let i = 0; i < samplesCount; i++) {
  24. const randomInteger = randomGenerator.getRandomIntegerExcluding(minValue, maxValue, valuesToExclude);
  25. if (!expectedRandomIntegerValues.includes(randomInteger)) {
  26. isRandomIntegerInAllowedValuesRange = false;
  27. }
  28. }
  29. });
  30. it('should return a random integer in allowed values range', () => {
  31. assert.isTrue(isRandomIntegerInAllowedValuesRange);
  32. });
  33. });
  34. describe('Variant #2: values boundaries', () => {
  35. const samplesCount: number = 500;
  36. const minValue: number = 5;
  37. const maxValue: number = 10;
  38. const valuesToExclude: number[] = [6, 9];
  39. const delta: number = 0.15;
  40. const expectedValueChance: number = 0.2
  41. let minValuesCount: number = 0;
  42. let maxValuesCount: number = 0;
  43. let minValueChance: number;
  44. let maxValueChance: number;
  45. before(() => {
  46. for (let i = 0; i < samplesCount; i++) {
  47. const randomInteger: number = randomGenerator.getRandomIntegerExcluding(minValue, maxValue, valuesToExclude);
  48. if (randomInteger === minValue) {
  49. minValuesCount += 1;
  50. }
  51. if (randomInteger === maxValue) {
  52. maxValuesCount += 1;
  53. }
  54. minValueChance = minValuesCount / samplesCount;
  55. maxValueChance = maxValuesCount / samplesCount;
  56. }
  57. });
  58. it('should generate min values', () => {
  59. assert.closeTo(minValueChance, expectedValueChance, delta);
  60. });
  61. it('should generate max values', () => {
  62. assert.closeTo(maxValueChance, expectedValueChance, delta);
  63. });
  64. });
  65. });
  66. });