LevelledTopologicalSorter.spec.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import 'reflect-metadata';
  2. import { assert } from 'chai';
  3. import { InversifyContainerFacade } from '../../../src/container/InversifyContainerFacade';
  4. import { ServiceIdentifiers } from '../../../src/container/ServiceIdentifiers';
  5. import { IInversifyContainerFacade } from '../../../src/interfaces/container/IInversifyContainerFacade';
  6. import { ILevelledTopologicalSorter } from '../../../src/interfaces/utils/ILevelledTopologicalSorter';
  7. describe('EscapeSequenceEncoder', () => {
  8. describe('encode', () => {
  9. let levelledTopologicalSorter: ILevelledTopologicalSorter;
  10. beforeEach(() => {
  11. const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade();
  12. inversifyContainerFacade.load('', '', {});
  13. levelledTopologicalSorter = inversifyContainerFacade
  14. .get<ILevelledTopologicalSorter>(ServiceIdentifiers.ILevelledTopologicalSorter);
  15. });
  16. describe('Base sort', () => {
  17. beforeEach(() => {
  18. levelledTopologicalSorter.add('A', 'B');
  19. levelledTopologicalSorter.add('B');
  20. levelledTopologicalSorter.add('C', 'B');
  21. levelledTopologicalSorter.add('D');
  22. levelledTopologicalSorter.add('E');
  23. levelledTopologicalSorter.add('F', 'A');
  24. levelledTopologicalSorter.add('F', 'E');
  25. });
  26. describe('Variant #1: Base linear sort', () => {
  27. const expectedSortedItems: string[] = [
  28. 'F',
  29. 'A',
  30. 'C',
  31. 'B',
  32. 'D',
  33. 'E',
  34. ];
  35. let sortedItems: string[];
  36. beforeEach(() => {
  37. sortedItems = levelledTopologicalSorter.sort();
  38. });
  39. it('should topologically linear sort items', () => {
  40. assert.deepEqual(sortedItems, expectedSortedItems);
  41. });
  42. });
  43. describe('Variant #2: Base sort with grouping', () => {
  44. const expectedSortedItems: string[][] = [
  45. ['C', 'D', 'F'],
  46. ['A', 'E'],
  47. ['B']
  48. ];
  49. let sortedItems: string[][];
  50. beforeEach(() => {
  51. sortedItems = levelledTopologicalSorter.sortByGroups();
  52. });
  53. it('should topologically linear sort items', () => {
  54. assert.deepEqual(sortedItems, expectedSortedItems);
  55. });
  56. });
  57. });
  58. describe('Sort without relations', () => {
  59. beforeEach(() => {
  60. levelledTopologicalSorter.add('A');
  61. levelledTopologicalSorter.add('B');
  62. levelledTopologicalSorter.add('C');
  63. levelledTopologicalSorter.add('D');
  64. levelledTopologicalSorter.add('E');
  65. levelledTopologicalSorter.add('F');
  66. });
  67. describe('Variant #1: Should sort items without relations', () => {
  68. const expectedSortedItems: string[] = [
  69. 'A',
  70. 'B',
  71. 'C',
  72. 'D',
  73. 'E',
  74. 'F'
  75. ];
  76. let sortedItems: string[];
  77. beforeEach(() => {
  78. sortedItems = levelledTopologicalSorter.sort();
  79. });
  80. it('should topologically linear sort items', () => {
  81. assert.deepEqual(sortedItems, expectedSortedItems);
  82. });
  83. });
  84. describe('Variant #2: Should sort items without relations with grouping', () => {
  85. const expectedSortedItems: string[][] = [
  86. ['A', 'B', 'C', 'D', 'E', 'F']
  87. ];
  88. let sortedItems: string[][];
  89. beforeEach(() => {
  90. sortedItems = levelledTopologicalSorter.sortByGroups();
  91. });
  92. it('should topologically linear sort items', () => {
  93. assert.deepEqual(sortedItems, expectedSortedItems);
  94. });
  95. });
  96. });
  97. describe('Circular relations', () => {
  98. let testFunc: () => void;
  99. beforeEach(() => {
  100. levelledTopologicalSorter.add('A', 'B');
  101. levelledTopologicalSorter.add('B', 'A');
  102. testFunc = () => levelledTopologicalSorter.sort();
  103. });
  104. it('should topologically linear sort items', () => {
  105. assert.throws(testFunc, Error);
  106. });
  107. });
  108. });
  109. });