@bikky/replication 1.0.1

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 (140) hide show
  1. package/Constants/Errors.d.ts +27 -0
  2. package/Constants/Errors.js +75 -0
  3. package/Constants/Logging.d.ts +17 -0
  4. package/Constants/Logging.js +97 -0
  5. package/Constants/ReplicableRegistry.d.ts +37 -0
  6. package/Constants/ReplicableRegistry.js +234 -0
  7. package/Constants/SerialisationTypes.d.ts +82 -0
  8. package/Constants/SerialisationTypes.js +160 -0
  9. package/Constants/SourceMaps.d.ts +10 -0
  10. package/Constants/SourceMaps.js +12 -0
  11. package/Constants/TraversalStep.d.ts +5 -0
  12. package/Constants/TraversalStep.js +2 -0
  13. package/Constants/Versions.d.ts +15 -0
  14. package/Constants/Versions.js +63 -0
  15. package/Expressions/Compiler/BuiltinGrammar.d.ts +234 -0
  16. package/Expressions/Compiler/BuiltinGrammar.js +446 -0
  17. package/Expressions/Compiler/ExpressionGrammar.d.ts +89 -0
  18. package/Expressions/Compiler/ExpressionGrammar.js +70 -0
  19. package/Expressions/Compiler/Parser.d.ts +56 -0
  20. package/Expressions/Compiler/Parser.js +314 -0
  21. package/Expressions/Compiler/Tokenizer.d.ts +52 -0
  22. package/Expressions/Compiler/Tokenizer.js +222 -0
  23. package/Expressions/Compiler/__tests__/Replicable.Expressions.Parser.test.d.ts +1 -0
  24. package/Expressions/Compiler/__tests__/Replicable.Expressions.Parser.test.js +516 -0
  25. package/Expressions/Compiler/__tests__/Replicable.Expressions.Tokenizer.test.d.ts +1 -0
  26. package/Expressions/Compiler/__tests__/Replicable.Expressions.Tokenizer.test.js +68 -0
  27. package/Expressions/CreateEvaluator.d.ts +4 -0
  28. package/Expressions/CreateEvaluator.js +85 -0
  29. package/Expressions/EvaluatorChain.d.ts +19 -0
  30. package/Expressions/EvaluatorChain.js +137 -0
  31. package/Expressions/EvaluatorSteps.d.ts +19 -0
  32. package/Expressions/EvaluatorSteps.js +12 -0
  33. package/Expressions/EvaluatorString.d.ts +21 -0
  34. package/Expressions/EvaluatorString.js +26 -0
  35. package/Expressions/Expression.d.ts +36 -0
  36. package/Expressions/Expression.js +147 -0
  37. package/Expressions/Traverser.d.ts +28 -0
  38. package/Expressions/Traverser.js +348 -0
  39. package/Expressions/TypeRegistry/Accessors.d.ts +26 -0
  40. package/Expressions/TypeRegistry/Accessors.js +58 -0
  41. package/Expressions/TypeRegistry/ChainCollections.d.ts +51 -0
  42. package/Expressions/TypeRegistry/ChainCollections.js +134 -0
  43. package/Expressions/TypeRegistry/ChainTypes.d.ts +23 -0
  44. package/Expressions/TypeRegistry/ChainTypes.js +46 -0
  45. package/Expressions/TypeRegistry/CustomAPI.d.ts +36 -0
  46. package/Expressions/TypeRegistry/CustomAPI.js +181 -0
  47. package/Expressions/TypeRegistry/Primitive.d.ts +19 -0
  48. package/Expressions/TypeRegistry/Primitive.js +47 -0
  49. package/Expressions/TypeRegistry/Registry.d.ts +27 -0
  50. package/Expressions/TypeRegistry/Registry.js +270 -0
  51. package/Expressions/TypeRegistry/ReplAPI.d.ts +41 -0
  52. package/Expressions/TypeRegistry/ReplAPI.js +220 -0
  53. package/Expressions/TypeRegistry/Scope.d.ts +24 -0
  54. package/Expressions/TypeRegistry/Scope.js +44 -0
  55. package/Expressions/TypeRegistry/Types.d.ts +23 -0
  56. package/Expressions/TypeRegistry/Types.js +1 -0
  57. package/Expressions/TypeRegistry/__tests__/Replicable.Expressions.Accessors.test.d.ts +1 -0
  58. package/Expressions/TypeRegistry/__tests__/Replicable.Expressions.Accessors.test.js +31 -0
  59. package/Expressions/__tests__/ExpressionExamples.d.ts +28 -0
  60. package/Expressions/__tests__/ExpressionExamples.js +50 -0
  61. package/Expressions/__tests__/Replicable.Expressions.Expressions.test.d.ts +1 -0
  62. package/Expressions/__tests__/Replicable.Expressions.Expressions.test.js +166 -0
  63. package/IDPool.d.ts +18 -0
  64. package/IDPool.data.d.ts +17 -0
  65. package/IDPool.js +139 -0
  66. package/License.txt +1 -0
  67. package/Main.d.ts +13 -0
  68. package/Main.js +13 -0
  69. package/Networking.d.ts +60 -0
  70. package/Networking.js +626 -0
  71. package/Replicatable.d.ts +66 -0
  72. package/Replicatable.js +123 -0
  73. package/Tracking/Buffable.d.ts +68 -0
  74. package/Tracking/Buffable.js +194 -0
  75. package/Tracking/Class.d.ts +97 -0
  76. package/Tracking/Class.js +221 -0
  77. package/Tracking/Functions.d.ts +14 -0
  78. package/Tracking/Functions.js +27 -0
  79. package/Tracking/GlobalGroup.d.ts +5 -0
  80. package/Tracking/GlobalGroup.js +39 -0
  81. package/Tracking/Property.d.ts +95 -0
  82. package/Tracking/Property.js +125 -0
  83. package/Tracking/Types.d.ts +33 -0
  84. package/Tracking/Types.js +1 -0
  85. package/Tracking/__tests__/Replicable.Tracking.Decorator.test.d.ts +1 -0
  86. package/Tracking/__tests__/Replicable.Tracking.Decorator.test.js +151 -0
  87. package/Tracking/__tests__/Replicable.Tracking.Deserialisation.test.d.ts +1 -0
  88. package/Tracking/__tests__/Replicable.Tracking.Deserialisation.test.js +253 -0
  89. package/Tracking/__tests__/Replicable.Tracking.MixinSchemaGeneration.test.d.ts +1 -0
  90. package/Tracking/__tests__/Replicable.Tracking.MixinSchemaGeneration.test.js +135 -0
  91. package/Tracking/__tests__/Replicable.Tracking.Struct.test.d.ts +1 -0
  92. package/Tracking/__tests__/Replicable.Tracking.Struct.test.js +66 -0
  93. package/Tracking/__tests__/Replicable.Tracking.Type.test.d.ts +1 -0
  94. package/Tracking/__tests__/Replicable.Tracking.Type.test.js +67 -0
  95. package/Transformers/Configurer.d.ts +39 -0
  96. package/Transformers/Configurer.js +415 -0
  97. package/Transformers/Constructor.d.ts +12 -0
  98. package/Transformers/Constructor.js +44 -0
  99. package/Transformers/Definitions.d.ts +102 -0
  100. package/Transformers/Definitions.js +626 -0
  101. package/Transformers/Loader.d.ts +45 -0
  102. package/Transformers/Loader.js +350 -0
  103. package/Transformers/Progress.d.ts +32 -0
  104. package/Transformers/Progress.js +429 -0
  105. package/Transformers/Reference.d.ts +37 -0
  106. package/Transformers/Reference.js +212 -0
  107. package/Transformers/SchemaGenerator.d.ts +102 -0
  108. package/Transformers/SchemaGenerator.js +564 -0
  109. package/Transformers/Serialiser.d.ts +31 -0
  110. package/Transformers/Serialiser.js +366 -0
  111. package/Transformers/Utils.d.ts +33 -0
  112. package/Transformers/Utils.js +287 -0
  113. package/Transformers/__tests__/Examples.d.ts +168 -0
  114. package/Transformers/__tests__/Examples.js +263 -0
  115. package/Transformers/__tests__/Replicable.Transformers.Definitions.test.d.ts +1 -0
  116. package/Transformers/__tests__/Replicable.Transformers.Definitions.test.js +457 -0
  117. package/Transformers/__tests__/Replicable.Transformers.Loader.test.d.ts +1 -0
  118. package/Transformers/__tests__/Replicable.Transformers.Loader.test.js +339 -0
  119. package/Transformers/__tests__/Replicable.Transformers.Progress.test.d.ts +1 -0
  120. package/Transformers/__tests__/Replicable.Transformers.Progress.test.js +256 -0
  121. package/Transformers/__tests__/Replicable.Transformers.Reference.test.d.ts +1 -0
  122. package/Transformers/__tests__/Replicable.Transformers.Reference.test.js +167 -0
  123. package/Transformers/__tests__/Replicable.Transformers.SchemaGenerator.test.d.ts +1 -0
  124. package/Transformers/__tests__/Replicable.Transformers.SchemaGenerator.test.js +400 -0
  125. package/Transformers/__tests__/Replicable.Transformers.SchemaGeneratorOutput.test.d.ts +1 -0
  126. package/Transformers/__tests__/Replicable.Transformers.SchemaGeneratorOutput.test.js +441 -0
  127. package/Transformers/__tests__/Replicable.Transformers.Serialiser.test.d.ts +1 -0
  128. package/Transformers/__tests__/Replicable.Transformers.Serialiser.test.js +320 -0
  129. package/Transformers/__tests__/Replicable.Transformers.Utils.test.d.ts +1 -0
  130. package/Transformers/__tests__/Replicable.Transformers.Utils.test.js +534 -0
  131. package/__tests__/Replicable.Expressions.test.d.ts +1 -0
  132. package/__tests__/Replicable.Expressions.test.js +166 -0
  133. package/__tests__/Replicable.IDPool.test.d.ts +1 -0
  134. package/__tests__/Replicable.IDPool.test.js +11 -0
  135. package/__tests__/Replicable.ReplicableRegistry.test.d.ts +1 -0
  136. package/__tests__/Replicable.ReplicableRegistry.test.js +154 -0
  137. package/__tests__/Replicable.Serialisation.test.d.ts +1 -0
  138. package/__tests__/Replicable.Serialisation.test.js +283 -0
  139. package/package.json +14 -0
  140. package/tsconfig.json +19 -0
@@ -0,0 +1,457 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { Expression, PropertyTypes, Versions } from "../../Main.js";
3
+ import { ReplicableRegistry } from "../../Constants/ReplicableRegistry.js";
4
+ import { ErrorStack } from "../../Constants/Errors.js";
5
+ import { Definitions } from "../Definitions.js";
6
+ import { BikPath } from "@bikky/path";
7
+ import { ExpressionScopes } from "../../Expressions/TypeRegistry/Registry.js";
8
+ import { TestPropertyDecorators } from "./Examples.js";
9
+ import { EvaluationChain } from "../../Expressions/EvaluatorChain.js";
10
+ //TODO: Test that class' DataIsType is used or ignored as appropriate.
11
+ describe("Definitions", async () => {
12
+ const TestRepl = ReplicableRegistry.__GetReplicableForDataName(TestPropertyDecorators.TransformersTheLotClass.name);
13
+ const ChildRepl = ReplicableRegistry.__GetReplicableForDataName(TestPropertyDecorators.TransformersBasicChild.name);
14
+ const SourceFile = {
15
+ SourceFile: BikPath.join(BikPath.getCurrentFilepath(), "./Examples.ts"),
16
+ Version: Versions.v1_0_0
17
+ };
18
+ let testVal = new TestPropertyDecorators.TransformersTheLotClass();
19
+ ExpressionScopes.addLocalVariable(TestRepl.classConstructor, "thisEntity", [TestRepl.classConstructor]);
20
+ ExpressionScopes.addLocalVariable(TestPropertyDecorators.TransformersBasicStruct, "thisEntity", [TestPropertyDecorators.TransformersBasicStruct]);
21
+ ExpressionScopes.addLocalVariable(TestPropertyDecorators.TransformersBasicClass, "thisEntity", [TestPropertyDecorators.TransformersBasicClass]);
22
+ Expression.setCurrentScope(TestRepl.classConstructor, { thisEntity: testVal });
23
+ let ver = Versions.v1_0_0;
24
+ let valDef = TestRepl.getPropDefinition(ver, "val");
25
+ let val2Def = TestRepl.getPropDefinition(ver, "val2");
26
+ let val3Def = TestRepl.getPropDefinition(ver, "val3");
27
+ let val4Def = TestRepl.getPropDefinition(ver, "val4");
28
+ let val5Def = TestRepl.getPropDefinition(ver, "val5");
29
+ let val6Def = TestRepl.getPropDefinition(ver, "val6");
30
+ let val7Def = TestRepl.getPropDefinition(ver, "val7");
31
+ let val8Def = TestRepl.getPropDefinition(ver, "val8");
32
+ let val9Def = TestRepl.getPropDefinition(ver, "val9");
33
+ let val10Def = TestRepl.getPropDefinition(ver, "val10");
34
+ let val11Def = TestRepl.getPropDefinition(ver, "val11");
35
+ let val12Def = TestRepl.getPropDefinition(ver, "val12");
36
+ let val13Def = TestRepl.getPropDefinition(ver, "val13");
37
+ let val14Def = TestRepl.getPropDefinition(ver, "val14");
38
+ //TODO: Add test for 12 which is removed
39
+ test("1. 13 has no expressions allowed, so getting expr config returns undefined", async () => {
40
+ expect(val13Def.expressionForProperty).toBeUndefined();
41
+ });
42
+ let valExpr = Expression.Parse("@{thisEntity.Val}", BikPath.getCurrentFilepath(), valDef.expressionForProperty[ver]);
43
+ let val2Expr = Expression.Parse("@{thisEntity.Val2}", BikPath.getCurrentFilepath(), val2Def.expressionForProperty[ver]);
44
+ let val3Expr = Expression.Parse("@{thisEntity.Val3}", BikPath.getCurrentFilepath(), val3Def.expressionForProperty[ver]);
45
+ let val4Expr = Expression.Parse("@{thisEntity.Val4}", BikPath.getCurrentFilepath(), val4Def.expressionForProperty[ver]);
46
+ let val5Expr = Expression.Parse("@{thisEntity.Val5}", BikPath.getCurrentFilepath(), val5Def.expressionForProperty[ver]);
47
+ let val6Expr = Expression.Parse("@{thisEntity.Val6}", BikPath.getCurrentFilepath(), val6Def.expressionForProperty[ver]);
48
+ let val7Expr = Expression.Parse("@{thisEntity.Val7}", BikPath.getCurrentFilepath(), val7Def.expressionForProperty[ver]);
49
+ let val8Expr = Expression.Parse("@{thisEntity.Val8}", BikPath.getCurrentFilepath(), val8Def.expressionForProperty[ver]);
50
+ let val9Expr = Expression.Parse("@{thisEntity.Val9}", BikPath.getCurrentFilepath(), val9Def.expressionForProperty[ver]);
51
+ let val10Expr = Expression.Parse("@{thisEntity.Val10}", BikPath.getCurrentFilepath(), val10Def.expressionForProperty[ver]);
52
+ let val11Expr = Expression.Parse("@{thisEntity.Val11}", BikPath.getCurrentFilepath(), val11Def.expressionForProperty[ver]);
53
+ let val14Expr = Expression.Parse("@{thisEntity.Val14}", BikPath.getCurrentFilepath(), val14Def.expressionForProperty[ver]);
54
+ let strExpr = Expression.Parse("@{thisEntity.Val} as a string", BikPath.getCurrentFilepath(), valDef.expressionForProperty[ver]);
55
+ describe("2. DoExprOutputsMatchPropertyModifier", () => {
56
+ test("Should return true if the property modifier is correct", async () => {
57
+ const Name = TestPropertyDecorators.TransformersTheLotClass.name;
58
+ let errors = new ErrorStack(SourceFile);
59
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val`, valDef.expressionForProperty[ver], valExpr, errors)).toBe(true);
60
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val`, valDef.expressionForProperty[ver], strExpr, errors)).toBe(true);
61
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val2`, val2Def.expressionForProperty[ver], val2Expr, errors)).toBe(true);
62
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val3`, val3Def.expressionForProperty[ver], val3Expr, errors)).toBe(true);
63
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val4`, val4Def.expressionForProperty[ver], val4Expr, errors)).toBe(true);
64
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val5`, val5Def.expressionForProperty[ver], val5Expr, errors)).toBe(true);
65
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val7`, val7Def.expressionForProperty[ver], val7Expr, errors)).toBe(true);
66
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val8`, val8Def.expressionForProperty[ver], val8Expr, errors)).toBe(true);
67
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val9`, val9Def.expressionForProperty[ver], val9Expr, errors)).toBe(true);
68
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val10`, val10Def.expressionForProperty[ver], val10Expr, errors)).toBe(true);
69
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val11`, val11Def.expressionForProperty[ver], val11Expr, errors)).toBe(true);
70
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val14`, val14Def.expressionForProperty[ver], val14Expr, errors)).toBe(true);
71
+ });
72
+ test("Should return false if the property modifier is incorrect", async () => {
73
+ const Name = TestPropertyDecorators.TransformersTheLotClass.name;
74
+ let errors = new ErrorStack(SourceFile);
75
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val`, valDef.expressionForProperty[ver], val3Expr, errors)).toBe(false);
76
+ expect(errors.toString("TEST_REP_TD001")).includesString(`${Name}.Val expects String but Expression produces Map<string, Number>. Expression is @{thisEntity.Val3}.`);
77
+ errors = new ErrorStack(SourceFile);
78
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val3`, val3Def.expressionForProperty[ver], valExpr, errors)).toBe(false);
79
+ expect(errors.toString("TEST_REP_TD002")).includesString(`${Name}.Val3 expects Map<string, Number> but Expression produces String. Expression is @{thisEntity.Val}.`);
80
+ errors = new ErrorStack(SourceFile);
81
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val4`, val4Def.expressionForProperty[ver], valExpr, errors)).toBe(false);
82
+ //TODO: type should be {[key: number]: String} ???
83
+ expect(errors.toString("TEST_REP_TD003")).includesString(`${Name}.Val4 expects {[key: string]: String } but Expression produces String. Expression is @{thisEntity.Val}.`);
84
+ errors = new ErrorStack(SourceFile);
85
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val`, valDef.expressionForProperty[ver], val4Expr, errors)).toBe(false);
86
+ expect(errors.toString("TEST_REP_TD004")).includesString(`${Name}.Val expects String but Expression produces {[key: string]: String }. Expression is @{thisEntity.Val4}.`);
87
+ errors = new ErrorStack(SourceFile);
88
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val6`, val6Def.expressionForProperty[ver], valExpr, errors)).toBe(false);
89
+ expect(errors.toString("TEST_REP_TD005")).includesString(`${Name}.Val6 expects Number[][] but Expression produces String. Expression is @{thisEntity.Val}.`);
90
+ errors = new ErrorStack(SourceFile);
91
+ expect(Definitions.DoExprOutputsMatchPropertyModifier(`${Name}.Val`, valDef.expressionForProperty[ver], val6Expr, errors)).toBe(false);
92
+ expect(errors.toString("TEST_REP_TD006")).includesString(`${Name}.Val expects String but Expression produces Number[][]. Expression is @{thisEntity.Val6}.`);
93
+ });
94
+ });
95
+ describe("3. DoExprOutputsMatchPropertyType", () => {
96
+ test("Should return true if the property type is correct", async () => {
97
+ const Name = TestPropertyDecorators.TransformersTheLotClass.name;
98
+ let errors = new ErrorStack(SourceFile);
99
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val`, valDef.expressionForProperty[ver], valExpr, errors)).toBe(true);
100
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val1`, valDef.expressionForProperty[ver], strExpr, errors)).toBe(true);
101
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val2`, val2Def.expressionForProperty[ver], val2Expr, errors)).toBe(true);
102
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val3`, val3Def.expressionForProperty[ver], val3Expr, errors)).toBe(true);
103
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val4`, val4Def.expressionForProperty[ver], val4Expr, errors)).toBe(true);
104
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val5`, val5Def.expressionForProperty[ver], val5Expr, errors)).toBe(true);
105
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val6`, val6Def.expressionForProperty[ver], val6Expr, errors)).toBe(true);
106
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val7`, val7Def.expressionForProperty[ver], val7Expr, errors)).toBe(true);
107
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val8`, val8Def.expressionForProperty[ver], val8Expr, errors)).toBe(true);
108
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val9`, val9Def.expressionForProperty[ver], val9Expr, errors)).toBe(true);
109
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val10`, val10Def.expressionForProperty[ver], val10Expr, errors)).toBe(true);
110
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val11`, val11Def.expressionForProperty[ver], val11Expr, errors)).toBe(true);
111
+ });
112
+ test("Should return true if property type is correct but modifier is incorrect", async () => {
113
+ const Name = TestPropertyDecorators.TransformersTheLotClass.name;
114
+ let errors = new ErrorStack(SourceFile);
115
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val`, valDef.expressionForProperty[ver], val4Expr, errors)).toBe(true);
116
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val`, valDef.expressionForProperty[ver], val5Expr, errors)).toBe(true);
117
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val2`, val2Def.expressionForProperty[ver], val3Expr, errors)).toBe(true);
118
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val2`, val2Def.expressionForProperty[ver], val6Expr, errors)).toBe(true);
119
+ });
120
+ test("Should return false if the property type is incorrect", async () => {
121
+ const Name = TestPropertyDecorators.TransformersTheLotClass.name;
122
+ let errors = new ErrorStack(SourceFile);
123
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val`, valDef.expressionForProperty[ver], val2Expr, errors)).toBe(false);
124
+ expect(errors.toString("TEST_REP_TD007")).includesString(`${Name}.Val expects String but Expression produces Number. Expression is @{thisEntity.Val2}.`);
125
+ errors = new ErrorStack(SourceFile);
126
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val3`, val3Def.expressionForProperty[ver], valExpr, errors)).toBe(false);
127
+ expect(errors.toString("TEST_REP_TD008")).includesString(`${Name}.Val3 expects Map<string, Number> but Expression produces String. Expression is @{thisEntity.Val}.`);
128
+ errors = new ErrorStack(SourceFile);
129
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val`, valDef.expressionForProperty[ver], val7Expr, errors)).toBe(false);
130
+ expect(errors.toString("TEST_REP_TD009")).includesString(`${Name}.Val expects String but Expression produces TransformersBasicStruct. Expression is @{thisEntity.Val7}.`);
131
+ errors = new ErrorStack(SourceFile);
132
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val7`, val7Def.expressionForProperty[ver], valExpr, errors)).toBe(false);
133
+ expect(errors.toString("TEST_REP_TD010")).includesString(`${Name}.Val7 expects TransformersBasicStruct but Expression produces String. Expression is @{thisEntity.Val}.`);
134
+ errors = new ErrorStack(SourceFile);
135
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val`, valDef.expressionForProperty[ver], val9Expr, errors)).toBe(false);
136
+ expect(errors.toString("TEST_REP_TD011")).includesString(`${Name}.Val expects String but Expression produces TransformersBasicClass. Expression is @{thisEntity.Val9}.`);
137
+ errors = new ErrorStack(SourceFile);
138
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val9`, val9Def.expressionForProperty[ver], valExpr, errors)).toBe(false);
139
+ expect(errors.toString("TEST_REP_TD012")).includesString(`${Name}.Val9 expects TransformersBasicClass but Expression produces String. Expression is @{thisEntity.Val}.`);
140
+ });
141
+ test("Should return true if expr type matches one of the property types", async () => {
142
+ const Name = TestPropertyDecorators.TransformersTheLotClass.name;
143
+ let errors = new ErrorStack(SourceFile);
144
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val8`, val8Def.expressionForProperty[ver], valExpr, errors)).toBe(true);
145
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val8`, val8Def.expressionForProperty[ver], val2Expr, errors)).toBe(true);
146
+ });
147
+ test("Should return false if any expr type doesn't match property type(s)", async () => {
148
+ const Name = TestPropertyDecorators.TransformersTheLotClass.name;
149
+ let errors = new ErrorStack(SourceFile);
150
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val`, valDef.expressionForProperty[ver], val8Expr, errors)).toBe(false);
151
+ expect(errors.toString("TEST_REP_TD013")).includesString(`${Name}.Val expects String but Expression produces (String | null | Number). Expression is @{thisEntity.Val8}.`);
152
+ errors = new ErrorStack(SourceFile);
153
+ expect(Definitions.DoExprOutputsMatchPropertyType(`${Name}.Val2`, val2Def.expressionForProperty[ver], val8Expr, errors)).toBe(false);
154
+ expect(errors.toString("TEST_REP_TD014")).includesString(`${Name}.Val2 expects Number but Expression produces (String | null | Number). Expression is @{thisEntity.Val8}.`);
155
+ });
156
+ });
157
+ // describe("4. DoesValMatchPropertyModifier", ()=> {
158
+ // test(" 1. Primitive string is assignable to single", ()=> {
159
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(valDef, TestPropertyDecorators.TransformersTheLotClass.name, true);
160
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], "hello", valDef.optional === true)).toBe(true);
161
+ // });
162
+ // test(" 2. Primitive number is assignable to single", ()=> {
163
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val2Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
164
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], 5, val2Def.optional === true)).toBe(true);
165
+ // });
166
+ // test(" 3. Map is assignable to map", ()=> {
167
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val3Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
168
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], new Map([["hello", 1]]), val3Def.optional === true)).toBe(true);
169
+ // });
170
+ // test(" 4. Dict is assignable to map", ()=> {
171
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val3Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
172
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], { "hello": 1 }, val3Def.optional === true)).toBe(true);
173
+ // });
174
+ // test(" 5. Undefined is assignable to optional", ()=> {
175
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val3Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
176
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], undefined, val3Def.optional === true)).toBe(true);
177
+ // });
178
+ // test(" 6. Dict is assignable to dict", ()=> {
179
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val4Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
180
+ // // eslint-disable-next-line @typescript-eslint/naming-convention
181
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], {1: "world"}, val4Def.optional === true)).toBe(true);
182
+ // });
183
+ // test(" 7. Array is assignable to array", ()=> {
184
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val5Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
185
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], ["hello"], val5Def.optional === true)).toBe(true);
186
+ // });
187
+ // test(" 8. Array of arrays is assignable to array of arrays", ()=> {
188
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val6Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
189
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], [[1, 2]], val6Def.optional === true)).toBe(true);
190
+ // });
191
+ // test(" 9. Class definition is assignable to single", ()=> {
192
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val7Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
193
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], { Class: "TransformersBasicStruct", Val: "hi" },
194
+ // val7Def.optional === true)).toBe(true);
195
+ // });
196
+ // test("10. String is assignable to single with multiple types", ()=> {
197
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val8Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
198
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], "hello", val8Def.optional === true)).toBe(true);
199
+ // });
200
+ // test("11. Null is assignable to single with multiple types", ()=> {
201
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val8Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
202
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], null, val8Def.optional === true)).toBe(true);
203
+ // });
204
+ // test("12. Number is assignable to single with multiple types", ()=> {
205
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val8Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
206
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], 4, val8Def.optional === true)).toBe(true);
207
+ // });
208
+ // test("13. Class Definition is assignable to pointer (inline)", ()=> {
209
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val9Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
210
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], { Class: "TransformersBasicClass", Val: "hi" },
211
+ // val9Def.optional === true)).toBe(true);
212
+ // });
213
+ // test("14. Class Definition is assignable to pointer", ()=> {
214
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val10Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
215
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], { Class: "TransformersBasicClass", Val: "hi" },
216
+ // val10Def.optional === true)).toBe(true);
217
+ // });
218
+ // test("15. String is assignable to readonly single", async () => {
219
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val11Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
220
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], "hello", val11Def.optional === true)).toBe(true);
221
+ // });
222
+ // test("16. Array can match single", async () => {
223
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(valDef, TestPropertyDecorators.TransformersTheLotClass.name, true);
224
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], ["hello"], valDef.optional === true)).toBe(true);
225
+ // });
226
+ // test("17. Dict can match single", async () => {
227
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val2Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
228
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], {"hello": "world"}, val2Def.optional === true)).toBe(true);
229
+ // });
230
+ // test("18. Array does not match Map", async () => {
231
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val3Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
232
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], ["hello"], val3Def.optional === true)).toBe(false);
233
+ // });
234
+ // test("19. Single does not match Map", async () => {
235
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val3Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
236
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], "hello", val3Def.optional === true)).toBe(false);
237
+ // });
238
+ // test("20. Single does not match Dict", async () => {
239
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val4Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
240
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], "hello", val4Def.optional === true)).toBe(false);
241
+ // });
242
+ // test("21. Single does not match Array", async () => {
243
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val5Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
244
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], 5, val5Def.optional === true)).toBe(false);
245
+ // });
246
+ // test("22. Single does not match Array of Arrays", async () => {
247
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val6Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
248
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], "hello", val6Def.optional === true)).toBe(false);
249
+ // });
250
+ // test("23. Array of Arrays can match Single (Struct)", async () => {
251
+ // let valInfo = Utils.GetPropertyDecoratorTypesInfo(val7Def, TestPropertyDecorators.TransformersTheLotClass.name, true);
252
+ // expect(Definitions.DoesValMatchPropertyModifier(valInfo[0], [["hello"]], val7Def.optional === true)).toBe(true);
253
+ // });
254
+ // });
255
+ describe("5. GetPropValueFromData", () => {
256
+ test("1. Get all entries in a single value", () => {
257
+ expect(Definitions.GetPropValuesFromData(valDef, "hello")).toContainAtLeast([["hello"], PropertyTypes.Solo]);
258
+ });
259
+ test("2. Get all entries in a dictionary", () => {
260
+ expect(Definitions.GetPropValuesFromData(val4Def, { hello: "world" })).toContainAtLeast([["world"], PropertyTypes.Dictionary | PropertyTypes.Map]);
261
+ expect(Definitions.GetPropValuesFromData(val4Def, { hello: "world", one: "two" })).toContainAtLeast([["world", "two"], PropertyTypes.Dictionary | PropertyTypes.Map]);
262
+ });
263
+ test("3. Get all entries in an array", () => {
264
+ expect(Definitions.GetPropValuesFromData(val5Def, ["hello"])).toContainAtLeast([["hello"], PropertyTypes.Array]);
265
+ expect(Definitions.GetPropValuesFromData(val5Def, ["hello", "world"])).toContainAtLeast([["hello", "world"], PropertyTypes.Array]);
266
+ });
267
+ test("4. Get all entries in a map", () => {
268
+ expect(Definitions.GetPropValuesFromData(val3Def, new Map([["hello", 1]]))).toContainAtLeast([[1], PropertyTypes.Map]);
269
+ expect(Definitions.GetPropValuesFromData(val3Def, new Map([["hello", 1], ["world", 2]]))).toContainAtLeast([[1, 2], PropertyTypes.Map]);
270
+ });
271
+ test("5. Get all entries in an array of arrays", () => {
272
+ expect(Definitions.GetPropValuesFromData(val6Def, [["hello"]])).toContainAtLeast([["hello"], PropertyTypes.Array2]);
273
+ expect(Definitions.GetPropValuesFromData(val6Def, [["hello", "world"]])).toContainAtLeast([["hello", "world"], PropertyTypes.Array2]);
274
+ expect(Definitions.GetPropValuesFromData(val6Def, [["hello"], ["world"]])).toContainAtLeast([["hello", "world"], PropertyTypes.Array2]);
275
+ });
276
+ });
277
+ // describe("6. ShouldSkipProperty", ()=> {
278
+ // test("Should return false if the property is not skipped", ()=> {
279
+ // let errors = new ErrorStack(SourceFile);
280
+ // expect(Definitions.ShouldSkipProperty(TestPropertyDecorators.TransformersTheLotClass.name, valDef, "skip", errors)).toBe(false);
281
+ // });
282
+ // test("Should return true if the property is computed", ()=> {
283
+ // let errors = new ErrorStack(SourceFile);
284
+ // expect(Definitions.ShouldSkipProperty(TestPropertyDecorators.TransformersTheLotClass.name, val14Def, "skip", errors)).toBe(true);
285
+ // });
286
+ // test("Should return true if the property is optional and undefined", ()=> {
287
+ // let errors = new ErrorStack(SourceFile);
288
+ // expect(Definitions.ShouldSkipProperty(TestPropertyDecorators.TransformersTheLotClass.name, val3Def, undefined, errors)).toBe(true);
289
+ // });
290
+ // test("Should return false if the property is optional and defined", ()=> {
291
+ // let errors = new ErrorStack(SourceFile);
292
+ // expect(Definitions.ShouldSkipProperty(TestPropertyDecorators.TransformersTheLotClass.name, val3Def, "hello", errors)).toBe(false);
293
+ // });
294
+ // test("Should return true if the property is removed", ()=> {
295
+ // let errors = new ErrorStack(SourceFile);
296
+ // expect(Definitions.ShouldSkipProperty(TestPropertyDecorators.TransformersTheLotClass.name, val12Def, "remove", errors)).toBe(true);
297
+ // expect(errors.toString()).includes(`Warning: ${TestPropertyDecorators.TransformersTheLotClass.name}.Val12 has been removed and cannot be loaded.`);
298
+ // });
299
+ // });
300
+ describe("7. DoesDataClassMatchRepl", () => {
301
+ test("Primitive doesn't match class", () => {
302
+ let errors = new ErrorStack(SourceFile);
303
+ expect(Definitions.DoesDataClassMatchRepl(ver, TestRepl, "hello", errors, true)).toBe(null);
304
+ expect(Definitions.DoesDataClassMatchRepl(ver, TestRepl, "hello", errors, false)).toBe(null);
305
+ });
306
+ test("Class matches class", () => {
307
+ let errors = new ErrorStack(SourceFile);
308
+ expect(Definitions.DoesDataClassMatchRepl(ver, TestRepl, testVal, errors, true)).toBe(TestRepl);
309
+ expect(Definitions.DoesDataClassMatchRepl(ver, TestRepl, testVal, errors, false)).toBe(TestRepl);
310
+ });
311
+ test("Class data matches class", () => {
312
+ let errors = new ErrorStack(SourceFile);
313
+ expect(Definitions.DoesDataClassMatchRepl(ver, TestRepl, { Class: TestPropertyDecorators.TransformersTheLotClass.name, Val: "hello" }, errors, true)).toBe(TestRepl);
314
+ expect(Definitions.DoesDataClassMatchRepl(ver, TestRepl, { Class: TestPropertyDecorators.TransformersTheLotClass.name, Val: "hello" }, errors, false)).toBe(TestRepl);
315
+ });
316
+ test("Child class matches class", () => {
317
+ let errors = new ErrorStack(SourceFile);
318
+ expect(Definitions.DoesDataClassMatchRepl(ver, TestRepl, { Class: TestPropertyDecorators.TransformersBasicChild.name }, errors, true)).toBe(ChildRepl);
319
+ expect(Definitions.DoesDataClassMatchRepl(ver, TestRepl, { Class: TestPropertyDecorators.TransformersBasicChild.name }, errors, false)).toBe(ChildRepl);
320
+ });
321
+ test("Other class does not match class", () => {
322
+ let errors = new ErrorStack(SourceFile);
323
+ expect(Definitions.DoesDataClassMatchRepl(ver, TestRepl, { Class: TestPropertyDecorators.TransformersBasicStruct.name }, errors, true)).toBe(null);
324
+ expect(Definitions.DoesDataClassMatchRepl(ver, TestRepl, { Class: TestPropertyDecorators.TransformersBasicStruct.name }, errors, false)).toBe(null);
325
+ expect(Definitions.DoesDataClassMatchRepl(ver, TestRepl, { Class: TestPropertyDecorators.TransformersBasicClass.name }, errors, true)).toBe(null);
326
+ expect(Definitions.DoesDataClassMatchRepl(ver, TestRepl, { Class: TestPropertyDecorators.TransformersBasicClass.name }, errors, false)).toBe(null);
327
+ });
328
+ });
329
+ describe("8. DoesExpressionMatchProperty", () => {
330
+ test("Should return true if the expression matches the property", async () => {
331
+ const Name = TestPropertyDecorators.TransformersTheLotClass.name;
332
+ let errors = new ErrorStack(SourceFile);
333
+ expect(Definitions.DoesExpressionMatchProperty(`${Name}.Val`, valDef.expressionForProperty[ver], valExpr, errors)).toBe(true);
334
+ expect(Definitions.DoesExpressionMatchProperty(`${Name}.Val2`, val2Def.expressionForProperty[ver], val2Expr, errors)).toBe(true);
335
+ expect(Definitions.DoesExpressionMatchProperty(`${Name}.Val3`, val3Def.expressionForProperty[ver], val3Expr, errors)).toBe(true);
336
+ expect(Definitions.DoesExpressionMatchProperty(`${Name}.Val4`, val4Def.expressionForProperty[ver], val4Expr, errors)).toBe(true);
337
+ expect(Definitions.DoesExpressionMatchProperty(`${Name}.Val5`, val5Def.expressionForProperty[ver], val5Expr, errors)).toBe(true);
338
+ expect(Definitions.DoesExpressionMatchProperty(`${Name}.Val6`, val6Def.expressionForProperty[ver], val6Expr, errors)).toBe(true);
339
+ expect(Definitions.DoesExpressionMatchProperty(`${Name}.Val7`, val7Def.expressionForProperty[ver], val7Expr, errors)).toBe(true);
340
+ expect(Definitions.DoesExpressionMatchProperty(`${Name}.Val8`, val8Def.expressionForProperty[ver], val8Expr, errors)).toBe(true);
341
+ expect(Definitions.DoesExpressionMatchProperty(`${Name}.Val9`, val9Def.expressionForProperty[ver], val9Expr, errors)).toBe(true);
342
+ expect(Definitions.DoesExpressionMatchProperty(`${Name}.Val10`, val10Def.expressionForProperty[ver], val10Expr, errors)).toBe(true);
343
+ expect(Definitions.DoesExpressionMatchProperty(`${Name}.Val11`, val11Def.expressionForProperty[ver], val11Expr, errors)).toBe(true);
344
+ expect(Definitions.DoesExpressionMatchProperty(`${Name}.Val14`, val14Def.expressionForProperty[ver], val14Expr, errors)).toBe(true);
345
+ });
346
+ test("Should return false if expression's modifiers don't match property", async () => {
347
+ const Name = TestPropertyDecorators.TransformersTheLotClass.name;
348
+ let errors = new ErrorStack(SourceFile);
349
+ expect(Definitions.DoesExpressionMatchProperty(`${Name}.Val`, valDef.expressionForProperty[ver], val3Expr, errors)).toBe(false);
350
+ expect(errors.toString("TEST_REP_TD015")).includesString(`${Name}.Val expects String but Expression produces Map<string, Number>. Expression is @{thisEntity.Val3}.`);
351
+ });
352
+ test("Should return false if expression's returned types don't match property", async () => {
353
+ const Name = TestPropertyDecorators.TransformersTheLotClass.name;
354
+ let errors = new ErrorStack(SourceFile);
355
+ expect(Definitions.DoesExpressionMatchProperty(`${Name}.Val`, valDef.expressionForProperty[ver], val2Expr, errors)).toBe(false);
356
+ expect(errors.toString("TEST_REP_TD016")).includesString(`${Name}.Val expects String but Expression produces Number. Expression is @{thisEntity.Val2}.`);
357
+ });
358
+ });
359
+ describe.sequential("9. SetupDataExpressions", () => {
360
+ test("Should return true if properties have correct expressions", () => {
361
+ let result;
362
+ expect(() => {
363
+ result = Definitions.PrePrepareData(TestRepl, JSON.parse(JSON.stringify(TestPropertyDecorators.TransformersTheLotExpression)), { SourceFile: BikPath.getCallerFilepath(), Version: ver });
364
+ }).not.toThrowError();
365
+ expect(result.Val).instanceOf(EvaluationChain);
366
+ expect(result.Val2).instanceOf(EvaluationChain);
367
+ expect(result.Val3).instanceOf(EvaluationChain);
368
+ expect(result.Val4).instanceOf(EvaluationChain);
369
+ expect(result.Val5).instanceOf(EvaluationChain);
370
+ expect(result.Val6).instanceOf(EvaluationChain);
371
+ expect(result.Val7).instanceOf(EvaluationChain);
372
+ expect(result.Val8).instanceOf(EvaluationChain);
373
+ expect(result.Val9).instanceOf(EvaluationChain);
374
+ expect(result.Val10).instanceOf(EvaluationChain);
375
+ expect(result.Val11).instanceOf(EvaluationChain);
376
+ expect(result.Val13).toContainAtLeast([[1, 2]]);
377
+ });
378
+ test("Should return true if property values contain correct expressons", () => {
379
+ let result = Definitions.PrePrepareData(TestRepl, JSON.parse(JSON.stringify(TestPropertyDecorators.TransformersTheLotInnerExpression)), { SourceFile: BikPath.getCallerFilepath(), Version: ver });
380
+ expect(result.Val).instanceOf(EvaluationChain);
381
+ expect(result.Val2).instanceOf(EvaluationChain);
382
+ expect(result.Val3).toBeInstanceOf(Object);
383
+ expect(result.Val3.hello).instanceOf(EvaluationChain);
384
+ expect(result.Val4).toBeInstanceOf(Object);
385
+ expect(result.Val4[1]).instanceOf(EvaluationChain);
386
+ expect(result.Val5).toBeInstanceOf(Array);
387
+ expect(result.Val5[0]).instanceOf(EvaluationChain);
388
+ expect(result.Val5[1]).instanceOf(EvaluationChain);
389
+ expect(result.Val6).toBeInstanceOf(Array);
390
+ expect(result.Val6[0]).toBeInstanceOf(Array);
391
+ expect(result.Val6[0][0]).instanceOf(EvaluationChain);
392
+ expect(result.Val6[0][1]).instanceOf(EvaluationChain);
393
+ expect(result.Val7).toBeInstanceOf(Object);
394
+ expect(result.Val7.Val).instanceOf(EvaluationChain);
395
+ expect(result.Val8).instanceOf(EvaluationChain);
396
+ expect(result.Val9).toBeInstanceOf(Object);
397
+ expect(result.Val9.Val).instanceOf(EvaluationChain);
398
+ expect(result.Val10).toBeInstanceOf(Object);
399
+ expect(result.Val10.Val).instanceOf(EvaluationChain);
400
+ expect(result.Val11).instanceOf(EvaluationChain);
401
+ expect(result.Val13).toContainAtLeast([[1, 2]]);
402
+ });
403
+ });
404
+ describe.sequential("10. IsLoadableDataForRepl", () => {
405
+ test("Should return true if the data is correct", () => {
406
+ let errors = new ErrorStack(SourceFile);
407
+ let result = Definitions.IsLoadableDataForRepl(TestRepl, TestPropertyDecorators.TransformersTheLotData, ver, errors);
408
+ expect(result).toBe(true);
409
+ });
410
+ test("Should return true if data is valid child data", () => {
411
+ let errors = new ErrorStack(SourceFile);
412
+ let result = Definitions.IsLoadableDataForRepl(TestRepl, TestPropertyDecorators.TransformersBasicChildData, ver, errors);
413
+ expect(result).toBe(true);
414
+ });
415
+ test("Should return true if the data contains correct expressions", () => {
416
+ let errors = new ErrorStack(SourceFile);
417
+ let expressionData = Definitions.PrePrepareData(TestRepl, JSON.parse(JSON.stringify(TestPropertyDecorators.TransformersTheLotExpression)), { SourceFile: BikPath.getCallerFilepath(), Version: ver });
418
+ let result = Definitions.IsLoadableDataForRepl(TestRepl, expressionData, ver, errors);
419
+ expect(result).toBe(true);
420
+ });
421
+ test("Should return true if the data contains correct values that contain expressions", () => {
422
+ let errors = new ErrorStack(SourceFile);
423
+ let expressionData = Definitions.PrePrepareData(TestRepl, JSON.parse(JSON.stringify(TestPropertyDecorators.TransformersTheLotInnerExpression)), { SourceFile: BikPath.getCallerFilepath(), Version: ver });
424
+ let result = Definitions.IsLoadableDataForRepl(TestRepl, expressionData, ver, errors);
425
+ expect(result).toBe(true);
426
+ });
427
+ test("Check that errors are formed sensibly", () => {
428
+ let errors = new ErrorStack(SourceFile);
429
+ let expressionData = JSON.parse(JSON.stringify(TestPropertyDecorators.InvalidTransformersTheLotData));
430
+ let result = Definitions.IsLoadableDataForRepl(TestRepl, expressionData, ver, errors);
431
+ expect(result).toBe(false);
432
+ //TODO: Don't forget to check that val14 shouldn't be present.
433
+ let errorStr = errors.toString("TEST_REP_TD017");
434
+ expect(errorStr).includesString(` TransformersTheLotClass.Val is missing and is not optional.`);
435
+ expect(errorStr).includesString(` TransformersTheLotClass.Val2 expects Number but got a String.`);
436
+ expect(errorStr).includesString(` TransformersTheLotClass.Val3 expects Map<string, Number> but got a String.`);
437
+ expect(errorStr).includesString(` TransformersTheLotClass.Val4 expects {[key: string]: String } but got a Number.`);
438
+ expect(errorStr).includesString(` TransformersTheLotClass.Val5 expects String[] but got a String[][].`);
439
+ expect(errorStr).includesString(` TransformersTheLotClass.Val6 expects Number[][] but got a Number[].`);
440
+ expect(errorStr).includesString(` Data claims to be of type TransformersBasicClass which is not assignable to TransformersBasicStruct.
441
+ Error parsing data. Data (<TransformersBasicStruct>{"Class":"TransformersBasicClass","Val":"hi"}) is not`
442
+ + ` assignable to class TransformersBasicStruct, see above errors for details.
443
+ TransformersTheLotClass.Val7 expects TransformersBasicStruct but got a {"Class":"TransformersBasicClass","Val":"hi"}.`);
444
+ expect(errorStr).includesString(` TransformersTheLotClass.Val8 expects (null | Number | String) but got a Number[][].`);
445
+ expect(errorStr).includesString(` TransformersBasicClass.Val expects String but got a Number.
446
+ Failed to parse (<TransformersBasicClass>{"Class":"TransformersBasicClass","Val":2}) for class TransformersBasicClass, see above errors for details.
447
+ TransformersTheLotClass.Val9 expects TransformersBasicClass but got a {"Class":"TransformersBasicClass","Val":2}.`);
448
+ expect(errorStr).includesString(` TransformersTheLotClass.Val10 expects TransformersBasicClass but got a Number[].`);
449
+ expect(errorStr).includesString(` TransformersTheLotClass.Val11 expects String but got a {[key: string]: String }.`);
450
+ // TODO: Re-add deprecation warning?
451
+ // expect(errorStr).includesString(
452
+ // ` Warning: TransformersTheLotClass.Val12 has been removed and cannot be loaded.`);
453
+ expect(errorStr).includesString(` TransformersTheLotClass.Val13 does not allow for expressions.`);
454
+ expect(errorStr).includesString(` for class TransformersTheLotClass, see above errors for details.`.trim());
455
+ });
456
+ });
457
+ });