1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the test suite module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 as published by the Free Software
20** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21** included in the packaging of this file. Please review the following
22** information to ensure the GNU General Public License requirements will
23** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24**
25** $QT_END_LICENSE$
26**
27****************************************************************************/
28
29#include <QtTest/QtTest>
30
31#include <private/qxsdstatemachine_p.h>
32#include <private/qxsdschematoken_p.h>
33
34using namespace QPatternist;
35
36class tst_XMLPatternsSchema : public QObject
37{
38 Q_OBJECT
39
40 public slots:
41 void init();
42 void cleanup();
43
44 private slots:
45 void stateMachineTest1();
46 void stateMachineTest2();
47 void stateMachineTest3();
48 void stateMachineTest4();
49 void stateMachineTest5();
50 void stateMachineTest6();
51 void stateMachineTest7();
52 void stateMachineTest8();
53 void stateMachineTest9();
54 void stateMachineTest10();
55 void stateMachineTest11();
56 void stateMachineTest12();
57 void stateMachineTest13();
58 void stateMachineTest14();
59 void stateMachineTest15();
60 void stateMachineTest16();
61 void stateMachineTest17();
62 void stateMachineTest18();
63 void stateMachineTest19();
64
65 private:
66 bool runTest(const QVector<XsdSchemaToken::NodeName> &list, XsdStateMachine<XsdSchemaToken::NodeName> &machine);
67};
68
69void tst_XMLPatternsSchema::init()
70{
71}
72
73void tst_XMLPatternsSchema::cleanup()
74{
75}
76
77bool tst_XMLPatternsSchema::runTest(const QVector<XsdSchemaToken::NodeName> &list, XsdStateMachine<XsdSchemaToken::NodeName> &machine)
78{
79 machine.reset();
80 for (int i = 0; i < list.count(); ++i) {
81 if (!machine.proceed(transition: list.at(i)))
82 return false;
83 }
84 if (!machine.inEndState())
85 return false;
86
87 return true;
88}
89
90void tst_XMLPatternsSchema::stateMachineTest1()
91{
92 XsdStateMachine<XsdSchemaToken::NodeName> machine;
93
94 // setup state machine for (annotation?, simpleType?) : attribute
95 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
96 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
97 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
98
99 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
100 machine.addTransition(start: startState, transition: XsdSchemaToken::SimpleType, end: s2);
101 machine.addTransition(start: s1, transition: XsdSchemaToken::SimpleType, end: s2);
102
103 QVERIFY(machine.inEndState() == true);
104 QVERIFY(machine.proceed(XsdSchemaToken::Annotation) == true);
105 QVERIFY(machine.inEndState() == true);
106 QVERIFY(machine.proceed(XsdSchemaToken::SimpleType) == true);
107 QVERIFY(machine.inEndState() == true);
108 QVERIFY(machine.proceed(XsdSchemaToken::SimpleType) == false);
109 QVERIFY(machine.proceed(XsdSchemaToken::Annotation) == false);
110 machine.reset();
111 QVERIFY(machine.proceed(XsdSchemaToken::SimpleType) == true);
112 QVERIFY(machine.inEndState() == true);
113 QVERIFY(machine.proceed(XsdSchemaToken::Annotation) == false);
114}
115
116void tst_XMLPatternsSchema::stateMachineTest2()
117{
118 XsdStateMachine<XsdSchemaToken::NodeName> machine;
119
120 // setup state machine for (annotation?, ((simpleType | complexType)?, (unique | key | keyref)*)) : element
121 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
122 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
123 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
124 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s3 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
125 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s4 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
126 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s5 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
127 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s6 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
128
129 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
130 machine.addTransition(start: startState, transition: XsdSchemaToken::SimpleType, end: s2);
131 machine.addTransition(start: startState, transition: XsdSchemaToken::ComplexType, end: s3);
132 machine.addTransition(start: startState, transition: XsdSchemaToken::Unique, end: s4);
133 machine.addTransition(start: startState, transition: XsdSchemaToken::Key, end: s5);
134 machine.addTransition(start: startState, transition: XsdSchemaToken::Keyref, end: s6);
135
136 machine.addTransition(start: s1, transition: XsdSchemaToken::SimpleType, end: s2);
137 machine.addTransition(start: s1, transition: XsdSchemaToken::ComplexType, end: s3);
138 machine.addTransition(start: s1, transition: XsdSchemaToken::Unique, end: s4);
139 machine.addTransition(start: s1, transition: XsdSchemaToken::Key, end: s5);
140 machine.addTransition(start: s1, transition: XsdSchemaToken::Keyref, end: s6);
141
142 machine.addTransition(start: s2, transition: XsdSchemaToken::Unique, end: s4);
143 machine.addTransition(start: s2, transition: XsdSchemaToken::Key, end: s5);
144 machine.addTransition(start: s2, transition: XsdSchemaToken::Keyref, end: s6);
145
146 machine.addTransition(start: s3, transition: XsdSchemaToken::Unique, end: s4);
147 machine.addTransition(start: s3, transition: XsdSchemaToken::Key, end: s5);
148 machine.addTransition(start: s3, transition: XsdSchemaToken::Keyref, end: s6);
149
150 machine.addTransition(start: s4, transition: XsdSchemaToken::Unique, end: s4);
151 machine.addTransition(start: s4, transition: XsdSchemaToken::Key, end: s5);
152 machine.addTransition(start: s4, transition: XsdSchemaToken::Keyref, end: s6);
153
154 machine.addTransition(start: s5, transition: XsdSchemaToken::Unique, end: s4);
155 machine.addTransition(start: s5, transition: XsdSchemaToken::Key, end: s5);
156 machine.addTransition(start: s5, transition: XsdSchemaToken::Keyref, end: s6);
157
158 machine.addTransition(start: s6, transition: XsdSchemaToken::Unique, end: s4);
159 machine.addTransition(start: s6, transition: XsdSchemaToken::Key, end: s5);
160 machine.addTransition(start: s6, transition: XsdSchemaToken::Keyref, end: s6);
161
162 QVector<XsdSchemaToken::NodeName> data1, data2, data3;
163
164 data1 << XsdSchemaToken::Annotation
165 << XsdSchemaToken::SimpleType
166 << XsdSchemaToken::Unique
167 << XsdSchemaToken::Keyref;
168
169 data2 << XsdSchemaToken::Annotation
170 << XsdSchemaToken::SimpleType
171 << XsdSchemaToken::Annotation
172 << XsdSchemaToken::Keyref;
173
174 data3 << XsdSchemaToken::Annotation
175 << XsdSchemaToken::SimpleType
176 << XsdSchemaToken::SimpleType;
177
178 QVERIFY(runTest(data1, machine) == true);
179 QVERIFY(runTest(data2, machine) == false);
180 QVERIFY(runTest(data3, machine) == false);
181}
182
183void tst_XMLPatternsSchema::stateMachineTest3()
184{
185 XsdStateMachine<XsdSchemaToken::NodeName> machine;
186
187 // setup state machine for (annotation?, (simpleContent | complexContent | ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?)))) : complexType
188 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
189 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
190 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
191 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s3 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
192 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s4 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
193 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s5 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
194 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s6 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
195 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s7 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
196 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s8 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
197 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s9 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
198 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s10 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
199
200 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
201 machine.addTransition(start: startState, transition: XsdSchemaToken::SimpleContent, end: s2);
202 machine.addTransition(start: startState, transition: XsdSchemaToken::ComplexContent, end: s3);
203 machine.addTransition(start: startState, transition: XsdSchemaToken::Group, end: s4);
204 machine.addTransition(start: startState, transition: XsdSchemaToken::All, end: s5);
205 machine.addTransition(start: startState, transition: XsdSchemaToken::Choice, end: s6);
206 machine.addTransition(start: startState, transition: XsdSchemaToken::Sequence, end: s7);
207 machine.addTransition(start: startState, transition: XsdSchemaToken::Attribute, end: s8);
208 machine.addTransition(start: startState, transition: XsdSchemaToken::AttributeGroup, end: s9);
209 machine.addTransition(start: startState, transition: XsdSchemaToken::AnyAttribute, end: s10);
210
211 machine.addTransition(start: s1, transition: XsdSchemaToken::SimpleContent, end: s2);
212 machine.addTransition(start: s1, transition: XsdSchemaToken::ComplexContent, end: s3);
213 machine.addTransition(start: s1, transition: XsdSchemaToken::Group, end: s4);
214 machine.addTransition(start: s1, transition: XsdSchemaToken::All, end: s5);
215 machine.addTransition(start: s1, transition: XsdSchemaToken::Choice, end: s6);
216 machine.addTransition(start: s1, transition: XsdSchemaToken::Sequence, end: s7);
217 machine.addTransition(start: s1, transition: XsdSchemaToken::Attribute, end: s8);
218 machine.addTransition(start: s1, transition: XsdSchemaToken::AttributeGroup, end: s9);
219 machine.addTransition(start: s1, transition: XsdSchemaToken::AnyAttribute, end: s10);
220
221 machine.addTransition(start: s4, transition: XsdSchemaToken::Attribute, end: s8);
222 machine.addTransition(start: s4, transition: XsdSchemaToken::AttributeGroup, end: s9);
223 machine.addTransition(start: s4, transition: XsdSchemaToken::AnyAttribute, end: s10);
224
225 machine.addTransition(start: s5, transition: XsdSchemaToken::Attribute, end: s8);
226 machine.addTransition(start: s5, transition: XsdSchemaToken::AttributeGroup, end: s9);
227 machine.addTransition(start: s5, transition: XsdSchemaToken::AnyAttribute, end: s10);
228
229 machine.addTransition(start: s6, transition: XsdSchemaToken::Attribute, end: s8);
230 machine.addTransition(start: s6, transition: XsdSchemaToken::AttributeGroup, end: s9);
231 machine.addTransition(start: s6, transition: XsdSchemaToken::AnyAttribute, end: s10);
232
233 machine.addTransition(start: s7, transition: XsdSchemaToken::Attribute, end: s8);
234 machine.addTransition(start: s7, transition: XsdSchemaToken::AttributeGroup, end: s9);
235 machine.addTransition(start: s7, transition: XsdSchemaToken::AnyAttribute, end: s10);
236
237 machine.addTransition(start: s8, transition: XsdSchemaToken::Attribute, end: s8);
238 machine.addTransition(start: s8, transition: XsdSchemaToken::AttributeGroup, end: s9);
239 machine.addTransition(start: s8, transition: XsdSchemaToken::AnyAttribute, end: s10);
240
241 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4;
242
243 data1 << XsdSchemaToken::Annotation
244 << XsdSchemaToken::SimpleContent;
245
246 data2 << XsdSchemaToken::Group
247 << XsdSchemaToken::Attribute
248 << XsdSchemaToken::Attribute
249 << XsdSchemaToken::AnyAttribute;
250
251 data3 << XsdSchemaToken::Group
252 << XsdSchemaToken::Choice
253 << XsdSchemaToken::Attribute
254 << XsdSchemaToken::AnyAttribute;
255
256 data4 << XsdSchemaToken::Annotation
257 << XsdSchemaToken::Sequence
258 << XsdSchemaToken::AnyAttribute;
259
260 QVERIFY(runTest(data1, machine) == true);
261 QVERIFY(runTest(data2, machine) == true);
262 QVERIFY(runTest(data3, machine) == false);
263 QVERIFY(runTest(data4, machine) == true);
264}
265
266void tst_XMLPatternsSchema::stateMachineTest4()
267{
268 XsdStateMachine<XsdSchemaToken::NodeName> machine;
269
270 // setup state machine for (annotation?, ((attribute | attributeGroup)*, anyAttribute?)) : named attribute group/simple content extension/
271 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
272 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
273 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
274 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s3 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
275 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s4 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
276
277 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
278 machine.addTransition(start: startState, transition: XsdSchemaToken::Attribute, end: s2);
279 machine.addTransition(start: startState, transition: XsdSchemaToken::AttributeGroup, end: s3);
280 machine.addTransition(start: startState, transition: XsdSchemaToken::AnyAttribute, end: s4);
281
282 machine.addTransition(start: s1, transition: XsdSchemaToken::Attribute, end: s2);
283 machine.addTransition(start: s1, transition: XsdSchemaToken::AttributeGroup, end: s3);
284 machine.addTransition(start: s1, transition: XsdSchemaToken::AnyAttribute, end: s4);
285
286 machine.addTransition(start: s2, transition: XsdSchemaToken::Attribute, end: s2);
287 machine.addTransition(start: s2, transition: XsdSchemaToken::AttributeGroup, end: s3);
288 machine.addTransition(start: s2, transition: XsdSchemaToken::AnyAttribute, end: s4);
289
290 machine.addTransition(start: s3, transition: XsdSchemaToken::Attribute, end: s2);
291 machine.addTransition(start: s3, transition: XsdSchemaToken::AttributeGroup, end: s3);
292 machine.addTransition(start: s3, transition: XsdSchemaToken::AnyAttribute, end: s4);
293
294 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4;
295
296 data1 << XsdSchemaToken::Annotation;
297
298 data2 << XsdSchemaToken::Attribute
299 << XsdSchemaToken::Attribute
300 << XsdSchemaToken::Attribute
301 << XsdSchemaToken::AnyAttribute;
302
303 data3 << XsdSchemaToken::Group
304 << XsdSchemaToken::Attribute
305 << XsdSchemaToken::AnyAttribute;
306
307 data4 << XsdSchemaToken::Attribute
308 << XsdSchemaToken::AnyAttribute
309 << XsdSchemaToken::Attribute;
310
311 QVERIFY(runTest(data1, machine) == true);
312 QVERIFY(runTest(data2, machine) == true);
313 QVERIFY(runTest(data3, machine) == false);
314 QVERIFY(runTest(data4, machine) == false);
315}
316
317void tst_XMLPatternsSchema::stateMachineTest5()
318{
319 XsdStateMachine<XsdSchemaToken::NodeName> machine;
320
321 // setup state machine for (annotation?, (all | choice | sequence)?) : group
322 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
323 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
324 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
325 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s3 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
326 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s4 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
327
328 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
329 machine.addTransition(start: startState, transition: XsdSchemaToken::All, end: s2);
330 machine.addTransition(start: startState, transition: XsdSchemaToken::Choice, end: s3);
331 machine.addTransition(start: startState, transition: XsdSchemaToken::Sequence, end: s4);
332
333 machine.addTransition(start: s1, transition: XsdSchemaToken::All, end: s2);
334 machine.addTransition(start: s1, transition: XsdSchemaToken::Choice, end: s3);
335 machine.addTransition(start: s1, transition: XsdSchemaToken::Sequence, end: s4);
336
337 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4, data5, data6, data7, data8, data9;
338
339 data1 << XsdSchemaToken::Annotation;
340 data2 << XsdSchemaToken::Annotation << XsdSchemaToken::All;
341 data3 << XsdSchemaToken::Annotation << XsdSchemaToken::Choice;
342 data4 << XsdSchemaToken::Annotation << XsdSchemaToken::Sequence;
343 data5 << XsdSchemaToken::All;
344 data6 << XsdSchemaToken::Choice;
345 data7 << XsdSchemaToken::Sequence;
346 data8 << XsdSchemaToken::Sequence << XsdSchemaToken::All;
347
348 QVERIFY(runTest(data1, machine) == true);
349 QVERIFY(runTest(data2, machine) == true);
350 QVERIFY(runTest(data3, machine) == true);
351 QVERIFY(runTest(data4, machine) == true);
352 QVERIFY(runTest(data5, machine) == true);
353 QVERIFY(runTest(data6, machine) == true);
354 QVERIFY(runTest(data7, machine) == true);
355 QVERIFY(runTest(data8, machine) == false);
356 QVERIFY(runTest(data9, machine) == true);
357}
358
359void tst_XMLPatternsSchema::stateMachineTest6()
360{
361 XsdStateMachine<XsdSchemaToken::NodeName> machine;
362
363 // setup state machine for (annotation?, element*) : all
364 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
365 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
366 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
367
368 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
369 machine.addTransition(start: startState, transition: XsdSchemaToken::Element, end: s2);
370
371 machine.addTransition(start: s1, transition: XsdSchemaToken::Element, end: s2);
372
373 machine.addTransition(start: s2, transition: XsdSchemaToken::Element, end: s2);
374
375 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4, data5, data6, data7, data8, data9;
376
377 data1 << XsdSchemaToken::Annotation;
378 data2 << XsdSchemaToken::Annotation << XsdSchemaToken::Element;
379 data3 << XsdSchemaToken::Element;
380 data4 << XsdSchemaToken::Element << XsdSchemaToken::Sequence;
381 data5 << XsdSchemaToken::Annotation << XsdSchemaToken::Element << XsdSchemaToken::Annotation;
382 data6 << XsdSchemaToken::Annotation << XsdSchemaToken::Annotation << XsdSchemaToken::Element;
383
384 QVERIFY(runTest(data1, machine) == true);
385 QVERIFY(runTest(data2, machine) == true);
386 QVERIFY(runTest(data3, machine) == true);
387 QVERIFY(runTest(data4, machine) == false);
388 QVERIFY(runTest(data5, machine) == false);
389 QVERIFY(runTest(data6, machine) == false);
390}
391
392void tst_XMLPatternsSchema::stateMachineTest7()
393{
394 XsdStateMachine<XsdSchemaToken::NodeName> machine;
395
396 // setup state machine for (annotation?, (element | group | choice | sequence | any)*) : choice sequence
397 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
398 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
399 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
400 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s3 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
401 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s4 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
402 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s5 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
403 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s6 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
404
405 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
406 machine.addTransition(start: startState, transition: XsdSchemaToken::Element, end: s2);
407 machine.addTransition(start: startState, transition: XsdSchemaToken::Group, end: s3);
408 machine.addTransition(start: startState, transition: XsdSchemaToken::Choice, end: s4);
409 machine.addTransition(start: startState, transition: XsdSchemaToken::Sequence, end: s5);
410 machine.addTransition(start: startState, transition: XsdSchemaToken::Any, end: s6);
411
412 machine.addTransition(start: s1, transition: XsdSchemaToken::Element, end: s2);
413 machine.addTransition(start: s1, transition: XsdSchemaToken::Group, end: s3);
414 machine.addTransition(start: s1, transition: XsdSchemaToken::Choice, end: s4);
415 machine.addTransition(start: s1, transition: XsdSchemaToken::Sequence, end: s5);
416 machine.addTransition(start: s1, transition: XsdSchemaToken::Any, end: s6);
417
418 machine.addTransition(start: s2, transition: XsdSchemaToken::Element, end: s2);
419 machine.addTransition(start: s2, transition: XsdSchemaToken::Group, end: s3);
420 machine.addTransition(start: s2, transition: XsdSchemaToken::Choice, end: s4);
421 machine.addTransition(start: s2, transition: XsdSchemaToken::Sequence, end: s5);
422 machine.addTransition(start: s2, transition: XsdSchemaToken::Any, end: s6);
423
424 machine.addTransition(start: s3, transition: XsdSchemaToken::Element, end: s2);
425 machine.addTransition(start: s3, transition: XsdSchemaToken::Group, end: s3);
426 machine.addTransition(start: s3, transition: XsdSchemaToken::Choice, end: s4);
427 machine.addTransition(start: s3, transition: XsdSchemaToken::Sequence, end: s5);
428 machine.addTransition(start: s3, transition: XsdSchemaToken::Any, end: s6);
429
430 machine.addTransition(start: s4, transition: XsdSchemaToken::Element, end: s2);
431 machine.addTransition(start: s4, transition: XsdSchemaToken::Group, end: s3);
432 machine.addTransition(start: s4, transition: XsdSchemaToken::Choice, end: s4);
433 machine.addTransition(start: s4, transition: XsdSchemaToken::Sequence, end: s5);
434 machine.addTransition(start: s4, transition: XsdSchemaToken::Any, end: s6);
435
436 machine.addTransition(start: s5, transition: XsdSchemaToken::Element, end: s2);
437 machine.addTransition(start: s5, transition: XsdSchemaToken::Group, end: s3);
438 machine.addTransition(start: s5, transition: XsdSchemaToken::Choice, end: s4);
439 machine.addTransition(start: s5, transition: XsdSchemaToken::Sequence, end: s5);
440 machine.addTransition(start: s5, transition: XsdSchemaToken::Any, end: s6);
441
442 machine.addTransition(start: s6, transition: XsdSchemaToken::Element, end: s2);
443 machine.addTransition(start: s6, transition: XsdSchemaToken::Group, end: s3);
444 machine.addTransition(start: s6, transition: XsdSchemaToken::Choice, end: s4);
445 machine.addTransition(start: s6, transition: XsdSchemaToken::Sequence, end: s5);
446 machine.addTransition(start: s6, transition: XsdSchemaToken::Any, end: s6);
447
448 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4, data5, data6, data7, data8, data9;
449
450 data1 << XsdSchemaToken::Annotation;
451 data2 << XsdSchemaToken::Annotation << XsdSchemaToken::Element << XsdSchemaToken::Sequence << XsdSchemaToken::Choice;
452 data3 << XsdSchemaToken::Group;
453 data4 << XsdSchemaToken::Element << XsdSchemaToken::Sequence << XsdSchemaToken::Annotation;
454
455 QVERIFY(runTest(data1, machine) == true);
456 QVERIFY(runTest(data2, machine) == true);
457 QVERIFY(runTest(data3, machine) == true);
458 QVERIFY(runTest(data4, machine) == false);
459}
460
461void tst_XMLPatternsSchema::stateMachineTest8()
462{
463 XsdStateMachine<XsdSchemaToken::NodeName> machine;
464
465 // setup state machine for (annotation?) : any/selector/field/notation/include/import/referred attribute group/anyAttribute/all facets
466 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
467 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
468
469 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
470
471 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4;
472
473 data1 << XsdSchemaToken::Annotation;
474 data2 << XsdSchemaToken::Annotation << XsdSchemaToken::Element;
475 data3 << XsdSchemaToken::Group;
476
477 QVERIFY(runTest(data1, machine) == true);
478 QVERIFY(runTest(data2, machine) == false);
479 QVERIFY(runTest(data3, machine) == false);
480 QVERIFY(runTest(data4, machine) == true);
481}
482
483void tst_XMLPatternsSchema::stateMachineTest9()
484{
485 XsdStateMachine<XsdSchemaToken::NodeName> machine;
486
487 // setup state machine for (annotation?, (selector, field+)) : unique/key/keyref
488 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartState);
489 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::InternalState);
490 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::InternalState);
491 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s3 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
492
493 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
494 machine.addTransition(start: startState, transition: XsdSchemaToken::Selector, end: s2);
495
496 machine.addTransition(start: s1, transition: XsdSchemaToken::Selector, end: s2);
497 machine.addTransition(start: s2, transition: XsdSchemaToken::Field, end: s3);
498 machine.addTransition(start: s3, transition: XsdSchemaToken::Field, end: s3);
499
500 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4, data5;
501
502 data1 << XsdSchemaToken::Annotation;
503 data2 << XsdSchemaToken::Annotation << XsdSchemaToken::Selector;
504 data3 << XsdSchemaToken::Annotation << XsdSchemaToken::Selector << XsdSchemaToken::Field;
505 data4 << XsdSchemaToken::Selector << XsdSchemaToken::Field;
506 data5 << XsdSchemaToken::Selector << XsdSchemaToken::Field << XsdSchemaToken::Field;
507
508 QVERIFY(runTest(data1, machine) == false);
509 QVERIFY(runTest(data2, machine) == false);
510 QVERIFY(runTest(data3, machine) == true);
511 QVERIFY(runTest(data4, machine) == true);
512 QVERIFY(runTest(data5, machine) == true);
513}
514
515void tst_XMLPatternsSchema::stateMachineTest10()
516{
517 XsdStateMachine<XsdSchemaToken::NodeName> machine;
518
519 // setup state machine for (appinfo | documentation)* : annotation
520 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
521 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
522 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
523
524 machine.addTransition(start: startState, transition: XsdSchemaToken::Appinfo, end: s1);
525 machine.addTransition(start: startState, transition: XsdSchemaToken::Documentation, end: s2);
526
527 machine.addTransition(start: s1, transition: XsdSchemaToken::Appinfo, end: s1);
528 machine.addTransition(start: s1, transition: XsdSchemaToken::Documentation, end: s2);
529
530 machine.addTransition(start: s2, transition: XsdSchemaToken::Appinfo, end: s1);
531 machine.addTransition(start: s2, transition: XsdSchemaToken::Documentation, end: s2);
532
533 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4, data5;
534
535 data1 << XsdSchemaToken::Appinfo;
536 data2 << XsdSchemaToken::Appinfo << XsdSchemaToken::Appinfo;
537 data3 << XsdSchemaToken::Documentation << XsdSchemaToken::Appinfo << XsdSchemaToken::Documentation;
538 data4 << XsdSchemaToken::Selector << XsdSchemaToken::Field;
539
540 QVERIFY(runTest(data1, machine) == true);
541 QVERIFY(runTest(data2, machine) == true);
542 QVERIFY(runTest(data3, machine) == true);
543 QVERIFY(runTest(data4, machine) == false);
544 QVERIFY(runTest(data5, machine) == true);
545}
546
547void tst_XMLPatternsSchema::stateMachineTest11()
548{
549 XsdStateMachine<XsdSchemaToken::NodeName> machine;
550
551 // setup state machine for (annotation?, (restriction | list | union)) : simpleType
552 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartState);
553 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::InternalState);
554 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
555 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s3 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
556 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s4 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
557
558 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
559 machine.addTransition(start: startState, transition: XsdSchemaToken::Restriction, end: s2);
560 machine.addTransition(start: startState, transition: XsdSchemaToken::List, end: s3);
561 machine.addTransition(start: startState, transition: XsdSchemaToken::Union, end: s4);
562
563 machine.addTransition(start: s1, transition: XsdSchemaToken::Restriction, end: s2);
564 machine.addTransition(start: s1, transition: XsdSchemaToken::List, end: s3);
565 machine.addTransition(start: s1, transition: XsdSchemaToken::Union, end: s4);
566
567 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4, data5, data6, data7, data8;
568
569 data1 << XsdSchemaToken::Annotation;
570 data2 << XsdSchemaToken::Annotation << XsdSchemaToken::Restriction;
571 data3 << XsdSchemaToken::Annotation << XsdSchemaToken::List;
572 data4 << XsdSchemaToken::Annotation << XsdSchemaToken::Union;
573 data5 << XsdSchemaToken::Restriction;
574 data6 << XsdSchemaToken::List;
575 data7 << XsdSchemaToken::Union;
576 data8 << XsdSchemaToken::Union << XsdSchemaToken::Union;
577
578 QVERIFY(runTest(data1, machine) == false);
579 QVERIFY(runTest(data2, machine) == true);
580 QVERIFY(runTest(data3, machine) == true);
581 QVERIFY(runTest(data4, machine) == true);
582 QVERIFY(runTest(data5, machine) == true);
583 QVERIFY(runTest(data6, machine) == true);
584 QVERIFY(runTest(data7, machine) == true);
585 QVERIFY(runTest(data8, machine) == false);
586}
587
588void tst_XMLPatternsSchema::stateMachineTest12()
589{
590 XsdStateMachine<XsdSchemaToken::NodeName> machine;
591
592 // setup state machine for (annotation?, (simpleType?, (minExclusive | minInclusive | maxExclusive | maxInclusive | totalDigits | fractionDigits | length | minLength | maxLength | enumeration | whiteSpace | pattern)*)) : simple type restriction
593 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
594 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
595 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
596 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s3 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
597
598 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
599 machine.addTransition(start: startState, transition: XsdSchemaToken::SimpleType, end: s2);
600 machine.addTransition(start: startState, transition: XsdSchemaToken::MinExclusive, end: s3);
601 machine.addTransition(start: startState, transition: XsdSchemaToken::MinInclusive, end: s3);
602 machine.addTransition(start: startState, transition: XsdSchemaToken::MaxExclusive, end: s3);
603 machine.addTransition(start: startState, transition: XsdSchemaToken::MaxInclusive, end: s3);
604 machine.addTransition(start: startState, transition: XsdSchemaToken::TotalDigits, end: s3);
605 machine.addTransition(start: startState, transition: XsdSchemaToken::FractionDigits, end: s3);
606 machine.addTransition(start: startState, transition: XsdSchemaToken::Length, end: s3);
607 machine.addTransition(start: startState, transition: XsdSchemaToken::MinLength, end: s3);
608 machine.addTransition(start: startState, transition: XsdSchemaToken::MaxLength, end: s3);
609 machine.addTransition(start: startState, transition: XsdSchemaToken::Enumeration, end: s3);
610 machine.addTransition(start: startState, transition: XsdSchemaToken::WhiteSpace, end: s3);
611 machine.addTransition(start: startState, transition: XsdSchemaToken::Pattern, end: s3);
612
613 machine.addTransition(start: s1, transition: XsdSchemaToken::SimpleType, end: s2);
614 machine.addTransition(start: s1, transition: XsdSchemaToken::MinExclusive, end: s3);
615 machine.addTransition(start: s1, transition: XsdSchemaToken::MinInclusive, end: s3);
616 machine.addTransition(start: s1, transition: XsdSchemaToken::MaxExclusive, end: s3);
617 machine.addTransition(start: s1, transition: XsdSchemaToken::MaxInclusive, end: s3);
618 machine.addTransition(start: s1, transition: XsdSchemaToken::TotalDigits, end: s3);
619 machine.addTransition(start: s1, transition: XsdSchemaToken::FractionDigits, end: s3);
620 machine.addTransition(start: s1, transition: XsdSchemaToken::Length, end: s3);
621 machine.addTransition(start: s1, transition: XsdSchemaToken::MinLength, end: s3);
622 machine.addTransition(start: s1, transition: XsdSchemaToken::MaxLength, end: s3);
623 machine.addTransition(start: s1, transition: XsdSchemaToken::Enumeration, end: s3);
624 machine.addTransition(start: s1, transition: XsdSchemaToken::WhiteSpace, end: s3);
625 machine.addTransition(start: s1, transition: XsdSchemaToken::Pattern, end: s3);
626
627 machine.addTransition(start: s2, transition: XsdSchemaToken::MinExclusive, end: s3);
628 machine.addTransition(start: s2, transition: XsdSchemaToken::MinInclusive, end: s3);
629 machine.addTransition(start: s2, transition: XsdSchemaToken::MaxExclusive, end: s3);
630 machine.addTransition(start: s2, transition: XsdSchemaToken::MaxInclusive, end: s3);
631 machine.addTransition(start: s2, transition: XsdSchemaToken::TotalDigits, end: s3);
632 machine.addTransition(start: s2, transition: XsdSchemaToken::FractionDigits, end: s3);
633 machine.addTransition(start: s2, transition: XsdSchemaToken::Length, end: s3);
634 machine.addTransition(start: s2, transition: XsdSchemaToken::MinLength, end: s3);
635 machine.addTransition(start: s2, transition: XsdSchemaToken::MaxLength, end: s3);
636 machine.addTransition(start: s2, transition: XsdSchemaToken::Enumeration, end: s3);
637 machine.addTransition(start: s2, transition: XsdSchemaToken::WhiteSpace, end: s3);
638 machine.addTransition(start: s2, transition: XsdSchemaToken::Pattern, end: s3);
639
640 machine.addTransition(start: s3, transition: XsdSchemaToken::MinExclusive, end: s3);
641 machine.addTransition(start: s3, transition: XsdSchemaToken::MinInclusive, end: s3);
642 machine.addTransition(start: s3, transition: XsdSchemaToken::MaxExclusive, end: s3);
643 machine.addTransition(start: s3, transition: XsdSchemaToken::MaxInclusive, end: s3);
644 machine.addTransition(start: s3, transition: XsdSchemaToken::TotalDigits, end: s3);
645 machine.addTransition(start: s3, transition: XsdSchemaToken::FractionDigits, end: s3);
646 machine.addTransition(start: s3, transition: XsdSchemaToken::Length, end: s3);
647 machine.addTransition(start: s3, transition: XsdSchemaToken::MinLength, end: s3);
648 machine.addTransition(start: s3, transition: XsdSchemaToken::MaxLength, end: s3);
649 machine.addTransition(start: s3, transition: XsdSchemaToken::Enumeration, end: s3);
650 machine.addTransition(start: s3, transition: XsdSchemaToken::WhiteSpace, end: s3);
651 machine.addTransition(start: s3, transition: XsdSchemaToken::Pattern, end: s3);
652
653 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4, data5;
654
655 data1 << XsdSchemaToken::Annotation;
656 data2 << XsdSchemaToken::Annotation << XsdSchemaToken::Length << XsdSchemaToken::MaxLength;
657 data3 << XsdSchemaToken::Annotation << XsdSchemaToken::List;
658 data4 << XsdSchemaToken::SimpleType << XsdSchemaToken::Pattern;
659
660 QVERIFY(runTest(data1, machine) == true);
661 QVERIFY(runTest(data2, machine) == true);
662 QVERIFY(runTest(data3, machine) == false);
663 QVERIFY(runTest(data4, machine) == true);
664 QVERIFY(runTest(data5, machine) == true);
665}
666
667void tst_XMLPatternsSchema::stateMachineTest13()
668{
669 XsdStateMachine<XsdSchemaToken::NodeName> machine;
670
671 // setup state machine for (annotation?, simpleType?) : list
672 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
673 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
674 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
675
676 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
677 machine.addTransition(start: startState, transition: XsdSchemaToken::SimpleType, end: s2);
678
679 machine.addTransition(start: s1, transition: XsdSchemaToken::SimpleType, end: s2);
680
681 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4, data5;
682
683 data1 << XsdSchemaToken::Annotation;
684 data2 << XsdSchemaToken::Annotation << XsdSchemaToken::SimpleType;
685 data3 << XsdSchemaToken::SimpleType;
686 data4 << XsdSchemaToken::SimpleType << XsdSchemaToken::SimpleType;
687
688 QVERIFY(runTest(data1, machine) == true);
689 QVERIFY(runTest(data2, machine) == true);
690 QVERIFY(runTest(data3, machine) == true);
691 QVERIFY(runTest(data4, machine) == false);
692 QVERIFY(runTest(data5, machine) == true);
693}
694
695void tst_XMLPatternsSchema::stateMachineTest14()
696{
697 XsdStateMachine<XsdSchemaToken::NodeName> machine;
698
699 // setup state machine for (annotation?, simpleType*) : union
700 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
701 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
702 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
703
704 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
705 machine.addTransition(start: startState, transition: XsdSchemaToken::SimpleType, end: s2);
706
707 machine.addTransition(start: s1, transition: XsdSchemaToken::SimpleType, end: s2);
708 machine.addTransition(start: s2, transition: XsdSchemaToken::SimpleType, end: s2);
709
710 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4, data5, data6;
711
712 data1 << XsdSchemaToken::Annotation;
713 data2 << XsdSchemaToken::Annotation << XsdSchemaToken::SimpleType;
714 data3 << XsdSchemaToken::SimpleType;
715 data4 << XsdSchemaToken::SimpleType << XsdSchemaToken::SimpleType;
716 data6 << XsdSchemaToken::Annotation << XsdSchemaToken::Annotation;
717
718 QVERIFY(runTest(data1, machine) == true);
719 QVERIFY(runTest(data2, machine) == true);
720 QVERIFY(runTest(data3, machine) == true);
721 QVERIFY(runTest(data4, machine) == true);
722 QVERIFY(runTest(data5, machine) == true);
723 QVERIFY(runTest(data6, machine) == false);
724}
725
726void tst_XMLPatternsSchema::stateMachineTest15()
727{
728 XsdStateMachine<XsdSchemaToken::NodeName> machine;
729
730 // setup state machine for ((include | import | redefine | annotation)*, (((simpleType | complexType | group | attributeGroup) | element | attribute | notation), annotation*)*) : schema
731 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
732 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
733 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
734 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s3 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
735
736 machine.addTransition(start: startState, transition: XsdSchemaToken::Include, end: s1);
737 machine.addTransition(start: startState, transition: XsdSchemaToken::Import, end: s1);
738 machine.addTransition(start: startState, transition: XsdSchemaToken::Redefine, end: s1);
739 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
740 machine.addTransition(start: startState, transition: XsdSchemaToken::SimpleType, end: s2);
741 machine.addTransition(start: startState, transition: XsdSchemaToken::ComplexType, end: s2);
742 machine.addTransition(start: startState, transition: XsdSchemaToken::Group, end: s2);
743 machine.addTransition(start: startState, transition: XsdSchemaToken::AttributeGroup, end: s2);
744 machine.addTransition(start: startState, transition: XsdSchemaToken::Element, end: s2);
745 machine.addTransition(start: startState, transition: XsdSchemaToken::Attribute, end: s2);
746 machine.addTransition(start: startState, transition: XsdSchemaToken::Notation, end: s2);
747
748 machine.addTransition(start: s1, transition: XsdSchemaToken::Include, end: s1);
749 machine.addTransition(start: s1, transition: XsdSchemaToken::Import, end: s1);
750 machine.addTransition(start: s1, transition: XsdSchemaToken::Redefine, end: s1);
751 machine.addTransition(start: s1, transition: XsdSchemaToken::Annotation, end: s1);
752 machine.addTransition(start: s1, transition: XsdSchemaToken::SimpleType, end: s2);
753 machine.addTransition(start: s1, transition: XsdSchemaToken::ComplexType, end: s2);
754 machine.addTransition(start: s1, transition: XsdSchemaToken::Group, end: s2);
755 machine.addTransition(start: s1, transition: XsdSchemaToken::AttributeGroup, end: s2);
756 machine.addTransition(start: s1, transition: XsdSchemaToken::Element, end: s2);
757 machine.addTransition(start: s1, transition: XsdSchemaToken::Attribute, end: s2);
758 machine.addTransition(start: s1, transition: XsdSchemaToken::Notation, end: s2);
759
760 machine.addTransition(start: s2, transition: XsdSchemaToken::SimpleType, end: s2);
761 machine.addTransition(start: s2, transition: XsdSchemaToken::ComplexType, end: s2);
762 machine.addTransition(start: s2, transition: XsdSchemaToken::Group, end: s2);
763 machine.addTransition(start: s2, transition: XsdSchemaToken::AttributeGroup, end: s2);
764 machine.addTransition(start: s2, transition: XsdSchemaToken::Element, end: s2);
765 machine.addTransition(start: s2, transition: XsdSchemaToken::Attribute, end: s2);
766 machine.addTransition(start: s2, transition: XsdSchemaToken::Notation, end: s2);
767 machine.addTransition(start: s2, transition: XsdSchemaToken::Annotation, end: s3);
768
769 machine.addTransition(start: s3, transition: XsdSchemaToken::SimpleType, end: s2);
770 machine.addTransition(start: s3, transition: XsdSchemaToken::ComplexType, end: s2);
771 machine.addTransition(start: s3, transition: XsdSchemaToken::Group, end: s2);
772 machine.addTransition(start: s3, transition: XsdSchemaToken::AttributeGroup, end: s2);
773 machine.addTransition(start: s3, transition: XsdSchemaToken::Element, end: s2);
774 machine.addTransition(start: s3, transition: XsdSchemaToken::Attribute, end: s2);
775 machine.addTransition(start: s3, transition: XsdSchemaToken::Notation, end: s2);
776 machine.addTransition(start: s3, transition: XsdSchemaToken::Annotation, end: s3);
777
778 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4, data5, data6;
779
780 data1 << XsdSchemaToken::Annotation << XsdSchemaToken::Import << XsdSchemaToken::SimpleType << XsdSchemaToken::Annotation;
781 data2 << XsdSchemaToken::SimpleType;
782 data3 << XsdSchemaToken::Annotation << XsdSchemaToken::Import << XsdSchemaToken::Include << XsdSchemaToken::Import;
783 data4 << XsdSchemaToken::SimpleType << XsdSchemaToken::ComplexType << XsdSchemaToken::Annotation << XsdSchemaToken::Attribute;
784 data5 << XsdSchemaToken::SimpleType << XsdSchemaToken::Include << XsdSchemaToken::Annotation << XsdSchemaToken::Attribute;
785
786 QVERIFY(runTest(data1, machine) == true);
787 QVERIFY(runTest(data2, machine) == true);
788 QVERIFY(runTest(data3, machine) == true);
789 QVERIFY(runTest(data4, machine) == true);
790 QVERIFY(runTest(data5, machine) == false);
791 QVERIFY(runTest(data6, machine) == true);
792}
793
794void tst_XMLPatternsSchema::stateMachineTest16()
795{
796 XsdStateMachine<XsdSchemaToken::NodeName> machine;
797
798 // setup state machine for (annotation | (simpleType | complexType | group | attributeGroup))* : redefine
799 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
800 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
801
802 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
803 machine.addTransition(start: startState, transition: XsdSchemaToken::SimpleType, end: s1);
804 machine.addTransition(start: startState, transition: XsdSchemaToken::ComplexType, end: s1);
805 machine.addTransition(start: startState, transition: XsdSchemaToken::Group, end: s1);
806 machine.addTransition(start: startState, transition: XsdSchemaToken::AttributeGroup, end: s1);
807
808 machine.addTransition(start: s1, transition: XsdSchemaToken::Annotation, end: s1);
809 machine.addTransition(start: s1, transition: XsdSchemaToken::SimpleType, end: s1);
810 machine.addTransition(start: s1, transition: XsdSchemaToken::ComplexType, end: s1);
811 machine.addTransition(start: s1, transition: XsdSchemaToken::Group, end: s1);
812 machine.addTransition(start: s1, transition: XsdSchemaToken::AttributeGroup, end: s1);
813
814 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4, data5, data6;
815
816 data1 << XsdSchemaToken::Annotation;
817 data2 << XsdSchemaToken::Annotation << XsdSchemaToken::SimpleType;
818 data3 << XsdSchemaToken::SimpleType;
819 data4 << XsdSchemaToken::SimpleType << XsdSchemaToken::SimpleType;
820 data6 << XsdSchemaToken::Annotation << XsdSchemaToken::Annotation;
821
822 QVERIFY(runTest(data1, machine) == true);
823 QVERIFY(runTest(data2, machine) == true);
824 QVERIFY(runTest(data3, machine) == true);
825 QVERIFY(runTest(data4, machine) == true);
826 QVERIFY(runTest(data5, machine) == true);
827 QVERIFY(runTest(data6, machine) == true);
828}
829
830void tst_XMLPatternsSchema::stateMachineTest17()
831{
832 XsdStateMachine<XsdSchemaToken::NodeName> machine;
833
834 // setup state machine for (annotation?, (restriction | extension)) : simpleContent
835 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartState);
836 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::InternalState);
837 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
838
839 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
840 machine.addTransition(start: startState, transition: XsdSchemaToken::Restriction, end: s2);
841 machine.addTransition(start: startState, transition: XsdSchemaToken::Extension, end: s2);
842
843 machine.addTransition(start: s1, transition: XsdSchemaToken::Restriction, end: s2);
844 machine.addTransition(start: s1, transition: XsdSchemaToken::Extension, end: s2);
845
846 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4, data5, data6;
847
848 data1 << XsdSchemaToken::Annotation;
849 data2 << XsdSchemaToken::Annotation << XsdSchemaToken::Extension;
850 data3 << XsdSchemaToken::Restriction;
851 data4 << XsdSchemaToken::Extension << XsdSchemaToken::Restriction;
852 data5 << XsdSchemaToken::Annotation << XsdSchemaToken::Annotation;
853
854 QVERIFY(runTest(data1, machine) == false);
855 QVERIFY(runTest(data2, machine) == true);
856 QVERIFY(runTest(data3, machine) == true);
857 QVERIFY(runTest(data4, machine) == false);
858 QVERIFY(runTest(data5, machine) == false);
859 QVERIFY(runTest(data6, machine) == false);
860}
861
862void tst_XMLPatternsSchema::stateMachineTest18()
863{
864 XsdStateMachine<XsdSchemaToken::NodeName> machine;
865
866 // setup state machine for (annotation?, (simpleType?, (minExclusive | minInclusive | maxExclusive | maxInclusive | totalDigits | fractionDigits | length | minLength | maxLength | enumeration | whiteSpace | pattern)*)?, ((attribute | attributeGroup)*, anyAttribute?)) : simpleContent restriction
867 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
868 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
869 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
870 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s3 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
871 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s4 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
872 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s5 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
873
874 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
875 machine.addTransition(start: startState, transition: XsdSchemaToken::SimpleType, end: s2);
876 machine.addTransition(start: startState, transition: XsdSchemaToken::MinExclusive, end: s3);
877 machine.addTransition(start: startState, transition: XsdSchemaToken::MinInclusive, end: s3);
878 machine.addTransition(start: startState, transition: XsdSchemaToken::MaxExclusive, end: s3);
879 machine.addTransition(start: startState, transition: XsdSchemaToken::MaxInclusive, end: s3);
880 machine.addTransition(start: startState, transition: XsdSchemaToken::TotalDigits, end: s3);
881 machine.addTransition(start: startState, transition: XsdSchemaToken::FractionDigits, end: s3);
882 machine.addTransition(start: startState, transition: XsdSchemaToken::Length, end: s3);
883 machine.addTransition(start: startState, transition: XsdSchemaToken::MinLength, end: s3);
884 machine.addTransition(start: startState, transition: XsdSchemaToken::MaxLength, end: s3);
885 machine.addTransition(start: startState, transition: XsdSchemaToken::Enumeration, end: s3);
886 machine.addTransition(start: startState, transition: XsdSchemaToken::WhiteSpace, end: s3);
887 machine.addTransition(start: startState, transition: XsdSchemaToken::Pattern, end: s3);
888 machine.addTransition(start: startState, transition: XsdSchemaToken::Attribute, end: s4);
889 machine.addTransition(start: startState, transition: XsdSchemaToken::AttributeGroup, end: s4);
890 machine.addTransition(start: startState, transition: XsdSchemaToken::AnyAttribute, end: s5);
891
892 machine.addTransition(start: s1, transition: XsdSchemaToken::SimpleType, end: s2);
893 machine.addTransition(start: s1, transition: XsdSchemaToken::MinExclusive, end: s3);
894 machine.addTransition(start: s1, transition: XsdSchemaToken::MinInclusive, end: s3);
895 machine.addTransition(start: s1, transition: XsdSchemaToken::MaxExclusive, end: s3);
896 machine.addTransition(start: s1, transition: XsdSchemaToken::MaxInclusive, end: s3);
897 machine.addTransition(start: s1, transition: XsdSchemaToken::TotalDigits, end: s3);
898 machine.addTransition(start: s1, transition: XsdSchemaToken::FractionDigits, end: s3);
899 machine.addTransition(start: s1, transition: XsdSchemaToken::Length, end: s3);
900 machine.addTransition(start: s1, transition: XsdSchemaToken::MinLength, end: s3);
901 machine.addTransition(start: s1, transition: XsdSchemaToken::MaxLength, end: s3);
902 machine.addTransition(start: s1, transition: XsdSchemaToken::Enumeration, end: s3);
903 machine.addTransition(start: s1, transition: XsdSchemaToken::WhiteSpace, end: s3);
904 machine.addTransition(start: s1, transition: XsdSchemaToken::Pattern, end: s3);
905 machine.addTransition(start: s1, transition: XsdSchemaToken::Attribute, end: s4);
906 machine.addTransition(start: s1, transition: XsdSchemaToken::AttributeGroup, end: s4);
907 machine.addTransition(start: s1, transition: XsdSchemaToken::AnyAttribute, end: s5);
908
909 machine.addTransition(start: s2, transition: XsdSchemaToken::MinExclusive, end: s3);
910 machine.addTransition(start: s2, transition: XsdSchemaToken::MinInclusive, end: s3);
911 machine.addTransition(start: s2, transition: XsdSchemaToken::MaxExclusive, end: s3);
912 machine.addTransition(start: s2, transition: XsdSchemaToken::MaxInclusive, end: s3);
913 machine.addTransition(start: s2, transition: XsdSchemaToken::TotalDigits, end: s3);
914 machine.addTransition(start: s2, transition: XsdSchemaToken::FractionDigits, end: s3);
915 machine.addTransition(start: s2, transition: XsdSchemaToken::Length, end: s3);
916 machine.addTransition(start: s2, transition: XsdSchemaToken::MinLength, end: s3);
917 machine.addTransition(start: s2, transition: XsdSchemaToken::MaxLength, end: s3);
918 machine.addTransition(start: s2, transition: XsdSchemaToken::Enumeration, end: s3);
919 machine.addTransition(start: s2, transition: XsdSchemaToken::WhiteSpace, end: s3);
920 machine.addTransition(start: s2, transition: XsdSchemaToken::Pattern, end: s3);
921 machine.addTransition(start: s2, transition: XsdSchemaToken::Attribute, end: s4);
922 machine.addTransition(start: s2, transition: XsdSchemaToken::AttributeGroup, end: s4);
923 machine.addTransition(start: s2, transition: XsdSchemaToken::AnyAttribute, end: s5);
924
925 machine.addTransition(start: s3, transition: XsdSchemaToken::MinExclusive, end: s3);
926 machine.addTransition(start: s3, transition: XsdSchemaToken::MinInclusive, end: s3);
927 machine.addTransition(start: s3, transition: XsdSchemaToken::MaxExclusive, end: s3);
928 machine.addTransition(start: s3, transition: XsdSchemaToken::MaxInclusive, end: s3);
929 machine.addTransition(start: s3, transition: XsdSchemaToken::TotalDigits, end: s3);
930 machine.addTransition(start: s3, transition: XsdSchemaToken::FractionDigits, end: s3);
931 machine.addTransition(start: s3, transition: XsdSchemaToken::Length, end: s3);
932 machine.addTransition(start: s3, transition: XsdSchemaToken::MinLength, end: s3);
933 machine.addTransition(start: s3, transition: XsdSchemaToken::MaxLength, end: s3);
934 machine.addTransition(start: s3, transition: XsdSchemaToken::Enumeration, end: s3);
935 machine.addTransition(start: s3, transition: XsdSchemaToken::WhiteSpace, end: s3);
936 machine.addTransition(start: s3, transition: XsdSchemaToken::Pattern, end: s3);
937 machine.addTransition(start: s3, transition: XsdSchemaToken::Attribute, end: s4);
938 machine.addTransition(start: s3, transition: XsdSchemaToken::AttributeGroup, end: s4);
939 machine.addTransition(start: s3, transition: XsdSchemaToken::AnyAttribute, end: s5);
940
941 machine.addTransition(start: s4, transition: XsdSchemaToken::Attribute, end: s4);
942 machine.addTransition(start: s4, transition: XsdSchemaToken::AttributeGroup, end: s4);
943 machine.addTransition(start: s4, transition: XsdSchemaToken::AnyAttribute, end: s5);
944
945 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4, data5, data6;
946
947 data1 << XsdSchemaToken::Annotation;
948 data2 << XsdSchemaToken::SimpleType << XsdSchemaToken::MinExclusive << XsdSchemaToken::MaxExclusive;
949 data3 << XsdSchemaToken::AnyAttribute << XsdSchemaToken::Attribute;
950 data4 << XsdSchemaToken::MinExclusive << XsdSchemaToken::TotalDigits << XsdSchemaToken::Enumeration;
951 data5 << XsdSchemaToken::Annotation << XsdSchemaToken::Annotation;
952
953 QVERIFY(runTest(data1, machine) == true);
954 QVERIFY(runTest(data2, machine) == true);
955 QVERIFY(runTest(data3, machine) == false);
956 QVERIFY(runTest(data4, machine) == true);
957 QVERIFY(runTest(data5, machine) == false);
958 QVERIFY(runTest(data6, machine) == true);
959}
960
961void tst_XMLPatternsSchema::stateMachineTest19()
962{
963 XsdStateMachine<XsdSchemaToken::NodeName> machine;
964
965 // setup state machine for (annotation?, (group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?)) : complex content restriction/complex content extension
966 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId startState = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::StartEndState);
967 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s1 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
968 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s2 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
969 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s3 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
970 const XsdStateMachine<XsdSchemaToken::NodeName>::StateId s4 = machine.addState(type: XsdStateMachine<XsdSchemaToken::NodeName>::EndState);
971
972 machine.addTransition(start: startState, transition: XsdSchemaToken::Annotation, end: s1);
973 machine.addTransition(start: startState, transition: XsdSchemaToken::Group, end: s2);
974 machine.addTransition(start: startState, transition: XsdSchemaToken::All, end: s2);
975 machine.addTransition(start: startState, transition: XsdSchemaToken::Choice, end: s2);
976 machine.addTransition(start: startState, transition: XsdSchemaToken::Sequence, end: s2);
977 machine.addTransition(start: startState, transition: XsdSchemaToken::Attribute, end: s3);
978 machine.addTransition(start: startState, transition: XsdSchemaToken::AttributeGroup, end: s3);
979 machine.addTransition(start: startState, transition: XsdSchemaToken::AnyAttribute, end: s4);
980
981 machine.addTransition(start: s1, transition: XsdSchemaToken::Group, end: s2);
982 machine.addTransition(start: s1, transition: XsdSchemaToken::All, end: s2);
983 machine.addTransition(start: s1, transition: XsdSchemaToken::Choice, end: s2);
984 machine.addTransition(start: s1, transition: XsdSchemaToken::Sequence, end: s2);
985 machine.addTransition(start: s1, transition: XsdSchemaToken::Attribute, end: s3);
986 machine.addTransition(start: s1, transition: XsdSchemaToken::AttributeGroup, end: s3);
987 machine.addTransition(start: s1, transition: XsdSchemaToken::AnyAttribute, end: s4);
988
989 machine.addTransition(start: s2, transition: XsdSchemaToken::Attribute, end: s3);
990 machine.addTransition(start: s2, transition: XsdSchemaToken::AttributeGroup, end: s3);
991 machine.addTransition(start: s2, transition: XsdSchemaToken::AnyAttribute, end: s4);
992
993 machine.addTransition(start: s3, transition: XsdSchemaToken::Attribute, end: s3);
994 machine.addTransition(start: s3, transition: XsdSchemaToken::AttributeGroup, end: s3);
995 machine.addTransition(start: s3, transition: XsdSchemaToken::AnyAttribute, end: s4);
996
997 QVector<XsdSchemaToken::NodeName> data1, data2, data3, data4, data5, data6;
998
999 data1 << XsdSchemaToken::Annotation;
1000 data2 << XsdSchemaToken::Annotation << XsdSchemaToken::Group;
1001 data3 << XsdSchemaToken::Annotation << XsdSchemaToken::Group << XsdSchemaToken::Sequence;
1002 data4 << XsdSchemaToken::Attribute << XsdSchemaToken::Attribute;
1003 data5 << XsdSchemaToken::Attribute << XsdSchemaToken::Sequence;
1004 data6 << XsdSchemaToken::Annotation << XsdSchemaToken::Annotation;
1005
1006 QVERIFY(runTest(data1, machine) == true);
1007 QVERIFY(runTest(data2, machine) == true);
1008 QVERIFY(runTest(data3, machine) == false);
1009 QVERIFY(runTest(data4, machine) == true);
1010 QVERIFY(runTest(data5, machine) == false);
1011 QVERIFY(runTest(data6, machine) == false);
1012}
1013
1014QTEST_MAIN(tst_XMLPatternsSchema)
1015#include "tst_xmlpatternsschema.moc"
1016

source code of qtxmlpatterns/tests/auto/xmlpatternsschema/tst_xmlpatternsschema.cpp