1program tarrconstr5;
2
3{$mode objfpc}{$H+}
4
5type
6  TSet = set of (One, Two, Three);
7
8  TLongIntArray = array of LongInt;
9  TLongIntArrayArray = array of TLongIntArray;
10  TSetArray  =array of TSet;
11  TSetArrayArray = array of TSetArray;
12  TStringArray = array of String;
13  TStringArrayArray = array of TStringArray;
14  TStringArrayArray2 = specialize TArray<specialize TArray<String>>;
15
16var
17  code: LongInt = 1;
18
19procedure CheckLongInt(aActual, aExpected: array of LongInt);
20var
21  i: LongInt;
22begin
23  if Length(aActual) <> Length(aExpected) then
24    Halt(code);
25  Inc(code);
26  for i := Low(aActual) to High(aActual) do
27    if aActual[i] <> aExpected[i] then
28      Halt(code);
29  Inc(code);
30end;
31
32procedure CheckLongInt(aActual, aExpected: array of TLongIntArray);
33var
34  i: LongInt;
35begin
36  if Length(aActual) <> Length(aExpected) then
37    Halt(code);
38  Inc(code);
39  for i := Low(aActual) to High(aActual) do
40    CheckLongInt(aActual[i], aExpected[i]);
41end;
42
43procedure CheckSet(aActual, aExpected: array of TSet);
44var
45  i: LongInt;
46begin
47  if Length(aActual) <> Length(aExpected) then
48    Halt(code);
49  Inc(code);
50  for i := Low(aActual) to High(aActual) do
51    if aActual[i] <> aExpected[i] then
52      Halt(code);
53  Inc(code);
54end;
55
56procedure CheckSet(aActual, aExpected: array of TSetArray);
57var
58  i: LongInt;
59begin
60  if Length(aActual) <> Length(aExpected) then
61    Halt(code);
62  Inc(code);
63  for i := Low(aActual) to High(aActual) do
64    CheckSet(aActual[i], aExpected[i]);
65end;
66
67procedure CheckString(aActual, aExpected: array of String);
68var
69  i: LongInt;
70begin
71  if Length(aActual) <> Length(aExpected) then
72    Halt(code);
73  Inc(code);
74  for i := Low(aActual) to High(aActual) do
75    if aActual[i] <> aExpected[i] then
76      Halt(code);
77  Inc(code);
78end;
79
80procedure CheckString(aActual, aExpected: array of TStringArray);
81var
82  i: LongInt;
83begin
84  if Length(aActual) <> Length(aExpected) then
85    Halt(code);
86  Inc(code);
87  for i := Low(aActual) to High(aActual) do
88    CheckString(aActual[i], aExpected[i]);
89end;
90
91var
92  la1: TLongIntArray;
93  la2: array of LongInt;
94  la3: specialize TArray<LongInt>;
95  laa1: TLongIntArrayArray;
96  laa2: array of TLongIntArray;
97  laa3: array of array of LongInt;
98  sa1: TSetArray;
99  sa2: array of TSet;
100  sa3: specialize TArray<TSet>;
101  saa1: array of TSetArray;
102  saa2: TSetArrayArray;
103  stra1: TStringArray;
104  stra2: array of String;
105  stra3: specialize TArray<String>;
106  straa1: array of TStringArray;
107  straa2: TStringArrayArray;
108  straa3: specialize TArray<TStringArray>;
109  straa4: specialize TArray<specialize TArray<String>>;
110begin
111  la1 := [];
112  CheckLongInt(la1, []);
113
114  laa1 := [[]];
115  CheckLongInt(laa1, [[]]);
116  CheckLongInt(laa1, [nil]);
117
118  laa1 := [nil];
119  CheckLongInt(laa1, [[]]);
120  CheckLongInt(laa1, [nil]);
121
122  laa1 := [[], nil];
123  CheckLongInt(laa1, [[], nil]);
124  CheckLongInt(laa1, [[], []]);
125  CheckLongInt(laa1, [nil, nil]);
126  CheckLongInt(laa1, [nil, []]);
127
128  laa1 := [nil, nil];
129  CheckLongInt(laa1, [nil, nil]);
130  CheckLongInt(laa1, [[], []]);
131  CheckLongInt(laa1, [nil, []]);
132  CheckLongInt(laa1, [[], nil]);
133
134  laa1 := [[], []];
135  CheckLongInt(laa1, [[], []]);
136  CheckLongInt(laa1, [nil, nil]);
137  CheckLongInt(laa1, [nil, []]);
138  CheckLongInt(laa1, [[], nil]);
139
140  laa1 := [nil, [], nil];
141  CheckLongInt(laa1, [nil, [], nil]);
142  CheckLongInt(laa1, [nil, nil, nil]);
143  CheckLongInt(laa1, [[], [], []]);
144  CheckLongInt(laa1, [[], nil, []]);
145
146  la1 := [1, 3, 5];
147  CheckLongInt(la1, [1, 3, 5]);
148
149  la2 := [2, 4, 6];
150  CheckLongInt(la2, [2, 4, 6]);
151
152  la3 := [5, 6, 7, 8];
153  CheckLongInt(la3, [5, 6, 7, 8]);
154
155  laa1 := [la1, la2];
156  CheckLongInt(laa1, [la1, la2]);
157
158  laa2 := [la2, la1];
159  CheckLongInt(laa2, [la2, la1]);
160
161  laa3 := [la1, la3];
162  CheckLongInt(laa3, [la1, la3]);
163
164  laa1 := [[1, 3, 5], [2, 4, 6], [1, 3, 5]];
165  CheckLongInt(laa1, [la1, la2, la1]);
166
167  laa2 := [[2, 4, 6], [1, 3, 5], [5, 6, 7, 8]];
168  CheckLongInt(laa2, [la2, la1, la3]);
169
170  laa3 := [[5, 6, 7, 8]];
171  CheckLongInt(laa3, [la3]);
172
173  laa3 := [[], [], []];
174  CheckLongInt(laa3, [nil, nil, nil]);
175
176  sa1 := [[]];
177  CheckSet(sa1, [[]]);
178
179  sa1 := [[], []];
180  CheckSet(sa1, [[], []]);
181
182  saa1 := [[[]]];
183  CheckSet(saa1, [[[]]]);
184
185  saa1 := [nil];
186  CheckSet(saa1, [nil]);
187
188  saa1 := [[]];
189  CheckSet(saa1, [[]]);
190
191  sa1 := [[One], [Two, Three]];
192  sa2 := [[]];
193  sa3 := [[Three], []];
194
195  saa1 := [[[One], [Two, Three]], [[]], [[Three], []]];
196  CheckSet(saa1, [sa1, sa2, sa3]);
197
198  sa1 := [[Two], [Three]];
199  sa2 := [[One]];
200
201  saa2 := [[[Two], [Three]], [[One]]];
202  CheckSet(saa2, [sa1, sa2]);
203
204  stra1 := ['Hello', 'World'];
205  CheckString(stra1, ['Hello', 'World']);
206
207  stra2 := ['Hello'];
208  CheckString(stra2, ['Hello']);
209
210  stra3 := [];
211  CheckString(stra3, []);
212
213  stra1 := ['Hello'];
214  stra2 := ['World'];
215
216  straa1 := [['Hello'], ['World']];
217  CheckString(straa1, [stra1, stra2]);
218
219  stra1 := ['Hello', 'FPC'];
220  stra2 := [];
221  stra3 := ['World'];
222
223  straa2 := [['Hello', 'FPC'], [], ['World']];
224  CheckString(straa2, [stra1, stra2, stra3]);
225
226  straa3 := [[], ['World'], ['Hello', 'FPC']];
227  CheckString(straa3, [stra2, stra3, stra1]);
228
229  straa4 := [['World'], ['World']];
230  CheckString(straa4, [stra3, stra3]);
231
232  Writeln('ok');
233end.
234