typia 13.2.0 → 13.3.0

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 (92) hide show
  1. package/lib/http.d.ts +3 -3
  2. package/lib/http.js.map +1 -1
  3. package/lib/http.mjs.map +1 -1
  4. package/lib/internal/_assertGuard.js +13 -3
  5. package/lib/internal/_assertGuard.js.map +1 -1
  6. package/lib/internal/_assertGuard.mjs +4 -2
  7. package/lib/internal/_assertGuard.mjs.map +1 -1
  8. package/lib/internal/_isFormatIdnHostname.js +5 -1
  9. package/lib/internal/_isFormatIdnHostname.js.map +1 -1
  10. package/lib/internal/_isFormatIdnHostname.mjs +1 -1
  11. package/lib/internal/_isFormatIdnHostname.mjs.map +1 -1
  12. package/lib/internal/_isFormatTime.js +19 -2
  13. package/lib/internal/_isFormatTime.js.map +1 -1
  14. package/lib/internal/_isFormatTime.mjs +9 -2
  15. package/lib/internal/_isFormatTime.mjs.map +1 -1
  16. package/lib/internal/_randomArray.js +37 -4
  17. package/lib/internal/_randomArray.js.map +1 -1
  18. package/lib/internal/_randomArray.mjs +16 -3
  19. package/lib/internal/_randomArray.mjs.map +1 -1
  20. package/lib/internal/_randomFormatByte.js +15 -12
  21. package/lib/internal/_randomFormatByte.js.map +1 -1
  22. package/lib/internal/_randomFormatByte.mjs +11 -10
  23. package/lib/internal/_randomFormatByte.mjs.map +1 -1
  24. package/lib/internal/_randomFormatDatetime.mjs +1 -1
  25. package/lib/internal/_randomFormatHostname.d.ts +2 -2
  26. package/lib/internal/_randomFormatHostname.js +2 -2
  27. package/lib/internal/_randomFormatHostname.mjs +2 -2
  28. package/lib/internal/_randomFormatHostname.mjs.map +1 -1
  29. package/lib/internal/_randomFormatIdnHostname.js +9 -10
  30. package/lib/internal/_randomFormatIdnHostname.js.map +1 -1
  31. package/lib/internal/_randomFormatIdnHostname.mjs +3 -4
  32. package/lib/internal/_randomFormatIdnHostname.mjs.map +1 -1
  33. package/lib/internal/_randomFormatRegex.js +4 -4
  34. package/lib/internal/_randomFormatRegex.js.map +1 -1
  35. package/lib/internal/_randomFormatRegex.mjs +1 -2
  36. package/lib/internal/_randomFormatRegex.mjs.map +1 -1
  37. package/lib/internal/_randomFormatTime.js +15 -10
  38. package/lib/internal/_randomFormatTime.js.map +1 -1
  39. package/lib/internal/_randomFormatTime.mjs +6 -3
  40. package/lib/internal/_randomFormatTime.mjs.map +1 -1
  41. package/lib/internal/private/__randomComposition.d.ts +8 -0
  42. package/lib/internal/private/__randomComposition.js +21 -1
  43. package/lib/internal/private/__randomComposition.js.map +1 -1
  44. package/lib/internal/private/__randomComposition.mjs +18 -1
  45. package/lib/internal/private/__randomComposition.mjs.map +1 -1
  46. package/lib/json.d.ts +2 -2
  47. package/lib/json.js.map +1 -1
  48. package/lib/json.mjs.map +1 -1
  49. package/lib/module.d.ts +28 -13
  50. package/lib/module.js.map +1 -1
  51. package/lib/module.mjs.map +1 -1
  52. package/lib/notations.d.ts +4 -4
  53. package/lib/notations.js.map +1 -1
  54. package/lib/notations.mjs.map +1 -1
  55. package/lib/plain.d.ts +3 -3
  56. package/lib/plain.js.map +1 -1
  57. package/lib/plain.mjs.map +1 -1
  58. package/lib/protobuf.d.ts +2 -2
  59. package/lib/protobuf.js.map +1 -1
  60. package/lib/protobuf.mjs.map +1 -1
  61. package/native/cmd/ttsc-typia/assert_guard_factory_contract_test.go +17 -4
  62. package/native/cmd/ttsc-typia/create_assert_error_factory_arity_test.go +309 -0
  63. package/native/cmd/ttsc-typia/local_function_named_like_typia_operation_transform_test.go +185 -0
  64. package/native/cmd/ttsc-typia/recursive_conditional_alias_name_transform_test.go +307 -0
  65. package/native/cmd/ttsc-typia/shadowed_typia_module_declaration_diagnostic_test.go +152 -0
  66. package/native/cmd/ttsc-typia/template_literal_type_tags_transform_test.go +1 -3
  67. package/native/cmd/ttsc-typia/transform_helpers_test.go +92 -26
  68. package/native/core/factories/FormatCheatSheet.go +2 -2
  69. package/native/core/factories/MetadataCommentTagFactory.go +26 -11
  70. package/native/core/factories/factory_utility_coverage_test.go +896 -907
  71. package/native/core/factories/internal/metadata/MetadataHelper.go +5 -28
  72. package/native/core/factories/metadata_comment_tag_factory_coverage_test.go +2 -2
  73. package/native/core/programmers/RandomProgrammer.go +5 -2
  74. package/native/core/schemas/metadata/MetadataCollection.go +47 -5
  75. package/native/transform/CallExpressionTransformer.go +167 -0
  76. package/package.json +3 -3
  77. package/src/http.ts +18 -4
  78. package/src/internal/_assertGuard.ts +13 -2
  79. package/src/internal/_isFormatIdnHostname.ts +5 -1
  80. package/src/internal/_isFormatTime.ts +19 -2
  81. package/src/internal/_randomArray.ts +42 -6
  82. package/src/internal/_randomFormatByte.ts +17 -12
  83. package/src/internal/_randomFormatHostname.ts +2 -2
  84. package/src/internal/_randomFormatIdnHostname.ts +8 -9
  85. package/src/internal/_randomFormatRegex.ts +4 -6
  86. package/src/internal/_randomFormatTime.ts +15 -10
  87. package/src/internal/private/__randomComposition.ts +24 -0
  88. package/src/json.ts +16 -4
  89. package/src/module.ts +56 -22
  90. package/src/notations.ts +16 -4
  91. package/src/plain.ts +12 -3
  92. package/src/protobuf.ts +16 -4
@@ -4,18 +4,18 @@
4
4
  package factories
5
5
 
6
6
  import (
7
- "math/big"
8
- "os"
9
- "path/filepath"
10
- "strings"
11
- "testing"
7
+ "math/big"
8
+ "os"
9
+ "path/filepath"
10
+ "strings"
11
+ "testing"
12
12
 
13
- shimast "github.com/microsoft/typescript-go/shim/ast"
14
- shimchecker "github.com/microsoft/typescript-go/shim/checker"
15
- shimprinter "github.com/microsoft/typescript-go/shim/printer"
16
- "github.com/samchon/ttsc/packages/ttsc/driver"
17
- schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
18
- nativeprotobuf "github.com/samchon/typia/packages/typia/native/core/schemas/protobuf"
13
+ shimast "github.com/microsoft/typescript-go/shim/ast"
14
+ shimchecker "github.com/microsoft/typescript-go/shim/checker"
15
+ shimprinter "github.com/microsoft/typescript-go/shim/printer"
16
+ "github.com/samchon/ttsc/packages/ttsc/driver"
17
+ schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
18
+ nativeprotobuf "github.com/samchon/typia/packages/typia/native/core/schemas/protobuf"
19
19
  )
20
20
 
21
21
  // TestFactoryUtilityCoverage covers small factory helpers.
@@ -31,108 +31,108 @@ import (
31
31
  // 4. Verify fallback AST, literal, protobuf, sequence validation, and type-tag factory paths.
32
32
  // 5. Resolve TypeScript checker-backed type names and synthetic function declarations.
33
33
  func TestFactoryUtilityCoverage(t *testing.T) {
34
- emit := shimprinter.NewEmitContext()
35
- input := expressionFactory_factory.NewIdentifier("input")
36
- for _, name := range []string{"int32", "uint32", "int64", "uint64", "float", "double", "unknown"} {
37
- if NumericRangeFactory.Number(name, input) == nil {
38
- t.Fatalf("number range %s returned nil", name)
39
- }
40
- }
41
- for _, name := range []string{"uint64", "int64"} {
42
- if NumericRangeFactory.Bigint(name, input) == nil {
43
- t.Fatalf("bigint range %s returned nil", name)
44
- }
45
- }
34
+ emit := shimprinter.NewEmitContext()
35
+ input := expressionFactory_factory.NewIdentifier("input")
36
+ for _, name := range []string{"int32", "uint32", "int64", "uint64", "float", "double", "unknown"} {
37
+ if NumericRangeFactory.Number(name, input) == nil {
38
+ t.Fatalf("number range %s returned nil", name)
39
+ }
40
+ }
41
+ for _, name := range []string{"uint64", "int64"} {
42
+ if NumericRangeFactory.Bigint(name, input) == nil {
43
+ t.Fatalf("bigint range %s returned nil", name)
44
+ }
45
+ }
46
46
 
47
- if ExpressionFactory.Bigint("123") == nil {
48
- t.Fatal("bigint expression returned nil")
49
- }
50
- if ExpressionFactory.Number(-12) == nil ||
51
- ExpressionFactory.Number(float32(1.5)) == nil ||
52
- ExpressionFactory.Number("7") == nil {
53
- t.Fatal("number expression branch returned nil")
54
- }
55
- if ExpressionFactory.IsRequired(input) == nil {
56
- t.Fatal("required expression returned nil")
57
- }
58
- if ExpressionFactory.IsArray(input) == nil ||
59
- ExpressionFactory.IsObject(ExpressionFactory_IsObjectProps{Input: input, CheckNull: true, CheckArray: true}) == nil ||
60
- ExpressionFactory.IsInstanceOf("Date", input) == nil ||
61
- ExpressionFactory.Coalesce(input, expressionFactory_factory.NewIdentifier("fallback")) == nil {
62
- t.Fatal("basic expression factory branch returned nil")
63
- }
64
- if ExpressionFactory.Currying(ExpressionFactory_CurryingProps{
65
- Function: expressionFactory_factory.NewIdentifier("fn"),
66
- Arguments: nil,
67
- }) == nil {
68
- t.Fatal("zero-argument currying returned nil")
69
- }
70
- if ExpressionFactory.Currying(ExpressionFactory_CurryingProps{
71
- Function: expressionFactory_factory.NewIdentifier("fn"),
72
- Arguments: []*shimast.Expression{
73
- expressionFactory_factory.NewIdentifier("a"),
74
- expressionFactory_factory.NewIdentifier("b"),
75
- },
76
- }) == nil {
77
- t.Fatal("multi-argument currying returned nil")
78
- }
79
- call := expressionFactory_factory.NewCallExpression(
80
- expressionFactory_factory.NewIdentifier("already"),
81
- nil,
82
- nil,
83
- nil,
84
- shimast.NodeFlagsNone,
85
- )
86
- if ExpressionFactory.SelfCall(emit, call) != call {
87
- t.Fatal("self-call should return call expressions unchanged")
88
- }
89
- if ExpressionFactory.SelfCall(emit, StatementFactory.Block(input), TypeFactory.Keyword("string")) == nil {
90
- t.Fatal("self-call should wrap non-call bodies")
91
- }
92
- if ExpressionFactory.GetEscapedText(ExpressionFactory_GetEscapedTextProps{}) != "" {
93
- t.Fatal("nil escaped text should be empty")
94
- }
95
- if ExpressionFactory.GetEscapedText(ExpressionFactory_GetEscapedTextProps{Input: input}) != "input" {
96
- t.Fatal("identifier escaped text mismatch")
97
- }
98
- if ExpressionFactory.GetEscapedText(ExpressionFactory_GetEscapedTextProps{
99
- Input: expressionFactory_factory.NewStringLiteral("text", shimast.TokenFlagsNone),
100
- }) != "text" {
101
- t.Fatal("string escaped text mismatch")
102
- }
103
- access := IdentifierFactory.Access(emit, input, "field")
104
- if IdentifierFactory.GetName(access) != "input.field" {
105
- t.Fatalf("property access name mismatch: %s", IdentifierFactory.GetName(access))
106
- }
107
- element := IdentifierFactory.Access(emit, input, "not valid")
108
- if IdentifierFactory.GetName(element) != "input[not valid]" {
109
- t.Fatalf("element access name mismatch: %s", IdentifierFactory.GetName(element))
110
- }
111
- if IdentifierFactory.GetName(nil) != "unknown" {
112
- t.Fatal("nil identifier name should be unknown")
113
- }
114
- if TypeFactory.GetReturnTypeOfClassMethod(TypeFactory_GetReturnTypeOfClassMethodProps{}) != nil {
115
- t.Fatal("nil checker and class should not produce a return type")
116
- }
117
- if TypeFactory.GetFunction(nil) != nil || TypeFactory.GetFunction(&shimchecker.Type{}) != nil {
118
- t.Fatal("nil or zero types should not produce function declarations")
119
- }
120
- if TypeFactory.GetFullName(TypeFactory_GetFullNameProps{}) != "" {
121
- t.Fatal("nil full name lookup should be empty")
122
- }
123
- if typeFactory_get_name(nil) != "__type" {
124
- t.Fatal("nil type factory internals should use fallback values")
125
- }
126
- for _, keyword := range []string{"void", "any", "unknown", "boolean", "number", "bigint", "string"} {
127
- if TypeFactory.Keyword(keyword) == nil {
128
- t.Fatalf("keyword %s returned nil", keyword)
129
- }
130
- }
131
- typeDir := t.TempDir()
132
- if err := os.MkdirAll(filepath.Join(typeDir, "src"), 0o755); err != nil {
133
- t.Fatalf("mkdir type factory fixture: %v", err)
134
- }
135
- if err := os.WriteFile(filepath.Join(typeDir, "tsconfig.json"), []byte(`{
47
+ if ExpressionFactory.Bigint("123") == nil {
48
+ t.Fatal("bigint expression returned nil")
49
+ }
50
+ if ExpressionFactory.Number(-12) == nil ||
51
+ ExpressionFactory.Number(float32(1.5)) == nil ||
52
+ ExpressionFactory.Number("7") == nil {
53
+ t.Fatal("number expression branch returned nil")
54
+ }
55
+ if ExpressionFactory.IsRequired(input) == nil {
56
+ t.Fatal("required expression returned nil")
57
+ }
58
+ if ExpressionFactory.IsArray(input) == nil ||
59
+ ExpressionFactory.IsObject(ExpressionFactory_IsObjectProps{Input: input, CheckNull: true, CheckArray: true}) == nil ||
60
+ ExpressionFactory.IsInstanceOf("Date", input) == nil ||
61
+ ExpressionFactory.Coalesce(input, expressionFactory_factory.NewIdentifier("fallback")) == nil {
62
+ t.Fatal("basic expression factory branch returned nil")
63
+ }
64
+ if ExpressionFactory.Currying(ExpressionFactory_CurryingProps{
65
+ Function: expressionFactory_factory.NewIdentifier("fn"),
66
+ Arguments: nil,
67
+ }) == nil {
68
+ t.Fatal("zero-argument currying returned nil")
69
+ }
70
+ if ExpressionFactory.Currying(ExpressionFactory_CurryingProps{
71
+ Function: expressionFactory_factory.NewIdentifier("fn"),
72
+ Arguments: []*shimast.Expression{
73
+ expressionFactory_factory.NewIdentifier("a"),
74
+ expressionFactory_factory.NewIdentifier("b"),
75
+ },
76
+ }) == nil {
77
+ t.Fatal("multi-argument currying returned nil")
78
+ }
79
+ call := expressionFactory_factory.NewCallExpression(
80
+ expressionFactory_factory.NewIdentifier("already"),
81
+ nil,
82
+ nil,
83
+ nil,
84
+ shimast.NodeFlagsNone,
85
+ )
86
+ if ExpressionFactory.SelfCall(emit, call) != call {
87
+ t.Fatal("self-call should return call expressions unchanged")
88
+ }
89
+ if ExpressionFactory.SelfCall(emit, StatementFactory.Block(input), TypeFactory.Keyword("string")) == nil {
90
+ t.Fatal("self-call should wrap non-call bodies")
91
+ }
92
+ if ExpressionFactory.GetEscapedText(ExpressionFactory_GetEscapedTextProps{}) != "" {
93
+ t.Fatal("nil escaped text should be empty")
94
+ }
95
+ if ExpressionFactory.GetEscapedText(ExpressionFactory_GetEscapedTextProps{Input: input}) != "input" {
96
+ t.Fatal("identifier escaped text mismatch")
97
+ }
98
+ if ExpressionFactory.GetEscapedText(ExpressionFactory_GetEscapedTextProps{
99
+ Input: expressionFactory_factory.NewStringLiteral("text", shimast.TokenFlagsNone),
100
+ }) != "text" {
101
+ t.Fatal("string escaped text mismatch")
102
+ }
103
+ access := IdentifierFactory.Access(emit, input, "field")
104
+ if IdentifierFactory.GetName(access) != "input.field" {
105
+ t.Fatalf("property access name mismatch: %s", IdentifierFactory.GetName(access))
106
+ }
107
+ element := IdentifierFactory.Access(emit, input, "not valid")
108
+ if IdentifierFactory.GetName(element) != "input[not valid]" {
109
+ t.Fatalf("element access name mismatch: %s", IdentifierFactory.GetName(element))
110
+ }
111
+ if IdentifierFactory.GetName(nil) != "unknown" {
112
+ t.Fatal("nil identifier name should be unknown")
113
+ }
114
+ if TypeFactory.GetReturnTypeOfClassMethod(TypeFactory_GetReturnTypeOfClassMethodProps{}) != nil {
115
+ t.Fatal("nil checker and class should not produce a return type")
116
+ }
117
+ if TypeFactory.GetFunction(nil) != nil || TypeFactory.GetFunction(&shimchecker.Type{}) != nil {
118
+ t.Fatal("nil or zero types should not produce function declarations")
119
+ }
120
+ if TypeFactory.GetFullName(TypeFactory_GetFullNameProps{}) != "" {
121
+ t.Fatal("nil full name lookup should be empty")
122
+ }
123
+ if typeFactory_get_name(nil) != "__type" {
124
+ t.Fatal("nil type factory internals should use fallback values")
125
+ }
126
+ for _, keyword := range []string{"void", "any", "unknown", "boolean", "number", "bigint", "string"} {
127
+ if TypeFactory.Keyword(keyword) == nil {
128
+ t.Fatalf("keyword %s returned nil", keyword)
129
+ }
130
+ }
131
+ typeDir := t.TempDir()
132
+ if err := os.MkdirAll(filepath.Join(typeDir, "src"), 0o755); err != nil {
133
+ t.Fatalf("mkdir type factory fixture: %v", err)
134
+ }
135
+ if err := os.WriteFile(filepath.Join(typeDir, "tsconfig.json"), []byte(`{
136
136
  "compilerOptions": {
137
137
  "target": "ES2022",
138
138
  "module": "commonjs",
@@ -144,9 +144,9 @@ func TestFactoryUtilityCoverage(t *testing.T) {
144
144
  "include": ["src"]
145
145
  }
146
146
  `), 0o644); err != nil {
147
- t.Fatalf("write type factory tsconfig: %v", err)
148
- }
149
- if err := os.WriteFile(filepath.Join(typeDir, "src", "main.ts"), []byte(`
147
+ t.Fatalf("write type factory tsconfig: %v", err)
148
+ }
149
+ if err := os.WriteFile(filepath.Join(typeDir, "src", "main.ts"), []byte(`
150
150
  export function declared(): string { return ""; }
151
151
  export const holder = { assigned: () => "" };
152
152
  export class Example {
@@ -164,849 +164,838 @@ export namespace Outer {
164
164
  }
165
165
  export let inner!: Outer.Inner;
166
166
  `), 0o644); err != nil {
167
- t.Fatalf("write type factory source: %v", err)
168
- }
169
- prog, diags, err := driver.LoadProgram(typeDir, "tsconfig.json", driver.LoadProgramOptions{})
170
- if err != nil {
171
- t.Fatalf("load type factory program: %v", err)
172
- }
173
- if len(diags) != 0 {
174
- t.Fatalf("type factory fixture diagnostics: %+v", diags)
175
- }
176
- defer prog.Close()
177
- source := prog.SourceFile(filepath.Join(typeDir, "src", "main.ts"))
178
- if source == nil {
179
- t.Fatal("type factory source file was not loaded")
180
- }
181
- statements := source.Statements.Nodes
182
- if len(statements) < 10 {
183
- t.Fatalf("type factory fixture expected statements, got %d", len(statements))
184
- }
185
- variableType := func(index int) *shimchecker.Type {
186
- declarations := statements[index].AsVariableStatement().DeclarationList.AsVariableDeclarationList().Declarations.Nodes
187
- if len(declarations) == 0 {
188
- t.Fatalf("variable statement %d has no declarations", index)
189
- }
190
- return prog.Checker.GetTypeAtLocation(declarations[0])
191
- }
192
- if !TypeFactory.IsFunction(prog.Checker.GetTypeAtLocation(statements[0])) {
193
- t.Fatal("function declaration should be recognized as function-like")
194
- }
195
- holderType := variableType(1)
196
- assignedSymbol := prog.Checker.GetPropertyOfType(holderType, "assigned")
197
- if assignedSymbol == nil {
198
- t.Fatal("holder.assigned symbol was not found")
199
- }
200
- assignedType := prog.Checker.GetTypeOfSymbolAtLocation(assignedSymbol, assignedSymbol.ValueDeclaration)
201
- assignedDeclaredType := shimchecker.Checker_getTypeOfSymbol(prog.Checker, assignedSymbol)
202
- if TypeFactory.GetFunction(assignedDeclaredType) == nil && TypeFactory.GetFunction(assignedType) == nil {
203
- t.Fatal("property assignment initializer should be recognized as function-like")
204
- }
205
- exampleType := variableType(4)
206
- fieldSymbol := prog.Checker.GetPropertyOfType(exampleType, "field")
207
- if fieldSymbol == nil {
208
- t.Fatal("example.field symbol was not found")
209
- }
210
- fieldType := prog.Checker.GetTypeOfSymbolAtLocation(fieldSymbol, fieldSymbol.ValueDeclaration)
211
- fieldDeclaredType := shimchecker.Checker_getTypeOfSymbol(prog.Checker, fieldSymbol)
212
- if TypeFactory.GetFunction(fieldDeclaredType) == nil && TypeFactory.GetFunction(fieldType) == nil {
213
- t.Fatal("property declaration initializer should be recognized as function-like")
214
- }
215
- if TypeFactory.GetReturnTypeOfClassMethod(TypeFactory_GetReturnTypeOfClassMethodProps{
216
- Checker: prog.Checker,
217
- Class: exampleType,
218
- Function: "method",
219
- }) == nil {
220
- t.Fatal("class method return type should be resolved")
221
- }
222
- if TypeFactory.GetReturnTypeOfClassMethod(TypeFactory_GetReturnTypeOfClassMethodProps{
223
- Checker: prog.Checker,
224
- Class: exampleType,
225
- Function: "missing",
226
- }) != nil || TypeFactory.GetReturnTypeOfClassMethod(TypeFactory_GetReturnTypeOfClassMethodProps{
227
- Checker: prog.Checker,
228
- Class: exampleType,
229
- Function: "value",
230
- }) != nil {
231
- t.Fatal("missing or non-call class properties should not produce return types")
232
- }
233
- for _, tc := range []struct {
234
- name string
235
- index int
236
- contains string
237
- }{
238
- {name: "generic", index: 5, contains: "Box<string>"},
239
- {name: "promise", index: 6, contains: "string"},
240
- {name: "intersection", index: 7, contains: " & "},
241
- {name: "namespace", index: 9, contains: "Outer.Inner"},
242
- } {
243
- fullName := TypeFactory.GetFullName(TypeFactory_GetFullNameProps{
244
- Checker: prog.Checker,
245
- Type: variableType(tc.index),
246
- })
247
- if !strings.Contains(fullName, tc.contains) {
248
- t.Fatalf("%s full name %q did not contain %q", tc.name, fullName, tc.contains)
249
- }
250
- }
251
- if IdentifierFactory.Postfix("field") != "\".field\"" ||
252
- IdentifierFactory.Postfix("not valid") == "" {
253
- t.Fatal("identifier postfix formatting mismatch")
254
- }
255
- if IdentifierFactory.Parameter("value", nil, nil) == nil ||
256
- IdentifierFactory.Parameter(input, TypeFactory.Keyword("string"), nil) == nil ||
257
- IdentifierFactory.Parameter(123, nil, expressionFactory_factory.NewToken(shimast.KindQuestionToken)) == nil {
258
- t.Fatal("identifier parameter branch returned nil")
259
- }
167
+ t.Fatalf("write type factory source: %v", err)
168
+ }
169
+ prog, diags, err := driver.LoadProgram(typeDir, "tsconfig.json", driver.LoadProgramOptions{})
170
+ if err != nil {
171
+ t.Fatalf("load type factory program: %v", err)
172
+ }
173
+ if len(diags) != 0 {
174
+ t.Fatalf("type factory fixture diagnostics: %+v", diags)
175
+ }
176
+ defer prog.Close()
177
+ source := prog.SourceFile(filepath.Join(typeDir, "src", "main.ts"))
178
+ if source == nil {
179
+ t.Fatal("type factory source file was not loaded")
180
+ }
181
+ statements := source.Statements.Nodes
182
+ if len(statements) < 10 {
183
+ t.Fatalf("type factory fixture expected statements, got %d", len(statements))
184
+ }
185
+ variableType := func(index int) *shimchecker.Type {
186
+ declarations := statements[index].AsVariableStatement().DeclarationList.AsVariableDeclarationList().Declarations.Nodes
187
+ if len(declarations) == 0 {
188
+ t.Fatalf("variable statement %d has no declarations", index)
189
+ }
190
+ return prog.Checker.GetTypeAtLocation(declarations[0])
191
+ }
192
+ if !TypeFactory.IsFunction(prog.Checker.GetTypeAtLocation(statements[0])) {
193
+ t.Fatal("function declaration should be recognized as function-like")
194
+ }
195
+ holderType := variableType(1)
196
+ assignedSymbol := prog.Checker.GetPropertyOfType(holderType, "assigned")
197
+ if assignedSymbol == nil {
198
+ t.Fatal("holder.assigned symbol was not found")
199
+ }
200
+ assignedType := prog.Checker.GetTypeOfSymbolAtLocation(assignedSymbol, assignedSymbol.ValueDeclaration)
201
+ assignedDeclaredType := shimchecker.Checker_getTypeOfSymbol(prog.Checker, assignedSymbol)
202
+ if TypeFactory.GetFunction(assignedDeclaredType) == nil && TypeFactory.GetFunction(assignedType) == nil {
203
+ t.Fatal("property assignment initializer should be recognized as function-like")
204
+ }
205
+ exampleType := variableType(4)
206
+ fieldSymbol := prog.Checker.GetPropertyOfType(exampleType, "field")
207
+ if fieldSymbol == nil {
208
+ t.Fatal("example.field symbol was not found")
209
+ }
210
+ fieldType := prog.Checker.GetTypeOfSymbolAtLocation(fieldSymbol, fieldSymbol.ValueDeclaration)
211
+ fieldDeclaredType := shimchecker.Checker_getTypeOfSymbol(prog.Checker, fieldSymbol)
212
+ if TypeFactory.GetFunction(fieldDeclaredType) == nil && TypeFactory.GetFunction(fieldType) == nil {
213
+ t.Fatal("property declaration initializer should be recognized as function-like")
214
+ }
215
+ if TypeFactory.GetReturnTypeOfClassMethod(TypeFactory_GetReturnTypeOfClassMethodProps{
216
+ Checker: prog.Checker,
217
+ Class: exampleType,
218
+ Function: "method",
219
+ }) == nil {
220
+ t.Fatal("class method return type should be resolved")
221
+ }
222
+ if TypeFactory.GetReturnTypeOfClassMethod(TypeFactory_GetReturnTypeOfClassMethodProps{
223
+ Checker: prog.Checker,
224
+ Class: exampleType,
225
+ Function: "missing",
226
+ }) != nil || TypeFactory.GetReturnTypeOfClassMethod(TypeFactory_GetReturnTypeOfClassMethodProps{
227
+ Checker: prog.Checker,
228
+ Class: exampleType,
229
+ Function: "value",
230
+ }) != nil {
231
+ t.Fatal("missing or non-call class properties should not produce return types")
232
+ }
233
+ for _, tc := range []struct {
234
+ name string
235
+ index int
236
+ contains string
237
+ }{
238
+ {name: "generic", index: 5, contains: "Box<string>"},
239
+ {name: "promise", index: 6, contains: "string"},
240
+ {name: "intersection", index: 7, contains: " & "},
241
+ {name: "namespace", index: 9, contains: "Outer.Inner"},
242
+ } {
243
+ fullName := TypeFactory.GetFullName(TypeFactory_GetFullNameProps{
244
+ Checker: prog.Checker,
245
+ Type: variableType(tc.index),
246
+ })
247
+ if !strings.Contains(fullName, tc.contains) {
248
+ t.Fatalf("%s full name %q did not contain %q", tc.name, fullName, tc.contains)
249
+ }
250
+ }
251
+ if IdentifierFactory.Postfix("field") != "\".field\"" ||
252
+ IdentifierFactory.Postfix("not valid") == "" {
253
+ t.Fatal("identifier postfix formatting mismatch")
254
+ }
255
+ if IdentifierFactory.Parameter("value", nil, nil) == nil ||
256
+ IdentifierFactory.Parameter(input, TypeFactory.Keyword("string"), nil) == nil ||
257
+ IdentifierFactory.Parameter(123, nil, expressionFactory_factory.NewToken(shimast.KindQuestionToken)) == nil {
258
+ t.Fatal("identifier parameter branch returned nil")
259
+ }
260
260
 
261
- description := CommentFactory.Description(nil)
262
- if description != nil {
263
- t.Fatal("description placeholder should stay nil")
264
- }
265
- merged := CommentFactory.Merge([]CommentFactory_SymbolDisplayPart{
266
- {Text: "a\r\n"},
267
- {Text: "b"},
268
- })
269
- if merged != "a\nb" {
270
- t.Fatalf("comment merge mismatch: %q", merged)
271
- }
272
- if StatementFactory.Entry(StatementFactory_EntryProps{Key: "k", Value: "v"}) == nil {
273
- t.Fatal("entry statement returned nil")
274
- }
275
- if StatementFactory.Mut(StatementFactory_MutProps{Name: "mutable"}) == nil ||
276
- StatementFactory.Constant(StatementFactory_ConstantProps{Name: "constant"}) == nil {
277
- t.Fatal("variable statement helper returned nil")
278
- }
279
- if StatementFactory.Transpile("expr") == nil {
280
- t.Fatal("transpile statement returned nil")
281
- }
282
- if StatementFactory.Block(input) == nil {
283
- t.Fatal("block statement returned nil")
284
- }
285
- if ValueFactory.BOOLEAN(true).Kind != shimast.KindTrueKeyword ||
286
- ValueFactory.BOOLEAN(false).Kind != shimast.KindFalseKeyword {
287
- t.Fatal("boolean value factory returned wrong keyword")
288
- }
289
- if LiteralFactory.Write(big.NewInt(10)) == nil {
290
- t.Fatal("bigint literal branch returned nil")
291
- }
292
- type literalStruct struct {
293
- Name string
294
- Age int
295
- skip string
296
- }
297
- literalPointer := 11
298
- if LiteralFactory.Write(nil) == nil ||
299
- LiteralFactory.Write([]any{"a", 1, true}) == nil ||
300
- LiteralFactory.Write(map[string]any{"type": "string", "skip": nil}) == nil ||
301
- LiteralFactory.Write(literalStruct{Name: "sam", Age: 1}) == nil ||
302
- LiteralFactory.Write(&literalPointer) == nil ||
303
- LiteralFactory.Write(func() {}) == nil {
304
- t.Fatal("literal factory branch returned nil")
305
- }
306
- if TemplateFactory.Generate([]*shimast.Expression{
307
- expressionFactory_factory.NewStringLiteral("a", shimast.TokenFlagsNone),
308
- expressionFactory_factory.NewStringLiteral("b", shimast.TokenFlagsNone),
309
- }) == nil || TemplateFactory.Generate([]*shimast.Expression{
310
- expressionFactory_factory.NewStringLiteral("a", shimast.TokenFlagsNone),
311
- input,
312
- expressionFactory_factory.NewStringLiteral("b", shimast.TokenFlagsNone),
313
- }) == nil {
314
- t.Fatal("template factory branch returned nil")
315
- }
316
- importer := factoryUtilityImporter{}
317
- for _, script := range []string{
318
- "$input;",
319
- "$importInternal(\"helper\");",
320
- "$importInstance(\"Thing\", \"pkg\");",
321
- "$importNamespace(\"NS\", \"pkg\");",
322
- "$importDefault(\"Default\", \"pkg\", false);",
323
- } {
324
- if ExpressionFactory.Transpile(ExpressionFactory_TranspileProps{
325
- Importer: importer,
326
- Script: script,
327
- })(input) == nil {
328
- t.Fatalf("expression transpile returned nil for %s", script)
329
- }
330
- }
331
- if FormatCheatSheet["password"] != "true" ||
332
- formatCheatSheet_RegexCall("/x/") != "/x/.test($input)" {
333
- t.Fatal("format cheat sheet helper returned unexpected output")
334
- }
335
- if !strings.Contains(expressionFactory_random_format_uuid(), "-") {
336
- t.Fatal("random uuid should include separators")
337
- }
261
+ description := CommentFactory.Description(nil)
262
+ if description != nil {
263
+ t.Fatal("description placeholder should stay nil")
264
+ }
265
+ merged := CommentFactory.Merge([]CommentFactory_SymbolDisplayPart{
266
+ {Text: "a\r\n"},
267
+ {Text: "b"},
268
+ })
269
+ if merged != "a\nb" {
270
+ t.Fatalf("comment merge mismatch: %q", merged)
271
+ }
272
+ if StatementFactory.Entry(StatementFactory_EntryProps{Key: "k", Value: "v"}) == nil {
273
+ t.Fatal("entry statement returned nil")
274
+ }
275
+ if StatementFactory.Mut(StatementFactory_MutProps{Name: "mutable"}) == nil ||
276
+ StatementFactory.Constant(StatementFactory_ConstantProps{Name: "constant"}) == nil {
277
+ t.Fatal("variable statement helper returned nil")
278
+ }
279
+ if StatementFactory.Transpile("expr") == nil {
280
+ t.Fatal("transpile statement returned nil")
281
+ }
282
+ if StatementFactory.Block(input) == nil {
283
+ t.Fatal("block statement returned nil")
284
+ }
285
+ if ValueFactory.BOOLEAN(true).Kind != shimast.KindTrueKeyword ||
286
+ ValueFactory.BOOLEAN(false).Kind != shimast.KindFalseKeyword {
287
+ t.Fatal("boolean value factory returned wrong keyword")
288
+ }
289
+ if LiteralFactory.Write(big.NewInt(10)) == nil {
290
+ t.Fatal("bigint literal branch returned nil")
291
+ }
292
+ type literalStruct struct {
293
+ Name string
294
+ Age int
295
+ skip string
296
+ }
297
+ literalPointer := 11
298
+ if LiteralFactory.Write(nil) == nil ||
299
+ LiteralFactory.Write([]any{"a", 1, true}) == nil ||
300
+ LiteralFactory.Write(map[string]any{"type": "string", "skip": nil}) == nil ||
301
+ LiteralFactory.Write(literalStruct{Name: "sam", Age: 1}) == nil ||
302
+ LiteralFactory.Write(&literalPointer) == nil ||
303
+ LiteralFactory.Write(func() {}) == nil {
304
+ t.Fatal("literal factory branch returned nil")
305
+ }
306
+ if TemplateFactory.Generate([]*shimast.Expression{
307
+ expressionFactory_factory.NewStringLiteral("a", shimast.TokenFlagsNone),
308
+ expressionFactory_factory.NewStringLiteral("b", shimast.TokenFlagsNone),
309
+ }) == nil || TemplateFactory.Generate([]*shimast.Expression{
310
+ expressionFactory_factory.NewStringLiteral("a", shimast.TokenFlagsNone),
311
+ input,
312
+ expressionFactory_factory.NewStringLiteral("b", shimast.TokenFlagsNone),
313
+ }) == nil {
314
+ t.Fatal("template factory branch returned nil")
315
+ }
316
+ importer := factoryUtilityImporter{}
317
+ for _, script := range []string{
318
+ "$input;",
319
+ "$importInternal(\"helper\");",
320
+ "$importInstance(\"Thing\", \"pkg\");",
321
+ "$importNamespace(\"NS\", \"pkg\");",
322
+ "$importDefault(\"Default\", \"pkg\", false);",
323
+ } {
324
+ if ExpressionFactory.Transpile(ExpressionFactory_TranspileProps{
325
+ Importer: importer,
326
+ Script: script,
327
+ })(input) == nil {
328
+ t.Fatalf("expression transpile returned nil for %s", script)
329
+ }
330
+ }
331
+ if FormatCheatSheet["password"] != "true" ||
332
+ formatCheatSheet_RegexCall("/x/") != "/x/.test($input)" {
333
+ t.Fatal("format cheat sheet helper returned unexpected output")
334
+ }
335
+ if !strings.Contains(expressionFactory_random_format_uuid(), "-") {
336
+ t.Fatal("random uuid should include separators")
337
+ }
338
338
 
339
- if MetadataTypeTagFactory.Is(nil) {
340
- t.Fatal("nil object should not be recognized as a typia tag")
341
- }
342
- tagShape := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
343
- Name: "TagShape",
344
- Properties: []*schemametadata.MetadataProperty{
345
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("target"), Value: factoryUtilityLiteralMetadata("string")}),
346
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("kind"), Value: factoryUtilityLiteralMetadata("format")}),
347
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("value"), Value: factoryUtilityLiteralMetadata("uuid")}),
348
- },
349
- })
350
- tagValue := schemametadata.MetadataSchema_initialize()
351
- tagValue.Required = false
352
- tagValue.Optional = true
353
- tagValue.Objects = append(tagValue.Objects, schemametadata.MetadataObject_create(schemametadata.MetadataObject{Type: tagShape}))
354
- tagContainer := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
355
- Name: "Tagged",
356
- Properties: []*schemametadata.MetadataProperty{
357
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("typia.tag"), Value: tagValue}),
358
- },
359
- })
360
- if !MetadataTypeTagFactory.Is(tagContainer) {
361
- t.Fatal("valid typia tag object shape was not recognized")
362
- }
363
- typeTagErrors := []MetadataFactory_IError{}
364
- analyzed := MetadataTypeTagFactory.Analyze(struct {
365
- Errors *[]MetadataFactory_IError
366
- Type string
367
- Objects []*schemametadata.MetadataObjectType
368
- Explore MetadataFactory_IExplore
369
- }{
370
- Errors: &typeTagErrors,
371
- Type: "string",
372
- Objects: []*schemametadata.MetadataObjectType{tagContainer},
373
- })
374
- if len(analyzed) != 1 || analyzed[0].Target != "string" || analyzed[0].Kind != "format" || analyzed[0].Value != "uuid" {
375
- t.Fatal("metadata type tag analysis should produce a valid string format tag")
376
- }
377
- validateObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
378
- Name: "ValidateRecord",
379
- Properties: []*schemametadata.MetadataProperty{
380
- factoryUtilityTagProperty("string", factoryUtilityLiteralMetadata("return true")),
381
- factoryUtilityTagProperty("number", factoryUtilityLiteralMetadata("return false")),
382
- },
383
- })
384
- schemaObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
385
- Name: "SchemaRecord",
386
- Properties: []*schemametadata.MetadataProperty{
387
- factoryUtilityTagProperty("label", factoryUtilityLiteralMetadata("ok")),
388
- },
389
- })
390
- richTag := factoryUtilityTagContainer("RichTag",
391
- factoryUtilityTagProperty("target", factoryUtilityStringUnionMetadata("string", "number")),
392
- factoryUtilityTagProperty("kind", factoryUtilityLiteralMetadata("range")),
393
- factoryUtilityTagProperty("value", factoryUtilityLiteralMetadata("minimum")),
394
- factoryUtilityTagProperty("exclusive", factoryUtilityStringTupleMetadata("format")),
395
- factoryUtilityTagProperty("validate", factoryUtilityObjectMetadata(validateObject)),
396
- factoryUtilityTagProperty("schema", factoryUtilityObjectMetadata(schemaObject)),
397
- )
398
- richAnalyzed := MetadataTypeTagFactory.Analyze(struct {
399
- Errors *[]MetadataFactory_IError
400
- Type string
401
- Objects []*schemametadata.MetadataObjectType
402
- Explore MetadataFactory_IExplore
403
- }{
404
- Errors: &typeTagErrors,
405
- Type: "number",
406
- Objects: []*schemametadata.MetadataObjectType{richTag},
407
- })
408
- if len(richAnalyzed) != 1 ||
409
- richAnalyzed[0].Target != "number" ||
410
- richAnalyzed[0].Validate != "return false" ||
411
- richAnalyzed[0].Schema == nil {
412
- t.Fatal("rich metadata type tag analysis missed validate or schema fields")
413
- }
414
- invalidTagErrors := []MetadataFactory_IError{}
415
- invalidOuter := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{Name: "InvalidOuter"})
416
- requiredTop := factoryUtilityTagContainer("RequiredTop",
417
- factoryUtilityTagProperty("target", factoryUtilityLiteralMetadata("string")),
418
- factoryUtilityTagProperty("kind", factoryUtilityLiteralMetadata("format")),
419
- factoryUtilityTagProperty("value", factoryUtilityLiteralMetadata("uuid")),
420
- )
421
- requiredTop.Properties[0].Value.Required = true
422
- requiredTop.Properties[0].Value.Optional = false
423
- missingEssential := factoryUtilityTagContainer("MissingEssential",
424
- factoryUtilityTagProperty("target", factoryUtilityLiteralMetadata("string")),
425
- )
426
- invalidProperty := factoryUtilityTagContainer("InvalidProperty",
427
- factoryUtilityTagProperty("target", factoryUtilityLiteralMetadata("symbol")),
428
- factoryUtilityTagProperty("kind", factoryUtilityAtomicMetadata("string")),
429
- factoryUtilityTagProperty("value", factoryUtilityAtomicMetadata("number")),
430
- factoryUtilityTagProperty("exclusive", factoryUtilityAtomicMetadata("boolean")),
431
- factoryUtilityTagProperty("validate", factoryUtilityAtomicMetadata("string")),
432
- factoryUtilityTagProperty("schema", factoryUtilityAtomicMetadata("string")),
433
- )
434
- nilTag := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
435
- Name: "NilTag",
436
- Properties: []*schemametadata.MetadataProperty{
437
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("typia.tag"), Value: schemametadata.MetadataSchema_initialize()}),
438
- },
439
- })
440
- invalidAnalyzed := MetadataTypeTagFactory.Analyze(struct {
441
- Errors *[]MetadataFactory_IError
442
- Type string
443
- Objects []*schemametadata.MetadataObjectType
444
- Explore MetadataFactory_IExplore
445
- }{
446
- Errors: &invalidTagErrors,
447
- Type: "string",
448
- Objects: []*schemametadata.MetadataObjectType{
449
- invalidOuter,
450
- requiredTop,
451
- missingEssential,
452
- invalidProperty,
453
- nilTag,
454
- tagContainer,
455
- },
456
- })
457
- if len(invalidAnalyzed) != 0 || len(invalidTagErrors) == 0 {
458
- t.Fatalf("invalid metadata type tags should be reported and filtered out: analyzed=%d errors=%d", len(invalidAnalyzed), len(invalidTagErrors))
459
- }
460
- typeTagReports := []string{}
461
- typeTagReport := func(next struct {
462
- Property *string
463
- Message string
464
- }) bool {
465
- typeTagReports = append(typeTagReports, next.Message)
466
- return false
467
- }
468
- MetadataTypeTagFactory.Validate(struct {
469
- Report func(struct {
470
- Property *string
471
- Message string
472
- }) bool
473
- Type string
474
- Tags []schemametadata.IMetadataTypeTag
475
- }{Report: typeTagReport, Type: "string", Tags: []schemametadata.IMetadataTypeTag{{Target: "number", Kind: "format"}}})
476
- MetadataTypeTagFactory.Validate(struct {
477
- Report func(struct {
478
- Property *string
479
- Message string
480
- }) bool
481
- Type string
482
- Tags []schemametadata.IMetadataTypeTag
483
- }{
484
- Report: typeTagReport,
485
- Type: "string",
486
- Tags: []schemametadata.IMetadataTypeTag{
487
- {Target: "string", Kind: "format", Name: "uuid", Exclusive: true},
488
- {Target: "string", Kind: "format", Name: "email", Exclusive: true},
489
- },
490
- })
491
- MetadataTypeTagFactory.Validate(struct {
492
- Report func(struct {
493
- Property *string
494
- Message string
495
- }) bool
496
- Type string
497
- Tags []schemametadata.IMetadataTypeTag
498
- }{
499
- Report: typeTagReport,
500
- Type: "string",
501
- Tags: []schemametadata.IMetadataTypeTag{
502
- // Format and Pattern as they are actually declared: both list the
503
- // kinds `["format", "pattern"]`, so intersecting them on one property
504
- // is forbidden. The cross-kind conflict fires on the opposite's kind,
505
- // not its name, and without a same-kind guard. The previous fixture
506
- // named the opposite in `exclusive` by tag name, the only shape the
507
- // doubly-broken check could fire on and no real declaration produces.
508
- {Target: "string", Kind: "format", Name: "Format<\"uuid\">", Exclusive: []string{"format", "pattern"}},
509
- {Target: "string", Kind: "pattern", Name: "Pattern<\"^x$\">", Exclusive: []string{"format", "pattern"}},
510
- },
511
- })
512
- invalidExclusiveReports := []string{}
513
- _ = metadataTypeTagFactory_get_exclusive(struct {
514
- Report func(struct {
515
- Property *string
516
- Message string
517
- }) bool
518
- Key string
519
- Value *schemametadata.MetadataSchema
520
- }{Report: func(next struct {
521
- Property *string
522
- Message string
523
- }) bool {
524
- invalidExclusiveReports = append(invalidExclusiveReports, next.Message)
525
- return false
526
- }, Key: "exclusive", Value: factoryUtilityStringTupleMetadata("ok", "")})
527
- if len(typeTagReports) != 3 ||
528
- len(invalidExclusiveReports) == 0 ||
529
- metadataTypeTagFactory_property_value(nil) != nil ||
530
- !metadataTypeTagFactory_some([]string{"a", "b"}, func(value string) bool { return value == "b" }) {
531
- t.Fatal("metadata type tag validation helper branches were not exercised")
532
- }
533
- if !strings.Contains(metadataTypeTagFactory_essentialFieldsMessage(), "'target'") {
534
- t.Fatal("essential field message should mention target")
535
- }
536
- reports := []string{}
537
- typeTagObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
538
- Name: "TypeTagSchema",
539
- Properties: []*schemametadata.MetadataProperty{
540
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("literal"), Value: factoryUtilityLiteralMetadata("value")}),
541
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("nullable"), Value: func() *schemametadata.MetadataSchema {
542
- meta := schemametadata.MetadataSchema_initialize()
543
- meta.Nullable = true
544
- meta.Required = false
545
- meta.Optional = true
546
- return meta
547
- }()}),
548
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("tuple"), Value: func() *schemametadata.MetadataSchema {
549
- meta := schemametadata.MetadataSchema_initialize()
550
- meta.Tuples = append(meta.Tuples, schemametadata.MetadataTuple_create(schemametadata.MetadataTuple{
551
- Type: schemametadata.MetadataTupleType_create(schemametadata.MetadataTupleType{
552
- Name: "Tuple",
553
- Elements: []*schemametadata.MetadataSchema{factoryUtilityLiteralMetadata("a"), factoryUtilityLiteralMetadata("b")},
554
- Nullables: []bool{},
555
- }),
556
- }))
557
- return meta
558
- }()}),
559
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("invalid"), Value: func() *schemametadata.MetadataSchema {
560
- meta := schemametadata.MetadataSchema_initialize()
561
- meta.Any = true
562
- return meta
563
- }()}),
564
- },
565
- })
566
- if objectSchema := MetadataTypeTagSchemaFactory.Object(struct {
567
- Report func(msg string) bool
568
- Object *schemametadata.MetadataObjectType
569
- }{
570
- Report: func(msg string) bool {
571
- reports = append(reports, msg)
572
- return false
573
- },
574
- Object: typeTagObject,
575
- }); objectSchema["literal"] != "value" || objectSchema["tuple"] == nil || len(reports) == 0 {
576
- t.Fatal("type tag schema factory returned unexpected output")
577
- }
339
+ if MetadataTypeTagFactory.Is(nil) {
340
+ t.Fatal("nil object should not be recognized as a typia tag")
341
+ }
342
+ tagShape := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
343
+ Name: "TagShape",
344
+ Properties: []*schemametadata.MetadataProperty{
345
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("target"), Value: factoryUtilityLiteralMetadata("string")}),
346
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("kind"), Value: factoryUtilityLiteralMetadata("format")}),
347
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("value"), Value: factoryUtilityLiteralMetadata("uuid")}),
348
+ },
349
+ })
350
+ tagValue := schemametadata.MetadataSchema_initialize()
351
+ tagValue.Required = false
352
+ tagValue.Optional = true
353
+ tagValue.Objects = append(tagValue.Objects, schemametadata.MetadataObject_create(schemametadata.MetadataObject{Type: tagShape}))
354
+ tagContainer := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
355
+ Name: "Tagged",
356
+ Properties: []*schemametadata.MetadataProperty{
357
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("typia.tag"), Value: tagValue}),
358
+ },
359
+ })
360
+ if !MetadataTypeTagFactory.Is(tagContainer) {
361
+ t.Fatal("valid typia tag object shape was not recognized")
362
+ }
363
+ typeTagErrors := []MetadataFactory_IError{}
364
+ analyzed := MetadataTypeTagFactory.Analyze(struct {
365
+ Errors *[]MetadataFactory_IError
366
+ Type string
367
+ Objects []*schemametadata.MetadataObjectType
368
+ Explore MetadataFactory_IExplore
369
+ }{
370
+ Errors: &typeTagErrors,
371
+ Type: "string",
372
+ Objects: []*schemametadata.MetadataObjectType{tagContainer},
373
+ })
374
+ if len(analyzed) != 1 || analyzed[0].Target != "string" || analyzed[0].Kind != "format" || analyzed[0].Value != "uuid" {
375
+ t.Fatal("metadata type tag analysis should produce a valid string format tag")
376
+ }
377
+ validateObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
378
+ Name: "ValidateRecord",
379
+ Properties: []*schemametadata.MetadataProperty{
380
+ factoryUtilityTagProperty("string", factoryUtilityLiteralMetadata("return true")),
381
+ factoryUtilityTagProperty("number", factoryUtilityLiteralMetadata("return false")),
382
+ },
383
+ })
384
+ schemaObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
385
+ Name: "SchemaRecord",
386
+ Properties: []*schemametadata.MetadataProperty{
387
+ factoryUtilityTagProperty("label", factoryUtilityLiteralMetadata("ok")),
388
+ },
389
+ })
390
+ richTag := factoryUtilityTagContainer("RichTag",
391
+ factoryUtilityTagProperty("target", factoryUtilityStringUnionMetadata("string", "number")),
392
+ factoryUtilityTagProperty("kind", factoryUtilityLiteralMetadata("range")),
393
+ factoryUtilityTagProperty("value", factoryUtilityLiteralMetadata("minimum")),
394
+ factoryUtilityTagProperty("exclusive", factoryUtilityStringTupleMetadata("format")),
395
+ factoryUtilityTagProperty("validate", factoryUtilityObjectMetadata(validateObject)),
396
+ factoryUtilityTagProperty("schema", factoryUtilityObjectMetadata(schemaObject)),
397
+ )
398
+ richAnalyzed := MetadataTypeTagFactory.Analyze(struct {
399
+ Errors *[]MetadataFactory_IError
400
+ Type string
401
+ Objects []*schemametadata.MetadataObjectType
402
+ Explore MetadataFactory_IExplore
403
+ }{
404
+ Errors: &typeTagErrors,
405
+ Type: "number",
406
+ Objects: []*schemametadata.MetadataObjectType{richTag},
407
+ })
408
+ if len(richAnalyzed) != 1 ||
409
+ richAnalyzed[0].Target != "number" ||
410
+ richAnalyzed[0].Validate != "return false" ||
411
+ richAnalyzed[0].Schema == nil {
412
+ t.Fatal("rich metadata type tag analysis missed validate or schema fields")
413
+ }
414
+ invalidTagErrors := []MetadataFactory_IError{}
415
+ invalidOuter := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{Name: "InvalidOuter"})
416
+ requiredTop := factoryUtilityTagContainer("RequiredTop",
417
+ factoryUtilityTagProperty("target", factoryUtilityLiteralMetadata("string")),
418
+ factoryUtilityTagProperty("kind", factoryUtilityLiteralMetadata("format")),
419
+ factoryUtilityTagProperty("value", factoryUtilityLiteralMetadata("uuid")),
420
+ )
421
+ requiredTop.Properties[0].Value.Required = true
422
+ requiredTop.Properties[0].Value.Optional = false
423
+ missingEssential := factoryUtilityTagContainer("MissingEssential",
424
+ factoryUtilityTagProperty("target", factoryUtilityLiteralMetadata("string")),
425
+ )
426
+ invalidProperty := factoryUtilityTagContainer("InvalidProperty",
427
+ factoryUtilityTagProperty("target", factoryUtilityLiteralMetadata("symbol")),
428
+ factoryUtilityTagProperty("kind", factoryUtilityAtomicMetadata("string")),
429
+ factoryUtilityTagProperty("value", factoryUtilityAtomicMetadata("number")),
430
+ factoryUtilityTagProperty("exclusive", factoryUtilityAtomicMetadata("boolean")),
431
+ factoryUtilityTagProperty("validate", factoryUtilityAtomicMetadata("string")),
432
+ factoryUtilityTagProperty("schema", factoryUtilityAtomicMetadata("string")),
433
+ )
434
+ nilTag := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
435
+ Name: "NilTag",
436
+ Properties: []*schemametadata.MetadataProperty{
437
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("typia.tag"), Value: schemametadata.MetadataSchema_initialize()}),
438
+ },
439
+ })
440
+ invalidAnalyzed := MetadataTypeTagFactory.Analyze(struct {
441
+ Errors *[]MetadataFactory_IError
442
+ Type string
443
+ Objects []*schemametadata.MetadataObjectType
444
+ Explore MetadataFactory_IExplore
445
+ }{
446
+ Errors: &invalidTagErrors,
447
+ Type: "string",
448
+ Objects: []*schemametadata.MetadataObjectType{
449
+ invalidOuter,
450
+ requiredTop,
451
+ missingEssential,
452
+ invalidProperty,
453
+ nilTag,
454
+ tagContainer,
455
+ },
456
+ })
457
+ if len(invalidAnalyzed) != 0 || len(invalidTagErrors) == 0 {
458
+ t.Fatalf("invalid metadata type tags should be reported and filtered out: analyzed=%d errors=%d", len(invalidAnalyzed), len(invalidTagErrors))
459
+ }
460
+ typeTagReports := []string{}
461
+ typeTagReport := func(next struct {
462
+ Property *string
463
+ Message string
464
+ }) bool {
465
+ typeTagReports = append(typeTagReports, next.Message)
466
+ return false
467
+ }
468
+ MetadataTypeTagFactory.Validate(struct {
469
+ Report func(struct {
470
+ Property *string
471
+ Message string
472
+ }) bool
473
+ Type string
474
+ Tags []schemametadata.IMetadataTypeTag
475
+ }{Report: typeTagReport, Type: "string", Tags: []schemametadata.IMetadataTypeTag{{Target: "number", Kind: "format"}}})
476
+ MetadataTypeTagFactory.Validate(struct {
477
+ Report func(struct {
478
+ Property *string
479
+ Message string
480
+ }) bool
481
+ Type string
482
+ Tags []schemametadata.IMetadataTypeTag
483
+ }{
484
+ Report: typeTagReport,
485
+ Type: "string",
486
+ Tags: []schemametadata.IMetadataTypeTag{
487
+ {Target: "string", Kind: "format", Name: "uuid", Exclusive: true},
488
+ {Target: "string", Kind: "format", Name: "email", Exclusive: true},
489
+ },
490
+ })
491
+ MetadataTypeTagFactory.Validate(struct {
492
+ Report func(struct {
493
+ Property *string
494
+ Message string
495
+ }) bool
496
+ Type string
497
+ Tags []schemametadata.IMetadataTypeTag
498
+ }{
499
+ Report: typeTagReport,
500
+ Type: "string",
501
+ Tags: []schemametadata.IMetadataTypeTag{
502
+ // Format and Pattern as they are actually declared: both list the
503
+ // kinds `["format", "pattern"]`, so intersecting them on one property
504
+ // is forbidden. The cross-kind conflict fires on the opposite's kind,
505
+ // not its name, and without a same-kind guard. The previous fixture
506
+ // named the opposite in `exclusive` by tag name, the only shape the
507
+ // doubly-broken check could fire on and no real declaration produces.
508
+ {Target: "string", Kind: "format", Name: "Format<\"uuid\">", Exclusive: []string{"format", "pattern"}},
509
+ {Target: "string", Kind: "pattern", Name: "Pattern<\"^x$\">", Exclusive: []string{"format", "pattern"}},
510
+ },
511
+ })
512
+ invalidExclusiveReports := []string{}
513
+ _ = metadataTypeTagFactory_get_exclusive(struct {
514
+ Report func(struct {
515
+ Property *string
516
+ Message string
517
+ }) bool
518
+ Key string
519
+ Value *schemametadata.MetadataSchema
520
+ }{Report: func(next struct {
521
+ Property *string
522
+ Message string
523
+ }) bool {
524
+ invalidExclusiveReports = append(invalidExclusiveReports, next.Message)
525
+ return false
526
+ }, Key: "exclusive", Value: factoryUtilityStringTupleMetadata("ok", "")})
527
+ if len(typeTagReports) != 3 ||
528
+ len(invalidExclusiveReports) == 0 ||
529
+ metadataTypeTagFactory_property_value(nil) != nil ||
530
+ !metadataTypeTagFactory_some([]string{"a", "b"}, func(value string) bool { return value == "b" }) {
531
+ t.Fatal("metadata type tag validation helper branches were not exercised")
532
+ }
533
+ if !strings.Contains(metadataTypeTagFactory_essentialFieldsMessage(), "'target'") {
534
+ t.Fatal("essential field message should mention target")
535
+ }
536
+ reports := []string{}
537
+ typeTagObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
538
+ Name: "TypeTagSchema",
539
+ Properties: []*schemametadata.MetadataProperty{
540
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("literal"), Value: factoryUtilityLiteralMetadata("value")}),
541
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("nullable"), Value: func() *schemametadata.MetadataSchema {
542
+ meta := schemametadata.MetadataSchema_initialize()
543
+ meta.Nullable = true
544
+ meta.Required = false
545
+ meta.Optional = true
546
+ return meta
547
+ }()}),
548
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("tuple"), Value: func() *schemametadata.MetadataSchema {
549
+ meta := schemametadata.MetadataSchema_initialize()
550
+ meta.Tuples = append(meta.Tuples, schemametadata.MetadataTuple_create(schemametadata.MetadataTuple{
551
+ Type: schemametadata.MetadataTupleType_create(schemametadata.MetadataTupleType{
552
+ Name: "Tuple",
553
+ Elements: []*schemametadata.MetadataSchema{factoryUtilityLiteralMetadata("a"), factoryUtilityLiteralMetadata("b")},
554
+ Nullables: []bool{},
555
+ }),
556
+ }))
557
+ return meta
558
+ }()}),
559
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("invalid"), Value: func() *schemametadata.MetadataSchema {
560
+ meta := schemametadata.MetadataSchema_initialize()
561
+ meta.Any = true
562
+ return meta
563
+ }()}),
564
+ },
565
+ })
566
+ if objectSchema := MetadataTypeTagSchemaFactory.Object(struct {
567
+ Report func(msg string) bool
568
+ Object *schemametadata.MetadataObjectType
569
+ }{
570
+ Report: func(msg string) bool {
571
+ reports = append(reports, msg)
572
+ return false
573
+ },
574
+ Object: typeTagObject,
575
+ }); objectSchema["literal"] != "value" || objectSchema["tuple"] == nil || len(reports) == 0 {
576
+ t.Fatal("type tag schema factory returned unexpected output")
577
+ }
578
578
 
579
- if protobufFactory_getBigintType([]any{uint64(1), "2"}) != "uint64" ||
580
- protobufFactory_getBigintType([]any{int64(-1)}) != "int64" {
581
- t.Fatal("protobuf bigint type inference mismatch")
582
- }
583
- if protobufFactory_getNumberType([]any{1, int64(2)}) != "int32" ||
584
- protobufFactory_getNumberType([]any{int64(2147483648)}) != "int64" ||
585
- protobufFactory_getNumberType([]any{float32(1.5)}) != "double" {
586
- t.Fatal("protobuf number type inference mismatch")
587
- }
588
- if protobufFactory_toFloat("3.5") != 3.5 {
589
- t.Fatal("protobuf fallback float conversion mismatch")
590
- }
591
- if protobufFactory_toFloat(float64(4.5)) != 4.5 ||
592
- protobufFactory_toFloat(uint64(5)) != 5 {
593
- t.Fatal("protobuf numeric float conversion mismatch")
594
- }
595
- for raw, expected := range map[any]int{
596
- int64(8): 8,
597
- float64(9): 9,
598
- "10": 10,
599
- } {
600
- if value := protobufFactory_getSequence([]schemametadata.IMetadataTypeTag{{Kind: "sequence", Schema: map[string]any{"x-protobuf-sequence": raw}}}); value == nil || *value != expected {
601
- t.Fatalf("protobuf sequence conversion mismatch for %v", raw)
602
- }
603
- }
604
- for _, tags := range [][]schemametadata.IMetadataTypeTag{
605
- {{Kind: "format"}},
606
- {{Kind: "sequence", Schema: "invalid"}},
607
- {{Kind: "sequence", Schema: map[string]any{}}},
608
- {{Kind: "sequence", Schema: map[string]any{"x-protobuf-sequence": "bad"}}},
609
- } {
610
- if protobufFactory_getSequence(tags) != nil {
611
- t.Fatal("invalid protobuf sequence tag should not resolve")
612
- }
613
- }
614
- if len(protobufFactory_firstTags(nil)) != 0 || protobufFactory_size(nil) != 0 {
615
- t.Fatal("protobuf empty helper fallback mismatch")
616
- }
579
+ if protobufFactory_getBigintType([]any{uint64(1), "2"}) != "uint64" ||
580
+ protobufFactory_getBigintType([]any{int64(-1)}) != "int64" {
581
+ t.Fatal("protobuf bigint type inference mismatch")
582
+ }
583
+ if protobufFactory_getNumberType([]any{1, int64(2)}) != "int32" ||
584
+ protobufFactory_getNumberType([]any{int64(2147483648)}) != "int64" ||
585
+ protobufFactory_getNumberType([]any{float32(1.5)}) != "double" {
586
+ t.Fatal("protobuf number type inference mismatch")
587
+ }
588
+ if protobufFactory_toFloat("3.5") != 3.5 {
589
+ t.Fatal("protobuf fallback float conversion mismatch")
590
+ }
591
+ if protobufFactory_toFloat(float64(4.5)) != 4.5 ||
592
+ protobufFactory_toFloat(uint64(5)) != 5 {
593
+ t.Fatal("protobuf numeric float conversion mismatch")
594
+ }
595
+ for raw, expected := range map[any]int{
596
+ int64(8): 8,
597
+ float64(9): 9,
598
+ "10": 10,
599
+ } {
600
+ if value := protobufFactory_getSequence([]schemametadata.IMetadataTypeTag{{Kind: "sequence", Schema: map[string]any{"x-protobuf-sequence": raw}}}); value == nil || *value != expected {
601
+ t.Fatalf("protobuf sequence conversion mismatch for %v", raw)
602
+ }
603
+ }
604
+ for _, tags := range [][]schemametadata.IMetadataTypeTag{
605
+ {{Kind: "format"}},
606
+ {{Kind: "sequence", Schema: "invalid"}},
607
+ {{Kind: "sequence", Schema: map[string]any{}}},
608
+ {{Kind: "sequence", Schema: map[string]any{"x-protobuf-sequence": "bad"}}},
609
+ } {
610
+ if protobufFactory_getSequence(tags) != nil {
611
+ t.Fatal("invalid protobuf sequence tag should not resolve")
612
+ }
613
+ }
614
+ if len(protobufFactory_firstTags(nil)) != 0 || protobufFactory_size(nil) != 0 {
615
+ t.Fatal("protobuf empty helper fallback mismatch")
616
+ }
617
617
 
618
- sequence := 7
619
- tagged := []*schemametadata.MetadataConstantValue{
620
- schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{
621
- Value: int64(-3),
622
- Tags: [][]schemametadata.IMetadataTypeTag{{
623
- {Kind: "type", Value: "int64"},
624
- {Kind: "sequence", Schema: map[string]any{"x-protobuf-sequence": sequence}},
625
- }},
626
- }),
627
- schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{
628
- Value: uint64(5),
629
- Tags: nil,
630
- }),
631
- }
632
- if values := protobufFactory_constantValues(tagged); len(values) != 2 || values[0] != int64(-3) {
633
- t.Fatal("protobuf constant value extraction mismatch")
634
- }
635
- bigints := map[string]*int{}
636
- protobufFactory_decodeBigint(bigints, tagged, "uint64")
637
- if bigints["int64"] == nil || *bigints["int64"] != sequence {
638
- t.Fatal("protobuf bigint tag decoding missed explicit type sequence")
639
- }
640
- if _, ok := bigints["uint64"]; !ok {
641
- t.Fatal("protobuf bigint tag decoding missed fallback type")
642
- }
618
+ sequence := 7
619
+ tagged := []*schemametadata.MetadataConstantValue{
620
+ schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{
621
+ Value: int64(-3),
622
+ Tags: [][]schemametadata.IMetadataTypeTag{{
623
+ {Kind: "type", Value: "int64"},
624
+ {Kind: "sequence", Schema: map[string]any{"x-protobuf-sequence": sequence}},
625
+ }},
626
+ }),
627
+ schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{
628
+ Value: uint64(5),
629
+ Tags: nil,
630
+ }),
631
+ }
632
+ if values := protobufFactory_constantValues(tagged); len(values) != 2 || values[0] != int64(-3) {
633
+ t.Fatal("protobuf constant value extraction mismatch")
634
+ }
635
+ bigints := map[string]*int{}
636
+ protobufFactory_decodeBigint(bigints, tagged, "uint64")
637
+ if bigints["int64"] == nil || *bigints["int64"] != sequence {
638
+ t.Fatal("protobuf bigint tag decoding missed explicit type sequence")
639
+ }
640
+ if _, ok := bigints["uint64"]; !ok {
641
+ t.Fatal("protobuf bigint tag decoding missed fallback type")
642
+ }
643
643
 
644
- numbers := map[string]*int{}
645
- protobufFactory_decodeNumber(numbers, []*schemametadata.MetadataConstantValue{
646
- schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{
647
- Value: 1.5,
648
- Tags: [][]schemametadata.IMetadataTypeTag{{
649
- {Kind: "type", Value: "float"},
650
- {Kind: "sequence", Schema: map[string]any{"x-protobuf-sequence": sequence}},
651
- }},
652
- }),
653
- schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{
654
- Value: 3,
655
- Tags: nil,
656
- }),
657
- }, "double")
658
- if numbers["float"] == nil || *numbers["float"] != sequence {
659
- t.Fatal("protobuf number tag decoding missed explicit type sequence")
660
- }
661
- if _, ok := numbers["double"]; !ok {
662
- t.Fatal("protobuf number tag decoding missed fallback type")
663
- }
664
- protoMeta := schemametadata.MetadataSchema_initialize()
665
- protoMeta.Constants = append(protoMeta.Constants,
666
- schemametadata.MetadataConstant_create(schemametadata.MetadataConstant{
667
- Type: "boolean",
668
- Values: []*schemametadata.MetadataConstantValue{
669
- schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{Value: true, Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(11)}}}),
670
- },
671
- }),
672
- schemametadata.MetadataConstant_create(schemametadata.MetadataConstant{
673
- Type: "bigint",
674
- Values: tagged,
675
- }),
676
- schemametadata.MetadataConstant_create(schemametadata.MetadataConstant{
677
- Type: "number",
678
- Values: []*schemametadata.MetadataConstantValue{
679
- schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{Value: 1.5, Tags: [][]schemametadata.IMetadataTypeTag{{{Kind: "type", Value: "float"}, factoryUtilitySequenceTag(12)}}}),
680
- },
681
- }),
682
- schemametadata.MetadataConstant_create(schemametadata.MetadataConstant{
683
- Type: "string",
684
- Values: []*schemametadata.MetadataConstantValue{
685
- schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{Value: "literal", Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(13)}}}),
686
- },
687
- }),
688
- )
689
- protoMeta.Templates = append(protoMeta.Templates, schemametadata.MetadataTemplate_create(schemametadata.MetadataTemplate{
690
- Row: []*schemametadata.MetadataSchema{factoryUtilityLiteralMetadata("template")},
691
- Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(14)}},
692
- }))
693
- protoMeta.Atomics = append(protoMeta.Atomics,
694
- schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{Type: "boolean", Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(15)}}}),
695
- schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{Type: "bigint", Tags: [][]schemametadata.IMetadataTypeTag{{{Kind: "type", Value: "uint64"}, factoryUtilitySequenceTag(16)}}}),
696
- schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{Type: "number", Tags: [][]schemametadata.IMetadataTypeTag{{{Kind: "type", Value: "uint32"}, factoryUtilitySequenceTag(17)}}}),
697
- schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{Type: "string", Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(18)}}}),
698
- )
699
- if len(protobufFactory_emplaceAtomic(protoMeta)) == 0 ||
700
- len(protobufFactory_getAtomics(protoMeta)) == 0 ||
701
- len(protobufFactory_getNumbers(protoMeta)) == 0 ||
702
- len(protobufFactory_getBigints(protoMeta)) == 0 {
703
- t.Fatal("protobuf atomic metadata helpers did not read rich metadata")
704
- }
705
- bytesMeta := schemametadata.MetadataSchema_initialize()
706
- bytesMeta.Natives = append(bytesMeta.Natives, schemametadata.MetadataNative_create(schemametadata.MetadataNative{Name: "Uint8Array"}))
707
- if _, ok := protobufFactory_emplaceSchema(bytesMeta).(nativeprotobuf.IProtobufSchema_IByte); !ok {
708
- t.Fatal("Uint8Array metadata should emplace as protobuf bytes")
709
- }
710
- dynamicObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
711
- Name: "Dynamic",
712
- Properties: []*schemametadata.MetadataProperty{
713
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
714
- Key: factoryUtilityAtomicMetadata("string"),
715
- Value: factoryUtilityAtomicMetadata("number"),
716
- }),
717
- },
718
- })
719
- dynamicMeta := schemametadata.MetadataSchema_initialize()
720
- dynamicMeta.Objects = append(dynamicMeta.Objects, schemametadata.MetadataObject_create(schemametadata.MetadataObject{Type: dynamicObject}))
721
- if _, ok := protobufFactory_emplaceSchema(dynamicMeta).(nativeprotobuf.IProtobufSchema_IMap); !ok {
722
- t.Fatal("dynamic object metadata should emplace as protobuf map")
723
- }
724
- mapMeta := schemametadata.MetadataSchema_initialize()
725
- mapMeta.Maps = append(mapMeta.Maps, schemametadata.MetadataMap_create(schemametadata.MetadataMap{
726
- Key: factoryUtilityAtomicMetadata("string"),
727
- Value: factoryUtilityAtomicMetadata("number"),
728
- }))
729
- if _, ok := protobufFactory_emplaceSchema(mapMeta).(nativeprotobuf.IProtobufSchema_IMap); !ok {
730
- t.Fatal("map metadata should emplace as protobuf map")
731
- }
732
- factoryUtilityMustPanic(t, func() {
733
- protobufFactory_emplaceSchema(schemametadata.MetadataSchema_initialize())
734
- })
644
+ numbers := map[string]*int{}
645
+ protobufFactory_decodeNumber(numbers, []*schemametadata.MetadataConstantValue{
646
+ schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{
647
+ Value: 1.5,
648
+ Tags: [][]schemametadata.IMetadataTypeTag{{
649
+ {Kind: "type", Value: "float"},
650
+ {Kind: "sequence", Schema: map[string]any{"x-protobuf-sequence": sequence}},
651
+ }},
652
+ }),
653
+ schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{
654
+ Value: 3,
655
+ Tags: nil,
656
+ }),
657
+ }, "double")
658
+ if numbers["float"] == nil || *numbers["float"] != sequence {
659
+ t.Fatal("protobuf number tag decoding missed explicit type sequence")
660
+ }
661
+ if _, ok := numbers["double"]; !ok {
662
+ t.Fatal("protobuf number tag decoding missed fallback type")
663
+ }
664
+ protoMeta := schemametadata.MetadataSchema_initialize()
665
+ protoMeta.Constants = append(protoMeta.Constants,
666
+ schemametadata.MetadataConstant_create(schemametadata.MetadataConstant{
667
+ Type: "boolean",
668
+ Values: []*schemametadata.MetadataConstantValue{
669
+ schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{Value: true, Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(11)}}}),
670
+ },
671
+ }),
672
+ schemametadata.MetadataConstant_create(schemametadata.MetadataConstant{
673
+ Type: "bigint",
674
+ Values: tagged,
675
+ }),
676
+ schemametadata.MetadataConstant_create(schemametadata.MetadataConstant{
677
+ Type: "number",
678
+ Values: []*schemametadata.MetadataConstantValue{
679
+ schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{Value: 1.5, Tags: [][]schemametadata.IMetadataTypeTag{{{Kind: "type", Value: "float"}, factoryUtilitySequenceTag(12)}}}),
680
+ },
681
+ }),
682
+ schemametadata.MetadataConstant_create(schemametadata.MetadataConstant{
683
+ Type: "string",
684
+ Values: []*schemametadata.MetadataConstantValue{
685
+ schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{Value: "literal", Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(13)}}}),
686
+ },
687
+ }),
688
+ )
689
+ protoMeta.Templates = append(protoMeta.Templates, schemametadata.MetadataTemplate_create(schemametadata.MetadataTemplate{
690
+ Row: []*schemametadata.MetadataSchema{factoryUtilityLiteralMetadata("template")},
691
+ Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(14)}},
692
+ }))
693
+ protoMeta.Atomics = append(protoMeta.Atomics,
694
+ schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{Type: "boolean", Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(15)}}}),
695
+ schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{Type: "bigint", Tags: [][]schemametadata.IMetadataTypeTag{{{Kind: "type", Value: "uint64"}, factoryUtilitySequenceTag(16)}}}),
696
+ schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{Type: "number", Tags: [][]schemametadata.IMetadataTypeTag{{{Kind: "type", Value: "uint32"}, factoryUtilitySequenceTag(17)}}}),
697
+ schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{Type: "string", Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(18)}}}),
698
+ )
699
+ if len(protobufFactory_emplaceAtomic(protoMeta)) == 0 ||
700
+ len(protobufFactory_getAtomics(protoMeta)) == 0 ||
701
+ len(protobufFactory_getNumbers(protoMeta)) == 0 ||
702
+ len(protobufFactory_getBigints(protoMeta)) == 0 {
703
+ t.Fatal("protobuf atomic metadata helpers did not read rich metadata")
704
+ }
705
+ bytesMeta := schemametadata.MetadataSchema_initialize()
706
+ bytesMeta.Natives = append(bytesMeta.Natives, schemametadata.MetadataNative_create(schemametadata.MetadataNative{Name: "Uint8Array"}))
707
+ if _, ok := protobufFactory_emplaceSchema(bytesMeta).(nativeprotobuf.IProtobufSchema_IByte); !ok {
708
+ t.Fatal("Uint8Array metadata should emplace as protobuf bytes")
709
+ }
710
+ dynamicObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
711
+ Name: "Dynamic",
712
+ Properties: []*schemametadata.MetadataProperty{
713
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
714
+ Key: factoryUtilityAtomicMetadata("string"),
715
+ Value: factoryUtilityAtomicMetadata("number"),
716
+ }),
717
+ },
718
+ })
719
+ dynamicMeta := schemametadata.MetadataSchema_initialize()
720
+ dynamicMeta.Objects = append(dynamicMeta.Objects, schemametadata.MetadataObject_create(schemametadata.MetadataObject{Type: dynamicObject}))
721
+ if _, ok := protobufFactory_emplaceSchema(dynamicMeta).(nativeprotobuf.IProtobufSchema_IMap); !ok {
722
+ t.Fatal("dynamic object metadata should emplace as protobuf map")
723
+ }
724
+ mapMeta := schemametadata.MetadataSchema_initialize()
725
+ mapMeta.Maps = append(mapMeta.Maps, schemametadata.MetadataMap_create(schemametadata.MetadataMap{
726
+ Key: factoryUtilityAtomicMetadata("string"),
727
+ Value: factoryUtilityAtomicMetadata("number"),
728
+ }))
729
+ if _, ok := protobufFactory_emplaceSchema(mapMeta).(nativeprotobuf.IProtobufSchema_IMap); !ok {
730
+ t.Fatal("map metadata should emplace as protobuf map")
731
+ }
732
+ factoryUtilityMustPanic(t, func() {
733
+ protobufFactory_emplaceSchema(schemametadata.MetadataSchema_initialize())
734
+ })
735
735
 
736
- sequenceErrors := []string{}
737
- seenSequences := map[int]bool{}
738
- addSequence := func(value int) bool {
739
- if seenSequences[value] {
740
- return false
741
- }
742
- seenSequences[value] = true
743
- return true
744
- }
745
- protobufFactory_validateInstanceSequence("array", [][]schemametadata.IMetadataTypeTag{
746
- {factoryUtilitySequenceTag(1)},
747
- {},
748
- }, &sequenceErrors, addSequence)
749
- protobufFactory_validateInstanceSequence("object", [][]schemametadata.IMetadataTypeTag{
750
- {factoryUtilitySequenceTag(2)},
751
- {factoryUtilitySequenceTag(3)},
752
- }, &sequenceErrors, addSequence)
753
- protobufFactory_validateInstanceSequence("map", [][]schemametadata.IMetadataTypeTag{
754
- {factoryUtilitySequenceTag(1)},
755
- }, &sequenceErrors, addSequence)
756
- protobufFactory_validateUniqueSequence("number type", map[int]bool{4: true, 5: true}, 2, 2, &sequenceErrors, addSequence)
757
- protobufFactory_validateUniqueSequence("string type", map[int]bool{6: true}, 2, 1, &sequenceErrors, addSequence)
758
- if len(sequenceErrors) < 4 {
759
- t.Fatalf("protobuf sequence validation did not report expected errors: %v", sequenceErrors)
760
- }
761
- propertyErrors := []string{}
762
- propertyMeta := schemametadata.MetadataSchema_initialize()
763
- propertyMeta.Constants = append(propertyMeta.Constants, protoMeta.Constants...)
764
- propertyMeta.Atomics = append(propertyMeta.Atomics, protoMeta.Atomics...)
765
- propertyMeta.Arrays = append(propertyMeta.Arrays, schemametadata.MetadataArray_create(schemametadata.MetadataArray{
766
- Type: schemametadata.MetadataArrayType_create(schemametadata.MetadataArrayType{Name: "Numbers", Value: factoryUtilityAtomicMetadata("number")}),
767
- Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(11)}},
768
- }))
769
- propertyMeta.Objects = append(propertyMeta.Objects, schemametadata.MetadataObject_create(schemametadata.MetadataObject{
770
- Type: dynamicObject,
771
- Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(19)}},
772
- }))
773
- propertyMeta.Maps = append(propertyMeta.Maps, schemametadata.MetadataMap_create(schemametadata.MetadataMap{
774
- Key: factoryUtilityAtomicMetadata("string"),
775
- Value: factoryUtilityAtomicMetadata("number"),
776
- Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(20)}},
777
- }))
778
- propertyMeta.Natives = append(propertyMeta.Natives, schemametadata.MetadataNative_create(schemametadata.MetadataNative{
779
- Name: "Uint8Array",
780
- Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(21)}},
781
- }))
782
- protobufFactory_validateProperty(propertyMeta, &propertyErrors)
783
- if len(propertyErrors) == 0 {
784
- t.Fatal("protobuf property validation should detect duplicate sequence rows")
785
- }
786
- duplicateObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
787
- Name: "DuplicateSequences",
788
- Properties: []*schemametadata.MetadataProperty{
789
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
790
- Key: factoryUtilityLiteralMetadata("first"),
791
- Value: factoryUtilitySequenceStringMetadata(30),
792
- }),
793
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
794
- Key: factoryUtilityLiteralMetadata("second"),
795
- Value: factoryUtilitySequenceStringMetadata(30),
796
- }),
797
- },
798
- })
799
- protobufFactory_validateObject(duplicateObject, &propertyErrors)
800
- if len(propertyErrors) < 2 {
801
- t.Fatal("protobuf object validation should detect duplicated property sequences")
802
- }
803
- emplaceObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
804
- Name: "EmplaceObject",
805
- Properties: []*schemametadata.MetadataProperty{
806
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
807
- Key: factoryUtilityLiteralMetadata("fixed"),
808
- Value: factoryUtilitySequenceStringMetadata(2),
809
- }),
810
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
811
- Key: factoryUtilityLiteralMetadata("floating"),
812
- Value: factoryUtilityAtomicMetadata("number"),
813
- }),
814
- },
815
- })
816
- ProtobufFactory.EmplaceObject(emplaceObject)
817
- if emplaceObject.Properties[1].Of_protobuf_ == nil ||
818
- emplaceObject.Properties[1].Of_protobuf_.Fixed {
819
- t.Fatal("protobuf object emplace should assign indexes to non-fixed properties")
820
- }
821
- shapeErrors := []string{}
822
- recordShape := func(msg string) { shapeErrors = append(shapeErrors, msg) }
823
- protobufFactory_validateShape(factoryUtilityArrayMetadata(factoryUtilityArrayMetadata(factoryUtilityAtomicMetadata("string"))), recordShape)
824
- optionalArray := factoryUtilityArrayMetadata(factoryUtilityAtomicMetadata("string"))
825
- optionalArray.Arrays[0].Type.Value.Optional = true
826
- optionalArray.Arrays[0].Type.Value.Required = false
827
- protobufFactory_validateShape(optionalArray, recordShape)
828
- unionArray := factoryUtilityArrayMetadata(factoryUtilityAtomicMetadata("string"))
829
- unionArray.Arrays[0].Type.Value.Atomics = append(unionArray.Arrays[0].Type.Value.Atomics, schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{Type: "number"}))
830
- protobufFactory_validateShape(unionArray, recordShape)
831
- mapArray := factoryUtilityArrayMetadata(mapMeta)
832
- protobufFactory_validateShape(mapArray, recordShape)
833
- mixedObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
834
- Name: "Mixed",
835
- Properties: []*schemametadata.MetadataProperty{
836
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("fixed"), Value: factoryUtilityAtomicMetadata("string")}),
837
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityAtomicMetadata("string"), Value: factoryUtilityAtomicMetadata("number")}),
838
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityAtomicMetadata("number"), Value: factoryUtilityAtomicMetadata("boolean")}),
839
- },
840
- })
841
- mixedMeta := schemametadata.MetadataSchema_initialize()
842
- mixedMeta.Objects = append(mixedMeta.Objects, schemametadata.MetadataObject_create(schemametadata.MetadataObject{Type: mixedObject}))
843
- protobufFactory_validateShape(mixedMeta, recordShape)
844
- dynamicArrayObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
845
- Name: "DynamicArray",
846
- Properties: []*schemametadata.MetadataProperty{
847
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityAtomicMetadata("string"), Value: factoryUtilityArrayMetadata(factoryUtilityAtomicMetadata("string"))}),
848
- },
849
- })
850
- dynamicArrayMeta := schemametadata.MetadataSchema_initialize()
851
- dynamicArrayMeta.Objects = append(dynamicArrayMeta.Objects, schemametadata.MetadataObject_create(schemametadata.MetadataObject{Type: dynamicArrayObject}))
852
- protobufFactory_validateShape(dynamicArrayMeta, recordShape)
853
- invalidMap := schemametadata.MetadataSchema_initialize()
854
- invalidMap.Maps = append(invalidMap.Maps, schemametadata.MetadataMap_create(schemametadata.MetadataMap{
855
- Key: factoryUtilityArrayMetadata(factoryUtilityAtomicMetadata("string")),
856
- Value: factoryUtilityArrayMetadata(factoryUtilityAtomicMetadata("number")),
857
- }))
858
- protobufFactory_validateShape(invalidMap, recordShape)
859
- if len(shapeErrors) < 7 {
860
- t.Fatalf("protobuf shape validation missed branch errors: %v", shapeErrors)
861
- }
862
- if protobufFactory_propertyIndex(nil) != nil {
863
- t.Fatal("unknown protobuf property type should not have an index")
864
- }
736
+ sequenceErrors := []string{}
737
+ seenSequences := map[int]bool{}
738
+ addSequence := func(value int) bool {
739
+ if seenSequences[value] {
740
+ return false
741
+ }
742
+ seenSequences[value] = true
743
+ return true
744
+ }
745
+ protobufFactory_validateInstanceSequence("array", [][]schemametadata.IMetadataTypeTag{
746
+ {factoryUtilitySequenceTag(1)},
747
+ {},
748
+ }, &sequenceErrors, addSequence)
749
+ protobufFactory_validateInstanceSequence("object", [][]schemametadata.IMetadataTypeTag{
750
+ {factoryUtilitySequenceTag(2)},
751
+ {factoryUtilitySequenceTag(3)},
752
+ }, &sequenceErrors, addSequence)
753
+ protobufFactory_validateInstanceSequence("map", [][]schemametadata.IMetadataTypeTag{
754
+ {factoryUtilitySequenceTag(1)},
755
+ }, &sequenceErrors, addSequence)
756
+ protobufFactory_validateUniqueSequence("number type", map[int]bool{4: true, 5: true}, 2, 2, &sequenceErrors, addSequence)
757
+ protobufFactory_validateUniqueSequence("string type", map[int]bool{6: true}, 2, 1, &sequenceErrors, addSequence)
758
+ if len(sequenceErrors) < 4 {
759
+ t.Fatalf("protobuf sequence validation did not report expected errors: %v", sequenceErrors)
760
+ }
761
+ propertyErrors := []string{}
762
+ propertyMeta := schemametadata.MetadataSchema_initialize()
763
+ propertyMeta.Constants = append(propertyMeta.Constants, protoMeta.Constants...)
764
+ propertyMeta.Atomics = append(propertyMeta.Atomics, protoMeta.Atomics...)
765
+ propertyMeta.Arrays = append(propertyMeta.Arrays, schemametadata.MetadataArray_create(schemametadata.MetadataArray{
766
+ Type: schemametadata.MetadataArrayType_create(schemametadata.MetadataArrayType{Name: "Numbers", Value: factoryUtilityAtomicMetadata("number")}),
767
+ Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(11)}},
768
+ }))
769
+ propertyMeta.Objects = append(propertyMeta.Objects, schemametadata.MetadataObject_create(schemametadata.MetadataObject{
770
+ Type: dynamicObject,
771
+ Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(19)}},
772
+ }))
773
+ propertyMeta.Maps = append(propertyMeta.Maps, schemametadata.MetadataMap_create(schemametadata.MetadataMap{
774
+ Key: factoryUtilityAtomicMetadata("string"),
775
+ Value: factoryUtilityAtomicMetadata("number"),
776
+ Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(20)}},
777
+ }))
778
+ propertyMeta.Natives = append(propertyMeta.Natives, schemametadata.MetadataNative_create(schemametadata.MetadataNative{
779
+ Name: "Uint8Array",
780
+ Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(21)}},
781
+ }))
782
+ protobufFactory_validateProperty(propertyMeta, &propertyErrors)
783
+ if len(propertyErrors) == 0 {
784
+ t.Fatal("protobuf property validation should detect duplicate sequence rows")
785
+ }
786
+ duplicateObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
787
+ Name: "DuplicateSequences",
788
+ Properties: []*schemametadata.MetadataProperty{
789
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
790
+ Key: factoryUtilityLiteralMetadata("first"),
791
+ Value: factoryUtilitySequenceStringMetadata(30),
792
+ }),
793
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
794
+ Key: factoryUtilityLiteralMetadata("second"),
795
+ Value: factoryUtilitySequenceStringMetadata(30),
796
+ }),
797
+ },
798
+ })
799
+ protobufFactory_validateObject(duplicateObject, &propertyErrors)
800
+ if len(propertyErrors) < 2 {
801
+ t.Fatal("protobuf object validation should detect duplicated property sequences")
802
+ }
803
+ emplaceObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
804
+ Name: "EmplaceObject",
805
+ Properties: []*schemametadata.MetadataProperty{
806
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
807
+ Key: factoryUtilityLiteralMetadata("fixed"),
808
+ Value: factoryUtilitySequenceStringMetadata(2),
809
+ }),
810
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
811
+ Key: factoryUtilityLiteralMetadata("floating"),
812
+ Value: factoryUtilityAtomicMetadata("number"),
813
+ }),
814
+ },
815
+ })
816
+ ProtobufFactory.EmplaceObject(emplaceObject)
817
+ if emplaceObject.Properties[1].Of_protobuf_ == nil ||
818
+ emplaceObject.Properties[1].Of_protobuf_.Fixed {
819
+ t.Fatal("protobuf object emplace should assign indexes to non-fixed properties")
820
+ }
821
+ shapeErrors := []string{}
822
+ recordShape := func(msg string) { shapeErrors = append(shapeErrors, msg) }
823
+ protobufFactory_validateShape(factoryUtilityArrayMetadata(factoryUtilityArrayMetadata(factoryUtilityAtomicMetadata("string"))), recordShape)
824
+ optionalArray := factoryUtilityArrayMetadata(factoryUtilityAtomicMetadata("string"))
825
+ optionalArray.Arrays[0].Type.Value.Optional = true
826
+ optionalArray.Arrays[0].Type.Value.Required = false
827
+ protobufFactory_validateShape(optionalArray, recordShape)
828
+ unionArray := factoryUtilityArrayMetadata(factoryUtilityAtomicMetadata("string"))
829
+ unionArray.Arrays[0].Type.Value.Atomics = append(unionArray.Arrays[0].Type.Value.Atomics, schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{Type: "number"}))
830
+ protobufFactory_validateShape(unionArray, recordShape)
831
+ mapArray := factoryUtilityArrayMetadata(mapMeta)
832
+ protobufFactory_validateShape(mapArray, recordShape)
833
+ mixedObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
834
+ Name: "Mixed",
835
+ Properties: []*schemametadata.MetadataProperty{
836
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityLiteralMetadata("fixed"), Value: factoryUtilityAtomicMetadata("string")}),
837
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityAtomicMetadata("string"), Value: factoryUtilityAtomicMetadata("number")}),
838
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityAtomicMetadata("number"), Value: factoryUtilityAtomicMetadata("boolean")}),
839
+ },
840
+ })
841
+ mixedMeta := schemametadata.MetadataSchema_initialize()
842
+ mixedMeta.Objects = append(mixedMeta.Objects, schemametadata.MetadataObject_create(schemametadata.MetadataObject{Type: mixedObject}))
843
+ protobufFactory_validateShape(mixedMeta, recordShape)
844
+ dynamicArrayObject := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
845
+ Name: "DynamicArray",
846
+ Properties: []*schemametadata.MetadataProperty{
847
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{Key: factoryUtilityAtomicMetadata("string"), Value: factoryUtilityArrayMetadata(factoryUtilityAtomicMetadata("string"))}),
848
+ },
849
+ })
850
+ dynamicArrayMeta := schemametadata.MetadataSchema_initialize()
851
+ dynamicArrayMeta.Objects = append(dynamicArrayMeta.Objects, schemametadata.MetadataObject_create(schemametadata.MetadataObject{Type: dynamicArrayObject}))
852
+ protobufFactory_validateShape(dynamicArrayMeta, recordShape)
853
+ invalidMap := schemametadata.MetadataSchema_initialize()
854
+ invalidMap.Maps = append(invalidMap.Maps, schemametadata.MetadataMap_create(schemametadata.MetadataMap{
855
+ Key: factoryUtilityArrayMetadata(factoryUtilityAtomicMetadata("string")),
856
+ Value: factoryUtilityArrayMetadata(factoryUtilityAtomicMetadata("number")),
857
+ }))
858
+ protobufFactory_validateShape(invalidMap, recordShape)
859
+ if len(shapeErrors) < 7 {
860
+ t.Fatalf("protobuf shape validation missed branch errors: %v", shapeErrors)
861
+ }
862
+ if protobufFactory_propertyIndex(nil) != nil {
863
+ t.Fatal("unknown protobuf property type should not have an index")
864
+ }
865
865
  }
866
866
 
867
867
  type factoryUtilityImporter struct{}
868
868
 
869
869
  func (factoryUtilityImporter) Internal(name string) *shimast.Node {
870
- return expressionFactory_factory.NewIdentifier(name)
870
+ return expressionFactory_factory.NewIdentifier(name)
871
871
  }
872
872
 
873
873
  func factoryUtilitySequenceTag(value int) schemametadata.IMetadataTypeTag {
874
- return schemametadata.IMetadataTypeTag{
875
- Kind: "sequence",
876
- Schema: map[string]any{"x-protobuf-sequence": value},
877
- }
874
+ return schemametadata.IMetadataTypeTag{
875
+ Kind: "sequence",
876
+ Schema: map[string]any{"x-protobuf-sequence": value},
877
+ }
878
878
  }
879
879
 
880
880
  func factoryUtilityMustPanic(t *testing.T, run func()) {
881
- t.Helper()
882
- defer func() {
883
- if recover() == nil {
884
- t.Fatal("expected helper to panic")
885
- }
886
- }()
887
- run()
881
+ t.Helper()
882
+ defer func() {
883
+ if recover() == nil {
884
+ t.Fatal("expected helper to panic")
885
+ }
886
+ }()
887
+ run()
888
888
  }
889
889
 
890
890
  func (factoryUtilityImporter) Instance(props ExpressionFactory_IInstance) *shimast.Node {
891
- return expressionFactory_factory.NewIdentifier(props.Name)
891
+ return expressionFactory_factory.NewIdentifier(props.Name)
892
892
  }
893
893
 
894
894
  func (factoryUtilityImporter) Namespace(props ExpressionFactory_INamespace) *shimast.Node {
895
- return expressionFactory_factory.NewIdentifier(props.Name)
895
+ return expressionFactory_factory.NewIdentifier(props.Name)
896
896
  }
897
897
 
898
898
  func (factoryUtilityImporter) Default(props ExpressionFactory_IDefault) *shimast.Node {
899
- return expressionFactory_factory.NewIdentifier(props.Name)
899
+ return expressionFactory_factory.NewIdentifier(props.Name)
900
900
  }
901
901
 
902
902
  func factoryUtilityLiteralMetadata(value string) *schemametadata.MetadataSchema {
903
- meta := schemametadata.MetadataSchema_initialize()
904
- meta.Constants = append(meta.Constants, schemametadata.MetadataConstant_create(schemametadata.MetadataConstant{
905
- Type: "string",
906
- Values: []*schemametadata.MetadataConstantValue{
907
- schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{Value: value}),
908
- },
909
- }))
910
- return meta
903
+ meta := schemametadata.MetadataSchema_initialize()
904
+ meta.Constants = append(meta.Constants, schemametadata.MetadataConstant_create(schemametadata.MetadataConstant{
905
+ Type: "string",
906
+ Values: []*schemametadata.MetadataConstantValue{
907
+ schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{Value: value}),
908
+ },
909
+ }))
910
+ return meta
911
911
  }
912
912
 
913
913
  func factoryUtilityStringUnionMetadata(values ...string) *schemametadata.MetadataSchema {
914
- meta := schemametadata.MetadataSchema_initialize()
915
- constants := make([]*schemametadata.MetadataConstantValue, 0, len(values))
916
- for _, value := range values {
917
- constants = append(constants, schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{Value: value}))
918
- }
919
- meta.Constants = append(meta.Constants, schemametadata.MetadataConstant_create(schemametadata.MetadataConstant{
920
- Type: "string",
921
- Values: constants,
922
- }))
923
- return meta
924
- }
925
-
926
- func factoryUtilityBooleanMetadata(value bool) *schemametadata.MetadataSchema {
927
- meta := schemametadata.MetadataSchema_initialize()
928
- meta.Constants = append(meta.Constants, schemametadata.MetadataConstant_create(schemametadata.MetadataConstant{
929
- Type: "boolean",
930
- Values: []*schemametadata.MetadataConstantValue{
931
- schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{Value: value}),
932
- },
933
- }))
934
- return meta
914
+ meta := schemametadata.MetadataSchema_initialize()
915
+ constants := make([]*schemametadata.MetadataConstantValue, 0, len(values))
916
+ for _, value := range values {
917
+ constants = append(constants, schemametadata.MetadataConstantValue_create(schemametadata.MetadataConstantValue{Value: value}))
918
+ }
919
+ meta.Constants = append(meta.Constants, schemametadata.MetadataConstant_create(schemametadata.MetadataConstant{
920
+ Type: "string",
921
+ Values: constants,
922
+ }))
923
+ return meta
935
924
  }
936
925
 
937
926
  func factoryUtilityObjectMetadata(object *schemametadata.MetadataObjectType) *schemametadata.MetadataSchema {
938
- meta := schemametadata.MetadataSchema_initialize()
939
- meta.Objects = append(meta.Objects, schemametadata.MetadataObject_create(schemametadata.MetadataObject{Type: object}))
940
- return meta
927
+ meta := schemametadata.MetadataSchema_initialize()
928
+ meta.Objects = append(meta.Objects, schemametadata.MetadataObject_create(schemametadata.MetadataObject{Type: object}))
929
+ return meta
941
930
  }
942
931
 
943
932
  func factoryUtilityStringTupleMetadata(values ...string) *schemametadata.MetadataSchema {
944
- meta := schemametadata.MetadataSchema_initialize()
945
- elements := make([]*schemametadata.MetadataSchema, 0, len(values))
946
- for _, value := range values {
947
- if value == "" {
948
- elements = append(elements, factoryUtilityAtomicMetadata("string"))
949
- } else {
950
- elements = append(elements, factoryUtilityLiteralMetadata(value))
951
- }
952
- }
953
- meta.Tuples = append(meta.Tuples, schemametadata.MetadataTuple_create(schemametadata.MetadataTuple{
954
- Type: schemametadata.MetadataTupleType_create(schemametadata.MetadataTupleType{
955
- Name: "ExclusiveTuple",
956
- Elements: elements,
957
- Nullables: []bool{},
958
- }),
959
- }))
960
- return meta
933
+ meta := schemametadata.MetadataSchema_initialize()
934
+ elements := make([]*schemametadata.MetadataSchema, 0, len(values))
935
+ for _, value := range values {
936
+ if value == "" {
937
+ elements = append(elements, factoryUtilityAtomicMetadata("string"))
938
+ } else {
939
+ elements = append(elements, factoryUtilityLiteralMetadata(value))
940
+ }
941
+ }
942
+ meta.Tuples = append(meta.Tuples, schemametadata.MetadataTuple_create(schemametadata.MetadataTuple{
943
+ Type: schemametadata.MetadataTupleType_create(schemametadata.MetadataTupleType{
944
+ Name: "ExclusiveTuple",
945
+ Elements: elements,
946
+ Nullables: []bool{},
947
+ }),
948
+ }))
949
+ return meta
961
950
  }
962
951
 
963
952
  func factoryUtilityTagProperty(key string, value *schemametadata.MetadataSchema) *schemametadata.MetadataProperty {
964
- return schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
965
- Key: factoryUtilityLiteralMetadata(key),
966
- Value: value,
967
- })
953
+ return schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
954
+ Key: factoryUtilityLiteralMetadata(key),
955
+ Value: value,
956
+ })
968
957
  }
969
958
 
970
959
  func factoryUtilityTagContainer(name string, properties ...*schemametadata.MetadataProperty) *schemametadata.MetadataObjectType {
971
- tagValue := schemametadata.MetadataSchema_initialize()
972
- tagValue.Required = false
973
- tagValue.Optional = true
974
- tagValue.Objects = append(tagValue.Objects, schemametadata.MetadataObject_create(schemametadata.MetadataObject{
975
- Type: schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
976
- Name: name + "Shape",
977
- Properties: properties,
978
- }),
979
- }))
980
- return schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
981
- Name: name,
982
- Properties: []*schemametadata.MetadataProperty{
983
- schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
984
- Key: factoryUtilityLiteralMetadata("typia.tag"),
985
- Value: tagValue,
986
- }),
987
- },
988
- })
960
+ tagValue := schemametadata.MetadataSchema_initialize()
961
+ tagValue.Required = false
962
+ tagValue.Optional = true
963
+ tagValue.Objects = append(tagValue.Objects, schemametadata.MetadataObject_create(schemametadata.MetadataObject{
964
+ Type: schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
965
+ Name: name + "Shape",
966
+ Properties: properties,
967
+ }),
968
+ }))
969
+ return schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
970
+ Name: name,
971
+ Properties: []*schemametadata.MetadataProperty{
972
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
973
+ Key: factoryUtilityLiteralMetadata("typia.tag"),
974
+ Value: tagValue,
975
+ }),
976
+ },
977
+ })
989
978
  }
990
979
 
991
980
  func factoryUtilityAtomicMetadata(name string) *schemametadata.MetadataSchema {
992
- meta := schemametadata.MetadataSchema_initialize()
993
- meta.Atomics = append(meta.Atomics, schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{Type: name}))
994
- return meta
981
+ meta := schemametadata.MetadataSchema_initialize()
982
+ meta.Atomics = append(meta.Atomics, schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{Type: name}))
983
+ return meta
995
984
  }
996
985
 
997
986
  func factoryUtilityArrayMetadata(value *schemametadata.MetadataSchema) *schemametadata.MetadataSchema {
998
- meta := schemametadata.MetadataSchema_initialize()
999
- meta.Arrays = append(meta.Arrays, schemametadata.MetadataArray_create(schemametadata.MetadataArray{
1000
- Type: schemametadata.MetadataArrayType_create(schemametadata.MetadataArrayType{Name: "Array<" + value.GetName() + ">", Value: value}),
1001
- }))
1002
- return meta
987
+ meta := schemametadata.MetadataSchema_initialize()
988
+ meta.Arrays = append(meta.Arrays, schemametadata.MetadataArray_create(schemametadata.MetadataArray{
989
+ Type: schemametadata.MetadataArrayType_create(schemametadata.MetadataArrayType{Name: "Array<" + value.GetName() + ">", Value: value}),
990
+ }))
991
+ return meta
1003
992
  }
1004
993
 
1005
994
  func factoryUtilitySequenceStringMetadata(sequence int) *schemametadata.MetadataSchema {
1006
- meta := schemametadata.MetadataSchema_initialize()
1007
- meta.Atomics = append(meta.Atomics, schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{
1008
- Type: "string",
1009
- Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(sequence)}},
1010
- }))
1011
- return meta
995
+ meta := schemametadata.MetadataSchema_initialize()
996
+ meta.Atomics = append(meta.Atomics, schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{
997
+ Type: "string",
998
+ Tags: [][]schemametadata.IMetadataTypeTag{{factoryUtilitySequenceTag(sequence)}},
999
+ }))
1000
+ return meta
1012
1001
  }