raain-model 2.6.8 → 2.6.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/.cursorignore +10 -0
  2. package/.github/workflows/ci.yml +29 -0
  3. package/CHANGELOG.md +166 -0
  4. package/LICENSE +21 -0
  5. package/README.md +5 -3
  6. package/RELEASE_PROCESS.md +111 -0
  7. package/package.json +1 -1
  8. package/specs/REQUIREMENTS.md +42 -0
  9. package/specs/TECHNICAL.md +57 -0
  10. package/specs/cartesian/Cartesian.spec.ts +82 -0
  11. package/specs/cartesian/CartesianTools.spec.ts +121 -0
  12. package/specs/gauge/Gauge.spec.ts +39 -0
  13. package/specs/organization/Organization.spec.ts +38 -0
  14. package/specs/polar/Polar.spec.ts +267 -0
  15. package/specs/quality/Position.spec.ts +18 -0
  16. package/specs/quality/QualityPointEdgeCases.spec.ts +215 -0
  17. package/specs/quality/QualityTools.spec.ts +67 -0
  18. package/specs/quality/SpeedMatrix.spec.ts +214 -0
  19. package/specs/radar/Radar.spec.ts +129 -0
  20. package/specs/rain/Rain.spec.ts +334 -0
  21. package/specs/tsconfig.json +12 -0
  22. package/{cartesian/CartesianMeasureValue.js → src/cartesian/CartesianMeasureValue.ts} +73 -41
  23. package/{cartesian/CartesianTools.js → src/cartesian/CartesianTools.ts} +130 -69
  24. package/src/cartesian/CartesianValue.ts +26 -0
  25. package/src/cartesian/EarthMap.ts +5 -0
  26. package/src/cartesian/ICartesianMeasureValue.ts +22 -0
  27. package/src/cartesian/LatLng.ts +43 -0
  28. package/src/cartesian/RadarCartesianMeasureValue.ts +32 -0
  29. package/src/cartesian/RainCartesianMeasureValue.ts +32 -0
  30. package/src/gauge/GaugeMeasure.ts +42 -0
  31. package/{gauge/GaugeNode.js → src/gauge/GaugeNode.ts} +48 -20
  32. package/src/gauge/GaugeNodeMap.ts +55 -0
  33. package/src/organization/EventNode.ts +43 -0
  34. package/{organization/Link.js → src/organization/Link.ts} +15 -15
  35. package/src/organization/Measure.ts +61 -0
  36. package/{organization/PeopleNode.js → src/organization/PeopleNode.ts} +20 -10
  37. package/{organization/RaainNode.js → src/organization/RaainNode.ts} +91 -58
  38. package/{organization/TeamNode.js → src/organization/TeamNode.ts} +36 -13
  39. package/{polar/AbstractPolarMeasureValue.js → src/polar/AbstractPolarMeasureValue.ts} +58 -32
  40. package/src/polar/IPolarMeasureValue.ts +21 -0
  41. package/{polar/MeasureValuePolarContainer.js → src/polar/MeasureValuePolarContainer.ts} +29 -13
  42. package/src/polar/PolarFilter.ts +46 -0
  43. package/{polar/PolarMeasureValue.js → src/polar/PolarMeasureValue.ts} +125 -62
  44. package/{polar/PolarMeasureValueMap.js → src/polar/PolarMeasureValueMap.ts} +165 -88
  45. package/src/polar/PolarValue.ts +16 -0
  46. package/{polar/RadarPolarMeasureValue.js → src/polar/RadarPolarMeasureValue.ts} +34 -21
  47. package/src/polar/RainPolarMeasureValue.ts +57 -0
  48. package/{quality/QualityPoint.js → src/quality/QualityPoint.ts} +62 -34
  49. package/{quality/SpeedMatrix.js → src/quality/SpeedMatrix.ts} +117 -76
  50. package/{quality/SpeedMatrixContainer.js → src/quality/SpeedMatrixContainer.ts} +210 -103
  51. package/src/quality/history/CartesianGaugeHistory.ts +23 -0
  52. package/src/quality/history/CartesianRainHistory.ts +15 -0
  53. package/src/quality/history/PositionHistory.ts +31 -0
  54. package/{quality/index.d.ts → src/quality/index.ts} +3 -0
  55. package/src/quality/position/Position.ts +59 -0
  56. package/src/quality/position/PositionValue.ts +15 -0
  57. package/{quality/tools/QualityTools.js → src/quality/tools/QualityTools.ts} +18 -17
  58. package/src/radar/RadarMeasure.ts +41 -0
  59. package/{radar/RadarNode.js → src/radar/RadarNode.ts} +41 -19
  60. package/src/radar/RadarNodeMap.ts +61 -0
  61. package/src/rain/MergeStrategy.ts +15 -0
  62. package/src/rain/RainComputation.ts +96 -0
  63. package/{rain/RainComputationAbstract.js → src/rain/RainComputationAbstract.ts} +135 -69
  64. package/{rain/RainComputationMap.js → src/rain/RainComputationMap.ts} +55 -22
  65. package/{rain/RainComputationQuality.js → src/rain/RainComputationQuality.ts} +82 -44
  66. package/src/rain/RainMeasure.ts +25 -0
  67. package/{rain/RainNode.js → src/rain/RainNode.ts} +117 -72
  68. package/tsconfig.json +17 -0
  69. package/tslint.json +79 -0
  70. package/typedoc.json +31 -0
  71. package/cartesian/CartesianMeasureValue.d.ts +0 -40
  72. package/cartesian/CartesianMeasureValue.js.map +0 -1
  73. package/cartesian/CartesianTools.d.ts +0 -32
  74. package/cartesian/CartesianTools.js.map +0 -1
  75. package/cartesian/CartesianValue.d.ts +0 -14
  76. package/cartesian/CartesianValue.js +0 -17
  77. package/cartesian/CartesianValue.js.map +0 -1
  78. package/cartesian/EarthMap.d.ts +0 -5
  79. package/cartesian/EarthMap.js +0 -3
  80. package/cartesian/EarthMap.js.map +0 -1
  81. package/cartesian/ICartesianMeasureValue.d.ts +0 -23
  82. package/cartesian/ICartesianMeasureValue.js +0 -3
  83. package/cartesian/ICartesianMeasureValue.js.map +0 -1
  84. package/cartesian/LatLng.d.ts +0 -16
  85. package/cartesian/LatLng.js +0 -34
  86. package/cartesian/LatLng.js.map +0 -1
  87. package/cartesian/RadarCartesianMeasureValue.d.ts +0 -17
  88. package/cartesian/RadarCartesianMeasureValue.js +0 -22
  89. package/cartesian/RadarCartesianMeasureValue.js.map +0 -1
  90. package/cartesian/RainCartesianMeasureValue.d.ts +0 -17
  91. package/cartesian/RainCartesianMeasureValue.js +0 -23
  92. package/cartesian/RainCartesianMeasureValue.js.map +0 -1
  93. package/cartesian/index.js +0 -25
  94. package/cartesian/index.js.map +0 -1
  95. package/gauge/GaugeMeasure.d.ts +0 -20
  96. package/gauge/GaugeMeasure.js +0 -30
  97. package/gauge/GaugeMeasure.js.map +0 -1
  98. package/gauge/GaugeNode.d.ts +0 -85
  99. package/gauge/GaugeNode.js.map +0 -1
  100. package/gauge/GaugeNodeMap.d.ts +0 -24
  101. package/gauge/GaugeNodeMap.js +0 -40
  102. package/gauge/GaugeNodeMap.js.map +0 -1
  103. package/gauge/index.js +0 -20
  104. package/gauge/index.js.map +0 -1
  105. package/index.js +0 -24
  106. package/index.js.map +0 -1
  107. package/organization/EventNode.d.ts +0 -22
  108. package/organization/EventNode.js +0 -30
  109. package/organization/EventNode.js.map +0 -1
  110. package/organization/IVersion.js +0 -3
  111. package/organization/IVersion.js.map +0 -1
  112. package/organization/Link.d.ts +0 -16
  113. package/organization/Link.js.map +0 -1
  114. package/organization/Measure.d.ts +0 -22
  115. package/organization/Measure.js +0 -45
  116. package/organization/Measure.js.map +0 -1
  117. package/organization/PeopleNode.d.ts +0 -18
  118. package/organization/PeopleNode.js.map +0 -1
  119. package/organization/RaainNode.d.ts +0 -96
  120. package/organization/RaainNode.js.map +0 -1
  121. package/organization/TeamNode.d.ts +0 -63
  122. package/organization/TeamNode.js.map +0 -1
  123. package/organization/index.js +0 -24
  124. package/organization/index.js.map +0 -1
  125. package/polar/AbstractPolarMeasureValue.d.ts +0 -29
  126. package/polar/AbstractPolarMeasureValue.js.map +0 -1
  127. package/polar/IPolarMeasureValue.d.ts +0 -19
  128. package/polar/IPolarMeasureValue.js +0 -3
  129. package/polar/IPolarMeasureValue.js.map +0 -1
  130. package/polar/MeasureValuePolarContainer.d.ts +0 -19
  131. package/polar/MeasureValuePolarContainer.js.map +0 -1
  132. package/polar/PolarFilter.d.ts +0 -16
  133. package/polar/PolarFilter.js +0 -45
  134. package/polar/PolarFilter.js.map +0 -1
  135. package/polar/PolarMeasureValue.d.ts +0 -51
  136. package/polar/PolarMeasureValue.js.map +0 -1
  137. package/polar/PolarMeasureValueMap.d.ts +0 -45
  138. package/polar/PolarMeasureValueMap.js.map +0 -1
  139. package/polar/PolarValue.d.ts +0 -10
  140. package/polar/PolarValue.js +0 -12
  141. package/polar/PolarValue.js.map +0 -1
  142. package/polar/RadarPolarMeasureValue.d.ts +0 -27
  143. package/polar/RadarPolarMeasureValue.js.map +0 -1
  144. package/polar/RainPolarMeasureValue.d.ts +0 -20
  145. package/polar/RainPolarMeasureValue.js +0 -42
  146. package/polar/RainPolarMeasureValue.js.map +0 -1
  147. package/polar/index.js +0 -25
  148. package/polar/index.js.map +0 -1
  149. package/quality/QualityPoint.d.ts +0 -37
  150. package/quality/QualityPoint.js.map +0 -1
  151. package/quality/SpeedMatrix.d.ts +0 -83
  152. package/quality/SpeedMatrix.js.map +0 -1
  153. package/quality/SpeedMatrixContainer.d.ts +0 -102
  154. package/quality/SpeedMatrixContainer.js.map +0 -1
  155. package/quality/history/CartesianGaugeHistory.d.ts +0 -15
  156. package/quality/history/CartesianGaugeHistory.js +0 -14
  157. package/quality/history/CartesianGaugeHistory.js.map +0 -1
  158. package/quality/history/CartesianRainHistory.d.ts +0 -9
  159. package/quality/history/CartesianRainHistory.js +0 -11
  160. package/quality/history/CartesianRainHistory.js.map +0 -1
  161. package/quality/history/PositionHistory.d.ts +0 -20
  162. package/quality/history/PositionHistory.js +0 -17
  163. package/quality/history/PositionHistory.js.map +0 -1
  164. package/quality/index.js +0 -26
  165. package/quality/index.js.map +0 -1
  166. package/quality/position/Position.d.ts +0 -22
  167. package/quality/position/Position.js +0 -50
  168. package/quality/position/Position.js.map +0 -1
  169. package/quality/position/PositionValue.d.ts +0 -9
  170. package/quality/position/PositionValue.js +0 -12
  171. package/quality/position/PositionValue.js.map +0 -1
  172. package/quality/tools/QualityTools.d.ts +0 -9
  173. package/quality/tools/QualityTools.js.map +0 -1
  174. package/radar/RadarMeasure.d.ts +0 -19
  175. package/radar/RadarMeasure.js +0 -30
  176. package/radar/RadarMeasure.js.map +0 -1
  177. package/radar/RadarNode.d.ts +0 -30
  178. package/radar/RadarNode.js.map +0 -1
  179. package/radar/RadarNodeMap.d.ts +0 -26
  180. package/radar/RadarNodeMap.js +0 -44
  181. package/radar/RadarNodeMap.js.map +0 -1
  182. package/radar/index.js +0 -20
  183. package/radar/index.js.map +0 -1
  184. package/rain/MergeStrategy.d.ts +0 -13
  185. package/rain/MergeStrategy.js +0 -11
  186. package/rain/MergeStrategy.js.map +0 -1
  187. package/rain/RainComputation.d.ts +0 -42
  188. package/rain/RainComputation.js +0 -65
  189. package/rain/RainComputation.js.map +0 -1
  190. package/rain/RainComputationAbstract.d.ts +0 -73
  191. package/rain/RainComputationAbstract.js.map +0 -1
  192. package/rain/RainComputationMap.d.ts +0 -97
  193. package/rain/RainComputationMap.js.map +0 -1
  194. package/rain/RainComputationQuality.d.ts +0 -40
  195. package/rain/RainComputationQuality.js.map +0 -1
  196. package/rain/RainMeasure.d.ts +0 -17
  197. package/rain/RainMeasure.js +0 -18
  198. package/rain/RainMeasure.js.map +0 -1
  199. package/rain/RainNode.d.ts +0 -46
  200. package/rain/RainNode.js.map +0 -1
  201. package/rain/index.js +0 -23
  202. package/rain/index.js.map +0 -1
  203. /package/{cartesian/index.d.ts → src/cartesian/index.ts} +0 -0
  204. /package/{gauge/index.d.ts → src/gauge/index.ts} +0 -0
  205. /package/{index.d.ts → src/index.ts} +0 -0
  206. /package/{organization/IVersion.d.ts → src/organization/IVersion.ts} +0 -0
  207. /package/{organization/index.d.ts → src/organization/index.ts} +0 -0
  208. /package/{polar/index.d.ts → src/polar/index.ts} +0 -0
  209. /package/{radar/index.d.ts → src/radar/index.ts} +0 -0
  210. /package/{rain/index.d.ts → src/rain/index.ts} +0 -0
@@ -0,0 +1,67 @@
1
+ import {expect} from 'chai';
2
+ import {CartesianTools, LatLng, Position, QualityTools} from '../../src';
3
+
4
+ describe('QualityTools', () => {
5
+
6
+ it('should MapPositionToLatLng and MapLatLngToPosition', () => {
7
+
8
+ let point = new Position({x: 0, y: 0});
9
+ let latLng = QualityTools.MapPositionToLatLng(point);
10
+ expect(QualityTools.MapLatLngToPosition(latLng).x).eq(point.x);
11
+ expect(QualityTools.MapLatLngToPosition(latLng).y).eq(point.y);
12
+ expect(latLng.lat).eq(0);
13
+ expect(latLng.lng).eq(0);
14
+
15
+ point = new Position({x: 10, y: -10});
16
+ latLng = QualityTools.MapPositionToLatLng(point);
17
+ expect(QualityTools.MapLatLngToPosition(latLng).x).eq(point.x);
18
+ expect(QualityTools.MapLatLngToPosition(latLng).y).eq(point.y);
19
+ expect(latLng.lat).eq(-10);
20
+ expect(latLng.lng).eq(10);
21
+
22
+ point = new Position({x: 11.0003, y: -11.03});
23
+ latLng = QualityTools.MapPositionToLatLng(point);
24
+ expect(QualityTools.MapLatLngToPosition(latLng).x).eq(point.x);
25
+ expect(QualityTools.MapLatLngToPosition(latLng).y).eq(point.y);
26
+
27
+ point = new Position({x: 11.0003, y: -11.03});
28
+ const cartesianWidthDefault = new LatLng({lat: CartesianTools.DEFAULT_SCALE, lng: CartesianTools.DEFAULT_SCALE});
29
+ latLng = QualityTools.MapPositionToLatLng(point);
30
+ // expect(QualityTools.MapLatLngToPosition(latLng).x).eq(11);
31
+ expect(QualityTools.MapLatLngToPosition(latLng).y).eq(-11.03);
32
+
33
+ const cartesianWidth = new LatLng({lat: 0.01426, lng: 0.00898});
34
+ // expect(QualityTools.MapLatLngToPosition(latLng).y).eq(-11.02298);
35
+ // expect(QualityTools.MapLatLngToPosition(latLng).x).eq(11.0005);
36
+
37
+ latLng = new LatLng({lat: 48.86420972077865, lng: 2.2681507839189115});
38
+ // expect(QualityTools.MapLatLngToPosition(latLng).x).eq(2.27194);
39
+ // expect(QualityTools.MapLatLngToPosition(latLng).y).eq(48.86902);
40
+ latLng = new LatLng({lat: 48.86423959124331, lng: 2.254480156320581});
41
+ // expect(QualityTools.MapLatLngToPosition(latLng).x).eq(2.25398);
42
+ // expect(QualityTools.MapLatLngToPosition(latLng).y).eq(48.86902);
43
+
44
+ });
45
+
46
+ it('should CreateNDimArray', () => {
47
+ const createdEmptyNDimArray = QualityTools.CreateNDimArray([1, 2, 3]);
48
+ expect(createdEmptyNDimArray.length).eq(1);
49
+ expect(createdEmptyNDimArray[0].length).eq(2);
50
+ expect(createdEmptyNDimArray[0][1].length).eq(3);
51
+ expect(createdEmptyNDimArray[0][1][2]).eq(undefined);
52
+
53
+ const createdFilledNDimArray = QualityTools.CreateNDimArray([1, 2, 3], 4321);
54
+ expect(createdFilledNDimArray.length).eq(1);
55
+ expect(createdFilledNDimArray[0].length).eq(2);
56
+ expect(createdFilledNDimArray[0][1].length).eq(3);
57
+ expect(createdFilledNDimArray[0][1][2]).eq(4321);
58
+
59
+ const createdFilledWithZeroNDimArray = QualityTools.CreateNDimArray([1, 2, 3], 0);
60
+ expect(createdFilledWithZeroNDimArray[0][1][2]).eq(0);
61
+
62
+ const createdFilledWithAnyNDimArray = QualityTools.CreateNDimArray([1, 2, 3], []);
63
+ createdFilledWithAnyNDimArray[0][1][2].push('test');
64
+ expect(createdFilledWithAnyNDimArray[0][1][2][0]).eq('test');
65
+ });
66
+
67
+ });
@@ -0,0 +1,214 @@
1
+ import {expect} from 'chai';
2
+ import {CartesianTools, CartesianValue, Position, QualityPoint, RainComputationQuality, SpeedMatrix, SpeedMatrixContainer} from '../../src';
3
+
4
+ describe('SpeedMatrix', () => {
5
+
6
+ const optionalTrace = (...log: any[]) => {
7
+ // console.log(new Date().toISOString(), log)
8
+ }
9
+ const optionalLogger = null; // console;
10
+
11
+ it('should SpeedMatrixContainer CreateFromJson, merge and renderMergedMatrix', () => {
12
+
13
+ const speedMatrices = [];
14
+ speedMatrices.push(new SpeedMatrix('1', '', []));
15
+ speedMatrices.push(new SpeedMatrix('2', '', []));
16
+ const speedMatrixContainer = new SpeedMatrixContainer({matrices: speedMatrices});
17
+
18
+ const speedMatrixContainerTwin = SpeedMatrixContainer.CreateFromJson(speedMatrixContainer.toJSON());
19
+ const optionsForFairCompare = {
20
+ removeFlatten: true,
21
+ removeMatrices: true,
22
+ removeIndicators: true,
23
+ };
24
+
25
+ expect(JSON.stringify(speedMatrixContainer.toJSON(optionsForFairCompare)))
26
+ .equal(JSON.stringify(speedMatrixContainerTwin.toJSON(optionsForFairCompare)));
27
+
28
+ const qualityPoint1 = new QualityPoint({
29
+ gaugeId: 'id1',
30
+ gaugeLabel: 'label1',
31
+ gaugeDate: null,
32
+ rainDate: null,
33
+ gaugeCartesianValue: new CartesianValue({value: 1, lat: 0, lng: 0}),
34
+ rainCartesianValues: [new CartesianValue({value: 2, lat: 0, lng: 0}), new CartesianValue({value: 3, lat: 0.01, lng: 0.02})],
35
+ speed: null,
36
+ remark: 'none',
37
+ });
38
+ const qualityPoint2 = new QualityPoint({
39
+ gaugeId: 'id2',
40
+ gaugeLabel: 'label2',
41
+ gaugeDate: null,
42
+ rainDate: null,
43
+ gaugeCartesianValue: new CartesianValue({value: 10, lat: 0, lng: 0}),
44
+ rainCartesianValues: [new CartesianValue({value: 20, lat: 0, lng: 0}), new CartesianValue({value: 30, lat: 0.01, lng: 0.02})],
45
+ speed: null,
46
+ remark: 'none',
47
+ });
48
+ const qualityPoints = [qualityPoint1, qualityPoint2];
49
+
50
+ const speedMatrixContainerToMerge = SpeedMatrixContainer.CreateFromJson({
51
+ matrices: [new SpeedMatrix('3', '', qualityPoints)],
52
+ trustedIndicator: 0.85
53
+ });
54
+ speedMatrixContainer.merge(speedMatrixContainerToMerge);
55
+
56
+ expect(speedMatrixContainer.getQualityPoints().length).eq(2);
57
+ expect(speedMatrixContainer.getQualityPoints('1').length).eq(0);
58
+ expect(speedMatrixContainer.getQualityPoints('2').length).eq(0);
59
+ expect(speedMatrixContainer.getQualityPoints('3').length).eq(2);
60
+ expect(speedMatrixContainer.getQualityPoints('3')[0].rainCartesianValues.length).eq(2);
61
+
62
+ expect(speedMatrixContainer.getQualityPointsByHistoricalPosition(0).length).eq(0);
63
+ expect(speedMatrixContainer.getQualityPointsByHistoricalPosition(2).length).eq(2);
64
+ expect(speedMatrixContainer.getQualityPointsByHistoricalPosition(20).length).eq(0);
65
+
66
+ const mergedMatrix = speedMatrixContainer.renderMergedMatrix();
67
+ expect(mergedMatrix.length).eq(Math.pow(SpeedMatrix.DEFAULT_MATRIX_RANGE * 2 + 1, 2));
68
+ expect(mergedMatrix[611].value).eq(1);
69
+ expect(mergedMatrix[611].x).eq(2);
70
+ expect(mergedMatrix[611].y).eq(1);
71
+ speedMatrixContainer.logMergedMatrix({normalize: false, logger: optionalLogger});
72
+ speedMatrixContainer.logMergedMatrix({normalize: true, logger: optionalLogger});
73
+ });
74
+
75
+ it('should SpeedMatrixContainer merge and compare', async () => {
76
+
77
+ const dateG1 = new Date(1.1 * 60 * 1000);
78
+ const dateG2 = new Date(7.1 * 60 * 1000);
79
+ const dateG3 = new Date(10.1 * 60 * 1000);
80
+ const dateR1 = new Date(2.1 * 60 * 1000);
81
+ const dateR2 = new Date(5.2 * 60 * 1000);
82
+ const dateR3 = new Date(8.2 * 60 * 1000);
83
+
84
+ const speed = {angleInDegrees: 1, pixelsPerPeriod: 2};
85
+ const qp = {
86
+ gaugeId: 'gaugeId1',
87
+ gaugeLabel: 'gaugeLabel',
88
+ gaugeDate: dateG1,
89
+ rainDate: dateR1,
90
+ gaugeCartesianValue: new CartesianValue({value: 10, lat: 1, lng: 2}),
91
+ rainCartesianValues: [new CartesianValue({value: 8, lat: 1, lng: 2}), new CartesianValue({value: 13, lat: 1.01, lng: 2.02})],
92
+ speed: {x: 1, y: 2},
93
+ remark: 'none',
94
+ };
95
+ const qualityPoint1 = new QualityPoint(JSON.parse(JSON.stringify(qp)));
96
+ const qualityPoints1: QualityPoint[] = [qualityPoint1];
97
+ const roundScale: Position = new Position({x: CartesianTools.DEFAULT_SCALE, y: CartesianTools.DEFAULT_SCALE});
98
+
99
+ const flattenPositionRange = {xMin: -4, xMax: 4, yMin: -4, yMax: 4};
100
+ const speedMatrix1 = new SpeedMatrix('0', '', qualityPoints1, speed, 1, flattenPositionRange, roundScale);
101
+ const qualitySpeedMatrixContainer1 = new SpeedMatrixContainer({matrices: [speedMatrix1]});
102
+
103
+ // 1) Verify creation
104
+ qualitySpeedMatrixContainer1.logMergedMatrix({normalize: false, logger: optionalLogger});
105
+ speedMatrix1.logFlatten({logger: optionalLogger, simplify: false});
106
+ expect(qualitySpeedMatrixContainer1.getQuality()).eq(0.5);
107
+ expect(qualitySpeedMatrixContainer1.getMaxGauge()).eq(10);
108
+ expect(qualitySpeedMatrixContainer1.getMaxRain()).eq(10.5);
109
+ expect(qualitySpeedMatrixContainer1.getQualityPoints().length).eq(1);
110
+ expect(qualitySpeedMatrixContainer1.getQualityPoints()[0].getGaugeValue()).eq(10);
111
+ expect(qualitySpeedMatrixContainer1.getQualityPoints()[0].getRainValue()).eq(10.5);
112
+ expect(qualityPoint1.getTimeDeltaInMinutes()).eq(1);
113
+
114
+ // Second and Third container to merge
115
+ qp.gaugeDate = dateG2;
116
+ const qualityPoint2_1 = new QualityPoint(JSON.parse(JSON.stringify(qp)));
117
+ qp.gaugeId = 'gaugeId2';
118
+ const qualityPoint2_2 = new QualityPoint(JSON.parse(JSON.stringify(qp)));
119
+ const qualityPoints2: QualityPoint[] = [qualityPoint2_1, qualityPoint2_2];
120
+ const speedMatrix2 = new SpeedMatrix('-2', '', qualityPoints2, speed, 1, flattenPositionRange, roundScale);
121
+ const qualitySpeedMatrixContainer2 = new SpeedMatrixContainer({matrices: [speedMatrix2]});
122
+ qualitySpeedMatrixContainer2.merge(qualitySpeedMatrixContainer1);
123
+
124
+ qp.gaugeId = 'gaugeId1';
125
+ qp.gaugeCartesianValue.value += 0.2;
126
+ qp.gaugeDate = dateG3;
127
+ const qualityPoint3_1 = new QualityPoint(JSON.parse(JSON.stringify(qp)));
128
+ qp.gaugeId = 'gaugeId2';
129
+ qp.gaugeCartesianValue.value += 0.2;
130
+ qp.gaugeDate = dateG3;
131
+ const qualityPoint3_2 = new QualityPoint(JSON.parse(JSON.stringify(qp)));
132
+ const qualityPoints3: QualityPoint[] = [qualityPoint3_1, qualityPoint3_2];
133
+ const speedMatrix3 = new SpeedMatrix('3', '', qualityPoints3, speed, 1, flattenPositionRange, roundScale);
134
+ const qualitySpeedMatrixContainer3 = new SpeedMatrixContainer({matrices: [speedMatrix3]});
135
+ qualitySpeedMatrixContainer2.merge(qualitySpeedMatrixContainer3);
136
+
137
+ // 2) Verify merging
138
+ qualitySpeedMatrixContainer2.logMergedMatrix({normalize: false, logger: optionalLogger});
139
+ expect(qualitySpeedMatrixContainer2.getQuality()).eq(0.38000000000000045);
140
+ expect(qualitySpeedMatrixContainer2.getMaxGauge()).eq(10.399999999999999);
141
+ expect(qualitySpeedMatrixContainer2.getMaxRain()).eq(10.5);
142
+ const qps = qualitySpeedMatrixContainer2.getQualityPoints();
143
+ expect(qps.length).eq(5);
144
+ expect(qps[0].getGaugeValue()).eq(10);
145
+ expect(qps[0].getRainValue()).eq(10.5);
146
+
147
+ expect(qualitySpeedMatrixContainer2.getQualityPoints('0').length).eq(1);
148
+ expect(qualitySpeedMatrixContainer2.getQualityPoints('0')[0].getGaugeValue()).eq(10);
149
+ expect(qualitySpeedMatrixContainer2.getQualityPoints('0')[0].getRainValue()).eq(10.5);
150
+
151
+ expect(qualitySpeedMatrixContainer2.getQualityPoints('-2').length).eq(2);
152
+ expect(qualitySpeedMatrixContainer2.getQualityPoints('-2')[0].getGaugeValue()).eq(10);
153
+ expect(qualitySpeedMatrixContainer2.getQualityPoints('-2')[0].getRainValue()).eq(10.5);
154
+
155
+ expect(qualitySpeedMatrixContainer2.getQualityPoints('3').length).eq(2);
156
+ expect(qualitySpeedMatrixContainer2.getQualityPoints('3')[0].getGaugeValue()).eq(10.2);
157
+ expect(qualitySpeedMatrixContainer2.getQualityPoints('3')[0].getRainValue()).eq(10.5);
158
+
159
+ // 3) Verify compare
160
+ const rainComputationQuality1 = new RainComputationQuality({
161
+ id: 'rcq1',
162
+ date: dateR1,
163
+ isReady: true,
164
+ qualitySpeedMatrixContainer: new SpeedMatrixContainer({matrices: [speedMatrix1, speedMatrix2]})
165
+ });
166
+ const rainComputationQuality2 = new RainComputationQuality({
167
+ id: 'rcq2',
168
+ date: dateR2,
169
+ isReady: true,
170
+ qualitySpeedMatrixContainer: qualitySpeedMatrixContainer2
171
+ });
172
+ const rainComputationQuality3 = new RainComputationQuality({
173
+ id: 'rcq3',
174
+ date: dateR3,
175
+ isReady: true,
176
+ qualitySpeedMatrixContainer: new SpeedMatrixContainer({matrices: [speedMatrix2, speedMatrix3]})
177
+ });
178
+ const compares = SpeedMatrixContainer.BuildCompares([rainComputationQuality1, rainComputationQuality2, rainComputationQuality3]);
179
+
180
+ // comparesPerDate
181
+ expect(compares.comparesPerDate.length).eq(3);
182
+ expect(compares.comparesPerDate[0].date.getTime()).eq(126000);
183
+ expect(compares.comparesPerDate[1].date.getTime()).eq(312000);
184
+ expect(compares.comparesPerDate[2].date.getTime()).eq(491999);
185
+ expect(compares.comparesPerDate[0].compareTimeline.length).eq(2);
186
+ expect(compares.comparesPerDate[1].compareTimeline.length).eq(3);
187
+ expect(compares.comparesPerDate[2].compareTimeline.length).eq(1);
188
+ expect(compares.comparesPerDate[0].compareTimeline[0].name).contains('in 2');
189
+ expect(compares.comparesPerDate[0].compareTimeline[1].name).contains('in 0');
190
+ expect(compares.comparesPerDate[1].compareTimeline[0].name).contains('in 2');
191
+ expect(compares.comparesPerDate[1].compareTimeline[1].name).contains('in 0');
192
+ expect(compares.comparesPerDate[1].compareTimeline[2].name).contains('since 3');
193
+ expect(compares.comparesPerDate[2].compareTimeline[0].name).contains('since 3');
194
+ expect(compares.comparesPerDate[0].compareTimeline[0].qualityPoints.length).eq(2);
195
+ expect(compares.comparesPerDate[0].compareTimeline[1].qualityPoints.length).eq(1);
196
+ expect(compares.comparesPerDate[1].compareTimeline[0].qualityPoints.length).eq(0);
197
+ expect(compares.comparesPerDate[1].compareTimeline[1].qualityPoints.length).eq(0);
198
+ expect(compares.comparesPerDate[1].compareTimeline[2].qualityPoints.length).eq(2);
199
+ expect(compares.comparesPerDate[2].compareTimeline[0].qualityPoints.length).eq(0);
200
+
201
+ // cumulative
202
+ expect(compares.compareCumulative.qualityPoints.length).eq(2);
203
+ expect(compares.compareCumulative.qualityPointsLegacy.length).eq(2);
204
+ expect(compares.compareCumulative.qualityPoints[0].gaugeId).eq('gaugeId2');
205
+ expect(compares.compareCumulative.qualityPoints[0].getGaugeValue()).eq(20.4);
206
+ expect(compares.compareCumulative.qualityPoints[0].getRainValue()).eq(21);
207
+ expect(compares.compareCumulative.qualityPoints[1].gaugeId).eq('gaugeId1');
208
+ expect(compares.compareCumulative.qualityPoints[1].getGaugeValue()).eq(30.2);
209
+ expect(compares.compareCumulative.qualityPoints[1].getRainValue()).eq(31.5);
210
+ expect(compares.compareCumulative.maxValue).eq(31.5);
211
+
212
+ });
213
+
214
+ });
@@ -0,0 +1,129 @@
1
+ import {expect} from 'chai';
2
+ import {MeasureValuePolarContainer, PolarMeasureValue, RadarMeasure, RadarNode, RadarPolarMeasureValue, TeamNode} from '../../src';
3
+ import {promisify} from 'util';
4
+
5
+ const sleep = promisify(setTimeout);
6
+
7
+ describe('Radar', () => {
8
+
9
+ const optionalTrace = (...log: any[]) => {
10
+ // console.log(new Date().toISOString(), log)
11
+ }
12
+
13
+ const optionalTable = (a: any[]) => {
14
+ // console.table(a)
15
+ }
16
+
17
+ it('should create ones', () => {
18
+ const team1 = new TeamNode({
19
+ id: 'tid1',
20
+ name: 'team1',
21
+ description: 'team...',
22
+ contracts: ['basic'],
23
+ contacts: []
24
+ });
25
+
26
+ const radarNode = new RadarNode({
27
+ id: 'RadarNode looks OK.', name: 'name', links: [],
28
+ latitude: 1, longitude: 1,
29
+ team: team1
30
+ });
31
+ expect(radarNode.id).eq('RadarNode looks OK.');
32
+ expect(JSON.stringify(radarNode.toJSON()))
33
+ .eq('{"id":"RadarNode looks OK.","links":[],"name":"name","latitude":1,"longitude":1,"team":"tid1"}');
34
+ });
35
+
36
+ it('should transform Polar', () => {
37
+
38
+ const measureValuePolarContainer = new MeasureValuePolarContainer({azimuth: 0, distance: 1, polarEdges: [33, 45.5]});
39
+ const polarMeasureValue = new PolarMeasureValue({
40
+ measureValuePolarContainers: [measureValuePolarContainer],
41
+ azimuthsCount: 720,
42
+ polarEdgesCount: 250
43
+ });
44
+ const radarPolarMeasureValue1 = new RadarPolarMeasureValue({polarMeasureValue, angle: 1, axis: 0});
45
+ expect(radarPolarMeasureValue1.getAzimuthsCount()).equal(720);
46
+ expect(radarPolarMeasureValue1.getPolarEdgesCount()).equal(250);
47
+
48
+ const radarPolarMeasureValue2 = new RadarPolarMeasureValue({polarMeasureValue: radarPolarMeasureValue1, angle: 1, axis: 0});
49
+ expect(radarPolarMeasureValue2.getAzimuthsCount()).equal(720);
50
+ expect(radarPolarMeasureValue2.getPolarEdgesCount()).equal(250);
51
+ expect(JSON.stringify(radarPolarMeasureValue2.toJSON({stringify: true})))
52
+ .eq(JSON.stringify(radarPolarMeasureValue1.toJSON({stringify: true})));
53
+ expect(JSON.stringify(radarPolarMeasureValue2.toJSON({stringify: true})))
54
+ .eq('{"polarMeasureValue":"{\\"measureValuePolarContainers\\":\\"[{\\\\\\"azimuth\\\\\\":0,\\\\\\"distance\\\\\\":1,\\\\\\"polarEdges\\\\\\":[33,45.5],\\\\\\"edgeOffset\\\\\\":0}]\\",\\"azimuthsCount\\":720,\\"polarEdgesCount\\":250}","angle":1,"axis":0}');
55
+
56
+ const radarPolarMeasureValue3 = new RadarPolarMeasureValue({
57
+ polarMeasureValue: radarPolarMeasureValue1.toJSONWithPolarStringified(),
58
+ angle: 1,
59
+ axis: 0
60
+ });
61
+ expect(radarPolarMeasureValue3.getAzimuthsCount()).equal(720);
62
+ expect(radarPolarMeasureValue3.getPolarEdgesCount()).equal(250);
63
+ expect(JSON.stringify(radarPolarMeasureValue3.toJSON({stringify: true})))
64
+ .eq(JSON.stringify(radarPolarMeasureValue1.toJSON({stringify: true})));
65
+ expect(JSON.stringify(radarPolarMeasureValue3.toJSON({stringify: true})))
66
+ .eq('{"polarMeasureValue":"{\\"measureValuePolarContainers\\":\\"[{\\\\\\"azimuth\\\\\\":0,\\\\\\"distance\\\\\\":1,\\\\\\"polarEdges\\\\\\":[33,45.5],\\\\\\"edgeOffset\\\\\\":0}]\\",\\"azimuthsCount\\":720,\\"polarEdgesCount\\":250}","angle":1,"axis":0}');
67
+
68
+ const radarMeasure = new RadarMeasure({id: 'measureId', values: [polarMeasureValue], date: new Date(100000)});
69
+ expect(JSON.stringify(radarMeasure.toJSON()))
70
+ .eq('{"id":"measureId","links":[],"date":"1970-01-01T00:01:40.000Z","validity":-1,"values":[{"measureValuePolarContainers":[{"azimuth":0,"distance":1,"polarEdges":[33,45.5],"edgeOffset":0}],"azimuthsCount":720,"polarEdgesCount":250}]}');
71
+
72
+ const polarMeasureValue1 = radarMeasure.values[0] as PolarMeasureValue;
73
+ const radarPolarMeasureValue4 = new RadarPolarMeasureValue({polarMeasureValue: polarMeasureValue1, angle: 1, axis: 0});
74
+ expect(JSON.stringify(radarPolarMeasureValue4.toJSON()))
75
+ .eq('{"polarMeasureValue":{"measureValuePolarContainers":[{"azimuth":0,"distance":1,"polarEdges":[33,45.5],"edgeOffset":0}],"azimuthsCount":720,"polarEdgesCount":250},"angle":1,"axis":0}');
76
+ expect(radarPolarMeasureValue4.getAzimuthsCount()).equal(720);
77
+ expect(radarPolarMeasureValue4.getPolarEdgesCount()).equal(250);
78
+
79
+ const radarPolarMeasureValue5 = new RadarPolarMeasureValue({
80
+ polarMeasureValue: JSON.stringify(radarMeasure.values[0]),
81
+ angle: 1, axis: 90
82
+ });
83
+ expect(radarPolarMeasureValue5.getAzimuthsCount()).equal(720);
84
+ expect(radarPolarMeasureValue5.getPolarEdgesCount()).equal(250);
85
+
86
+ const team1 = new TeamNode({
87
+ id: 'tid1',
88
+ name: 'team1',
89
+ description: 'team...',
90
+ contracts: ['basic'],
91
+ contacts: []
92
+ });
93
+ const radarNode = new RadarNode({
94
+ id: 'RadarNode looks OK.',
95
+ name: 'name',
96
+ links: [radarMeasure],
97
+ latitude: 1, longitude: 1,
98
+ team: team1
99
+ });
100
+
101
+ expect(JSON.stringify(radarNode.toJSON()))
102
+ .eq('{"id":"RadarNode looks OK.","links":[{"rel":"radar-measure","href":"../radar-measures/1970-01-01T00:01:40.000Z/measureId"}],"name":"name","latitude":1,"longitude":1,"team":"tid1"}');
103
+ });
104
+
105
+ it('should use multi-dimension image', async () => {
106
+
107
+ const testOneFake = (move: number) => {
108
+ const radarPolarMeasureValues = RadarPolarMeasureValue.BuildFakeRadarPolarMeasureValues(move);
109
+ expect(radarPolarMeasureValues.length).equal(6);
110
+ const polars = radarPolarMeasureValues[0].polarMeasureValue.getPolars();
111
+ expect(polars.length).equal(720);
112
+ expect(polars[0].polarEdges.length).equal(250);
113
+ optionalTable(polars
114
+ .filter((p, pi) => pi % 10 === 0)
115
+ .map(m =>
116
+ m.polarEdges
117
+ .filter((n, ni) => ni % 10 === 0)));
118
+ }
119
+
120
+ // for (let move = 0; move < 90; move++) {
121
+ testOneFake(0);
122
+ testOneFake(45);
123
+ testOneFake(90);
124
+ // await sleep(1000);
125
+ // }
126
+ });
127
+
128
+
129
+ });