Remove getSemanticVersion()
[yangtools.git] / model / yang-model-util / src / test / java / org / opendaylight / yangtools / yang / model / util / SchemaContextProxyTest.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.yang.model.util;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
12 import static org.mockito.ArgumentMatchers.any;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.mock;
15
16 import com.google.common.collect.ImmutableSet;
17 import java.net.URI;
18 import java.util.Arrays;
19 import java.util.Collection;
20 import java.util.HashSet;
21 import java.util.List;
22 import java.util.Optional;
23 import java.util.Set;
24 import org.junit.Test;
25 import org.opendaylight.yangtools.yang.common.QName;
26 import org.opendaylight.yangtools.yang.common.QNameModule;
27 import org.opendaylight.yangtools.yang.common.Revision;
28 import org.opendaylight.yangtools.yang.common.XMLNamespace;
29 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
31 import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
32 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
33 import org.opendaylight.yangtools.yang.model.api.Module;
34 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
35 import org.opendaylight.yangtools.yang.model.api.ModuleLike;
36 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
37 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
38 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
39 import org.opendaylight.yangtools.yang.model.api.Submodule;
40 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
41 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
42 import org.opendaylight.yangtools.yang.model.api.stmt.ImportEffectiveStatement;
43 import org.opendaylight.yangtools.yang.model.spi.AbstractSchemaContext;
44 import org.opendaylight.yangtools.yang.model.util.FilteringSchemaContextProxy.ModuleId;
45
46 public class SchemaContextProxyTest {
47
48     private static final URI NAMESPACE = URI.create("urn:opendaylight:params:xml:ns:yang:controller:config");
49     private static final Revision REVISION = Revision.of("2015-01-01");
50     private static final Revision REVISION2 = Revision.of("2015-01-15");
51
52     private static final String CONFIG_NAME = "config";
53     private static final String ROOT_NAME = "root";
54     private static final String MODULE2_NAME = "module2";
55     private static final String MODULE3_NAME = "module3";
56     private static final String MODULE4_NAME = "module4";
57     private static final String MODULE41_NAME = "module41";
58     private static final String MODULE5_NAME = "module5";
59
60     private static SchemaContext mockSchema(final Module... modules) {
61         final List<Module> sortedModules = Arrays.asList(modules);
62         sortedModules.sort(AbstractSchemaContext.NAME_REVISION_COMPARATOR);
63         SchemaContext mock = mock(SchemaContext.class);
64         doReturn(ImmutableSet.copyOf(sortedModules)).when(mock).getModules();
65         return mock;
66     }
67
68     /*
69      * CFG(R)
70      *  | \
71      *  |  \
72      * M2 <- M3
73      */
74     @Test
75     public void testBasic() {
76         Module moduleConfig = mockModule(CONFIG_NAME);
77         Module module2 = mockModule(MODULE2_NAME);
78         Module module3 = mockModule(MODULE3_NAME);
79
80         mockModuleImport(module2, moduleConfig);
81         mockModuleImport(module3, module2, moduleConfig);
82
83         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
84
85         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
86                 moduleConfig);
87         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
88     }
89
90     /*
91      * No root or additional modules
92      *  | \
93      *  |  \
94      * M2 <- M3
95      */
96     @Test
97     public void testNull() {
98         Module moduleConfig = mockModule(CONFIG_NAME);
99         Module module2 = mockModule(MODULE2_NAME);
100         Module module3 = mockModule(MODULE3_NAME);
101
102         mockModuleImport(module2, moduleConfig);
103         mockModuleImport(module3, module2, moduleConfig);
104
105         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
106
107         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, null);
108         assertProxyContext(filteringSchemaContextProxy, null);
109     }
110
111     /*
112      *  Config
113      *  | \ (NR)
114      *  |  \
115      * M2 <- M3
116      */
117     @Test
118     public void testConfigDifferentRevisions() {
119         Module moduleConfigNullRevision = mockModule(CONFIG_NAME, null);
120         Module moduleConfig = mockModule(CONFIG_NAME, REVISION);
121         Module moduleConfig2 = mockModule(CONFIG_NAME, REVISION2);
122         Module module2 = mockModule(MODULE2_NAME);
123         Module module3 = mockModule(MODULE3_NAME);
124
125         mockModuleImport(module2, moduleConfig);
126         mockModuleImport(module3, module2, moduleConfigNullRevision);
127
128         SchemaContext schemaContext = mockSchema(moduleConfig, moduleConfig2, module2, module3);
129
130         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
131                 moduleConfig);
132         assertProxyContext(filteringSchemaContextProxy, moduleConfig, moduleConfig2, module2, module3);
133     }
134
135     /*
136      *     CFG(R)
137      *    |      \
138      *   |         \
139      * M2<-(NullRev)M3
140      */
141     @Test
142     public void testBasicNullRevision() throws Exception {
143         final Module moduleConfig = mockModule(CONFIG_NAME, Revision.of("2013-04-05"));
144         final Module module2 = mockModule(MODULE2_NAME, Revision.of("2014-06-17"));
145         final Module module20 = mockModule(MODULE2_NAME, null);
146         final Module module3 = mockModule(MODULE3_NAME, Revision.of("2014-06-12"));
147         final Module module30 = mockModule(MODULE3_NAME, null);
148
149         mockModuleImport(module20, moduleConfig);
150         mockModuleImport(module2, moduleConfig);
151         mockModuleImport(module3, module20, moduleConfig);
152         mockModuleImport(module30, module20, moduleConfig);
153
154         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
155
156         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
157                 moduleConfig);
158
159         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
160     }
161
162     /*
163      * CFG(R)   ROOT(R)
164      *  |         \
165      *  |          \
166      * M2          M3
167      */
168     @Test
169     public void testBasicMoreRootModules() {
170         final Module moduleConfig = mockModule(CONFIG_NAME);
171         final Module moduleRoot = mockModule(ROOT_NAME);
172         final Module module2 = mockModule(MODULE2_NAME);
173         final Module module3 = mockModule(MODULE3_NAME);
174
175         mockModuleImport(module2, moduleConfig);
176         mockModuleImport(module3, moduleRoot);
177
178         SchemaContext schemaContext = mockSchema(moduleConfig, moduleRoot, module2, module3);
179
180         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null, moduleRoot,
181                 moduleConfig);
182         assertProxyContext(filteringSchemaContextProxy, moduleRoot, module3, moduleConfig, module2);
183     }
184
185     /*
186      * CFG(R)
187      *  |
188      *  |
189      * M2 <- M3
190      */
191     @Test
192     public void testChainNotDepend() {
193         Module moduleConfig = mockModule(CONFIG_NAME);
194         Module module2 = mockModule(MODULE2_NAME);
195         Module module3 = mockModule(MODULE3_NAME);
196
197         mockModuleImport(module2, moduleConfig);
198         mockModuleImport(module3, module2);
199
200         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3);
201
202         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
203                 moduleConfig);
204         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2);
205     }
206
207     /*
208      * CFG(R)
209      *  |
210      *  |
211      * M2 -> M3 -> M4 -> M5
212      */
213     @Test
214     public void testChainDependMulti() {
215         Module moduleConfig = mockModule(CONFIG_NAME);
216         Module module2 = mockModule(MODULE2_NAME);
217         Module module3 = mockModule(MODULE3_NAME);
218         Module module4 = mockModule(MODULE4_NAME);
219         Module module5 = mockModule(MODULE5_NAME);
220
221         mockModuleImport(module2, moduleConfig, module3);
222         mockModuleImport(module3, module4);
223         mockModuleImport(module4, module5);
224
225         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4, module5);
226
227         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
228                 moduleConfig);
229         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4, module5);
230     }
231
232     /*
233      * CFG(R)
234      *  |
235      *  |
236      * M2 -> M3 <- M4
237      */
238     @Test
239     public void testChainNotDependMulti() {
240         Module moduleConfig = mockModule(CONFIG_NAME);
241         Module module2 = mockModule(MODULE2_NAME);
242         Module module3 = mockModule(MODULE3_NAME);
243         Module module4 = mockModule(MODULE4_NAME);
244
245         mockModuleImport(module2, moduleConfig, module3);
246         mockModuleImport(module4, module3);
247
248         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4);
249
250         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
251                 moduleConfig);
252         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
253     }
254
255     /*
256      *  CFG(R)
257      *  | \ \ \
258      *  |  \ \ \
259      * M2 M3 M4 M5
260      */
261     @Test
262     public void testChainNotMulti() {
263         final Module moduleConfig = mockModule(CONFIG_NAME);
264         final Module module2 = mockModule(MODULE2_NAME);
265         final Module module3 = mockModule(MODULE3_NAME);
266         final Module module4 = mockModule(MODULE4_NAME);
267         final Module module5 = mockModule(MODULE5_NAME);
268
269         mockModuleImport(module2, moduleConfig);
270         mockModuleImport(module3, moduleConfig);
271         mockModuleImport(module4, moduleConfig);
272         mockModuleImport(module5, moduleConfig);
273
274         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4, module5);
275
276         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
277                 moduleConfig);
278         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4, module5);
279     }
280
281     /*
282      * CFG(R)
283      *  | \
284      *  |  \
285      * M2 <- M3 M4=M3(Different revision)
286      */
287     @Test
288     public void testBasicRevisionChange() throws Exception {
289         Module moduleConfig = mockModule(CONFIG_NAME);
290         Module module2 = mockModule(MODULE2_NAME);
291         Module module3 = mockModule(MODULE3_NAME);
292         Module module4 = mockModule(MODULE3_NAME, Revision.of("2015-10-10"));
293
294         mockModuleImport(module2, moduleConfig);
295         mockModuleImport(module3, module2, moduleConfig);
296
297         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4);
298
299         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
300                 moduleConfig);
301         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3);
302     }
303
304     /*
305      * CFG(R)
306      * |
307      * M2 -(no revision)-> M3(R2) ... M3(R1)
308      */
309     @Test
310     public void testImportNoRevision() {
311         Module moduleConfig = mockModule(CONFIG_NAME, REVISION);
312         Module module2 = mockModule(MODULE2_NAME, REVISION);
313
314         Module module3  = mockModule(MODULE3_NAME, null);
315         Module module30 = mockModule(MODULE3_NAME, REVISION);
316         Module module31 = mockModule(MODULE3_NAME, REVISION2);
317         mockModuleImport(module2, moduleConfig, module3);
318
319         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module30, module31);
320
321         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
322                 moduleConfig);
323
324         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module31);
325     }
326
327     /*
328      * CFG(R)
329      * |   \
330      * |    \
331      * |    M2 -> M3
332      * |
333      * M41(S) => M4
334      */
335     @Test
336     public void testBasicSubmodule() {
337         Module moduleConfig = mockModule(CONFIG_NAME);
338         Module module2 = mockModule(MODULE2_NAME);
339         Module module3 = mockModule(MODULE3_NAME);
340         Module module4 = mockModule(MODULE4_NAME);
341         Submodule module41 = mockSubmodule(MODULE41_NAME);
342
343         mockSubmodules(module4, module41);
344         mockModuleImport(module2, moduleConfig, module3);
345         mockModuleImport(module41, moduleConfig);
346
347         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4);
348
349         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, null,
350                 moduleConfig);
351         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4);
352     }
353
354     /*
355      * M2 -> M3 -> M4 -> M5
356      */
357     @Test
358     public void testChainAdditionalModules() {
359         Module module2 = mockModule(MODULE2_NAME);
360         Module module3 = mockModule(MODULE3_NAME);
361         Module module4 = mockModule(MODULE4_NAME);
362         Module module5 = mockModule(MODULE5_NAME);
363
364         mockModuleImport(module2, module3);
365         mockModuleImport(module3, module4);
366         mockModuleImport(module4, module5);
367
368         SchemaContext schemaContext = mockSchema(module2, module3, module4, module5);
369
370         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Set.of(module2),
371             null);
372         assertProxyContext(filteringSchemaContextProxy, module2, module3, module4, module5);
373     }
374
375     /*
376      *
377      * CFG(R)
378      *  |
379      *  |       M5
380      * M2
381      *
382      * M3 -> M4
383      */
384     @Test
385     public void testChainAdditionalModulesConfig() {
386         Module moduleConfig = mockModule(CONFIG_NAME);
387         Module module2 = mockModule(MODULE2_NAME);
388
389         Module module3 = mockModule(MODULE3_NAME);
390         Module module4 = mockModule(MODULE4_NAME);
391         Module module5 = mockModule(MODULE5_NAME);
392
393         mockModuleImport(module2, moduleConfig);
394         mockModuleImport(module3, module4);
395
396         SchemaContext schemaContext = mockSchema(moduleConfig, module2, module3, module4, module5);
397
398         FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Set.of(module3),
399             moduleConfig);
400         assertProxyContext(filteringSchemaContextProxy, moduleConfig, module2, module3, module4);
401     }
402
403     @Test
404     public void testGetDataDefinitions() {
405         final Module moduleConfig = mockModule(CONFIG_NAME);
406         final SchemaContext schemaContext = mockSchema(moduleConfig);
407         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Set.of(),
408             moduleConfig);
409
410         final ContainerSchemaNode mockedContainer = mock(ContainerSchemaNode.class);
411         doReturn(Set.of(mockedContainer)).when(moduleConfig).getChildNodes();
412
413         final Collection<? extends DataSchemaNode> dataDefinitions = filteringSchemaContextProxy.getDataDefinitions();
414         assertTrue(dataDefinitions.contains(mockedContainer));
415     }
416
417     @Test
418     public void testGetNotifications() {
419         final Module moduleConfig = mockModule(CONFIG_NAME);
420         final SchemaContext schemaContext = mockSchema(moduleConfig);
421         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Set.of(),
422             moduleConfig);
423
424         final NotificationDefinition mockedNotification = mock(NotificationDefinition.class);
425         doReturn(Set.of(mockedNotification)).when(moduleConfig).getNotifications();
426
427         final Collection<? extends NotificationDefinition> schemaContextProxyNotifications =
428             filteringSchemaContextProxy.getNotifications();
429         assertTrue(schemaContextProxyNotifications.contains(mockedNotification));
430     }
431
432     @Test
433     public void testGetOperations() {
434         final Module moduleConfig = mockModule(CONFIG_NAME);
435         final SchemaContext schemaContext = mockSchema(moduleConfig);
436         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Set.of(),
437             moduleConfig);
438
439         final RpcDefinition mockedRpc = mock(RpcDefinition.class);
440         doReturn(Set.of(mockedRpc)).when(moduleConfig).getRpcs();
441
442         final Collection<? extends RpcDefinition> operations = filteringSchemaContextProxy.getOperations();
443         assertTrue(operations.contains(mockedRpc));
444     }
445
446     @Test
447     public void testGetExtensions() {
448         final Module moduleConfig = mockModule(CONFIG_NAME);
449         final SchemaContext schemaContext = mockSchema(moduleConfig);
450         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Set.of(),
451             moduleConfig);
452
453         final ExtensionDefinition mockedExtension = mock(ExtensionDefinition.class);
454         doReturn(List.of(mockedExtension)).when(moduleConfig).getExtensionSchemaNodes();
455
456         final Collection<? extends ExtensionDefinition> schemaContextProxyExtensions =
457                 filteringSchemaContextProxy.getExtensions();
458         assertTrue(schemaContextProxyExtensions.contains(mockedExtension));
459     }
460
461     @Test
462     public void testGetUnknownSchemaNodes() {
463         final Module moduleConfig = mockModule(CONFIG_NAME);
464         final SchemaContext schemaContext = mockSchema(moduleConfig);
465         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Set.of(),
466             moduleConfig);
467
468         final UnknownSchemaNode mockedUnknownSchemaNode = mock(UnknownSchemaNode.class);
469         doReturn(List.of(mockedUnknownSchemaNode)).when(moduleConfig).getUnknownSchemaNodes();
470
471         final Collection<? extends UnknownSchemaNode> schemaContextProxyUnknownSchemaNodes =
472                 filteringSchemaContextProxy.getUnknownSchemaNodes();
473         assertTrue(schemaContextProxyUnknownSchemaNodes.contains(mockedUnknownSchemaNode));
474     }
475
476     @Test
477     public void testGetTypeDefinitions() {
478         final Module moduleConfig = mockModule(CONFIG_NAME);
479         final SchemaContext schemaContext = mockSchema(moduleConfig);
480         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Set.of(),
481             moduleConfig);
482
483         final TypeDefinition<?> mockedTypeDefinition = mock(TypeDefinition.class);
484         doReturn(Set.of(mockedTypeDefinition)).when(moduleConfig).getTypeDefinitions();
485
486         final Collection<? extends TypeDefinition<?>> schemaContextProxyTypeDefinitions = filteringSchemaContextProxy
487             .getTypeDefinitions();
488         assertTrue(schemaContextProxyTypeDefinitions.contains(mockedTypeDefinition));
489     }
490
491     @Test
492     public void testGetChildNodes() {
493         final Module moduleConfig = mockModule(CONFIG_NAME);
494         final SchemaContext schemaContext = mockSchema(moduleConfig);
495         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Set.of(),
496             moduleConfig);
497
498         final ContainerSchemaNode mockedContainer = mock(ContainerSchemaNode.class);
499         doReturn(Set.of(mockedContainer)).when(moduleConfig).getChildNodes();
500
501         final Collection<? extends DataSchemaNode> schemaContextProxyChildNodes =
502                 filteringSchemaContextProxy.getChildNodes();
503         assertTrue(schemaContextProxyChildNodes.contains(mockedContainer));
504     }
505
506     @Test
507     public void testGetGroupings() {
508         final Module moduleConfig = mockModule(CONFIG_NAME);
509         final SchemaContext schemaContext = mockSchema(moduleConfig);
510         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Set.of(),
511             moduleConfig);
512
513         final GroupingDefinition mockedGrouping = mock(GroupingDefinition.class);
514         doReturn(Set.of(mockedGrouping)).when(moduleConfig).getGroupings();
515
516         final Collection<? extends GroupingDefinition> schemaContextProxyGroupings =
517                 filteringSchemaContextProxy.getGroupings();
518         assertTrue(schemaContextProxyGroupings.contains(mockedGrouping));
519     }
520
521     @Test
522     public void testGetDataChildByName() {
523         final Module moduleConfig = mockModule(CONFIG_NAME);
524         final SchemaContext schemaContext = mockSchema(moduleConfig);
525         final FilteringSchemaContextProxy filteringSchemaContextProxy = createProxySchemaCtx(schemaContext, Set.of(),
526             moduleConfig);
527
528         final QName qname = QName.create("config-namespace", "2016-08-11", "cont");
529         final ContainerSchemaNode mockedContainer = mock(ContainerSchemaNode.class);
530         doReturn(mockedContainer).when(moduleConfig).dataChildByName(any(QName.class));
531
532         final DataSchemaNode dataSchemaNode = filteringSchemaContextProxy.getDataChildByName(qname);
533         assertTrue(dataSchemaNode instanceof ContainerSchemaNode);
534     }
535
536     private static void assertProxyContext(final FilteringSchemaContextProxy filteringSchemaContextProxy,
537             final Module... expected) {
538
539         final Set<Module> modSet = expected != null ? ImmutableSet.copyOf(expected) : Set.of();
540         Set<Module> modSetFiltering = filteringSchemaContextProxy.getModules();
541
542         assertEquals(modSet, modSetFiltering);
543
544         //asserting collections
545         if (expected != null) {
546             for (final Module module : expected) {
547                 assertEquals(module, filteringSchemaContextProxy.findModule(module.getName(), module.getRevision())
548                     .get());
549
550                 Collection<? extends Module> mod = filteringSchemaContextProxy.findModules(module.getNamespace());
551                 assertTrue(mod.contains(module));
552                 assertEquals(module, filteringSchemaContextProxy.findModule(module.getNamespace(),
553                     module.getRevision().orElse(null)).get());
554             }
555         }
556     }
557
558     private static FilteringSchemaContextProxy createProxySchemaCtx(final SchemaContext schemaContext,
559             final Set<Module> additionalModules, final Module... modules) {
560         Set<Module> modulesSet = modules != null ? ImmutableSet.copyOf(modules) : Set.of();
561         return new FilteringSchemaContextProxy(schemaContext, createModuleIds(modulesSet),
562                 createModuleIds(additionalModules));
563     }
564
565     private static Set<ModuleId> createModuleIds(final Set<Module> modules) {
566         Set<ModuleId> moduleIds = new HashSet<>();
567         if (modules != null) {
568             for (Module module : modules) {
569                 moduleIds.add(new ModuleId(module.getName(), module.getRevision()));
570             }
571         }
572
573         return moduleIds;
574     }
575
576     private static void mockSubmodules(final Module mainModule, final Submodule... submodules) {
577         doReturn(Set.of(submodules)).when(mainModule).getSubmodules();
578     }
579
580     private static void mockModuleImport(final ModuleLike importer, final Module... imports) {
581         Set<ModuleImport> mockedImports = new HashSet<>();
582         for (final Module module : imports) {
583             mockedImports.add(new ModuleImport() {
584                 @Override
585                 public String getModuleName() {
586                     return module.getName();
587                 }
588
589                 @Override
590                 public Optional<Revision> getRevision() {
591                     return module.getRevision();
592                 }
593
594                 @Override
595                 public String getPrefix() {
596                     return module.getName();
597                 }
598
599                 @Override
600                 public Optional<String> getDescription() {
601                     return module.getDescription();
602                 }
603
604                 @Override
605                 public Optional<String> getReference() {
606                     return module.getReference();
607                 }
608
609                 @Override
610                 public String toString() {
611                     return String.format("Module: %s, revision:%s", module.getName(), module.getRevision());
612                 }
613
614                 @Override
615                 public ImportEffectiveStatement asEffectiveStatement() {
616                     throw new UnsupportedOperationException();
617                 }
618             });
619         }
620         doReturn(mockedImports).when(importer).getImports();
621     }
622
623     //mock module with revision
624     private static Module mockModule(final String name, final Revision rev) {
625
626         final Module mod = mockModule(name);
627
628         doReturn(QNameModule.create(mod.getNamespace(), rev)).when(mod).getQNameModule();
629         doReturn(Optional.ofNullable(rev)).when(mod).getRevision();
630         doReturn(mod.getQNameModule().toString()).when(mod).toString();
631
632         return mod;
633     }
634
635     //mock module with default revision
636     private static Module mockModule(final String name) {
637         Module mockedModule = mock(Module.class);
638         mockModuleLike(mockedModule, name);
639         return mockedModule;
640     }
641
642     private static Submodule mockSubmodule(final String name) {
643         Submodule mockedModule = mock(Submodule.class);
644         mockModuleLike(mockedModule, name);
645         return mockedModule;
646     }
647
648     private static void mockModuleLike(final ModuleLike mockedModule, final String name) {
649         doReturn(name).when(mockedModule).getName();
650         doReturn(Optional.of(REVISION)).when(mockedModule).getRevision();
651         final XMLNamespace newNamespace = XMLNamespace.of(NAMESPACE.toString() + ":" + name);
652         doReturn(newNamespace).when(mockedModule).getNamespace();
653         doReturn(QNameModule.create(newNamespace, REVISION)).when(mockedModule).getQNameModule();
654         doReturn(Set.of()).when(mockedModule).getSubmodules();
655         doReturn(mockedModule.getQNameModule().toString()).when(mockedModule).toString();
656         mockModuleImport(mockedModule);
657     }
658 }